Re: [PATCH v8 1/3] branch: accept multiple upstream branches for tracking
- From
Glen Choo <chooglen@google.com>
- Date
- Dec 21, 2021, 18:25 UTC
- Message-ID
- <kl6l35mlzug1.fsf@chooglen-macbookpro.roam.corp.google.com>
- In-Reply-To
- <xmqq1r26sazc.fsf@gitster.g>
Junio C Hamano <gitster@pobox.com> writes:
Show 43 quoted lines
>> +/**
>> + * Install upstream tracking configuration for a branch; specifically, add
>> + * `branch.<name>.remote` and `branch.<name>.merge` entries.
>> + *
>> + * `flag` contains integer flags for options; currently only
>> + * BRANCH_CONFIG_VERBOSE is checked.
>> + *
>> + * `local` is the name of the branch whose configuration we're installing.
>> + *
>> + * `origin` is the name of the remote owning the upstream branches. NULL means
>> + * the upstream branches are local to this repo.
>> + *
>> + * `remotes` is a list of refs that are upstream of local
>> + */
>> +static int install_branch_config_multiple_remotes(int flag, const char *local,
>> + const char *origin, struct string_list *remotes)
>> {
>> const char *shortname = NULL;
>> struct strbuf key = STRBUF_INIT;
>> + struct string_list_item *item;
>> int rebasing = should_setup_rebase(origin);
>>
>> + if (!remotes->nr)
>> + BUG("must provide at least one remote for branch config");
>> + if (rebasing && remotes->nr > 1)
>> + die(_("cannot inherit upstream tracking configuration of "
>> + "multiple refs when rebasing is requested"));
>> +
>> + /*
>> + * If the new branch is trying to track itself, something has gone
>> + * wrong. Warn the user and don't proceed any further.
>> + */
>> + if (!origin)
>> + for_each_string_list_item(item, remotes)
>> + if (skip_prefix(item->string, "refs/heads/", &shortname)
>> + && !strcmp(local, shortname)) {
>> + warning(_("not setting branch '%s' as its own upstream."),
>> + local);
>> + return 0;
>> + }
>
> Added comments make it easier to follow what is going on and more
> importantly why. I very much like it ;-)Agreed! We made a lot of 'why' decisions and I think the comments do a great job of capturing that.
Show 30 quoted lines
>> @@ -87,29 +117,40 @@ int install_branch_config(int flag, const char *local, const char *origin, const
>> strbuf_release(&key);
>>
>> if (flag & BRANCH_CONFIG_VERBOSE) {
>> + struct strbuf tmp_ref_name = STRBUF_INIT;
>> + struct string_list friendly_ref_names = STRING_LIST_INIT_DUP;
>> +
>> + for_each_string_list_item(item, remotes) {
>> + shortname = item->string;
>> + skip_prefix(shortname, "refs/heads/", &shortname);
>> + if (origin) {
>> + strbuf_addf(&tmp_ref_name, "%s/%s",
>> + origin, shortname);
>> + string_list_append_nodup(
>> + &friendly_ref_names,
>> + strbuf_detach(&tmp_ref_name, NULL));
>> + } else {
>> + string_list_append(
>> + &friendly_ref_names, shortname);
>> + }
>> + }
>> +
>> + if (remotes->nr == 1) {
>> + /*
>> + * Rebasing is only allowed in the case of a single
>> + * upstream branch.
>> + */
>
> There does not seem to be any code to forbid "rebasing" when
> remotes->nr != 1, though. Did I miss a call to die() earlier?The die() call happens in install_branch_config_multiple_remotes(), where it belongs.
I think someone who reads this comment will eventually track down the die() call, but it does look a little out of place. Purely as a matter of personal taste, I would have expected this comment to be in the 'else' clause, and it might read something like:
install_branch_config_multiple_remotes() does not allow rebasing with multiple upstream branches.
but that's just a suggestion :) This patch looks fine to me.
Show 15 quoted lines
>
>> + printf_ln(rebasing ?
>> + _("branch '%s' set up to track '%s' by rebasing.") :
>> + _("branch '%s' set up to track '%s'."),
>> + local, friendly_ref_names.items[0].string);
>> } else {
>> + printf_ln(_("branch '%s' set up to track:"), local);
>> + for_each_string_list_item(item, &friendly_ref_names)
>> + printf_ln(" %s", item->string);
>
> In other words, I would have expected something in this else clause.
>
>> }
>
> Thanks.