Add support for ^{tag} to the disambiguation logic. Before this ^{tag}
would simply be ignored:

    $ git rev-parse e8f2^{tag}
    error: short SHA1 e8f2 is ambiguous
    hint: The candidates are:
    hint:   e8f2650052 tag v2.17.0
    hint:   e8f21caf94 commit 2013-06-24 - bash prompt: print unique detached 
HEAD abbreviated object name
    hint:   e8f26250fa commit 2017-02-03 - Merge pull request #996 from 
jeffhostetler/jeffhostetler/register_rename_src
    hint:   e8f2bc0c06 commit 2015-05-10 - Documentation: note behavior for 
multiple remote.url entries
    hint:   e8f2093055 tree
    hint:   e8f25a3a50 tree
    hint:   e8f28d537c tree
    hint:   e8f2cf6ec0 tree
    hint:   e8f21d02f7 blob
    hint:   e8f21d577c blob
    hint:   e8f2867228 blob
    hint:   e8f2a35526 blob
    e8f2^{tag}

Now the logic added in ed1ca6025f ("peel_onion: disambiguate to favor
tree-ish when we know we want a tree-ish", 2013-03-31) has been
extended to support it.

    $ git rev-parse e8f2^{tag}
    e8f2650052f3ff646023725e388ea1112b020e79

Signed-off-by: Ævar Arnfjörð Bjarmason <ava...@gmail.com>
---
 cache.h                             |  5 +++--
 sha1-name.c                         | 13 ++++++++++++-
 t/t1512-rev-parse-disambiguation.sh |  5 ++++-
 3 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/cache.h b/cache.h
index 77b7acebb6..3f6a292ba6 100644
--- a/cache.h
+++ b/cache.h
@@ -1322,8 +1322,9 @@ struct object_context {
 #define GET_OID_TREE             010
 #define GET_OID_TREEISH          020
 #define GET_OID_BLOB             040
-#define GET_OID_FOLLOW_SYMLINKS 0100
-#define GET_OID_RECORD_PATH     0200
+#define GET_OID_TAG             0100
+#define GET_OID_FOLLOW_SYMLINKS 0200
+#define GET_OID_RECORD_PATH     0400
 #define GET_OID_ONLY_TO_DIE    04000
 
 #define GET_OID_DISAMBIGUATORS \
diff --git a/sha1-name.c b/sha1-name.c
index 46d8b1afa6..68d5f65362 100644
--- a/sha1-name.c
+++ b/sha1-name.c
@@ -221,6 +221,12 @@ static int finish_object_disambiguation(struct 
disambiguate_state *ds,
        return 0;
 }
 
+static int disambiguate_tag_only(const struct object_id *oid, void 
*cb_data_unused)
+{
+       int kind = oid_object_info(oid, NULL);
+       return kind == OBJ_TAG;
+}
+
 static int disambiguate_commit_only(const struct object_id *oid, void 
*cb_data_unused)
 {
        int kind = oid_object_info(oid, NULL);
@@ -288,7 +294,8 @@ int set_disambiguate_hint_config(const char *var, const 
char *value)
                { "committish", disambiguate_committish_only },
                { "tree", disambiguate_tree_only },
                { "treeish", disambiguate_treeish_only },
-               { "blob", disambiguate_blob_only }
+               { "blob", disambiguate_blob_only },
+               { "tag", disambiguate_tag_only }
        };
        int i;
 
@@ -429,6 +436,8 @@ static int get_short_oid(const char *name, int len, struct 
object_id *oid,
                ds.fn = disambiguate_treeish_only;
        else if (flags & GET_OID_BLOB)
                ds.fn = disambiguate_blob_only;
+       else if (flags & GET_OID_TAG)
+               ds.fn = disambiguate_tag_only;
        else
                ds.fn = default_disambiguate_hint;
 
@@ -958,6 +967,8 @@ static int peel_onion(const char *name, int len, struct 
object_id *oid,
        lookup_flags &= ~GET_OID_DISAMBIGUATORS;
        if (expected_type == OBJ_COMMIT)
                lookup_flags |= GET_OID_COMMITTISH;
+       else if (expected_type == OBJ_TAG)
+               lookup_flags |= GET_OID_TAG;
        else if (expected_type == OBJ_TREE)
                lookup_flags |= GET_OID_TREEISH;
 
diff --git a/t/t1512-rev-parse-disambiguation.sh 
b/t/t1512-rev-parse-disambiguation.sh
index 711704ba5a..c7ceda2f21 100755
--- a/t/t1512-rev-parse-disambiguation.sh
+++ b/t/t1512-rev-parse-disambiguation.sh
@@ -334,7 +334,10 @@ test_expect_success C_LOCALE_OUTPUT 'ambiguity hints 
respect type' '
        test_must_fail git rev-parse 000000000^{commit} 2>stderr &&
        grep ^hint: stderr >hints &&
        # 5 commits, 1 tag (which is a commitish), plus intro line
-       test_line_count = 7 hints
+       test_line_count = 7 hints &&
+       git rev-parse 000000000^{tag} >stdout &&
+       test_line_count = 1 stdout &&
+       grep -q ^0000000000f8f stdout
 '
 
 test_expect_success C_LOCALE_OUTPUT 'failed type-selector still shows hint' '
-- 
2.17.0.290.gded63e768a

Reply via email to