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