"Tao Klerks via GitGitGadget" <gitgitgadget@xxxxxxxxx> writes: > diff --git a/branch.c b/branch.c > index 6b31df539a5..182f1c5a556 100644 > --- a/branch.c > +++ b/branch.c > @@ -18,17 +18,31 @@ struct tracking { > int matches; > }; > > +struct find_tracked_branch_cb { > + struct tracking *tracking; > + struct string_list ambiguous_remotes; > +}; > + > static int find_tracked_branch(struct remote *remote, void *priv) > { > - struct tracking *tracking = priv; > + struct find_tracked_branch_cb *ftb = priv; > + struct tracking *tracking = ftb->tracking; > > if (!remote_find_tracking(remote, &tracking->spec)) { > - if (++tracking->matches == 1) { > + switch (++tracking->matches) { > + case 1: > string_list_append(tracking->srcs, tracking->spec.src); > tracking->remote = remote->name; > - } else { > + break; > + case 2: > + /* there are at least two remotes; backfill the first one */ > + string_list_append(&ftb->ambiguous_remotes, tracking->remote); > + /* fall through */ > + default: > + string_list_append(&ftb->ambiguous_remotes, remote->name); > free(tracking->spec.src); > string_list_clear(tracking->srcs, 0); > + break; > } > tracking->spec.src = NULL; > } Ah I see, on the first iteration, we set the first remote's name to tracking->remote, and on the second iteration, we copy that value to the list before copying the _current_ remote's name to the list. > -test_expect_success 'avoid ambiguous track' ' > +test_expect_success 'avoid ambiguous track and advise' ' > git config branch.autosetupmerge true && > git config remote.ambi1.url lalala && > git config remote.ambi1.fetch refs/heads/lalala:refs/heads/main && > git config remote.ambi2.url lilili && > git config remote.ambi2.fetch refs/heads/lilili:refs/heads/main && > - test_must_fail git branch all1 main && > + cat <<-EOF >expected && > + fatal: not tracking: ambiguous information for ref '\''refs/heads/main'\'' > + hint: There are multiple remotes whose fetch refspecs map to the remote > + hint: tracking ref '\''refs/heads/main'\'': > + hint: ambi1 > + hint: ambi2 > + hint: '' > + hint: This is typically a configuration error. > + hint: '' > + hint: To support setting up tracking branches, ensure that > + hint: different remotes'\'' fetch refspecs map into different > + hint: tracking namespaces. > + EOF > + test_must_fail git branch all1 main 2>actual && > + test_cmp expected actual && > test -z "$(git config branch.all1.merge)" > ' And this test shows that this indeed does what we think it does. Nicely done. I notice that we there is an instance of test -z "$(some git command)", which IIRC is discouraged because it would mask a failure in the git command, but that's not new and I don't think it needs to be fixed in this series anyway. Reviewed-by: Glen Choo <chooglen@xxxxxxxxxx>