bug-gzip
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v7] gzip: add "--keep" option to keep (don't delete) input files


From: Rodrigo Campos
Subject: [PATCH v7] gzip: add "--keep" option to keep (don't delete) input files
Date: Sun, 14 Apr 2013 22:04:55 -0300

By default it is disabled to keep everything working as before. And as a
short option "-k" is used to be consistent with lzip, bzip2 and friends.
* doc/gzip.texi: Document "--keep" option.
* gzip.1: Likewise.
* gunzip.in: Likewise.
* NEWS: Likewise.
* gzip.c: Add support for "--keep".
* tests/gzip-k: Add test for the new functionality
---
 NEWS              |    2 ++
 doc/gzip.texi     |    5 +++++
 gunzip.in         |    1 +
 gzip.1            |    9 ++++++---
 gzip.c            |   35 ++++++++++++++++++++++-------------
 tests/Makefile.am |    1 +
 tests/gzip-k      |   34 ++++++++++++++++++++++++++++++++++
 7 files changed, 71 insertions(+), 16 deletions(-)
 create mode 100755 tests/gzip-k

diff --git a/NEWS b/NEWS
index c8ae541..bd75340 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,8 @@ GNU gzip NEWS                                    -*- outline -*-
 
 * Noteworthy changes in release ?.? (????-??-??) [?]
 
+** Add '--keep' option
+
 ** Bug fixes
 
   gzip -d no longer malfunctions with certain invalid data in 'pack' format.
diff --git a/doc/gzip.texi b/doc/gzip.texi
index f7e45e1..3de3063 100644
--- a/doc/gzip.texi
+++ b/doc/gzip.texi
@@ -195,6 +195,7 @@ Mandatory arguments to long options are mandatory for short 
options too.
   -d, --decompress  decompress
   -f, --force       force overwrite of output file and compress links
   -h, --help        give this help
+  -k, --keep        keep (don't delete) input files
   -l, --list        list compressed file contents
   -L, --license     display software license
   -n, --no-name     do not save or restore the original name and time stamp
@@ -276,6 +277,10 @@ whether an existing file should be overwritten.
 @itemx -h
 Print an informative help message describing the options then quit.
 
address@hidden --keep
address@hidden -k
+Keep (don't delete) input files during compression or decompression.
+
 @item --list
 @itemx -l
 For each compressed file, list the following fields:
diff --git a/gunzip.in b/gunzip.in
index b95e973..dbfd04b 100644
--- a/gunzip.in
+++ b/gunzip.in
@@ -38,6 +38,7 @@ Mandatory arguments to long options are mandatory for short 
options too.
 
   -c, --stdout      write on standard output, keep original files unchanged
   -f, --force       force overwrite of output file and compress links
+  -k, --keep        keep (don't delete) input files
   -l, --list        list compressed file contents
   -n, --no-name     do not save or restore the original name and time stamp
   -N, --name        save or restore the original name and time stamp
diff --git a/gzip.1 b/gzip.1
index c97aeb1..71e097c 100644
--- a/gzip.1
+++ b/gzip.1
@@ -4,7 +4,7 @@ gzip, gunzip, zcat \- compress or expand files
 .SH SYNOPSIS
 .ll +8
 .B gzip
-.RB [ " \-acdfhlLnNrtvV19 " ]
+.RB [ " \-acdfhklLnNrtvV19 " ]
 .RB [ \-S\ suffix ]
 [
 .I "name \&..."
@@ -12,7 +12,7 @@ gzip, gunzip, zcat \- compress or expand files
 .ll -8
 .br
 .B gunzip
-.RB [ " \-acfhlLnNrtvV " ]
+.RB [ " \-acfhklLnNrtvV " ]
 .RB [ \-S\ suffix ]
 [
 .I "name \&..."
@@ -218,6 +218,9 @@ prompts to verify whether an existing file should be 
overwritten.
 .B \-h --help
 Display a help screen and quit.
 .TP
+.B \-k --keep
+Keep (don't delete) input files during compression or decompression.
+.TP
 .B \-l --list
 For each compressed file, list the following fields:
 
@@ -392,7 +395,7 @@ Internet RFC 1951 (May 1996).
 Exit status is normally 0;
 if an error occurs, exit status is 1. If a warning occurs, exit status is 2.
 .TP
-Usage: gzip [-cdfhlLnNrtvV19] [-S suffix] [file ...]
+Usage: gzip [-cdfhklLnNrtvV19] [-S suffix] [file ...]
 Invalid options were specified on the command line.
 .TP
 \fIfile\fP\^: not in gzip format
diff --git a/gzip.c b/gzip.c
index 66529e0..93cc738 100644
--- a/gzip.c
+++ b/gzip.c
@@ -167,6 +167,7 @@ static int ascii = 0;        /* convert end-of-lines to 
local OS conventions */
        int to_stdout = 0;    /* output to stdout (-c) */
 static int decompress = 0;   /* decompress (-d) */
 static int force = 0;        /* don't ask questions, compress links (-f) */
+static int keep = 0;         /* keep (don't delete) input files */
 static int no_name = -1;     /* don't save or restore the original file name */
 static int no_time = -1;     /* don't save or restore the original file time */
 static int recursive = 0;    /* recurse through directories (-r) */
@@ -256,6 +257,7 @@ static const struct option longopts[] =
     {"force",      0, 0, 'f'}, /* force overwrite of output file */
     {"help",       0, 0, 'h'}, /* give help */
  /* {"pkzip",      0, 0, 'k'},    force output in pkzip format */
+    {"keep",       0, 0, 'k'}, /* keep (don't delete) input files */
     {"list",       0, 0, 'l'}, /* list .gz file contents */
     {"license",    0, 0, 'L'}, /* display software license */
     {"no-name",    0, 0, 'n'}, /* don't save or restore original name & time */
@@ -334,6 +336,7 @@ local void help()
  "  -f, --force       force overwrite of output file and compress links",
  "  -h, --help        give this help",
 /*  -k, --pkzip       force output in pkzip format */
+ "  -k, --keep        keep (don't delete) input files",
  "  -l, --list        list compressed file contents",
  "  -L, --license     display software license",
 #ifdef UNDOCUMENTED
@@ -437,7 +440,7 @@ int main (int argc, char **argv)
     z_suffix = Z_SUFFIX;
     z_len = strlen(z_suffix);
 
-    while ((optc = getopt_long (argc, argv, "ab:cdfhH?lLmMnNqrS:tvVZ123456789",
+    while ((optc = getopt_long (argc, argv, 
"ab:cdfhH?klLmMnNqrS:tvVZ123456789",
                                 longopts, (int *)0)) != -1) {
         switch (optc) {
         case 'a':
@@ -460,6 +463,8 @@ int main (int argc, char **argv)
             force++; break;
         case 'h': case 'H':
             help(); do_exit(OK); break;
+        case 'k':
+            keep = 1; break;
         case 'l':
             list = decompress = to_stdout = 1; break;
         case 'L':
@@ -851,25 +856,29 @@ local void treat_file(iname)
 
     if (!to_stdout)
       {
-        sigset_t oldset;
-        int unlink_errno;
 
         copy_stat (&istat);
         if (close (ofd) != 0)
           write_error ();
 
-        sigprocmask (SIG_BLOCK, &caught_signals, &oldset);
-        remove_ofname_fd = -1;
-        unlink_errno = xunlink (ifname) == 0 ? 0 : errno;
-        sigprocmask (SIG_SETMASK, &oldset, NULL);
-
-        if (unlink_errno)
+        if (!keep)
           {
-            WARN ((stderr, "%s: ", program_name));
-            if (!quiet)
+            sigset_t oldset;
+            int unlink_errno;
+
+            sigprocmask (SIG_BLOCK, &caught_signals, &oldset);
+            remove_ofname_fd = -1;
+            unlink_errno = xunlink (ifname) == 0 ? 0 : errno;
+            sigprocmask (SIG_SETMASK, &oldset, NULL);
+
+            if (unlink_errno)
               {
-                errno = unlink_errno;
-                perror (ifname);
+                WARN ((stderr, "%s: ", program_name));
+                if (!quiet)
+                  {
+                    errno = unlink_errno;
+                    perror (ifname);
+                  }
               }
           }
       }
diff --git a/tests/Makefile.am b/tests/Makefile.am
index ad08601..a1899a2 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -15,6 +15,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 TESTS =                                        \
+  gzip-k                               \
   helin-segv                           \
   help-version                         \
   hufts                                        \
diff --git a/tests/gzip-k b/tests/gzip-k
new file mode 100755
index 0000000..81543be
--- /dev/null
+++ b/tests/gzip-k
@@ -0,0 +1,34 @@
+#!/bin/sh
+# Ensure that gzip -k works as expected
+
+# Copyright (C) 2013 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# limit so don't run it by default.
+
+. "${srcdir=.}/init.sh"; path_prepend_ ..
+
+echo test-input > in || framework_failure_
+fail=0
+
+# Check the input file is not deleted on compression
+gzip -k in 2>&1 || fail=1
+test -s in -a -s in.gz || fail=1
+rm in
+
+# Check the input file is not deleted on decompression
+gzip -dk in.gz 2>&1 || fail=1
+test -s in -a -s in.gz || fail=1
+
+Exit $fail
-- 
1.7.10.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]