diff options
author | Junio C Hamano <junkio@cox.net> | 2006-05-09 16:44:59 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-05-09 16:44:59 -0700 |
commit | b9895c06882c0e395a2d22c3649e53bd342b535e (patch) | |
tree | 8e6be32660bcfc7b0a409eadd949c886898aaaf4 | |
parent | Merge branch 'jc/again' (diff) | |
parent | get_sha1() - fix infinite loop on nonexistent stage. (diff) | |
download | tgif-b9895c06882c0e395a2d22c3649e53bd342b535e.tar.xz |
Merge branch 'jc/xsha1'
* jc/xsha1:
get_sha1() - fix infinite loop on nonexistent stage.
get_sha1(): :path and :[0-3]:path to extract from index.
-rw-r--r-- | sha1_name.c | 55 |
1 files changed, 47 insertions, 8 deletions
diff --git a/sha1_name.c b/sha1_name.c index 345935bb2b..dc6835520c 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -458,17 +458,56 @@ int get_sha1(const char *name, unsigned char *sha1) { int ret; unsigned unused; + int namelen = strlen(name); + const char *cp; prepare_alt_odb(); - ret = get_sha1_1(name, strlen(name), sha1); - if (ret < 0) { - const char *cp = strchr(name, ':'); - if (cp) { - unsigned char tree_sha1[20]; - if (!get_sha1_1(name, cp-name, tree_sha1)) - return get_tree_entry(tree_sha1, cp+1, sha1, - &unused); + ret = get_sha1_1(name, namelen, sha1); + if (!ret) + return ret; + /* sha1:path --> object name of path in ent sha1 + * :path -> object name of path in index + * :[0-3]:path -> object name of path in index at stage + */ + if (name[0] == ':') { + int stage = 0; + struct cache_entry *ce; + int pos; + if (namelen < 3 || + name[2] != ':' || + name[1] < '0' || '3' < name[1]) + cp = name + 1; + else { + stage = name[1] - '0'; + cp = name + 3; } + namelen = namelen - (cp - name); + if (!active_cache) + read_cache(); + if (active_nr < 0) + return -1; + pos = cache_name_pos(cp, namelen); + if (pos < 0) + pos = -pos - 1; + while (pos < active_nr) { + ce = active_cache[pos]; + if (ce_namelen(ce) != namelen || + memcmp(ce->name, cp, namelen)) + break; + if (ce_stage(ce) == stage) { + memcpy(sha1, ce->sha1, 20); + return 0; + } + pos++; + } + return -1; + } + cp = strchr(name, ':'); + if (cp) { + unsigned char tree_sha1[20]; + if (!get_sha1_1(name, cp-name, tree_sha1)) + return get_tree_entry(tree_sha1, cp+1, sha1, + &unused); } return ret; } |