]> Dogcows Code - chaz/tar/commitdiff
Options to control option handling in file lists. master
authorSergey Poznyakoff <gray@gnu.org.ua>
Mon, 3 Aug 2015 13:11:08 +0000 (16:11 +0300)
committerSergey Poznyakoff <gray@gnu.org.ua>
Mon, 3 Aug 2015 13:47:22 +0000 (16:47 +0300)
The --verbatim-files-from option disables option handling in
file lists.  The --no-verbatim-files-from reverts its effect.

The --null option implies --verbatim-files-from.  This restores
the documented behavior, broken by 26538c9b.

* src/common.h (verbatim_files_from_option): New global.
* src/names.c (name_elt): New member: file.verbatim
(name_add_file): Take 'verbatim' state as its third parameter.
(read_next_name): Don't call handle_option if file.verbatim
is set.
* src/tar.c: New options --verbatim-files-from and
--no-verbatim-files-from.

* doc/tar.texi: Document --verbatim-files-from and
--no-verbatim-files-from options.
* NEWS: Update.
* configure.ac: Version 1.28.90

* tests/T-null2.at: New testcase.
* tests/Makefile.am: Update.
* tests/testsuite.at: Update.

NEWS
configure.ac
doc/tar.texi
src/common.h
src/names.c
src/tar.c
tests/Makefile.am
tests/T-null2.at [new file with mode: 0644]
tests/testsuite.at

diff --git a/NEWS b/NEWS
index c3385f8b6ce6e3864f250cde9efaac9ce4f4050a..aa6d4739e05cbbbbdd924b6ede9071054ce22ed9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,35 @@
-GNU tar NEWS - User visible changes. 2014-11-07
+GNU tar NEWS - User visible changes. 2015-08-03
 Please send GNU tar bug reports to <bug-tar@gnu.org>
 
+\f
+version 1.28.90 (Git)
+
+* New options: --verbatim-files-from, --no-verbatim-files-from
+
+The --verbatim-files-from option instructs tar to treat each line read
+from a file list as a file name, even if it starts with a dash.
+
+File lists are supplied with the --files-from (-T) option.  By
+default, each line read from a file list is first stripped off the
+leading and trailing whitespace and, if the result begins with a dash,
+it is treated as tar command line option.
+
+Use the --verbatim-files-from option to disable this special handling.
+This facilitates the use of tar with file lists created automatically
+(e.g. by file(1) command).
+
+This option affects all --files-from options that occur after it in
+the command line.  Its effect is reverted by the
+--no-verbatim-files-from option.
+
+* --null option reads file names verbatim
+
+The --null option implies --verbatim-files-from.  I.e. each line 
+read from null-delimited file lists is treated as a file name.
+
+This restores the documented behavior, which was broken in version
+1.27.
+
 \f
 version 1.28, 2014-07-28
 
@@ -1505,7 +1534,7 @@ Versions 1.07 back to 1.00 by Jay Fenlason.
 
 \f
 
-Copyright 1994-2001, 2003-2010, 2013-2014 Free Software Foundation, Inc.
+Copyright 1994-2001, 2003-2010, 2013-2015 Free Software Foundation, Inc.
 
 This file is part of GNU tar.
 
index a93c6c072f84c1d101a29428c032eb8a615caa61..0df6a21f33a9bd98c852eb4d97f5ec4d3dcbd1cd 100644 (file)
@@ -1,6 +1,6 @@
 # Configure template for GNU tar.  -*- autoconf -*-
 
-# Copyright 1991, 1994-2010, 2013-2014 Free Software Foundation, Inc.
+# Copyright 1991, 1994-2010, 2013-2015 Free Software Foundation, Inc.
 
 # This file is part of GNU tar.
 
@@ -17,7 +17,7 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-AC_INIT([GNU tar], [1.28], [bug-tar@gnu.org])
+AC_INIT([GNU tar], [1.28.90], [bug-tar@gnu.org])
 AC_CONFIG_SRCDIR([src/tar.c])
 AC_CONFIG_AUX_DIR([build-aux])
 AC_CONFIG_HEADERS([config.h])
