Code

merge: do not mistake (ancestor of) tag for branch
authorJonathan Nieder <jrnieder@gmail.com>
Tue, 17 Aug 2010 06:52:48 +0000 (01:52 -0500)
committerJunio C Hamano <gitster@pobox.com>
Wed, 18 Aug 2010 21:02:02 +0000 (14:02 -0700)
If no branch 'foo' exists but a tag 'foo' does, then
git merge foo^ results in

Merge branch 'foo' (early part)

as a commit message, because the relevant code path checks that
refs/heads/foo is a valid refname for writing rather than for
reading.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/merge.c
t/t7600-merge.sh

index 37ce4f589f6582abf0d1ef5bd263f590a16853d5..2207f79969975225077ff16c7c368c4652548862 100644 (file)
@@ -437,7 +437,7 @@ static void merge_name(const char *remote, struct strbuf *msg)
                strbuf_addstr(&truname, "refs/heads/");
                strbuf_addstr(&truname, remote);
                strbuf_setlen(&truname, truname.len - len);
-               if (resolve_ref(truname.buf, buf_sha, 0, NULL)) {
+               if (resolve_ref(truname.buf, buf_sha, 1, NULL)) {
                        strbuf_addf(msg,
                                    "%s\t\tbranch '%s'%s of .\n",
                                    sha1_to_hex(remote_head->sha1),
index cde8390c1b9df6e6537a3538d8da11511b6644ec..16e5ba1d8cb9c10fc45bdf7fd3ea6d5d2acaac22 100755 (executable)
@@ -558,8 +558,11 @@ test_expect_success 'refresh the index before merging' '
        git merge c3
 '
 
-cat >expected <<EOF
-Merge branch 'c5' (early part)
+cat >expected.branch <<\EOF
+Merge branch 'c5-branch' (early part)
+EOF
+cat >expected.tag <<\EOF
+Merge commit 'c5~1'
 EOF
 
 test_expect_success 'merge early part of c2' '
@@ -577,9 +580,14 @@ test_expect_success 'merge early part of c2' '
        git add c6.c &&
        git commit -m c6 &&
        git tag c6 &&
+       git branch -f c5-branch c5 &&
+       git merge c5-branch~1 &&
+       git show -s --pretty=format:%s HEAD >actual.branch &&
+       git reset --keep HEAD^ &&
        git merge c5~1 &&
-       git show -s --pretty=format:%s HEAD > actual &&
-       test_cmp actual expected
+       git show -s --pretty=format:%s HEAD >actual.tag &&
+       test_cmp expected.branch actual.branch &&
+       test_cmp expected.tag actual.tag
 '
 
 test_debug 'gitk --all'