]> granicus.if.org Git - git/commitdiff
fast-export: do not parse non-commit objects while reading marks file
authorFelipe Contreras <felipe.contreras@gmail.com>
Sun, 5 May 2013 22:38:53 +0000 (17:38 -0500)
committerJunio C Hamano <gitster@pobox.com>
Tue, 7 May 2013 14:03:01 +0000 (07:03 -0700)
We read from the marks file and keep only marked commits, but in
order to find the type of object, we are parsing the whole thing,
which is slow, specially in big repositories with lots of big files.

There's no need for that, we can query the object information with
sha1_object_info().

Before this, loading the objects of a fresh emacs import, with 260598
blobs took 14 minutes, after this patch, it takes 3 seconds.

This is the way fast-import does it. Also die if the object is not
found (like fast-import).

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fast-export.c

index d60d675f6f5f1a2df50bdd3a6ba076e8c0ddd1f2..dd561e5031955b54c995abde1271c4841c3c7d24 100644 (file)
@@ -613,6 +613,7 @@ static void import_marks(char *input_file)
                char *line_end, *mark_end;
                unsigned char sha1[20];
                struct object *object;
+               enum object_type type;
 
                line_end = strchr(line, '\n');
                if (line[0] != ':' || !line_end)
@@ -627,17 +628,19 @@ static void import_marks(char *input_file)
                if (last_idnum < mark)
                        last_idnum = mark;
 
-               object = parse_object(sha1);
-               if (!object)
+               type = sha1_object_info(sha1, NULL);
+               if (type < 0)
+                       die("object not found: %s", sha1_to_hex(sha1));
+
+               if (type != OBJ_COMMIT)
+                       /* only commits */
                        continue;
 
+               object = parse_object(sha1);
+
                if (object->flags & SHOWN)
                        error("Object %s already has a mark", sha1_to_hex(sha1));
 
-               if (object->type != OBJ_COMMIT)
-                       /* only commits */
-                       continue;
-
                mark_object(object, mark);
 
                object->flags |= SHOWN;