Merge branch 'mg/detached-head-report'

"git branch" on a detached HEAD always said "(detached from xyz)",
even when "git status" would report "detached at xyz".  The HEAD is
actually at xyz and haven't been moved since it was detached in
such a case, but the user cannot read what the current value of
HEAD is when "detached from" is used.

* mg/detached-head-report:
  branch: name detached HEAD analogous to status
  wt-status: refactor detached HEAD analysis
This commit is contained in:
Junio C Hamano 2015-03-20 13:11:46 -07:00
commit 38f6ae90de
4 changed files with 52 additions and 7 deletions

View File

@ -589,9 +589,16 @@ static char *get_head_description(void)
else if (state.bisect_in_progress) else if (state.bisect_in_progress)
strbuf_addf(&desc, _("(no branch, bisect started on %s)"), strbuf_addf(&desc, _("(no branch, bisect started on %s)"),
state.branch); state.branch);
else if (state.detached_from) else if (state.detached_from) {
strbuf_addf(&desc, _("(detached from %s)"), /* TRANSLATORS: make sure these match _("HEAD detached at ")
state.detached_from); and _("HEAD detached from ") in wt-status.c */
if (state.detached_at)
strbuf_addf(&desc, _("(HEAD detached at %s)"),
state.detached_from);
else
strbuf_addf(&desc, _("(HEAD detached from %s)"),
state.detached_from);
}
else else
strbuf_addstr(&desc, _("(no branch)")); strbuf_addstr(&desc, _("(no branch)"));
free(state.branch); free(state.branch);

View File

@ -96,7 +96,7 @@ test_expect_success 'git branch -v pattern does not show branch summaries' '
test_expect_success 'git branch shows detached HEAD properly' ' test_expect_success 'git branch shows detached HEAD properly' '
cat >expect <<EOF && cat >expect <<EOF &&
* (detached from $(git rev-parse --short HEAD^0)) * (HEAD detached at $(git rev-parse --short HEAD^0))
branch-one branch-one
branch-two branch-two
master master
@ -106,4 +106,41 @@ EOF
test_i18ncmp expect actual test_i18ncmp expect actual
' '
test_expect_success 'git branch shows detached HEAD properly after moving' '
cat >expect <<EOF &&
* (HEAD detached from $(git rev-parse --short HEAD))
branch-one
branch-two
master
EOF
git reset --hard HEAD^1 &&
git branch >actual &&
test_i18ncmp expect actual
'
test_expect_success 'git branch shows detached HEAD properly from tag' '
cat >expect <<EOF &&
* (HEAD detached at fromtag)
branch-one
branch-two
master
EOF
git tag fromtag master &&
git checkout fromtag &&
git branch >actual &&
test_i18ncmp expect actual
'
test_expect_success 'git branch shows detached HEAD properly after moving from tag' '
cat >expect <<EOF &&
* (HEAD detached from fromtag)
branch-one
branch-two
master
EOF
git reset --hard HEAD^1 &&
git branch >actual &&
test_i18ncmp expect actual
'
test_done test_done

View File

@ -1242,6 +1242,8 @@ static void wt_status_get_detached_from(struct wt_status_state *state)
state->detached_from = state->detached_from =
xstrdup(find_unique_abbrev(cb.nsha1, DEFAULT_ABBREV)); xstrdup(find_unique_abbrev(cb.nsha1, DEFAULT_ABBREV));
hashcpy(state->detached_sha1, cb.nsha1); hashcpy(state->detached_sha1, cb.nsha1);
state->detached_at = !get_sha1("HEAD", sha1) &&
!hashcmp(sha1, state->detached_sha1);
free(ref); free(ref);
strbuf_release(&cb.buf); strbuf_release(&cb.buf);
@ -1330,10 +1332,8 @@ void wt_status_print(struct wt_status *s)
on_what = _("rebase in progress; onto "); on_what = _("rebase in progress; onto ");
branch_name = state.onto; branch_name = state.onto;
} else if (state.detached_from) { } else if (state.detached_from) {
unsigned char sha1[20];
branch_name = state.detached_from; branch_name = state.detached_from;
if (!get_sha1("HEAD", sha1) && if (state.detached_at)
!hashcmp(sha1, state.detached_sha1))
on_what = _("HEAD detached at "); on_what = _("HEAD detached at ");
else else
on_what = _("HEAD detached from "); on_what = _("HEAD detached from ");

View File

@ -84,6 +84,7 @@ struct wt_status_state {
int cherry_pick_in_progress; int cherry_pick_in_progress;
int bisect_in_progress; int bisect_in_progress;
int revert_in_progress; int revert_in_progress;
int detached_at;
char *branch; char *branch;
char *onto; char *onto;
char *detached_from; char *detached_from;