From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Subject: [PATCH v4 14/18] sha1_name.c: many short names can only be committish
Date: Mon, 2 Jul 2012 15:34:05 -0700 [thread overview]
Message-ID: <1341268449-27801-15-git-send-email-gitster@pobox.com> (raw)
In-Reply-To: <1341268449-27801-1-git-send-email-gitster@pobox.com>
We know that the token "$name" that appear in "$name^{commit}",
"$name^4", "$name~4" etc. can only name a committish (either a
commit or a tag that peels to a commit). Teach get_short_sha1() to
take advantage of that knowledge when disambiguating an abbreviated
SHA-1 given as an object name.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
cache.h | 1 +
sha1_name.c | 32 ++++++++++++++++++++++++++++----
t/t1512-rev-parse-disambiguation.sh | 2 +-
3 files changed, 30 insertions(+), 5 deletions(-)
diff --git a/cache.h b/cache.h
index 29f0b2a..1acf3b4 100644
--- a/cache.h
+++ b/cache.h
@@ -813,6 +813,7 @@ struct object_context {
#define GET_SHA1_QUIETLY 01
#define GET_SHA1_COMMIT 02
+#define GET_SHA1_COMMITTISH 04
extern int get_sha1(const char *str, unsigned char *sha1);
extern void die_on_misspelt_object_name(const char *name, const char *prefix);
diff --git a/sha1_name.c b/sha1_name.c
index 6f6c49c..35ad473 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -224,6 +224,24 @@ static int disambiguate_commit_only(const unsigned char *sha1, void *cb_data_unu
return kind == OBJ_COMMIT;
}
+static int disambiguate_committish_only(const unsigned char *sha1, void *cb_data_unused)
+{
+ struct object *obj;
+ int kind;
+
+ kind = sha1_object_info(sha1, NULL);
+ if (kind == OBJ_COMMIT)
+ return 1;
+ if (kind != OBJ_TAG)
+ return 0;
+
+ /* We need to do this the hard way... */
+ obj = deref_tag(lookup_object(sha1), NULL, 0);
+ if (obj && obj->type == OBJ_COMMIT)
+ return 1;
+ return 0;
+}
+
static int get_short_sha1(const char *name, int len, unsigned char *sha1,
unsigned flags)
{
@@ -261,6 +279,8 @@ static int get_short_sha1(const char *name, int len, unsigned char *sha1,
memset(&ds, 0, sizeof(ds));
if (flags & GET_SHA1_COMMIT)
ds.fn = disambiguate_commit_only;
+ else if (flags & GET_SHA1_COMMITTISH)
+ ds.fn = disambiguate_committish_only;
find_short_object_filename(len, hex_pfx, &ds);
find_short_packed_object(len, bin_pfx, &ds);
@@ -440,9 +460,9 @@ static int get_parent(const char *name, int len,
unsigned char *result, int idx)
{
unsigned char sha1[20];
- int ret = get_sha1_1(name, len, sha1, 0);
struct commit *commit;
struct commit_list *p;
+ int ret = get_sha1_1(name, len, sha1, GET_SHA1_COMMITTISH);
if (ret)
return ret;
@@ -473,7 +493,7 @@ static int get_nth_ancestor(const char *name, int len,
struct commit *commit;
int ret;
- ret = get_sha1_1(name, len, sha1, 0);
+ ret = get_sha1_1(name, len, sha1, GET_SHA1_COMMITTISH);
if (ret)
return ret;
commit = lookup_commit_reference(sha1);
@@ -519,6 +539,7 @@ static int peel_onion(const char *name, int len, unsigned char *sha1)
unsigned char outer[20];
const char *sp;
unsigned int expected_type = 0;
+ unsigned lookup_flags;
struct object *o;
/*
@@ -554,7 +575,10 @@ static int peel_onion(const char *name, int len, unsigned char *sha1)
else
return -1;
- if (get_sha1_1(name, sp - name - 2, outer, 0))
+ if (expected_type == OBJ_COMMIT)
+ lookup_flags = GET_SHA1_COMMITTISH;
+
+ if (get_sha1_1(name, sp - name - 2, outer, lookup_flags))
return -1;
o = parse_object(outer);
@@ -666,7 +690,7 @@ static int get_sha1_1(const char *name, int len, unsigned char *sha1, unsigned l
if (!ret)
return 0;
- return get_short_sha1(name, len, sha1, 0);
+ return get_short_sha1(name, len, sha1, lookup_flags);
}
/*
diff --git a/t/t1512-rev-parse-disambiguation.sh b/t/t1512-rev-parse-disambiguation.sh
index 42701ad..823e288 100755
--- a/t/t1512-rev-parse-disambiguation.sh
+++ b/t/t1512-rev-parse-disambiguation.sh
@@ -54,7 +54,7 @@ test_expect_success 'first commit' '
git commit -m d8znjge0
'
-test_expect_failure 'disambiguate commit-ish' '
+test_expect_success 'disambiguate commit-ish' '
# feed commit-ish in an unambiguous way
git rev-parse --verify 1102198268^{commit} &&
--
1.7.11.1.212.g52fe12e
next prev parent reply other threads:[~2012-07-02 22:35 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-02 22:33 [PATCH v4 00/18] Extending the shelf-life of "git describe" output Junio C Hamano
2012-07-02 22:33 ` [PATCH v4 01/18] sha1_name.c: indentation fix Junio C Hamano
2012-07-02 22:33 ` [PATCH v4 02/18] sha1_name.c: hide get_sha1_with_context_1() ugliness Junio C Hamano
2012-07-02 22:33 ` [PATCH v4 03/18] sha1_name.c: get rid of ugly get_sha1_with_mode_1() Junio C Hamano
2012-07-03 8:01 ` Matthieu Moy
2012-07-03 17:19 ` Junio C Hamano
2012-07-04 7:12 ` Matthieu Moy
2012-07-02 22:33 ` [PATCH v4 04/18] sha1_name.c: get rid of get_sha1_with_mode() Junio C Hamano
2012-07-02 22:33 ` [PATCH v4 05/18] sha1_name.c: clarify what "fake" is for in find_short_object_filename() Junio C Hamano
2012-07-02 22:33 ` [PATCH v4 06/18] sha1_name.c: rename "now" to "current" Junio C Hamano
2012-07-02 22:33 ` [PATCH v4 07/18] sha1_name.c: refactor find_short_packed_object() Junio C Hamano
2012-07-02 22:33 ` [PATCH v4 08/18] sha1_name.c: correct misnamed "canonical" and "res" Junio C Hamano
2012-07-02 22:34 ` [PATCH v4 09/18] sha1_name.c: restructure disambiguation of short names Junio C Hamano
2012-07-02 22:34 ` [PATCH v4 10/18] sha1_name.c: allow get_short_sha1() to take other flags Junio C Hamano
2012-07-02 22:34 ` [PATCH v4 11/18] sha1_name.c: teach get_short_sha1() a commit-only option Junio C Hamano
2012-07-02 22:34 ` [PATCH v4 12/18] sha1_name.c: get_describe_name() by definition groks only commits Junio C Hamano
2012-07-02 22:34 ` [PATCH v4 13/18] sha1_name.c: get_sha1_1() takes lookup flags Junio C Hamano
2012-07-02 22:34 ` Junio C Hamano [this message]
2012-07-02 23:01 ` [PATCH v4 14/18] sha1_name.c: many short names can only be committish Junio C Hamano
2012-07-02 22:34 ` [PATCH v4 15/18] sha1_name.c: teach lookup context to get_sha1_with_context() Junio C Hamano
2012-07-02 22:34 ` [PATCH v4 16/18] sha1_name.c: introduce get_sha1_committish() Junio C Hamano
2012-07-02 22:34 ` [PATCH v4 17/18] revision.c: allow handle_revision_arg() to take other flags Junio C Hamano
2012-07-02 22:34 ` [PATCH v4 18/18] revision.c: the "log" family, except for "show", takes committish Junio C Hamano
2012-07-03 7:19 ` [PATCH v4 00/18] Extending the shelf-life of "git describe" output Jeff King
2012-07-03 17:19 ` Junio C Hamano
2012-07-03 18:20 ` Junio C Hamano
2012-07-03 18:38 ` Jeff King
2012-07-03 18:41 ` Junio C Hamano
2012-07-03 19:34 ` Jeff King
2012-07-03 20:21 ` Junio C Hamano
2012-07-03 20:24 ` Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1341268449-27801-15-git-send-email-gitster@pobox.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).