memcpy(ce->name, base, baselen);
memcpy(ce->name + baselen, pathname, len+1);
memcpy(ce->sha1, sha1, 20);
- return add_cache_entry(ce, 1);
+ return add_cache_entry(ce, ADD_CACHE_OK_TO_ADD);
}
static int read_tree_recursive(void *buffer, unsigned long size,
return (struct tree *) obj;
}
-int parse_tree(struct tree *item)
+int parse_tree_buffer(struct tree *item, void *buffer, unsigned long size)
{
- char type[20];
- void *buffer, *bufptr;
- unsigned long size;
+ void *bufptr = buffer;
struct tree_entry_list **list_p;
+
if (item->object.parsed)
return 0;
item->object.parsed = 1;
- buffer = bufptr = 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))
- return error("Object %s not a tree",
- sha1_to_hex(item->object.sha1));
list_p = &item->entries;
while (size) {
struct object *obj;
entry = xmalloc(sizeof(struct tree_entry_list));
entry->name = strdup(path + 1);
- entry->directory = S_ISDIR(mode);
- entry->executable = mode & S_IXUSR;
+ entry->directory = S_ISDIR(mode) != 0;
+ entry->executable = (mode & S_IXUSR) != 0;
+ entry->symlink = S_ISLNK(mode) != 0;
+ entry->mode = mode;
entry->next = NULL;
bufptr += len + 20;
}
return 0;
}
+
+int parse_tree(struct tree *item)
+{
+ char type[20];
+ void *buffer;
+ unsigned long size;
+ int ret;
+
+ if (item->object.parsed)
+ return 0;
+ 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)) {
+ free(buffer);
+ return error("Object %s not a tree",
+ sha1_to_hex(item->object.sha1));
+ }
+ ret = parse_tree_buffer(item, buffer, size);
+ free(buffer);
+ return ret;
+}