>>>>> "LT" == Linus Torvalds <torvalds@osdl.org> writes: LT> While adding a new object to a pack file is _possible_ (you add it to the LT> end of the pack-file, and re-generate the index file), I would strongly LT> suggest against it for several reasons: OK, people have convinced me not to dream on ;-). LT> Btw, I'm not claiming that my current pack format is "optimal" of course. LT> For example, while I write all objects in recency order, right now that LT> means that if a recent object has been written as a delta that depends on LT> an older one, I actually write the delta first (correct) but I won't write LT> the older object until its recency ordering (wrong). I agree. How does this one look? Lightly tested by packing, unpacking without -n and fsck'ing, not unpacking but placing it under .git/objects/pack and running fsck with --full, all using the current GIT repo. ------------ Deltas are useless by themselves and when you use them you need to get to their base objects. A base object should inherit recency from the most recent deltified object that is based on it and that is what this patch teaches git-pack-objects. Signed-off-by: Junio C Hamano <junkio@cox.net> --- cd /opt/packrat/playpen/public/in-place/git/git.junio/ jit-diff # - master: Use enhanced diff_delta() in the similarity estimator. # + (working tree) diff --git a/pack-objects.c b/pack-objects.c --- a/pack-objects.c +++ b/pack-objects.c @@ -118,6 +118,23 @@ static unsigned long write_object(struct return hdrlen + datalen; } +static unsigned long write_one(struct sha1file *f, + struct object_entry *e, + unsigned long offset) +{ + if (e->offset) + /* offset starts from header size and cannot be zero + * if it is written already. + */ + return offset; + e->offset = offset; + offset += write_object(f, e); + /* if we are delitified, write out its base object. */ + if (e->delta) + offset = write_one(f, e->delta, offset); + return offset; +} + static void write_pack_file(void) { int i; @@ -135,11 +152,9 @@ static void write_pack_file(void) hdr.hdr_entries = htonl(nr_objects); sha1write(f, &hdr, sizeof(hdr)); offset = sizeof(hdr); - for (i = 0; i < nr_objects; i++) { - struct object_entry *entry = objects + i; - entry->offset = offset; - offset += write_object(f, entry); - } + for (i = 0; i < nr_objects; i++) + offset = write_one(f, objects + i, offset); + sha1close(f, pack_file_sha1, 1); mb = offset >> 20; offset &= 0xfffff; Compilation finished at Tue Jun 28 17:43:31 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.htmlReceived on Wed Jun 29 10:54:07 2005
This archive was generated by hypermail 2.1.8 : 2005-06-29 10:54:10 EST