Code

archive: make zip compression level independent from core git
authorRené Scharfe <rene.scharfe@lsrfire.ath.cx>
Fri, 18 Jul 2008 14:30:32 +0000 (16:30 +0200)
committerJunio C Hamano <gitster@pobox.com>
Sat, 19 Jul 2008 18:17:43 +0000 (11:17 -0700)
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>
archive-zip.c
archive.h
builtin-archive.c

index d56e5cfc1e4047a2e86a2aeacaafc8fb2931179e..fb12398b0f56fecaf75b85ea4cace5173214bb5b 100644 (file)
@@ -93,7 +93,7 @@ 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;
@@ -101,7 +101,7 @@ static void *zlib_deflate(void *data, unsigned long size,
        int result;
 
        memset(&stream, 0, sizeof(stream));
-       deflateInit(&stream, zlib_compression_level);
+       deflateInit(&stream, compression_level);
        maxsize = deflateBound(&stream, size);
        buffer = xmalloc(maxsize);
 
@@ -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;
@@ -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 ... */
index 96bb1cd85362e68ee42c81d5017222411e6bf669..4a02371f374a159604ab55102be5ba5b9d3f7cd2 100644 (file)
--- a/archive.h
+++ b/archive.h
@@ -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 *);
index d5e3af879e7935ae3d5a6fad11951071e379855e..cff6ce7de3b4ecd6e0f03cd8d86026f4ee61fe1c 100644 (file)
@@ -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);