Merge branch 'rs/archive-zip-raw-compression'

* rs/archive-zip-raw-compression:
  archive-zip: use deflateInit2() to ask for raw compressed data
This commit is contained in:
Junio C Hamano 2013-03-27 09:28:53 -07:00
commit e96a3b3649
3 changed files with 34 additions and 28 deletions

View File

@ -111,8 +111,9 @@ static void copy_le32(unsigned char *dest, unsigned int n)
dest[3] = 0xff & (n >> 030); dest[3] = 0xff & (n >> 030);
} }
static void *zlib_deflate(void *data, unsigned long size, static void *zlib_deflate_raw(void *data, unsigned long size,
int compression_level, unsigned long *compressed_size) int compression_level,
unsigned long *compressed_size)
{ {
git_zstream stream; git_zstream stream;
unsigned long maxsize; unsigned long maxsize;
@ -120,7 +121,7 @@ static void *zlib_deflate(void *data, unsigned long size,
int result; int result;
memset(&stream, 0, sizeof(stream)); memset(&stream, 0, sizeof(stream));
git_deflate_init(&stream, compression_level); git_deflate_init_raw(&stream, compression_level);
maxsize = git_deflate_bound(&stream, size); maxsize = git_deflate_bound(&stream, size);
buffer = xmalloc(maxsize); buffer = xmalloc(maxsize);
@ -265,14 +266,11 @@ static int write_zip_entry(struct archiver_args *args,
} }
if (buffer && method == 8) { if (buffer && method == 8) {
deflated = zlib_deflate(buffer, size, args->compression_level, out = deflated = zlib_deflate_raw(buffer, size,
args->compression_level,
&compressed_size); &compressed_size);
if (deflated && compressed_size - 6 < size) { if (!out || compressed_size >= size) {
/* ZLIB --> raw compressed data (see RFC 1950) */ out = buffer;
/* CMF and FLG ... */
out = (unsigned char *)deflated + 2;
compressed_size -= 6; /* ... and ADLER32 */
} else {
method = 0; method = 0;
compressed_size = size; compressed_size = size;
} }
@ -353,7 +351,7 @@ static int write_zip_entry(struct archiver_args *args,
unsigned char compressed[STREAM_BUFFER_SIZE * 2]; unsigned char compressed[STREAM_BUFFER_SIZE * 2];
memset(&zstream, 0, sizeof(zstream)); memset(&zstream, 0, sizeof(zstream));
git_deflate_init(&zstream, args->compression_level); git_deflate_init_raw(&zstream, args->compression_level);
compressed_size = 0; compressed_size = 0;
zstream.next_out = compressed; zstream.next_out = compressed;
@ -370,13 +368,10 @@ static int write_zip_entry(struct archiver_args *args,
result = git_deflate(&zstream, 0); result = git_deflate(&zstream, 0);
if (result != Z_OK) if (result != Z_OK)
die("deflate error (%d)", result); die("deflate error (%d)", result);
out = compressed; out_len = zstream.next_out - compressed;
if (!compressed_size)
out += 2;
out_len = zstream.next_out - out;
if (out_len > 0) { if (out_len > 0) {
write_or_die(1, out, out_len); write_or_die(1, compressed, out_len);
compressed_size += out_len; compressed_size += out_len;
zstream.next_out = compressed; zstream.next_out = compressed;
zstream.avail_out = sizeof(compressed); zstream.avail_out = sizeof(compressed);
@ -394,11 +389,8 @@ static int write_zip_entry(struct archiver_args *args,
die("deflate error (%d)", result); die("deflate error (%d)", result);
git_deflate_end(&zstream); git_deflate_end(&zstream);
out = compressed; out_len = zstream.next_out - compressed;
if (!compressed_size) write_or_die(1, compressed, out_len);
out += 2;
out_len = zstream.next_out - out - 4;
write_or_die(1, out, out_len);
compressed_size += out_len; compressed_size += out_len;
zip_offset += compressed_size; zip_offset += compressed_size;

View File

@ -34,6 +34,7 @@ int git_inflate(git_zstream *, int flush);
void git_deflate_init(git_zstream *, int level); void git_deflate_init(git_zstream *, int level);
void git_deflate_init_gzip(git_zstream *, int level); void git_deflate_init_gzip(git_zstream *, int level);
void git_deflate_init_raw(git_zstream *, int level);
void git_deflate_end(git_zstream *); void git_deflate_end(git_zstream *);
int git_deflate_abort(git_zstream *); int git_deflate_abort(git_zstream *);
int git_deflate_end_gently(git_zstream *); int git_deflate_end_gently(git_zstream *);

25
zlib.c
View File

@ -168,13 +168,8 @@ void git_deflate_init(git_zstream *strm, int level)
strm->z.msg ? strm->z.msg : "no message"); strm->z.msg ? strm->z.msg : "no message");
} }
void git_deflate_init_gzip(git_zstream *strm, int level) static void do_git_deflate_init(git_zstream *strm, int level, int windowBits)
{ {
/*
* Use default 15 bits, +16 is to generate gzip header/trailer
* instead of the zlib wrapper.
*/
const int windowBits = 15 + 16;
int status; int status;
zlib_pre_call(strm); zlib_pre_call(strm);
@ -188,6 +183,24 @@ void git_deflate_init_gzip(git_zstream *strm, int level)
strm->z.msg ? strm->z.msg : "no message"); strm->z.msg ? strm->z.msg : "no message");
} }
void git_deflate_init_gzip(git_zstream *strm, int level)
{
/*
* Use default 15 bits, +16 is to generate gzip header/trailer
* instead of the zlib wrapper.
*/
return do_git_deflate_init(strm, level, 15 + 16);
}
void git_deflate_init_raw(git_zstream *strm, int level)
{
/*
* Use default 15 bits, negate the value to get raw compressed
* data without zlib header and trailer.
*/
return do_git_deflate_init(strm, level, -15);
}
int git_deflate_abort(git_zstream *strm) int git_deflate_abort(git_zstream *strm)
{ {
int status; int status;