>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 ;)