X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=tree.c;h=d188c0fbaee110a17ca7a0d16dcc979091f44ded;hb=ac78e548049f4e86b38368d2c4b4dbb546c64ac6;hp=ef456be9dd0faee46435a3c3b126a36c2be58051;hpb=c9c3470aec3a1d753ac1e5f21358f6374c1add95;p=git.git diff --git a/tree.c b/tree.c index ef456be9d..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) @@ -152,18 +151,14 @@ static void 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; @@ -191,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));