Re: [PATCH v3 1/1] remote.c: fix handling of %(push:remoteref)
- From
- Damien Robert <damien.olivier.robert@gmail.com>
- Date
- Apr 16, 2020, 15:12 UTC
- Message-ID
- <20200416151213.xbo5x6jt477ezwvo@feanor>
- In-Reply-To
- <20200328133134.GA1196665@coredump.intra.peff.net>
From Jeff King, Sat 28 Mar 2020 at 09:31:34 (-0400) :
> > > I am still a bit annoyed that I cannot call branch_get_push_remoteref from > > > branch_get_push1 because of the PUSH_DEFAULT_UPSTREAM case, but this can > > > wait and we will need to work with the code duplication meanwhile.
> > I looked into this, too, and have a working patch. It does get a little > > awkward, though, and I'm happy to just take your patch for now as the > > practical thing.
Hi Jeff,
I looked up at your patch again, because the code duplication gets more annoying the more new corner cases I have to handle to get the push ref correct in all cases (cf my cover letter to v6).
This implements what I was suggesting in https://public-inbox.org/git/20200301220531.iuokzzdb5gruslrn@doriath/
Essentially in branch_get_push you call:
remote = remote_get(pushremote_for_branch(branch, NULL));
tracking_for_push_dest(remote, branch_get_push_remoteref(branch),And as I pointed out, this is currently exactly what branch_get_push_1 does, except in the PUSH_DEFAULT_UPSTREAM where it returns branch->merge[0]->dst.
But branch->merge is set up in `set_merge`, where we have:
ret->merge[i]->src = xstrdup(ret->merge_name[i]);
if (!remote_find_tracking(remote, ret->merge[i]) ||
strcmp(ret->remote_name, "."))
continue;
if (dwim_ref(ret->merge_name[i], strlen(ret->merge_name[i]),
&oid, &ref) == 1)
ret->merge[i]->dst = ref;So in particular, when the remote is local, the current code path calls dwim_ref. (I have no idea who set up ret->merge[i]->dst if the remote is not local...)
So my question was: can dwim_ref(branch->merge[0]->src) be different from tracking_for_push_dest(branch->merge[0]->src)?
So I admit I don't understand everything dwim_ref does, but there is at least one case where the answer is yes: if we have a dangling symref, dwim_ref which calls expand_ref in refs.c will detect it. So in the current code, %(push) would show nothing, while with your patch it would show the dangling symref.
Obviously we cannot allow a regression for this very common case ;)