[PATCH] wt-status: expand, not dwim, a "detached from" ref
- From
- Jonathan Tan <jonathantanmy@google.com>
- Date
- May 13, 2020, 00:40 UTC
- Message-ID
- <20200513004058.34456-1-jonathantanmy@google.com>
When a user checks out the upstream branch of HEAD and then runs "git branch", like this:
git checkout @{u}
git branchan error message is printed:
fatal: HEAD does not point to a branch
(This error message when running "git branch" persists even after checking out other things - it only stops after checking out a branch.)
This is because "git branch" attempts to DWIM "@{u}" when determining the "HEAD detached" message, but that doesn't work because HEAD no longer points to a branch.
Therefore, when calculating the status of a worktree, only expand such a string, not DWIM it. Such strings would not match a ref, and "git branch" would report "HEAD detached at <hash>" instead.
Signed-off-by: Jonathan Tan <jonathantanmy@google.com> --- I tried to track down other uses of wt_status_get_detached_from() (called from wt_status_get_state() with get_detached_from=1) but there seemed to be quite a few, so I stopped.
One alternative is to plumb down a flag from dwim_ref() to
interpret_branch_mark() that indicates that (1) don't read HEAD when
processing, and (2) when encountering a ref of the form "<optional
ref>@{u}", don't die when the optional ref doesn't exist, is not a
branch, or does not have an upstream. (We cannot change the
functionality outright because other parts of Git rely on such a message
being printed.) But this seems too complicated just for diagnosis.
---
t/t3203-branch-output.sh | 10 ++++++++++
wt-status.c | 2 +-
2 files changed, 11 insertions(+), 1 deletion(-)diff --git a/t/t3203-branch-output.sh b/t/t3203-branch-output.sh index 71818b90f0..c5d3d739e5 100755 --- a/t/t3203-branch-output.sh +++ b/t/t3203-branch-output.sh @@ -209,6 +209,16 @@ EOF test_i18ncmp expect actual ' +test_expect_success 'git branch shows detached HEAD properly after checking out upstream branch' ' + git init upstream && + test_commit -C upstream foo && + + git clone upstream downstream && + git -C downstream checkout @{u} && + git -C downstream branch >actual && + test_i18ngrep "HEAD detached at [0-9a-f]\\+" actual +' + test_expect_success 'git branch `--sort` option' ' cat >expect <<-\EOF && * (HEAD detached from fromtag) diff --git a/wt-status.c b/wt-status.c index 98dfa6f73f..f84ebc3e2c 100644 --- a/wt-status.c +++ b/wt-status.c @@ -1562,7 +1562,7 @@ static void wt_status_get_detached_from(struct repository *r, return; } - if (dwim_ref(cb.buf.buf, cb.buf.len, &oid, &ref) == 1 && + if (expand_ref(the_repository, cb.buf.buf, cb.buf.len, &oid, &ref) == 1 && /* sha1 is a commit? match without further lookup */ (oideq(&cb.noid, &oid) || /* perhaps sha1 is a tag, try to dereference to a commit */
-- 2.26.2.645.ge9eca65c58-goog