summaryrefslogtreecommitdiff
path: root/tree.c
diff options
context:
space:
mode:
authorDaniel Barkalow <barkalow@iabervon.org>2006-01-26 01:13:36 -0500
committerJunio C Hamano <junkio@cox.net>2006-01-26 01:08:29 -0800
commit521698b1538fb3c9bd818ee98f2c17d2c80c9605 (patch)
tree0162088be261b4880ac40bda405f81cb9cebbdd9 /tree.c
parent731043fd4d55b1561ebb5a53daa4b9ff6dfac046 (diff)
downloadgit-521698b1538fb3c9bd818ee98f2c17d2c80c9605.tar.gz
Only use a single parser for tree objects
This makes read_tree_recursive and read_tree take a struct tree instead of a buffer. It also move the declaration of read_tree into tree.h (where struct tree is defined), and updates ls-tree and diff-index (the only places that presently use read_tree*()) to use the new versions. Signed-off-by: Daniel Barkalow <barkalow@iabervon.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'tree.c')
-rw-r--r--tree.c48
1 files changed, 18 insertions, 30 deletions
diff --git a/tree.c b/tree.c
index dc1c41e938..87e0d743f8 100644
--- a/tree.c
+++ b/tree.c
@@ -74,27 +74,24 @@ static int match_tree_entry(const char *base, int baselen, const char *path, uns
return 0;
}
-int read_tree_recursive(void *buffer, unsigned long size,
+int read_tree_recursive(struct tree *tree,
const char *base, int baselen,
int stage, const char **match,
read_tree_fn_t fn)
{
- while (size) {
- int len = strlen(buffer)+1;
- unsigned char *sha1 = buffer + len;
- char *path = strchr(buffer, ' ')+1;
- unsigned int mode;
-
- if (size < len + 20 || sscanf(buffer, "%o", &mode) != 1)
- return -1;
-
- buffer = sha1 + 20;
- size -= len + 20;
-
- if (!match_tree_entry(base, baselen, path, mode, match))
+ struct tree_entry_list *list;
+ if (parse_tree(tree))
+ return -1;
+ list = tree->entries;
+ while (list) {
+ struct tree_entry_list *current = list;
+ list = list->next;
+ if (!match_tree_entry(base, baselen, current->name,
+ current->mode, match))
continue;
- switch (fn(sha1, base, baselen, path, mode, stage)) {
+ switch (fn(current->item.any->sha1, base, baselen,
+ current->name, current->mode, stage)) {
case 0:
continue;
case READ_TREE_RECURSIVE:
@@ -102,28 +99,19 @@ int read_tree_recursive(void *buffer, unsigned long size,
default:
return -1;
}
- if (S_ISDIR(mode)) {
+ if (current->directory) {
int retval;
- int pathlen = strlen(path);
+ int pathlen = strlen(current->name);
char *newbase;
- void *eltbuf;
- char elttype[20];
- unsigned long eltsize;
- eltbuf = read_sha1_file(sha1, elttype, &eltsize);
- if (!eltbuf || strcmp(elttype, "tree")) {
- if (eltbuf) free(eltbuf);
- return -1;
- }
newbase = xmalloc(baselen + 1 + pathlen);
memcpy(newbase, base, baselen);
- memcpy(newbase + baselen, path, pathlen);
+ memcpy(newbase + baselen, current->name, pathlen);
newbase[baselen + pathlen] = '/';
- retval = read_tree_recursive(eltbuf, eltsize,
+ retval = read_tree_recursive(current->item.tree,
newbase,
baselen + pathlen + 1,
stage, match, fn);
- free(eltbuf);
free(newbase);
if (retval)
return -1;
@@ -133,9 +121,9 @@ int read_tree_recursive(void *buffer, unsigned long size,
return 0;
}
-int read_tree(void *buffer, unsigned long size, int stage, const char **match)
+int read_tree(struct tree *tree, int stage, const char **match)
{
- return read_tree_recursive(buffer, size, "", 0, stage, match, read_one_entry);
+ return read_tree_recursive(tree, "", 0, stage, match, read_one_entry);
}
struct tree *lookup_tree(const unsigned char *sha1)