@matheusbsbs / matheus-bagliano / commits / 03993e139c
Fork 0

index-pack: Track the object_entry that creates each base_data

If we free the data stored within a base_data we need the struct object_entry to get the data back again for use with another dependent delta. Storing the object_entry* in base_data makes it simple to call get_data_from_pack() to recover the compressed information. This however means that we must add the missing base object to the end of our packfile prior to calling resolve_delta() on each of the dependent deltas. Adding the base first ensures we can read the base back from the pack we are indexing, as if it had been included by the remote side. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Shawn O. Pearce committed Jul 13, 2008 at 22:07 UTC 03993e139cafd04c3783902243328442a5b4aa2c
1 file changed +12 -6
index-pack.c
+12 -6
@@ -29,6 +29,7 @@ union delta_base {
29 struct base_data {
30 struct base_data *base;
31 struct base_data *child;
32 + struct object_entry *obj;
33 void *data;
34 unsigned long size;
35 };
@@ -475,6 +476,7 @@ static void resolve_delta(struct object_entry *delta_obj,
476 sha1_object(result.data, result.size, type, delta_obj->idx.sha1);
477 nr_resolved_deltas++;
478
479 + result.obj = delta_obj;
480 link_base_data(base_obj, &result);
481
482 hashcpy(delta_base.sha1, delta_obj->idx.sha1);
@@ -587,6 +589,7 @@ static void parse_pack_objects(unsigned char *sha1)
589 continue;
590 base_obj.data = get_data_from_pack(obj);
591 base_obj.size = obj->size;
592 + base_obj.obj = obj;
593 link_base_data(NULL, &base_obj);
594
595 if (ref)
@@ -632,7 +635,8 @@ static int write_compressed(int fd, void *in, unsigned int size, uint32_t *obj_c
635 return size;
636 }
637
635 -static void append_obj_to_pack(const unsigned char *sha1, void *buf,
638 +static struct object_entry *append_obj_to_pack(
639 + const unsigned char *sha1, void *buf,
640 unsigned long size, enum object_type type)
641 {
642 struct object_entry *obj = &objects[nr_objects++];
@@ -653,6 +657,7 @@ static void append_obj_to_pack(const unsigned char *sha1, void *buf,
657 obj[1].idx.offset = obj[0].idx.offset + n;
658 obj[1].idx.offset += write_compressed(output_fd, buf, size, &obj[0].idx.crc32);
659 hashcpy(obj->idx.sha1, sha1);
660 + return obj;
661 }
662
663 static int delta_pos_compare(const void *_a, const void *_b)
@@ -696,6 +701,12 @@ static void fix_unresolved_deltas(int nr_unresolved)
701 base_obj.data = read_sha1_file(d->base.sha1, &type, &base_obj.size);
702 if (!base_obj.data)
703 continue;
704 +
705 + if (check_sha1_signature(d->base.sha1, base_obj.data,
706 + base_obj.size, typename(type)))
707 + die("local object %s is corrupt", sha1_to_hex(d->base.sha1));
708 + base_obj.obj = append_obj_to_pack(d->base.sha1, base_obj.data,
709 + base_obj.size, type);
710 link_base_data(NULL, &base_obj);
711
712 find_delta_children(&d->base, &first, &last);
@@ -705,11 +716,6 @@ static void fix_unresolved_deltas(int nr_unresolved)
716 resolve_delta(child, &base_obj, type);
717 }
718
708 - if (check_sha1_signature(d->base.sha1, base_obj.data,
709 - base_obj.size, typename(type)))
710 - die("local object %s is corrupt", sha1_to_hex(d->base.sha1));
711 - append_obj_to_pack(d->base.sha1, base_obj.data,
712 - base_obj.size, type);
719 unlink_base_data(&base_obj);
720 display_progress(progress, nr_resolved_deltas);
721 }