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:
commit
e96a3b3649
@ -111,8 +111,9 @@ static void copy_le32(unsigned char *dest, unsigned int n)
|
||||
dest[3] = 0xff & (n >> 030);
|
||||
}
|
||||
|
||||
static void *zlib_deflate(void *data, unsigned long size,
|
||||
int compression_level, unsigned long *compressed_size)
|
||||
static void *zlib_deflate_raw(void *data, unsigned long size,
|
||||
int compression_level,
|
||||
unsigned long *compressed_size)
|
||||
{
|
||||
git_zstream stream;
|
||||
unsigned long maxsize;
|
||||
@ -120,7 +121,7 @@ static void *zlib_deflate(void *data, unsigned long size,
|
||||
int result;
|
||||
|
||||
memset(&stream, 0, sizeof(stream));
|
||||
git_deflate_init(&stream, compression_level);
|
||||
git_deflate_init_raw(&stream, compression_level);
|
||||
maxsize = git_deflate_bound(&stream, size);
|
||||
buffer = xmalloc(maxsize);
|
||||
|
||||
@ -265,14 +266,11 @@ static int write_zip_entry(struct archiver_args *args,
|
||||
}
|
||||
|
||||
if (buffer && method == 8) {
|
||||
deflated = zlib_deflate(buffer, size, args->compression_level,
|
||||
out = deflated = zlib_deflate_raw(buffer, size,
|
||||
args->compression_level,
|
||||
&compressed_size);
|
||||
if (deflated && compressed_size - 6 < size) {
|
||||
/* ZLIB --> raw compressed data (see RFC 1950) */
|
||||
/* CMF and FLG ... */
|
||||
out = (unsigned char *)deflated + 2;
|
||||
compressed_size -= 6; /* ... and ADLER32 */
|
||||
} else {
|
||||
if (!out || compressed_size >= size) {
|
||||
out = buffer;
|
||||
method = 0;
|
||||
compressed_size = size;
|
||||
}
|
||||
@ -353,7 +351,7 @@ static int write_zip_entry(struct archiver_args *args,
|
||||
unsigned char compressed[STREAM_BUFFER_SIZE * 2];
|
||||
|
||||
memset(&zstream, 0, sizeof(zstream));
|
||||
git_deflate_init(&zstream, args->compression_level);
|
||||
git_deflate_init_raw(&zstream, args->compression_level);
|
||||
|
||||
compressed_size = 0;
|
||||
zstream.next_out = compressed;
|
||||
@ -370,13 +368,10 @@ static int write_zip_entry(struct archiver_args *args,
|
||||
result = git_deflate(&zstream, 0);
|
||||
if (result != Z_OK)
|
||||
die("deflate error (%d)", result);
|
||||
out = compressed;
|
||||
if (!compressed_size)
|
||||
out += 2;
|
||||
out_len = zstream.next_out - out;
|
||||
out_len = zstream.next_out - compressed;
|
||||
|
||||
if (out_len > 0) {
|
||||
write_or_die(1, out, out_len);
|
||||
write_or_die(1, compressed, out_len);
|
||||
compressed_size += out_len;
|
||||
zstream.next_out = compressed;
|
||||
zstream.avail_out = sizeof(compressed);
|
||||
@ -394,11 +389,8 @@ static int write_zip_entry(struct archiver_args *args,
|
||||
die("deflate error (%d)", result);
|
||||
|
||||
git_deflate_end(&zstream);
|
||||
out = compressed;
|
||||
if (!compressed_size)
|
||||
out += 2;
|
||||
out_len = zstream.next_out - out - 4;
|
||||
write_or_die(1, out, out_len);
|
||||
out_len = zstream.next_out - compressed;
|
||||
write_or_die(1, compressed, out_len);
|
||||
compressed_size += out_len;
|
||||
zip_offset += compressed_size;
|
||||
|
||||
|
1
cache.h
1
cache.h
@ -34,6 +34,7 @@ int git_inflate(git_zstream *, int flush);
|
||||
|
||||
void git_deflate_init(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 *);
|
||||
int git_deflate_abort(git_zstream *);
|
||||
int git_deflate_end_gently(git_zstream *);
|
||||
|
25
zlib.c
25
zlib.c
@ -168,13 +168,8 @@ void git_deflate_init(git_zstream *strm, int level)
|
||||
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;
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
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 status;
|
||||
|
Loading…
Reference in New Issue
Block a user