Skip to content

Commit

Permalink
archive: make zip compression level independent from core git
Browse files Browse the repository at this point in the history
zlib_compression_level is the compression level used for git's object store.
It's 1 by default, which is the fastest setting.  This variable is also used
as the default compression level for ZIP archives created by git archive.

For archives, however, zlib's own default of 6 is more appropriate, as it's
favouring small size over speed -- archive creation is not that performance
critical most of the time.

This patch makes git archive independent from git's internal compression
level setting.  It affects invocations of git archive without explicitly
specified compression level option, only.

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
René Scharfe authored and gitster committed Jul 19, 2008
1 parent 6259ac6 commit 3a176c6
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 5 deletions.
9 changes: 5 additions & 4 deletions archive-zip.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,15 +93,15 @@ static void copy_le32(unsigned char *dest, unsigned int n)
}

static void *zlib_deflate(void *data, unsigned long size,
unsigned long *compressed_size)
int compression_level, unsigned long *compressed_size)
{
z_stream stream;
unsigned long maxsize;
void *buffer;
int result;

memset(&stream, 0, sizeof(stream));
deflateInit(&stream, zlib_compression_level);
deflateInit(&stream, compression_level);
maxsize = deflateBound(&stream, size);
buffer = xmalloc(maxsize);

Expand Down Expand Up @@ -157,7 +157,7 @@ static int write_zip_entry(struct archiver_args *args,
method = 0;
attr2 = S_ISLNK(mode) ? ((mode | 0777) << 16) :
(mode & 0111) ? ((mode) << 16) : 0;
if (S_ISREG(mode) && zlib_compression_level != 0)
if (S_ISREG(mode) && args->compression_level != 0)
method = 8;
crc = crc32(crc, buffer, size);
out = buffer;
Expand All @@ -169,7 +169,8 @@ static int write_zip_entry(struct archiver_args *args,
}

if (method == 8) {
deflated = zlib_deflate(buffer, size, &compressed_size);
deflated = zlib_deflate(buffer, size, args->compression_level,
&compressed_size);
if (deflated && compressed_size - 6 < size) {
/* ZLIB --> raw compressed data (see RFC 1950) */
/* CMF and FLG ... */
Expand Down
1 change: 1 addition & 0 deletions archive.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ struct archiver_args {
time_t time;
const char **pathspec;
unsigned int verbose : 1;
int compression_level;
};

typedef int (*write_archive_fn_t)(struct archiver_args *);
Expand Down
3 changes: 2 additions & 1 deletion builtin-archive.c
Original file line number Diff line number Diff line change
Expand Up @@ -185,9 +185,10 @@ int parse_archive_args(int argc, const char **argv, const struct archiver **ar,
if (!*ar)
die("Unknown archive format '%s'", format);

args->compression_level = Z_DEFAULT_COMPRESSION;
if (compression_level != -1) {
if ((*ar)->flags & USES_ZLIB_COMPRESSION)
zlib_compression_level = compression_level;
args->compression_level = compression_level;
else {
die("Argument not supported for format '%s': -%d",
format, compression_level);
Expand Down

0 comments on commit 3a176c6

Please sign in to comment.