index fc3d046ad890e254686c08f4df7da38c613924ee..96f6aeb4312af4b50b5aaaaa0b02dc600cca734e 100644 (file)
@@ -3041,6 +3041,21 @@ mechanism.
 Treat all input file or member names literally, do not interpret
 escape sequences.  @xref{input name quoting}.
 
+@opsummary{no-verbatim-files-from}
+@item --no-verbatim-files-from
+
+Instructs @GNUTAR{} to treat each line read from a file list as if it
+were supplied in the command line.  I.e., leading and trailing
+whitespace is removed and, if the result begins with a dash, it is
+treated as a @GNUTAR{} command line option.
+
+This is default behavior.  This option is provided as a way to restore
+it after @option{--verbatim-files-from} option.
+
+It is implied by the @option{--no-null} option.
+
+@xref{no-verbatim-files-from}.
+
 @opsummary{no-wildcards}
 @item --no-wildcards
 Do not use wildcards.
@@ -3055,10 +3070,16 @@ Wildcards do not match @samp{/}.
 @item --null
 
 When @command{tar} is using the @option{--files-from} option, this option
-instructs @command{tar} to expect file names terminated with @acronym{NUL}, so
-@command{tar} can correctly work with file names that contain newlines.
+instructs @command{tar} to expect file names terminated with
+@acronym{NUL}, and to process file names verbatim.  
+
+This means that @command{tar} correctly works with file names that
+contain newlines or begin with a dash.
+
 @xref{nul}.
 
+See also @ref{verbatim-files-from}.
+
 @opsummary{numeric-owner}
 @item --numeric-owner
 
@@ -3504,6 +3525,29 @@ presumed to be a compression program of some sort.  @xref{gzip}.
 Display file modification dates in @acronym{UTC}.  This option implies
 @option{--verbose}.
 
+@opsummary{verbatim-files-from}
+@item --verbatim-files-from
+
+Instructs @GNUTAR{} to treat each line read from a file list as a file
+name, even if it starts with a dash.
+
+File lists are supplied with the @option{--files-from} (@option{-T})
+option.  By default, each line read from a file list is first trimmed
+off the leading and trailing whitespace and, if the result begins with
+a dash, it is treated as a @GNUTAR{} command line option.
+
+Use the @option{--verbatim-files-from} option to disable this special
+handling.  This facilitates the use of @command{tar} with file lists
+created by @command{file} command.
+
+This option affects all @option{--files-from} options that occur after
+it in the command line.  Its effect is reverted by the
+@option{--no-verbatim-files-from} option.
+
+This option is implied by the @option{--null} option.
+
+@xref{verbatim-files-from}.
+
 @opsummary{verbose}
 @item --verbose
 @itemx -v
@@ -3670,7 +3714,7 @@ successfully.  For example, @w{@samp{tar --version}} might print:
 
 @smallexample
 tar (GNU tar) @value{VERSION}
-Copyright (C) 2013-2014 Free Software Foundation, Inc.
+Copyright (C) 2013-2015 Free Software Foundation, Inc.
 License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
 This is free software: you are free to change and redistribute it.
 There is NO WARRANTY, to the extent permitted by law.
@@ -7217,7 +7261,7 @@ If you give a single dash as a file name for @option{--files-from}, (i.e.,
 you specify either @code{--files-from=-} or @code{-T -}), then the file
 names are read from standard input.
 
-Unless you are running @command{tar} with @option{--create}, you can not use
+Unless you are running @command{tar} with @option{--create}, you cannot use
 both @code{--files-from=-} and @code{--file=-} (@code{-f -}) in the same
 command.
 
@@ -7237,8 +7281,9 @@ $ @kbd{tar -c -v -z -T small-files -f little.tgz}
 @end smallexample
 
 @noindent
