Code

doc typo: s/prior committing/prior to committing/
[git.git] / object.c
index 7bd3fec55655584f9cf4aebc6a13de7b84a78af5..5a5ebe27b0db0506dc1a6606d30e328c53275c18 100644 (file)
--- a/object.c
+++ b/object.c
@@ -136,32 +136,44 @@ struct object *parse_object_buffer(const unsigned char *sha1, enum object_type t
        struct object *obj;
        int eaten = 0;
 
+       obj = NULL;
        if (type == OBJ_BLOB) {
                struct blob *blob = lookup_blob(sha1);
-               parse_blob_buffer(blob, buffer, size);
-               obj = &blob->object;
+               if (blob) {
+                       parse_blob_buffer(blob, buffer, size);
+                       obj = &blob->object;
+               }
        } else if (type == OBJ_TREE) {
                struct tree *tree = lookup_tree(sha1);
-               obj = &tree->object;
-               if (!tree->object.parsed) {
-                       parse_tree_buffer(tree, buffer, size);
-                       eaten = 1;
+               if (tree) {
+                       obj = &tree->object;
+                       if (!tree->object.parsed) {
+                               parse_tree_buffer(tree, buffer, size);
+                               eaten = 1;
+                       }
                }
        } else if (type == OBJ_COMMIT) {
                struct commit *commit = lookup_commit(sha1);
-               parse_commit_buffer(commit, buffer, size);
-               if (!commit->buffer) {
-                       commit->buffer = buffer;
-                       eaten = 1;
+               if (commit) {
+                       parse_commit_buffer(commit, buffer, size);
+                       if (!commit->buffer) {
+                               commit->buffer = buffer;
+                               eaten = 1;
+                       }
+                       obj = &commit->object;
                }
-               obj = &commit->object;
        } else if (type == OBJ_TAG) {
                struct tag *tag = lookup_tag(sha1);
-               parse_tag_buffer(tag, buffer, size);
-               obj = &tag->object;
+               if (tag) {
+                       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;
 }
@@ -176,6 +188,7 @@ struct object *parse_object(const unsigned char *sha1)
        if (buffer) {
                struct object *obj;
                if (check_sha1_signature(sha1, buffer, size, typename(type)) < 0) {
+                       free(buffer);
                        error("sha1 mismatch %s\n", sha1_to_hex(sha1));
                        return NULL;
                }
@@ -230,6 +243,11 @@ int object_list_contains(struct object_list *list, struct object *obj)
 }
 
 void add_object_array(struct object *obj, const char *name, struct object_array *array)
+{
+       add_object_array_with_mode(obj, name, array, S_IFINVALID);
+}
+
+void add_object_array_with_mode(struct object *obj, const char *name, struct object_array *array, unsigned mode)
 {
        unsigned nr = array->nr;
        unsigned alloc = array->alloc;
@@ -243,5 +261,6 @@ void add_object_array(struct object *obj, const char *name, struct object_array
        }
        objects[nr].item = obj;
        objects[nr].name = name;
+       objects[nr].mode = mode;
        array->nr = ++nr;
 }