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);
|
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,
|
||||||
&compressed_size);
|
args->compression_level,
|
||||||
if (deflated && compressed_size - 6 < size) {
|
&compressed_size);
|
||||||
/* ZLIB --> raw compressed data (see RFC 1950) */
|
if (!out || compressed_size >= size) {
|
||||||
/* CMF and FLG ... */
|
out = buffer;
|
||||||
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;
|
||||||
|
|
||||||
|
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(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
25
zlib.c
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user