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>
---
  - Incorporate Jonathan's version of checking
  - Show original branch name, e.g. "(rebasing foo)", when possible

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

diff --git a/builtin/branch.c b/builtin/branch.c
index ea6498b..40f20ad 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -550,6 +550,44 @@ 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)
+               return xstrdup(bisect ? _("(bisecting)") : _("_(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, _("(bisecting)"));
+               else
+                       strbuf_addf(&result, _("(bisecting %s)"), sb.buf);
+       } else {
+               if (!prefixcmp(sb.buf, "refs/heads/"))
+                       strbuf_addf(&result, _("(rebasing %s)"), sb.buf + 11);
+               else
+                       strbuf_addstr(&result, _("(rebasing)"));
+       }
+       strbuf_release(&sb);
+       return strbuf_detach(&result, NULL);
+}
 
 static void show_detached(struct ref_list *ref_list)
 {
@@ -557,7 +595,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..90968d5 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 "* (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.1.459.g5970e58

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