diff options
author | Junio C Hamano <junkio@cox.net> | 2006-06-03 23:59:27 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-06-03 23:59:27 -0700 |
commit | 16a4c6ee0d9a3d07d4d0afbbc4e3467e78065eca (patch) | |
tree | e76b6ce43feac1834a88737554392cbf3eba04ee /fetch.c | |
parent | f0679f474a884df13ce032d81dde34175c0fa343 (diff) | |
parent | 6f9012b62517ca490e4131f24e03ff842527f1b9 (diff) | |
download | git-16a4c6ee0d9a3d07d4d0afbbc4e3467e78065eca.tar.gz git-16a4c6ee0d9a3d07d4d0afbbc4e3467e78065eca.tar.xz |
Merge branch 'lt/tree-2'
* lt/tree-2:
fetch.c: do not call process_tree() from process_tree().
tree_entry(): new tree-walking helper function
adjust to the rebased series by Linus.
Remove "tree->entries" tree-entry list from tree parser
Switch "read_tree_recursive()" over to tree-walk functionality
Make "tree_entry" have a SHA1 instead of a union of object pointers
Add raw tree buffer info to "struct tree"
Remove last vestiges of generic tree_entry_list
Convert fetch.c: process_tree() to raw tree walker
Convert "mark_tree_uninteresting()" to raw tree walker
Remove unused "zeropad" entry from tree_list_entry
fsck-objects: avoid unnecessary tree_entry_list usage
Remove "tree->entries" tree-entry list from tree parser
builtin-read-tree.c: avoid tree_entry_list in prime_cache_tree_rec()
Switch "read_tree_recursive()" over to tree-walk functionality
Make "tree_entry" have a SHA1 instead of a union of object pointers
Make "struct tree" contain the pointer to the tree buffer
Diffstat (limited to 'fetch.c')
-rw-r--r-- | fetch.c | 31 |
1 files changed, 22 insertions, 9 deletions
@@ -3,6 +3,7 @@ #include "cache.h" #include "commit.h" #include "tree.h" +#include "tree-walk.h" #include "tag.h" #include "blob.h" #include "refs.h" @@ -37,21 +38,33 @@ static int process(struct object *obj); static int process_tree(struct tree *tree) { - struct tree_entry_list *entry; + struct tree_desc desc; + struct name_entry entry; if (parse_tree(tree)) return -1; - entry = tree->entries; - tree->entries = NULL; - while (entry) { - struct tree_entry_list *next = entry->next; - if (process(entry->item.any)) + desc.buf = tree->buffer; + desc.size = tree->size; + while (tree_entry(&desc, &entry)) { + struct object *obj = NULL; + + if (S_ISDIR(entry.mode)) { + struct tree *tree = lookup_tree(entry.sha1); + if (tree) + obj = &tree->object; + } + else { + struct blob *blob = lookup_blob(entry.sha1); + if (blob) + obj = &blob->object; + } + if (!obj || process(obj)) return -1; - free(entry->name); - free(entry); - entry = next; } + free(tree->buffer); + tree->buffer = NULL; + tree->size = 0; return 0; } |