static int process_tree(struct tree *tree)
{
struct tree_desc desc;
+ struct name_entry entry;
if (parse_tree(tree))
return -1;
desc.buf = tree->buffer;
desc.size = tree->size;
- 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)) {
- struct tree *tree = lookup_tree(sha1);
- process_tree(tree);
- } else {
- struct blob *blob = lookup_blob(sha1);
- process(&blob->object);
+ 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(tree->buffer);
tree->buffer = NULL;
int pull(char *target)
{
- struct ref_lock *lock;
+ struct ref_lock *lock = NULL;
unsigned char sha1[20];
char *msg;
int ret;
if (interpret_target(target, sha1)) {
error("Could not interpret %s as something to pull", target);
- unlock_ref(lock);
+ if (lock)
+ unlock_ref(lock);
return -1;
}
if (process(lookup_unknown_object(sha1))) {
- unlock_ref(lock);
+ if (lock)
+ unlock_ref(lock);
return -1;
}
if (loop()) {
- unlock_ref(lock);
+ if (lock)
+ unlock_ref(lock);
return -1;
}