summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2007-06-13 03:48:21 (GMT)
committerJunio C Hamano <gitster@pobox.com>2007-06-13 03:48:21 (GMT)
commit44bdc434e830cea881eb908e32d80d5bc0c71d4f (patch)
tree9636baf35f9087a4f1c2b2efce1056989064f2e9
parent2cf69cf6edbaa15ed47f9c73c0eb60ce7983ba6b (diff)
parente2ac7cb5fbcf1407003aa07cdcd14141527ea2e3 (diff)
downloadgit-44bdc434e830cea881eb908e32d80d5bc0c71d4f.zip
git-44bdc434e830cea881eb908e32d80d5bc0c71d4f.tar.gz
git-44bdc434e830cea881eb908e32d80d5bc0c71d4f.tar.bz2
Merge branch 'sv/objfixes' into maint
* sv/objfixes: Don't assume tree entries that are not dirs are blobs
-rw-r--r--object.c3
-rw-r--r--tree.c7
2 files changed, 9 insertions, 1 deletions
diff --git a/object.c b/object.c
index cfc4969..16793d9 100644
--- a/object.c
+++ b/object.c
@@ -160,8 +160,11 @@ struct object *parse_object_buffer(const unsigned char *sha1, enum object_type t
parse_tag_buffer(tag, buffer, size);
obj = &tag->object;
} else {
+ warning("object %s has unknown type id %d\n", sha1_to_hex(sha1), type);
obj = NULL;
}
+ if (obj && obj->type == OBJ_NONE)
+ obj->type = type;
*eaten_p = eaten;
return obj;
}
diff --git a/tree.c b/tree.c
index e4a39aa..e946dac 100644
--- a/tree.c
+++ b/tree.c
@@ -173,8 +173,13 @@ static void track_tree_refs(struct tree *item)
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);