diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-03-14 11:49:40 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-03-14 17:59:24 -0700 |
commit | 621ff6759414e2a723f61b6d8fc04b9805eb0c20 (patch) | |
tree | 66a4e202a7baf9cf65c15bc17d182f65c1013d44 | |
parent | ed0b9d43097349f4d730472673c07f427480e14a (diff) | |
download | git-621ff6759414e2a723f61b6d8fc04b9805eb0c20.tar.gz git-621ff6759414e2a723f61b6d8fc04b9805eb0c20.tar.xz |
rev-parse: fix meaning of rev~ vs rev~0.
I think it would make more sense for rev~ to have the same guarantees that
rev^ has, namely to always return a commit. I would also suggest that not
giving a number would have the same effect of defaulting to 1, not 0.
Right now it's a bit illogical, but at least it's an _undocumented_
illogical behaviour.
This patch makes '^' and '~' act the same for the default count (i.e. both
default to 1), and also have the same behaviour for a count of zero.
Before (no discernible pattern):
[torvalds@woody git]$ git rev-parse v1.5.1 v1.5.1^0 v1.5.1~0 v1.5.1^ v1.5.1~
45354a57ee7e3e42c7137db6c94fa968c6babe8d
89815cab95268e8f0f58142b848ac4cd5e9cbdcb
45354a57ee7e3e42c7137db6c94fa968c6babe8d
045f5759c97746589a067461e50fad16f60711ac
45354a57ee7e3e42c7137db6c94fa968c6babe8d
After (fairly logical):
[torvalds@woody git]$ git rev-parse v1.5.1 v1.5.1^0 v1.5.1~0 v1.5.1^ v1.5.1~
45354a57ee7e3e42c7137db6c94fa968c6babe8d
89815cab95268e8f0f58142b848ac4cd5e9cbdcb
89815cab95268e8f0f58142b848ac4cd5e9cbdcb
045f5759c97746589a067461e50fad16f60711ac
045f5759c97746589a067461e50fad16f60711ac
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | sha1_name.c | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/sha1_name.c b/sha1_name.c index 13e11645e..6c9c1c75a 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -408,18 +408,22 @@ static int get_nth_ancestor(const char *name, int len, unsigned char *result, int generation) { unsigned char sha1[20]; - int ret = get_sha1_1(name, len, sha1); + struct commit *commit; + int ret; + + ret = get_sha1_1(name, len, sha1); if (ret) return ret; + commit = lookup_commit_reference(sha1); + if (!commit) + return -1; while (generation--) { - struct commit *commit = lookup_commit_reference(sha1); - - if (!commit || parse_commit(commit) || !commit->parents) + if (parse_commit(commit) || !commit->parents) return -1; - hashcpy(sha1, commit->parents->item->object.sha1); + commit = commit->parents->item; } - hashcpy(result, sha1); + hashcpy(result, commit->object.sha1); return 0; } @@ -526,9 +530,8 @@ static int get_sha1_1(const char *name, int len, unsigned char *sha1) int ret, has_suffix; const char *cp; - /* "name~3" is "name^^^", - * "name~" and "name~0" are name -- not "name^0"! - * "name^" is not "name^0"; it is "name^1". + /* + * "name~3" is "name^^^", "name~" is "name~1", and "name^" is "name^1". */ has_suffix = 0; for (cp = name + len - 1; name <= cp; cp--) { @@ -546,11 +549,10 @@ static int get_sha1_1(const char *name, int len, unsigned char *sha1) cp++; while (cp < name + len) num = num * 10 + *cp++ - '0'; - if (has_suffix == '^') { - if (!num && len1 == len - 1) - num = 1; + if (!num && len1 == len - 1) + num = 1; + if (has_suffix == '^') return get_parent(name, len1, sha1, num); - } /* else if (has_suffix == '~') -- goes without saying */ return get_nth_ancestor(name, len1, sha1, num); } |