diff options
author | Linus Torvalds <torvalds@osdl.org> | 2006-05-29 23:18:00 +0400 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-05-30 06:05:14 +0400 |
commit | 1ccf5a345a6e7974ec0380eed735c2db97e50b4c (patch) | |
tree | 968330ac27eced499e0a426e93666c7e296ef4af | |
parent | 0790a42a502701c7b58e9ad4123e46bf46bbf319 (diff) |
builtin-read-tree.c: avoid tree_entry_list in prime_cache_tree_rec()
Use the raw tree walker instead.
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r-- | builtin-read-tree.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/builtin-read-tree.c b/builtin-read-tree.c index 5e513c85ca..67492bfb45 100644 --- a/builtin-read-tree.c +++ b/builtin-read-tree.c @@ -9,6 +9,7 @@ #include "object.h" #include "tree.h" +#include "tree-walk.h" #include "cache-tree.h" #include <sys/time.h> #include <signal.h> @@ -775,19 +776,28 @@ static int read_cache_unmerged(void) static void prime_cache_tree_rec(struct cache_tree *it, struct tree *tree) { - struct tree_entry_list *ent; + struct tree_desc desc; int cnt; memcpy(it->sha1, tree->object.sha1, 20); - for (cnt = 0, ent = tree->entries; ent; ent = ent->next) { - if (!ent->directory) + desc.buf = tree->buffer; + desc.size = tree->size; + cnt = 0; + while (desc.size) { + unsigned mode; + const char *name; + const unsigned char *sha1; + + sha1 = tree_entry_extract(&desc, &name, &mode); + update_tree_entry(&desc); + if (!S_ISDIR(mode)) cnt++; else { struct cache_tree_sub *sub; - struct tree *subtree = lookup_tree(ent->sha1); + struct tree *subtree = lookup_tree(sha1); if (!subtree->object.parsed) parse_tree(subtree); - sub = cache_tree_sub(it, ent->name); + sub = cache_tree_sub(it, name); sub->cache_tree = cache_tree(); prime_cache_tree_rec(sub->cache_tree, subtree); cnt += sub->cache_tree->entry_count; |