diff options
author | Junio C Hamano <junkio@cox.net> | 2005-06-28 17:49:27 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-28 20:37:42 -0700 |
commit | 9d5ab9625ddb53a68a99516225d0bcb39ec473d5 (patch) | |
tree | 50c53ecc9651c7f697aabac2cd48e3f7d04ce638 | |
parent | git-unpack-objects: re-write to read from stdin (diff) | |
download | tgif-9d5ab9625ddb53a68a99516225d0bcb39ec473d5.tar.xz |
[PATCH] Emit base objects of a delta chain when the delta is output.
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>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | pack-objects.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/pack-objects.c b/pack-objects.c index 36f515b738..feee5600b9 100644 --- a/pack-objects.c +++ b/pack-objects.c @@ -118,6 +118,23 @@ static unsigned long write_object(struct sha1file *f, struct object_entry *entry 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; |