From: Junio C Hamano Date: Mon, 2 Jul 2012 19:04:52 +0000 (-0700) Subject: sha1_name.c: introduce get_sha1_committish() X-Git-Tag: v1.7.12-rc0~22^2~10 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=cd74e4733db3e2353077bdc7021caa70bed2a483;p=git.git sha1_name.c: introduce get_sha1_committish() Many callers know that the user meant to name a committish by syntactical positions where the object name appears. Calling this function allows the machinery to disambiguate shorter-than-unique abbreviated object names between committish and others. Note that this does NOT error out when the named object is not a committish. It is merely to give a hint to the disambiguation machinery. Signed-off-by: Junio C Hamano --- diff --git a/cache.h b/cache.h index e1fa63b31..e947b48d0 100644 --- a/cache.h +++ b/cache.h @@ -817,6 +817,7 @@ struct object_context { #define GET_SHA1_ONLY_TO_DIE 04000 extern int get_sha1(const char *str, unsigned char *sha1); +extern int get_sha1_committish(const char *str, unsigned char *sha1); extern void maybe_die_on_misspelt_object_name(const char *name, const char *prefix); extern int get_sha1_with_context(const char *str, unsigned flags, unsigned char *sha1, struct object_context *orc); diff --git a/commit.c b/commit.c index 35af4988f..8b84efff9 100644 --- a/commit.c +++ b/commit.c @@ -67,7 +67,7 @@ struct commit *lookup_commit_reference_by_name(const char *name) unsigned char sha1[20]; struct commit *commit; - if (get_sha1(name, sha1)) + if (get_sha1_committish(name, sha1)) return NULL; commit = lookup_commit_reference(sha1); if (!commit || parse_commit(commit)) diff --git a/revision.c b/revision.c index 7444f2eaa..c3160f2e6 100644 --- a/revision.c +++ b/revision.c @@ -979,7 +979,7 @@ static int add_parents_only(struct rev_info *revs, const char *arg_, int flags) flags ^= UNINTERESTING; arg++; } - if (get_sha1(arg, sha1)) + if (get_sha1_committish(arg, sha1)) return 0; while (1) { it = get_reference(revs, arg, sha1, 0); @@ -1120,8 +1120,8 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, next = "HEAD"; if (dotdot == arg) this = "HEAD"; - if (!get_sha1(this, from_sha1) && - !get_sha1(next, sha1)) { + if (!get_sha1_committish(this, from_sha1) && + !get_sha1_committish(next, sha1)) { struct commit *a, *b; struct commit_list *exclude; diff --git a/sha1_name.c b/sha1_name.c index c045be8e1..9e13d60bf 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -872,7 +872,7 @@ int get_sha1_mb(const char *name, unsigned char *sha1) struct strbuf sb; strbuf_init(&sb, dots - name); strbuf_add(&sb, name, dots - name); - st = get_sha1(sb.buf, sha1_tmp); + st = get_sha1_committish(sb.buf, sha1_tmp); strbuf_release(&sb); } if (st) @@ -881,7 +881,7 @@ int get_sha1_mb(const char *name, unsigned char *sha1) if (!one) return -1; - if (get_sha1(dots[3] ? (dots + 3) : "HEAD", sha1_tmp)) + if (get_sha1_committish(dots[3] ? (dots + 3) : "HEAD", sha1_tmp)) return -1; two = lookup_commit_reference_gently(sha1_tmp, 0); if (!two) @@ -999,6 +999,23 @@ int get_sha1(const char *name, unsigned char *sha1) return get_sha1_with_context(name, 0, sha1, &unused); } +/* + * Many callers know that the user meant to name a committish by + * syntactical positions where the object name appears. Calling this + * function allows the machinery to disambiguate shorter-than-unique + * abbreviated object names between committish and others. + * + * Note that this does NOT error out when the named object is not a + * committish. It is merely to give a hint to the disambiguation + * machinery. + */ +int get_sha1_committish(const char *name, unsigned char *sha1) +{ + struct object_context unused; + return get_sha1_with_context(name, GET_SHA1_COMMITTISH, + sha1, &unused); +} + /* Must be called only when object_name:filename doesn't exist. */ static void diagnose_invalid_sha1_path(const char *prefix, const char *filename, diff --git a/t/t1512-rev-parse-disambiguation.sh b/t/t1512-rev-parse-disambiguation.sh index 7652f1c2e..6f87d8ea9 100755 --- a/t/t1512-rev-parse-disambiguation.sh +++ b/t/t1512-rev-parse-disambiguation.sh @@ -102,7 +102,7 @@ test_expect_failure 'disambiguate commit' ' test $(git rev-parse $commit^) = $(git rev-parse 0000000000e4f) ' -test_expect_failure 'log name1..name2 takes only commit-ishes on both ends' ' +test_expect_success 'log name1..name2 takes only commit-ishes on both ends' ' git log 000000000..000000000 && git log ..000000000 && git log 000000000.. &&