On Sun, 13 Jul 2008, Shawn O. Pearce wrote: > 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* makes it simple to call > get_data_from_pack() to recover the compressed information. > > This however means we must add the missing baes object to the end Typo? > 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 indexing, as if it had been included by > the remote side. > > Signed-off-by: Shawn O. Pearce <spearce@xxxxxxxxxxx> ACK > --- > index-pack.c | 18 ++++++++++++------ > 1 files changed, 12 insertions(+), 6 deletions(-) > > diff --git a/index-pack.c b/index-pack.c > index 6c59fd3..7239e89 100644 > --- a/index-pack.c > +++ b/index-pack.c > @@ -29,6 +29,7 @@ union delta_base { > struct base_data { > struct base_data *base; > struct base_data *child; > + struct object_entry *obj; > void *data; > unsigned long size; > }; > @@ -476,6 +477,7 @@ static void resolve_delta(struct object_entry *delta_obj, > sha1_object(result.data, result.size, type, delta_obj->idx.sha1); > nr_resolved_deltas++; > > + result.obj = delta_obj; > link_base_data(base_obj, &result); > > hashcpy(delta_base.sha1, delta_obj->idx.sha1); > @@ -588,6 +590,7 @@ static void parse_pack_objects(unsigned char *sha1) > continue; > base_obj.data = get_data_from_pack(obj); > base_obj.size = obj->size; > + base_obj.obj = obj; > link_base_data(NULL, &base_obj); > > if (ref) > @@ -633,7 +636,8 @@ static int write_compressed(int fd, void *in, unsigned int size, uint32_t *obj_c > return size; > } > > -static void append_obj_to_pack(const unsigned char *sha1, void *buf, > +static struct object_entry *append_obj_to_pack( > + const unsigned char *sha1, void *buf, > unsigned long size, enum object_type type) > { > struct object_entry *obj = &objects[nr_objects++]; > @@ -654,6 +658,7 @@ static void append_obj_to_pack(const unsigned char *sha1, void *buf, > obj[1].idx.offset = obj[0].idx.offset + n; > obj[1].idx.offset += write_compressed(output_fd, buf, size, &obj[0].idx.crc32); > hashcpy(obj->idx.sha1, sha1); > + return obj; > } > > static int delta_pos_compare(const void *_a, const void *_b) > @@ -697,6 +702,12 @@ static void fix_unresolved_deltas(int nr_unresolved) > base_obj.data = read_sha1_file(d->base.sha1, &type, &base_obj.size); > if (!base_obj.data) > continue; > + > + if (check_sha1_signature(d->base.sha1, base_obj.data, > + base_obj.size, typename(type))) > + die("local object %s is corrupt", sha1_to_hex(d->base.sha1)); > + base_obj.obj = append_obj_to_pack(d->base.sha1, base_obj.data, > + base_obj.size, type); > link_base_data(NULL, &base_obj); > > find_delta_children(&d->base, &first, &last); > @@ -706,11 +717,6 @@ static void fix_unresolved_deltas(int nr_unresolved) > resolve_delta(child, &base_obj, type); > } > > - if (check_sha1_signature(d->base.sha1, base_obj.data, > - base_obj.size, typename(type))) > - die("local object %s is corrupt", sha1_to_hex(d->base.sha1)); > - append_obj_to_pack(d->base.sha1, base_obj.data, > - base_obj.size, type); > unlink_base_data(&base_obj); > display_progress(progress, nr_resolved_deltas); > } > -- > 1.5.6.2.393.g45096 > Nicolas -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html