This prints more helpful info when HEAD is detached: is it detached
because of bisect or rebase? What is the original branch name in those
cases?

Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 Keep "no branch" in all cases. Just append "rebasing/bisecting [%s]"
 when applicable.

 builtin/branch.c            | 44 +++++++++++++++++++++++++++++++++++++++++++-
 t/t6030-bisect-porcelain.sh |  2 +-
 2 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/builtin/branch.c b/builtin/branch.c
index 6371bf9..26c0c3d 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -550,6 +550,48 @@ static int calc_maxwidth(struct ref_list *refs)
        return w;
 }
 
+static char *get_head_description()
+{
+       struct stat st;
+       struct strbuf sb = STRBUF_INIT;
+       struct strbuf result = STRBUF_INIT;
+       int bisect = 0;
+       int ret;
+       if (!stat(git_path("rebase-merge"), &st) && S_ISDIR(st.st_mode))
+               ret = strbuf_read_file(&sb, git_path("rebase-merge/head-name"), 
0);
+       else if (!access(git_path("rebase-apply/rebasing"), F_OK))
+               ret = strbuf_read_file(&sb, git_path("rebase-apply/head-name"), 
0);
+       else if (!access(git_path("BISECT_LOG"), F_OK)) {
+               ret = strbuf_read_file(&sb, git_path("BISECT_START"), 0);
+               bisect = 1;
+       } else
+               return xstrdup(_("(no branch)"));
+
+       if (ret <= 0) {
+               if (bisect)
+                       return xstrdup(_("(no branch, bisecting)"));
+               else
+                       return xstrdup(_("_(no branch, rebasing)"));
+       }
+
+       while (sb.len && sb.buf[sb.len - 1] == '\n')
+               strbuf_setlen(&sb, sb.len - 1);
+
+       if (bisect) {
+               unsigned char sha1[20];
+               if (!get_sha1_hex(sb.buf, sha1))
+                       strbuf_addstr(&result, _("(no branch, bisecting)"));
+               else
+                       strbuf_addf(&result, _("(no branch, bisecting %s)"), 
sb.buf);
+       } else {
+               if (!prefixcmp(sb.buf, "refs/heads/"))
+                       strbuf_addf(&result, _("(no branch, rebasing %s)"), 
sb.buf + 11);
+               else
+                       strbuf_addstr(&result, _("(no branch, rebasing)"));
+       }
+       strbuf_release(&sb);
+       return strbuf_detach(&result, NULL);
+}
 
 static void show_detached(struct ref_list *ref_list)
 {
@@ -557,7 +599,7 @@ static void show_detached(struct ref_list *ref_list)
 
        if (head_commit && is_descendant_of(head_commit, 
ref_list->with_commit)) {
                struct ref_item item;
-               item.name = xstrdup(_("(no branch)"));
+               item.name = get_head_description();
                item.width = utf8_strwidth(item.name);
                item.kind = REF_LOCAL_BRANCH;
                item.dest = NULL;
diff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh
index 3e0e15f..9b6f0d0 100755
--- a/t/t6030-bisect-porcelain.sh
+++ b/t/t6030-bisect-porcelain.sh
@@ -164,7 +164,7 @@ test_expect_success 'bisect start: existing 
".git/BISECT_START" not modified if
        cp .git/BISECT_START saved &&
        test_must_fail git bisect start $HASH4 foo -- &&
        git branch > branch.output &&
-       test_i18ngrep "* (no branch)" branch.output > /dev/null &&
+       test_i18ngrep "* (no branch, bisecting other)" branch.output > 
/dev/null &&
        test_cmp saved .git/BISECT_START
 '
 test_expect_success 'bisect start: no ".git/BISECT_START" if mistaken rev' '
-- 
1.8.1.2.536.gf441e6d

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to