-In the file list given by @option{-T} option, any file name beginning
-with @samp{-} character is considered a @command{tar} option and is
+By default, each line read from the file list is first stripped off
+any leading and trailing whitespace.  If the resulting string begins
+with @samp{-} character, it is considered a @command{tar} option and is
 processed accordingly@footnote{Versions of @GNUTAR{} up to 1.15.1
 recognized only @option{-C} option in file lists, and only if the
 option and its argument occupied two consecutive lines.}. For example,
@@ -7273,10 +7318,23 @@ libc.a
 @end group
 @end smallexample
 
+@anchor{verbatim-files-from}
+@opindex verbatim-files-from
+If such option handling is undesirable, use the
+@option{--verbatim-files-from} option.  When this option is in effect,
+each line read from the file list is treated as a file name.  Notice,
+that this means, in particular, that no whitespace trimming is
+performed.
+
+@anchor{no-verbatim-files-from}
+@opindex no-verbatim-files-from
+The @option{--verbatim-files-from} affects all @option{-T} options
+that follow it in the command line.  The default behavior can be
+restored using @option{--no-verbatim-files-from} option.
+
 @opindex add-file
-If you happen to have a file whose name starts with @samp{-},
-precede it with @option{--add-file} option to prevent it from
-being recognized as an option.  For example: @code{--add-file=--my-file}.
+To disable option handling for a single file name, use the
+@option{--add-file} option, e.g.: @code{--add-file=--my-file}.
 
 @menu
 * nul::
@@ -7308,7 +7366,8 @@ The @option{--null} option is just like the one in @acronym{GNU}
 @command{xargs} and @command{cpio}, and is useful with the
 @option{-print0} predicate of @acronym{GNU} @command{find}.  In
 @command{tar}, @option{--null} also disables special handling for
-file names that begin with dash.
+file names that begin with dash (similar to
+@option{--verbatim-files-from} option).
 
 This example shows how to use @command{find} to generate a list of files
 larger than 800K in length and put that list into a file called
@@ -8786,8 +8845,8 @@ To use it, you would invoke @command{tar} as follows:
 $ @kbd{tar -c -f foo.tar --files-from list}
 @end smallexample
 
-The interpretation of @option{--directory} is disabled by
-@option{--null} option.
+The interpretation of options in file lists is disabled by
+@option{--verbatim-files-from} and @option{--null} options.
 
 @node absolute
 @subsection Absolute File Names
index 2904183d6197a17bfb001da430d7f4a386c42da1..e7911f4bab9ee9e781b8c11d4a1e8e42984e59d2 100644 (file)
@@ -1,6 +1,6 @@
 /* Common declarations for the tar program.
 
-   Copyright 1988, 1992-1994, 1996-1997, 1999-2010, 2012-2014 Free
+   Copyright 1988, 1992-1994, 1996-1997, 1999-2010, 2012-2015 Free
    Software Foundation, Inc.
 
    This file is part of GNU tar.
@@ -386,6 +386,9 @@ GLOBAL dev_t root_device;
 /* Unquote filenames */
 GLOBAL bool unquote_option;
 
+/* Treat file names read from -T input verbatim */
+GLOBAL bool verbatim_files_from_option;
+
 GLOBAL int savedir_sort_order;
 
 /* Show file or archive names after transformation.
@@ -727,7 +730,8 @@ int uname_to_uid (char const *uname, uid_t *puid);
 void name_init (void);
 void name_add_name (const char *name, int matching_flags);
 void name_add_dir (const char *name);
-void name_add_file (const char *name, int term, int matching_flags);
+void name_add_file (const char *name, int term, bool verbatim,
+                   int matching_flags);
 void name_term (void);
 const char *name_next (int change_dirs);
 void name_gather (void);
index e3e145aef3e4394741e070c2f2a8f1910cf827e2..22118b7665c9e8445f4a623a3a6145c65b812316 100644 (file)
@@ -1,6 +1,6 @@
 /* Various processing of names.
 
-   Copyright 1988, 1992, 1994, 1996-2001, 2003-2007, 2009, 2013-2014
+   Copyright 1988, 1992, 1994, 1996-2001, 2003-2007, 2009, 2013-2015
    Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify it
@@ -228,6 +228,8 @@ struct name_elt        /* A name_array element. */
     {
       const char *name;/* File name */
       int term;        /* File name terminator in the list */
+      bool verbatim;   /* Verbatim handling of file names: no white-space
+                         trimming, no option processing */
       FILE *fp;
     } file;
   } v;
