1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-23 07:56:24 +02:00

get_sha1(): :path and :[0-3]:path to extract from index.

Earlier patch to say <ent>:<path> by Linus was very useful, and
this extends the same idea to the current index.  An sha1
expression :<path> extracts the object name for the named path
from the current index.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2006-04-21 17:31:04 -07:00
parent 66ae0c7702
commit 73b0e5af9d

View File

@ -458,17 +458,55 @@ 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;
}
}
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;
}