format-patch: pick up correct branch name from symbolic ref
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Thu, 3 Jan 2013 14:03:10 +0000 (21:03 +0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 3 Jan 2013 15:44:07 +0000 (07:44 -0800)
find_branch_name() assumes to take refs/heads/<branch>. But we also
have symbolic refs, such as HEAD, that can point to a valid branch in
refs/heads and do not follow refs/heads/<branch> syntax. Remove the
assumption and apply normal ref resolution. After all it would be
confusing if rev machinery resolves a ref in one way and
find_branch_name() another.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/log.c
t/t4014-format-patch.sh
index dff79212d0f6e027f3ec316a5892c80b6b55e7af..a293a3f05c16064bcafc1db430790ce3af7eefc7 100644 (file)
@@ -1014,8 +1014,8 @@ static char *find_branch_name(struct rev_info *rev)
 {
        int i, positive = -1;
        unsigned char branch_sha1[20];
-       struct strbuf buf = STRBUF_INIT;
-       const char *branch;
+       const char *ref;
+       char *full_ref, *branch = NULL;
 
        for (i = 0; i < rev->cmdline.nr; i++) {
                if (rev->cmdline.rev[i].flags & UNINTERESTING)
@@ -1027,16 +1027,13 @@ static char *find_branch_name(struct rev_info *rev)
        }
        if (positive < 0)
                return NULL;
-       strbuf_addf(&buf, "refs/heads/%s", rev->cmdline.rev[positive].name);
-       branch = resolve_ref_unsafe(buf.buf, branch_sha1, 1, NULL);
-       if (!branch ||
-           prefixcmp(branch, "refs/heads/") ||
-           hashcmp(rev->cmdline.rev[positive].item->sha1, branch_sha1))
-               branch = NULL;
-       strbuf_release(&buf);
-       if (branch)
-               return xstrdup(rev->cmdline.rev[positive].name);
-       return NULL;
+       ref = rev->cmdline.rev[positive].name;
+       if (dwim_ref(ref, strlen(ref), branch_sha1, &full_ref) &&
+           !prefixcmp(full_ref, "refs/heads/") &&
+           !hashcmp(rev->cmdline.rev[positive].item->sha1, branch_sha1))
+               branch = xstrdup(full_ref + strlen("refs/heads/"));
+       free(full_ref);
+       return branch;
 }
 
 int cmd_format_patch(int argc, const char **argv, const char *prefix)
index 4183f9ae1ca89b166ee01878ce90e9fa33bbf0aa..7b536e0fd9e44ef4394a7050f03c55a1c62f6093 100755 (executable)
@@ -912,4 +912,18 @@ test_expect_success 'cover letter using branch description (3)' '
        grep hello actual >/dev/null
 '
 
+test_expect_success 'cover letter using branch description (4)' '
+       git checkout rebuild-1 &&
+       test_config branch.rebuild-1.description hello &&
+       git format-patch --stdout --cover-letter master.. >actual &&
+       grep hello actual >/dev/null
+'
+
+test_expect_success 'cover letter using branch description (5)' '
+       git checkout rebuild-1 &&
+       test_config branch.rebuild-1.description hello &&
+       git format-patch --stdout --cover-letter -2 HEAD >actual &&
+       grep hello actual >/dev/null
+'
+
 test_done