Junio C Hamano <gitster@xxxxxxxxx> writes: >> +/** >> + * 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. >> @@ -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. > >> + 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.