Merge branch 'rh/peeling-tag-to-tag'
authorJunio C Hamano <gitster@pobox.com>
Fri, 20 Sep 2013 19:27:18 +0000 (12:27 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 20 Sep 2013 19:27:18 +0000 (12:27 -0700)
Make "foo^{tag}" to peel a tag to itself, i.e. no-op., and fail if
"foo" is not a tag. "git rev-parse --verify v1.0^{tag}" would be a
more convenient way to say "test $(git cat-file -t v1.0) = tag".

* rh/peeling-tag-to-tag:
peel_onion: do not assume length of x_type globals
peel_onion(): add support for <rev>^{tag}

Documentation/revisions.txt
sha1_name.c
t/t1511-rev-parse-caret.sh
index b0f4284cfbec9745d25fb242d32f808c83d0953f..71dcd12ebd25811ed2c4c41717371f3a97321288 100644 (file)
@@ -125,6 +125,9 @@ some output processing may assume ref names in UTF-8.
 object that exists, without requiring 'rev' to be a tag, and
 without dereferencing 'rev'; because a tag is already an object,
 it does not have to be dereferenced even once to get to an object.
++
+'rev{caret}\{tag\}' can be used to ensure that 'rev' identifies an
+existing tag object.
 
 '<rev>{caret}\{\}', e.g. 'v0.99.8{caret}\{\}'::
   A suffix '{caret}' followed by an empty brace pair
index ad79d7b81249b6908bb9728b88addbb2fe6955cd..78c093f79e40db5eada30f3bbf6cfe314fb22834 100644 (file)
@@ -677,11 +677,13 @@ static int peel_onion(const char *name, int len, unsigned char *sha1)
                return -1;
 
        sp++; /* beginning of type name, or closing brace for empty */
-       if (!strncmp(commit_type, sp, 6) && sp[6] == '}')
+       if (!prefixcmp(sp, "commit}"))
                expected_type = OBJ_COMMIT;
-       else if (!strncmp(tree_type, sp, 4) && sp[4] == '}')
+       else if (!prefixcmp(sp, "tag}"))
+               expected_type = OBJ_TAG;
+       else if (!prefixcmp(sp, "tree}"))
                expected_type = OBJ_TREE;
-       else if (!strncmp(blob_type, sp, 4) && sp[4] == '}')
+       else if (!prefixcmp(sp, "blob}"))
                expected_type = OBJ_BLOB;
        else if (!prefixcmp(sp, "object}"))
                expected_type = OBJ_ANY;
index eaefc777bd98aeb4cae2ba34eec0e5fe2c2fbd72..15973f20945769fd7661cd4b203e96032495a60e 100755 (executable)
@@ -54,6 +54,13 @@ test_expect_success 'ref^{tree}' '
        test_must_fail git rev-parse blob-tag^{tree}
 '
 
+test_expect_success 'ref^{tag}' '
+       test_must_fail git rev-parse HEAD^{tag} &&
+       git rev-parse commit-tag >expected &&
+       git rev-parse commit-tag^{tag} >actual &&
+       test_cmp expected actual
+'
+
 test_expect_success 'ref^{/.}' '
        git rev-parse master >expected &&
        git rev-parse master^{/.} >actual &&