From: Rohit Ashiwal <rohit.ashiwal...@gmail.com>

As we already link to the zlib library, we can perform the compression
without even requiring gzip on the host machine.

Signed-off-by: Rohit Ashiwal <rohit.ashiwal...@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schinde...@gmx.de>
---
 archive-tar.c | 34 +++++++++++++++++++++++++---------
 1 file changed, 25 insertions(+), 9 deletions(-)

diff --git a/archive-tar.c b/archive-tar.c
index ba37dad27c..5979ed14b7 100644
--- a/archive-tar.c
+++ b/archive-tar.c
@@ -466,18 +466,34 @@ static int write_tar_filter_archive(const struct archiver 
*ar,
        filter.use_shell = 1;
        filter.in = -1;
 
-       if (start_command(&filter) < 0)
-               die_errno(_("unable to start '%s' filter"), argv[0]);
-       close(1);
-       if (dup2(filter.in, 1) < 0)
-               die_errno(_("unable to redirect descriptor"));
-       close(filter.in);
+       if (!strcmp("gzip -cn", ar->data)) {
+               char outmode[4] = "wb\0";
+
+               if (args->compression_level >= 0 && args->compression_level <= 
9)
+                       outmode[2] = '0' + args->compression_level;
+
+               gzip = gzdopen(fileno(stdout), outmode);
+               if (!gzip)
+                       die(_("Could not gzdopen stdout"));
+       } else {
+               if (start_command(&filter) < 0)
+                       die_errno(_("unable to start '%s' filter"), argv[0]);
+               close(1);
+               if (dup2(filter.in, 1) < 0)
+                       die_errno(_("unable to redirect descriptor"));
+               close(filter.in);
+       }
 
        r = write_tar_archive(ar, args);
 
-       close(1);
-       if (finish_command(&filter) != 0)
-               die(_("'%s' filter reported error"), argv[0]);
+       if (gzip) {
+               if (gzclose(gzip) != Z_OK)
+                       die(_("gzclose failed"));
+       } else {
+               close(1);
+               if (finish_command(&filter) != 0)
+                       die(_("'%s' filter reported error"), argv[0]);
+       }
 
        strbuf_release(&cmd);
        return r;
-- 
gitgitgadget

Reply via email to