提交 4e38e9b1 编写于 作者: J Junio C Hamano

Merge branch 'jk/fast-export-object-lookup'

* jk/fast-export-object-lookup:
  fast-export: do not load blob objects twice
  fast-export: rename handle_object function
...@@ -113,12 +113,13 @@ static void show_progress(void) ...@@ -113,12 +113,13 @@ static void show_progress(void)
printf("progress %d objects\n", counter); printf("progress %d objects\n", counter);
} }
static void handle_object(const unsigned char *sha1) static void export_blob(const unsigned char *sha1)
{ {
unsigned long size; unsigned long size;
enum object_type type; enum object_type type;
char *buf; char *buf;
struct object *object; struct object *object;
int eaten;
if (no_data) if (no_data)
return; return;
...@@ -126,16 +127,18 @@ static void handle_object(const unsigned char *sha1) ...@@ -126,16 +127,18 @@ static void handle_object(const unsigned char *sha1)
if (is_null_sha1(sha1)) if (is_null_sha1(sha1))
return; return;
object = parse_object(sha1); object = lookup_object(sha1);
if (!object) if (object && object->flags & SHOWN)
die ("Could not read blob %s", sha1_to_hex(sha1));
if (object->flags & SHOWN)
return; return;
buf = read_sha1_file(sha1, &type, &size); buf = read_sha1_file(sha1, &type, &size);
if (!buf) if (!buf)
die ("Could not read blob %s", sha1_to_hex(sha1)); die ("Could not read blob %s", sha1_to_hex(sha1));
if (check_sha1_signature(sha1, buf, size, typename(type)) < 0)
die("sha1 mismatch in blob %s", sha1_to_hex(sha1));
object = parse_object_buffer(sha1, type, size, buf, &eaten);
if (!object)
die("Could not read blob %s", sha1_to_hex(sha1));
mark_next_object(object); mark_next_object(object);
...@@ -147,7 +150,8 @@ static void handle_object(const unsigned char *sha1) ...@@ -147,7 +150,8 @@ static void handle_object(const unsigned char *sha1)
show_progress(); show_progress();
object->flags |= SHOWN; object->flags |= SHOWN;
free(buf); if (!eaten)
free(buf);
} }
static int depth_first(const void *a_, const void *b_) static int depth_first(const void *a_, const void *b_)
...@@ -312,7 +316,7 @@ static void handle_commit(struct commit *commit, struct rev_info *rev) ...@@ -312,7 +316,7 @@ static void handle_commit(struct commit *commit, struct rev_info *rev)
/* Export the referenced blobs, and remember the marks. */ /* Export the referenced blobs, and remember the marks. */
for (i = 0; i < diff_queued_diff.nr; i++) for (i = 0; i < diff_queued_diff.nr; i++)
if (!S_ISGITLINK(diff_queued_diff.queue[i]->two->mode)) if (!S_ISGITLINK(diff_queued_diff.queue[i]->two->mode))
handle_object(diff_queued_diff.queue[i]->two->sha1); export_blob(diff_queued_diff.queue[i]->two->sha1);
mark_next_object(&commit->object); mark_next_object(&commit->object);
if (!is_encoding_utf8(encoding)) if (!is_encoding_utf8(encoding))
...@@ -512,7 +516,7 @@ static void get_tags_and_duplicates(struct rev_cmdline_info *info, ...@@ -512,7 +516,7 @@ static void get_tags_and_duplicates(struct rev_cmdline_info *info,
commit = (struct commit *)tag; commit = (struct commit *)tag;
break; break;
case OBJ_BLOB: case OBJ_BLOB:
handle_object(tag->object.sha1); export_blob(tag->object.sha1);
continue; continue;
default: /* OBJ_TAG (nested tags) is already handled */ default: /* OBJ_TAG (nested tags) is already handled */
warning("Tag points to object of unexpected type %s, skipping.", warning("Tag points to object of unexpected type %s, skipping.",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册