Data after Z_FULL_FLUSH will be compressed independently of the header, and could therefore be reused without recompressing when creating a pack. --- This passes "make test" and unpacking of the whole git repo with git-fsck-objects afterwards. However, a straight reuse still will not be possible, because sha1write_compressed() uses deflateInit(&stream, Z_DEFAULT_COMPRESSION), which writes zlib headers around the deflate stream, and the zlib footer contains adler32 checksum. So, as a minimum, you will need to decompress the object data, calculate its adler32 checksum and write the zlib header yourself. sha1_file.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) 8b12d9a58e87a4c5b5a2a7b20d06fe29a5afb903 diff --git a/sha1_file.c b/sha1_file.c index a80d849..34d4da4 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -1399,7 +1399,8 @@ int write_sha1_file(void *buf, unsigned /* Set it up */ memset(&stream, 0, sizeof(stream)); deflateInit(&stream, Z_BEST_COMPRESSION); - size = deflateBound(&stream, len+hdrlen); + /* Additional 6 bytes for the Z_FULL_FLUSH marker */ + size = deflateBound(&stream, hdrlen) + 6 + deflateBound(&stream, len); compressed = xmalloc(size); /* Compress it */ @@ -1412,6 +1413,10 @@ int write_sha1_file(void *buf, unsigned while (deflate(&stream, 0) == Z_OK) /* nothing */; + /* Flush before data */ + while (deflate(&stream, Z_FULL_FLUSH) == Z_OK) + /* nothing */; + /* Then the data itself.. */ stream.next_in = buf; stream.avail_in = len; -- 1.2.GIT - : 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