Code

revision.c: remove duplicated parents after history simplification
[git.git] / tree.c
diff --git a/tree.c b/tree.c
index dbb63fc52543c06cfd24f7858bbad490c700c5ed..04fe653a8e25feb0fc15f76ba487d0f8dbd52f82 100644 (file)
--- a/tree.c
+++ b/tree.c
@@ -127,12 +127,8 @@ int read_tree(struct tree *tree, int stage, const char **match)
 struct tree *lookup_tree(const unsigned char *sha1)
 {
        struct object *obj = lookup_object(sha1);
-       if (!obj) {
-               struct tree *ret = alloc_tree_node();
-               created_object(sha1, &ret->object);
-               ret->object.type = OBJ_TREE;
-               return ret;
-       }
+       if (!obj)
+               return create_object(sha1, OBJ_TREE, alloc_tree_node());
        if (!obj->type)
                obj->type = OBJ_TREE;
        if (obj->type != OBJ_TREE) {
@@ -161,7 +157,7 @@ static void track_tree_refs(struct tree *item)
        /* Count how many entries there are.. */
        init_tree_desc(&desc, item->buffer, item->size);
        while (tree_entry(&desc, &entry)) {
-               if (S_ISDIRLNK(entry.mode))
+               if (S_ISGITLINK(entry.mode))
                        continue;
                n_refs++;
        }
@@ -173,12 +169,17 @@ static void track_tree_refs(struct tree *item)
        while (tree_entry(&desc, &entry)) {
                struct object *obj;
 
-               if (S_ISDIRLNK(entry.mode))
+               if (S_ISGITLINK(entry.mode))
                        continue;
                if (S_ISDIR(entry.mode))
                        obj = &lookup_tree(entry.sha1)->object;
-               else
+               else if (S_ISREG(entry.mode) || S_ISLNK(entry.mode))
                        obj = &lookup_blob(entry.sha1)->object;
+               else {
+                       warning("in tree %s: entry %s has bad mode %.6o\n",
+                            sha1_to_hex(item->object.sha1), entry.path, entry.mode);
+                       obj = lookup_unknown_object(entry.sha1);
+               }
                refs->ref[i++] = obj;
        }
        set_object_refs(&item->object, refs);