Re: [PATCH v8 1/3] branch: accept multiple upstream branches for tracking
From: Glen Choo <hidden>
Date: 2021-12-21 18:25:38
Junio C Hamano [off-list ref] writes:
quoted
+/** + * 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.
quoted
@@ -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.
quoted
+ 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.quoted
}Thanks.