[PATCH] delta check
[git/git.git] / tree.c
diff --git a/tree.c b/tree.c
index d9777bf..d448dae 100644 (file)
--- a/tree.c
+++ b/tree.c
@@ -18,7 +18,7 @@ static int read_one_entry(unsigned char *sha1, const char *base, int baselen, co
        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,
@@ -39,14 +39,17 @@ static int read_tree_recursive(void *buffer, unsigned long size,
                if (S_ISDIR(mode)) {
                        int retval;
                        int pathlen = strlen(path);
-                       char *newbase = xmalloc(baselen + 1 + pathlen);
+                       char *newbase;
                        void *eltbuf;
                        char elttype[20];
                        unsigned long eltsize;
 
                        eltbuf = read_sha1_file(sha1, elttype, &eltsize);
-                       if (!eltbuf || strcmp(elttype, "tree"))
+                       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);
                        newbase[baselen + pathlen] = '/';
@@ -80,6 +83,8 @@ struct tree *lookup_tree(unsigned char *sha1)
                ret->object.type = tree_type;
                return ret;
        }
+       if (!obj->type)
+               obj->type = tree_type;
        if (obj->type != tree_type) {
                error("Object %s is a %s, not a tree", 
                      sha1_to_hex(sha1), obj->type);