X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=tree.c;h=d188c0fbaee110a17ca7a0d16dcc979091f44ded;hb=ced38ea252cb8b0315f4d2a54648b11c6c090657;hp=a6032e35ecb2543b6efcae252e5815b804cb6f0a;hpb=9673198ee867cea4ed70d2cf54c1a2eb8f27bb46;p=git.git diff --git a/tree.c b/tree.c index a6032e35e..d188c0fba 100644 --- a/tree.c +++ b/tree.c @@ -4,7 +4,6 @@ #include "commit.h" #include "tag.h" #include "tree-walk.h" -#include const char *tree_type = "tree"; @@ -25,7 +24,7 @@ static int read_one_entry(const unsigned char *sha1, const char *base, int basel ce->ce_flags = create_ce_flags(baselen + len, stage); memcpy(ce->name, base, baselen); memcpy(ce->name + baselen, pathname, len+1); - memcpy(ce->sha1, sha1, 20); + hashcpy(ce->sha1, sha1); return add_cache_entry(ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_SKIP_DFCHECK); } @@ -84,8 +83,7 @@ int read_tree_recursive(struct tree *tree, if (parse_tree(tree)) return -1; - desc.buf = tree->buffer; - desc.size = tree->size; + init_tree_desc(&desc, tree->buffer, tree->size); while (tree_entry(&desc, &entry)) { if (!match_tree_entry(base, baselen, entry.path, entry.mode, match)) @@ -102,14 +100,15 @@ int read_tree_recursive(struct tree *tree, if (S_ISDIR(entry.mode)) { int retval; char *newbase; + unsigned int pathlen = tree_entry_len(entry.path, entry.sha1); - newbase = xmalloc(baselen + 1 + entry.pathlen); + newbase = xmalloc(baselen + 1 + pathlen); memcpy(newbase, base, baselen); - memcpy(newbase + baselen, entry.path, entry.pathlen); - newbase[baselen + entry.pathlen] = '/'; + memcpy(newbase + baselen, entry.path, pathlen); + newbase[baselen + pathlen] = '/'; retval = read_tree_recursive(lookup_tree(entry.sha1), newbase, - baselen + entry.pathlen + 1, + baselen + pathlen + 1, stage, match, fn); free(newbase); if (retval) @@ -144,7 +143,7 @@ struct tree *lookup_tree(const unsigned char *sha1) return (struct tree *) obj; } -static int track_tree_refs(struct tree *item) +static void track_tree_refs(struct tree *item) { int n_refs = 0, i; struct object_refs *refs; @@ -152,18 +151,14 @@ static int track_tree_refs(struct tree *item) struct name_entry entry; /* Count how many entries there are.. */ - desc.buf = item->buffer; - desc.size = item->size; - while (desc.size) { + init_tree_desc(&desc, item->buffer, item->size); + while (tree_entry(&desc, &entry)) n_refs++; - update_tree_entry(&desc); - } /* Allocate object refs and walk it again.. */ i = 0; refs = alloc_object_refs(n_refs); - desc.buf = item->buffer; - desc.size = item->size; + init_tree_desc(&desc, item->buffer, item->size); while (tree_entry(&desc, &entry)) { struct object *obj; @@ -174,7 +169,6 @@ static int track_tree_refs(struct tree *item) refs->ref[i++] = obj; } set_object_refs(&item->object, refs); - return 0; } int parse_tree_buffer(struct tree *item, void *buffer, unsigned long size) @@ -192,17 +186,17 @@ int parse_tree_buffer(struct tree *item, void *buffer, unsigned long size) int parse_tree(struct tree *item) { - char type[20]; + enum object_type type; void *buffer; unsigned long size; if (item->object.parsed) return 0; - buffer = read_sha1_file(item->object.sha1, type, &size); + buffer = read_sha1_file(item->object.sha1, &type, &size); if (!buffer) return error("Could not read %s", sha1_to_hex(item->object.sha1)); - if (strcmp(type, tree_type)) { + if (type != OBJ_TREE) { free(buffer); return error("Object %s not a tree", sha1_to_hex(item->object.sha1));