[PATCH] write_sha1_file(): Perform Z_FULL_FLUSH between header and data
- From
Sergey Vlasov <vsu@altlinux.ru>
- Date
- Mar 8, 2006, 10:45 UTC
- Message-ID
- <20060308134519.78ea313d.vsu@altlinux.ru>
- In-Reply-To
- <7vzmk1izpa.fsf_-_@assigned-by-dhcp.cox.net>
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