X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=tree-walk.c;h=1869baede56da54f964e4300d0b4148e66999cab;hb=a8c40471ab0851bf9a58f7dc76f121258e0690e2;hp=3f83e98f3a443e4537f53abf32bcca1389c5d9d8;hpb=f4241c4c9a03d15957759e836eda7b8108ef881d;p=thirdparty%2Fgit.git diff --git a/tree-walk.c b/tree-walk.c index 3f83e98f3a..1869baede5 100644 --- a/tree-walk.c +++ b/tree-walk.c @@ -20,8 +20,8 @@ void *fill_tree_descriptor(struct tree_desc *desc, const unsigned char *sha1) static int entry_compare(struct name_entry *a, struct name_entry *b) { return base_name_compare( - a->path, a->pathlen, a->mode, - b->path, b->pathlen, b->mode); + a->path, tree_entry_len(a->path, a->sha1), a->mode, + b->path, tree_entry_len(b->path, b->sha1), b->mode); } static void entry_clear(struct name_entry *a) @@ -32,7 +32,6 @@ static void entry_clear(struct name_entry *a) static void entry_extract(struct tree_desc *t, struct name_entry *a) { a->sha1 = tree_entry_extract(t, &a->path, &a->mode); - a->pathlen = strlen(a->path); } void update_tree_entry(struct tree_desc *desc) @@ -93,7 +92,6 @@ int tree_entry(struct tree_desc *desc, struct name_entry *entry) entry->path = path; len = strlen(path); - entry->pathlen = len; path += len + 1; entry->sha1 = (const unsigned char *) path; @@ -113,7 +111,6 @@ void traverse_trees(int n, struct tree_desc *t, const char *base, traverse_callb struct name_entry *entry = xmalloc(n*sizeof(*entry)); for (;;) { - struct name_entry entry[3]; unsigned long mask = 0; int i, last; @@ -170,7 +167,7 @@ static int find_tree_entry(struct tree_desc *t, const char *name, unsigned char sha1 = tree_entry_extract(t, &entry, mode); update_tree_entry(t); - entrylen = strlen(entry); + entrylen = tree_entry_len(entry, sha1); if (entrylen > namelen) continue; cmp = memcmp(name, entry, entrylen); @@ -179,7 +176,7 @@ static int find_tree_entry(struct tree_desc *t, const char *name, unsigned char if (cmp < 0) break; if (entrylen == namelen) { - memcpy(result, sha1, 20); + hashcpy(result, sha1); return 0; } if (name[entrylen] != '/') @@ -187,7 +184,7 @@ static int find_tree_entry(struct tree_desc *t, const char *name, unsigned char if (!S_ISDIR(*mode)) break; if (++entrylen == namelen) { - memcpy(result, sha1, 20); + hashcpy(result, sha1); return 0; } return get_tree_entry(sha1, name + entrylen, result, mode); @@ -200,10 +197,17 @@ int get_tree_entry(const unsigned char *tree_sha1, const char *name, unsigned ch int retval; void *tree; struct tree_desc t; + unsigned char root[20]; - tree = read_object_with_reference(tree_sha1, tree_type, &t.size, NULL); + tree = read_object_with_reference(tree_sha1, tree_type, &t.size, root); if (!tree) return -1; + + if (name[0] == '\0') { + hashcpy(sha1, root); + return 0; + } + t.buf = tree; retval = find_tree_entry(&t, name, sha1, mode); free(tree);