Skip to content

Commit

Permalink
[PATCH] Emit base objects of a delta chain when the delta is output.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano authored and Linus Torvalds committed Jun 29, 2005
1 parent 67e5a5e commit 9d5ab96
Showing 1 changed file with 20 additions and 5 deletions.
25 changes: 20 additions & 5 deletions pack-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down

0 comments on commit 9d5ab96

Please sign in to comment.