@@ -313,13 +315,14 @@ name_add_dir (const char *name)
 }
 
 void
-name_add_file (const char *name, int term, int matflags)
+name_add_file (const char *name, int term, bool verbatim, int matflags)
 {
   struct name_elt *ep = name_elt_alloc_matflags (matflags);
 
   ep->type = NELT_FILE;
   ep->v.file.name = name;
   ep->v.file.term = term;
+  ep->v.file.verbatim = verbatim;
   ep->v.file.fp = NULL;
 }
 \f
@@ -512,7 +515,7 @@ read_next_name (struct name_elt *ent, struct name_elt *ret)
        case file_list_success:
          if (unquote_option)
            unquote_string (name_buffer);
-         if (handle_option (name_buffer) == 0)
+         if (!ent->v.file.verbatim && handle_option (name_buffer) == 0)
            {
              name_list_adjust ();
              return 1;
index f8102e0aaef34b303664f331679a2ec328c72b49..79475048e7e89f4d514b2ae5b87664bb61edb869 100644 (file)
--- a/src/tar.c
+++ b/src/tar.c
@@ -1,6 +1,6 @@
 /* A tar (tape archiver) program.
 
-   Copyright 1988, 1992-1997, 1999-2001, 2003-2007, 2012-2014 Free
+   Copyright 1988, 1992-1997, 1999-2001, 2003-2007, 2012-2015 Free
    Software Foundation, Inc.
 
    Written by John Gilmore, starting 1985-08-25.
@@ -323,6 +323,7 @@ enum
   NO_SEEK_OPTION,
   NO_SELINUX_CONTEXT_OPTION,
   NO_UNQUOTE_OPTION,
+  NO_VERBATIM_FILES_FROM_OPTION,
   NO_WILDCARDS_MATCH_SLASH_OPTION,
   NO_WILDCARDS_OPTION,
   NO_XATTR_OPTION,
@@ -364,6 +365,7 @@ enum
   TRANSFORM_OPTION,
   UNQUOTE_OPTION,
   UTC_OPTION,
+  VERBATIM_FILES_FROM_OPTION,
   VOLNO_FILE_OPTION,
   WARNING_OPTION,
   WILDCARDS_MATCH_SLASH_OPTION,
@@ -713,13 +715,19 @@ static struct argp_option options[] = {
   {"files-from", 'T', N_("FILE"), 0,
    N_("get names to extract or create from FILE"), GRID+1 },
   {"null", NULL_OPTION, 0, 0,
-   N_("-T reads null-terminated names, disable -C"), GRID+1 },
+   N_("-T reads null-terminated names; implies --verbatim-files-from"),
+      GRID+1 },
   {"no-null", NO_NULL_OPTION, 0, 0,
    N_("disable the effect of the previous --null option"), GRID+1 },
   {"unquote", UNQUOTE_OPTION, 0, 0,
    N_("unquote input file or member names (default)"), GRID+1 },
   {"no-unquote", NO_UNQUOTE_OPTION, 0, 0,
    N_("do not unquote input file or member names"), GRID+1 },
+  {"verbatim-files-from", VERBATIM_FILES_FROM_OPTION, 0, 0,
+   N_("-T reads file names verbatim (no option handling)"), GRID+1 },
+  {"no-verbatim-files-from", NO_VERBATIM_FILES_FROM_OPTION, 0, 0,
+   N_("-T treats file names starting with dash as options (default)"),
+      GRID+1 },
   {"exclude", EXCLUDE_OPTION, N_("PATTERN"), 0,
    N_("exclude files, given as a PATTERN"), GRID+1 },
   {"exclude-from", 'X', N_("FILE"), 0,
@@ -1645,7 +1653,8 @@ parse_opt (int key, char *arg, struct argp_state *state)
       break;
 
     case 'T':
-      name_add_file (arg, filename_terminator, MAKE_INCL_OPTIONS (args));
+      name_add_file (arg, filename_terminator, verbatim_files_from_option,
+                    MAKE_INCL_OPTIONS (args));
       /* Indicate we've been given -T option. This is for backward
         compatibility only, so that `tar cfT archive /dev/null will
         succeed */
@@ -1906,10 +1915,12 @@ parse_opt (int key, char *arg, struct argp_state *state)
 
     case NULL_OPTION:
       filename_terminator = '\0';
+      verbatim_files_from_option = true;
       break;
 
     case NO_NULL_OPTION:
       filename_terminator = '\n';
+      verbatim_files_from_option = false;
       break;
 
     case NUMERIC_OWNER_OPTION:
@@ -2159,6 +2170,14 @@ parse_opt (int key, char *arg, struct argp_state *state)
       unquote_option = false;
       break;
 
+    case VERBATIM_FILES_FROM_OPTION:
+      verbatim_files_from_option = true;
+      break;
+
+    case NO_VERBATIM_FILES_FROM_OPTION:
+      verbatim_files_from_option = false;
+      break;
+      
     case WARNING_OPTION:
       set_warning_option (arg);
       break;
index f5b643746d8330865c56a1fb605ab796e99d4432..70aa87479b5d6a1ba20bc124c277f071bdc388ac 100644 (file)
@@ -1,6 +1,6 @@
 # Makefile for GNU tar regression tests.
 
-# Copyright 1996-1997, 1999-2001, 2003-2007, 2009, 2012-2013 Free Software
+# Copyright 1996-1997, 1999-2001, 2003-2007, 2009, 2012-2015 Free Software
 
 # This file is part of GNU tar.
 
@@ -47,6 +47,7 @@ TESTSUITE_AT = \
  T-dir01.at\
  T-empty.at\
  T-null.at\
+ T-null2.at\
  T-rec.at\
  T-zfile.at\
  T-nonl.at\
diff --git a/tests/T-null2.at b/tests/T-null2.at
new file mode 100644 (file)
index 0000000..502bdc0
--- /dev/null
@@ -0,0 +1,43 @@
+# This file is part of test suite for GNU tar. -*- Autotest -*-
+# Copyright 2015 Free Software Foundation, Inc.
+#
+# GNU tar 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.
+#
+# GNU tar 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/>.
+
+AT_SETUP([--null enables verbatim reading])
+AT_KEYWORDS([files-from null T-null2 T-verbatim])
+
+# According to the docs, --null should read each line from the file
+# list verbatim.  This feature was broken by commit 26538c9b (tar version
+# 1.27).
+
+AT_TAR_CHECK([
+AT_DATA([file-list],[a
+-b
+--c d
+])
+
+genfile -f a
+genfile -f -b
+genfile -f '--c d'
+
+cat file-list | tr '\n' '\0' | tar -c -f archive -v --null -T -
+],
+[0],
+[a
+-b
+--c d
+],
+[],[],[],[ustar]) # Testing one format is enough
+
+AT_CLEANUP
index f64615a148b2e1b3194dd7c9711cf7d79416cd0f..b1e7d3b8aed6491a12991066e1454bb1d8a2ca01 100644 (file)
@@ -1,7 +1,7 @@
 # Process this file with autom4te to create testsuite. -*- Autotest -*-
 
 # Test suite for GNU tar.
-# Copyright 2004-2008, 2010-2014 Free Software Foundation, Inc.
+# Copyright 2004-2008, 2010-2015 Free Software Foundation, Inc.
 
 # This file is part of GNU tar.
 
@@ -203,6 +203,7 @@ m4_include([T-rec.at])
 m4_include([T-cd.at])
 m4_include([T-empty.at])
 m4_include([T-null.at])
+m4_include([T-null2.at])
 m4_include([T-zfile.at])
 m4_include([T-nonl.at])
 m4_include([T-dir00.at])
This page took 0.044478 seconds and 4 git commands to generate.