Merge branch 'gc/branch-recurse-submodules-fix'

A handful of obvious clean-ups around a topic that is already in
'master'.

* gc/branch-recurse-submodules-fix:
  branch.c: simplify advice-and-die sequence
  branch: rework comments for future developers
  branch: remove negative exit code
  branch --set-upstream-to: be consistent when advising
  branch: give submodule updating advice before exit
  branch: support more tracking modes when recursing
This commit is contained in:
Junio C Hamano 2022-04-04 10:56:22 -07:00
commit da95e25656
3 changed files with 76 additions and 16 deletions

View File

@ -233,6 +233,9 @@ static void setup_tracking(const char *new_ref, const char *orig_ref,
struct string_list tracking_srcs = STRING_LIST_INIT_DUP;
int config_flags = quiet ? 0 : BRANCH_CONFIG_VERBOSE;
if (!track)
BUG("asked to set up tracking, but tracking is disallowed");
memset(&tracking, 0, sizeof(tracking));
tracking.spec.dst = (char *)orig_ref;
tracking.srcs = &tracking_srcs;
@ -260,7 +263,7 @@ static void setup_tracking(const char *new_ref, const char *orig_ref,
string_list_append(tracking.srcs, orig_ref);
if (install_branch_config_multiple_remotes(config_flags, new_ref,
tracking.remote, tracking.srcs) < 0)
exit(-1);
exit(1);
cleanup:
string_list_clear(&tracking_srcs, 0);
@ -385,12 +388,10 @@ static void dwim_branch_start(struct repository *r, const char *start_name,
real_ref = NULL;
if (get_oid_mb(start_name, &oid)) {
if (explicit_tracking) {
if (advice_enabled(ADVICE_SET_UPSTREAM_FAILURE)) {
error(_(upstream_missing), start_name);
advise(_(upstream_advice));
exit(1);
}
die(_(upstream_missing), start_name);
int code = die_message(_(upstream_missing), start_name);
advise_if_enabled(ADVICE_SET_UPSTREAM_FAILURE,
_(upstream_advice));
exit(code);
}
die(_("not a valid object name: '%s'"), start_name);
}
@ -534,8 +535,27 @@ static int submodule_create_branch(struct repository *r,
strvec_push(&child.args, "--quiet");
if (reflog)
strvec_push(&child.args, "--create-reflog");
if (track == BRANCH_TRACK_ALWAYS || track == BRANCH_TRACK_EXPLICIT)
strvec_push(&child.args, "--track");
switch (track) {
case BRANCH_TRACK_NEVER:
strvec_push(&child.args, "--no-track");
break;
case BRANCH_TRACK_ALWAYS:
case BRANCH_TRACK_EXPLICIT:
strvec_push(&child.args, "--track=direct");
break;
case BRANCH_TRACK_OVERRIDE:
BUG("BRANCH_TRACK_OVERRIDE cannot be used when creating a branch.");
break;
case BRANCH_TRACK_INHERIT:
strvec_push(&child.args, "--track=inherit");
break;
case BRANCH_TRACK_UNSPECIFIED:
/* Default for "git checkout". Do not pass --track. */
case BRANCH_TRACK_REMOTE:
/* Default for "git branch". Do not pass --track. */
break;
}
strvec_pushl(&child.args, name, start_oid, tracking_name, NULL);
@ -585,11 +605,13 @@ void create_branches_recursively(struct repository *r, const char *name,
*/
for (i = 0; i < submodule_entry_list.entry_nr; i++) {
if (submodule_entry_list.entries[i].repo == NULL) {
int code = die_message(
_("submodule '%s': unable to find submodule"),
submodule_entry_list.entries[i].submodule->name);
if (advice_enabled(ADVICE_SUBMODULES_NOT_UPDATED))
advise(_("You may try updating the submodules using 'git checkout %s && git submodule update --init'"),
start_commitish);
die(_("submodule '%s': unable to find submodule"),
submodule_entry_list.entries[i].submodule->name);
exit(code);
}
if (submodule_create_branch(
@ -614,7 +636,8 @@ void create_branches_recursively(struct repository *r, const char *name,
* tedious to determine whether or not tracking was set up in the
* superproject.
*/
setup_tracking(name, tracking_name, track, quiet);
if (track)
setup_tracking(name, tracking_name, track, quiet);
for (i = 0; i < submodule_entry_list.entry_nr; i++) {
if (submodule_create_branch(

View File

@ -3073,9 +3073,10 @@ static int module_create_branch(int argc, const char **argv, const char *prefix)
OPT__FORCE(&force, N_("force creation"), 0),
OPT_BOOL(0, "create-reflog", &reflog,
N_("create the branch's reflog")),
OPT_SET_INT('t', "track", &track,
N_("set up tracking mode (see git-pull(1))"),
BRANCH_TRACK_EXPLICIT),
OPT_CALLBACK_F('t', "track", &track, "(direct|inherit)",
N_("set branch tracking configuration"),
PARSE_OPT_OPTARG,
parse_opt_tracking_mode),
OPT__DRY_RUN(&dry_run,
N_("show whether the branch would be created")),
OPT_END()

View File

@ -260,7 +260,7 @@ test_expect_success 'should get fatal error upon branch creation when submodule
)
'
test_expect_success 'should set up tracking of remote-tracking branches' '
test_expect_success 'should set up tracking of remote-tracking branches by default' '
test_when_finished "reset_remote_test" &&
(
cd super-clone &&
@ -289,4 +289,40 @@ test_expect_success 'should not fail when unable to set up tracking in submodule
)
'
test_expect_success '--track=inherit should set up tracking correctly' '
test_when_finished "reset_remote_test" &&
(
cd super-clone &&
git branch --recurse-submodules branch-a origin/branch-a &&
# Set this manually instead of using branch --set-upstream-to
# to circumvent the "nonexistent upstream" check.
git -C sub config branch.branch-a.remote origin &&
git -C sub config branch.branch-a.merge refs/heads/sub-branch-a &&
git -C sub/sub-sub config branch.branch-a.remote other &&
git -C sub/sub-sub config branch.branch-a.merge refs/heads/sub-sub-branch-a &&
git branch --recurse-submodules --track=inherit branch-b branch-a &&
test_cmp_config origin branch.branch-b.remote &&
test_cmp_config refs/heads/branch-a branch.branch-b.merge &&
test_cmp_config -C sub origin branch.branch-b.remote &&
test_cmp_config -C sub refs/heads/sub-branch-a branch.branch-b.merge &&
test_cmp_config -C sub/sub-sub other branch.branch-b.remote &&
test_cmp_config -C sub/sub-sub refs/heads/sub-sub-branch-a branch.branch-b.merge
)
'
test_expect_success '--no-track should not set up tracking' '
test_when_finished "reset_remote_test" &&
(
cd super-clone &&
git branch --recurse-submodules --no-track branch-a origin/branch-a &&
test_cmp_config "" --default "" branch.branch-a.remote &&
test_cmp_config "" --default "" branch.branch-a.merge &&
test_cmp_config -C sub "" --default "" branch.branch-a.remote &&
test_cmp_config -C sub "" --default "" branch.branch-a.merge &&
test_cmp_config -C sub/sub-sub "" --default "" branch.branch-a.remote &&
test_cmp_config -C sub/sub-sub "" --default "" branch.branch-a.merge
)
'
test_done