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
maint
Junio C Hamano 2013-03-25 14:01:05 -07:00
commit 4e38e9b1d0
1 changed files with 13 additions and 9 deletions

View File

@ -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)
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)
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)
/* 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,
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.",