format-patch: pick up correct branch name from symbolic ref

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>
This commit is contained in:
Nguyễn Thái Ngọc Duy 2013-01-03 21:03:10 +07:00 committed by Junio C Hamano
parent e216cc48da
commit 20b630aae9
2 changed files with 23 additions and 12 deletions

View file

@ -1014,8 +1014,8 @@ static char *find_branch_name(struct rev_info *rev)
{ {
int i, positive = -1; int i, positive = -1;
unsigned char branch_sha1[20]; unsigned char branch_sha1[20];
struct strbuf buf = STRBUF_INIT; const char *ref;
const char *branch; char *full_ref, *branch = NULL;
for (i = 0; i < rev->cmdline.nr; i++) { for (i = 0; i < rev->cmdline.nr; i++) {
if (rev->cmdline.rev[i].flags & UNINTERESTING) if (rev->cmdline.rev[i].flags & UNINTERESTING)
@ -1027,16 +1027,13 @@ static char *find_branch_name(struct rev_info *rev)
} }
if (positive < 0) if (positive < 0)
return NULL; return NULL;
strbuf_addf(&buf, "refs/heads/%s", rev->cmdline.rev[positive].name); ref = rev->cmdline.rev[positive].name;
branch = resolve_ref_unsafe(buf.buf, branch_sha1, 1, NULL); if (dwim_ref(ref, strlen(ref), branch_sha1, &full_ref) &&
if (!branch || !prefixcmp(full_ref, "refs/heads/") &&
prefixcmp(branch, "refs/heads/") || !hashcmp(rev->cmdline.rev[positive].item->sha1, branch_sha1))
hashcmp(rev->cmdline.rev[positive].item->sha1, branch_sha1)) branch = xstrdup(full_ref + strlen("refs/heads/"));
branch = NULL; free(full_ref);
strbuf_release(&buf); return branch;
if (branch)
return xstrdup(rev->cmdline.rev[positive].name);
return NULL;
} }
int cmd_format_patch(int argc, const char **argv, const char *prefix) int cmd_format_patch(int argc, const char **argv, const char *prefix)

View file

@ -912,4 +912,18 @@ test_expect_success 'cover letter using branch description (3)' '
grep hello actual >/dev/null 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 test_done