]> Dogcows Code - chaz/tar/commitdiff
Implement --no-null option.
authorSergey Poznyakoff <gray@gnu.org.ua>
Wed, 24 Sep 2008 10:58:19 +0000 (10:58 +0000)
committerSergey Poznyakoff <gray@gnu.org.ua>
Wed, 24 Sep 2008 10:58:19 +0000 (10:58 +0000)
* NEWS: Update.
* doc/tar.texi: Update.
* src/tar.c: New option --no-null.

ChangeLog
NEWS
doc/tar.texi
src/tar.c

index 722cff6cb30a28d0780a3bd2761cc8740c31e2d4..0c13afffdb8ad1ddbaeb5eadb7e13bb41fe8ce17 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-09-24  Sergey Poznyakoff  <gray@gnu.org.ua>
+
+       * NEWS: Update.
+       * doc/tar.texi: Update.
+       * src/tar.c: New option --no-null.
+
 2008-09-23  Sergey Poznyakoff  <gray@gnu.org.ua>
 
        * src/common.h (filename_terminator): Remove global.
diff --git a/NEWS b/NEWS
index 62844269fd7cafae43430a708b843aab472495a3..5767601bf3b60fafb8d37b4d12aae7d507cb9759 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,4 @@
-GNU tar NEWS - User visible changes. 2008-06-26
+GNU tar NEWS - User visible changes. 2008-09-24
 Please send GNU tar bug reports to <bug-tar@gnu.org>
 
 \f
@@ -14,6 +14,10 @@ A shortcut for --lzma.
 
 Cancels the effect of previous --auto-compress (-a) option.
 
+* New option --no-null
+
+Cancels the effect of previous --null option.
+
 * Compressed format recognition
 
 If tar is unable to determine archive compression format, it falls
@@ -24,6 +28,11 @@ back to using archive suffix to determine it.
 Using --exclude-vcs handles also files used internally by Bazaar,
 Mercurial and Darcs.
 
+* Bugfixes
+
+** The --null option disabled handling of tar options in list files.  This
+is fixed.
+
 \f
 
 version 1.20 - Sergey Poznyakoff, 2008-04-14
index 7739489615cc5e5197b625d9904c4b56ede4c3a4..f86f077ad9e7811da802419c3ec771b60cabfa09 100644 (file)
@@ -2880,6 +2880,13 @@ Use case-sensitive matching.
 Print warnings about subprocesses that terminated with a nonzero exit
 code. @xref{Writing to an External Program}.
 
+@opsummary{no-null}
+@item --no-null
+
+If the @option{--null} option was given previously, this option
+cancels its effect, so that any following @option{--files-from}
+options will expect their file lists to be newline-terminated.
+
 @opsummary{no-overwrite-dir}
 @item --no-overwrite-dir
 
@@ -3901,15 +3908,15 @@ The name of the archive @command{tar} is processing.
 
 @vrindex TAR_BLOCKING_FACTOR, checkpoint script environment
 @item TAR_BLOCKING_FACTOR
-Current blocking factor (@pxref{Blocking}.
+Current blocking factor (@pxref{Blocking}).
 
 @vrindex TAR_CHECKPOINT, checkpoint script environment
 @item TAR_CHECKPOINT
-The checkpoint number.
+Number of the checkpoint.
 
 @vrindex TAR_SUBCOMMAND, checkpoint script environment
 @item TAR_SUBCOMMAND
-A short option describing the operation @command{tar} is executing
+A short option describing the operation @command{tar} is executing.
 @xref{Operations}, for a complete list of subcommand options.
 
 @vrindex TAR_FORMAT, checkpoint script environment
@@ -6747,10 +6754,14 @@ files whose names contain newlines can be archived using
 @option{--files-from}.
 
 @table @option
-@opindex null
+@xopindex{null, described}
 @item --null
 Only consider @code{NUL} terminated file names, instead of files that
 terminate in a newline.
+
+@xopindex{no-null, described}
+@item --no-null
+Undo the effect of any previous @option{--null} option.
 @end table
 
 The @option{--null} option is just like the one in @acronym{GNU}
@@ -6774,7 +6785,37 @@ $ @kbd{find .  -size +800 -print0 > long-files}
 $ @kbd{tar -c -v --null --files-from=long-files --file=big.tar}
 @end smallexample
 
-@FIXME{say anything else here to conclude the section?}
+The @option{--no-null} option can be used if you need to read both
+zero-terminated and newline-terminated files on the same command line.
+For example, if @file{flist} is a newline-terminated file, then the
+following command can be used to combine it with the above command:
+
+@smallexample
+@group
+$ @kbd{find .  -size +800 -print0 |
+  tar -c -f big.tar --null -T - --no-null -T flist}
+@end group
+@end smallexample
+
+This example uses short options for typographic reasons, to avoid
+very long lines.
+
+@GNUTAR is able to automatically detect null-terminated file lists, so
+it is safe to use them even without the @option{--null} option.  In
+this case @command{tar} will print a warning and continue reading such
+a file as if @option{--null} were actually given:
+
+@smallexample
+@group
+$ @kbd{find .  -size +800 -print0 | tar -c -f big.tar -T -}
+tar: -: file name read contains nul character
+@end group
+@end smallexample
+
+The null terminator, however, remains in effect only for this
+particular file, any following @option{-T} options will assume
+newline termination.  Of course, the null autodetection applies
+to these eventual surplus @option{-T} options as well.
 
 @node exclude
 @section Excluding Some Files
index 67bb0be7816eed29dabfea111e8f33aa2f79c24f..24279c72f788f4c2d81e652dbf22f2d7b9f191b8 100644 (file)
--- a/src/tar.c
+++ b/src/tar.c
@@ -280,6 +280,7 @@ enum
   NO_DELAY_DIRECTORY_RESTORE_OPTION,
   NO_IGNORE_CASE_OPTION,
   NO_IGNORE_COMMAND_ERROR_OPTION,
+  NO_NULL_OPTION,
   NO_OVERWRITE_DIR_OPTION,
   NO_QUOTE_CHARS_OPTION,
   NO_RECURSION_OPTION,
@@ -622,6 +623,8 @@ static struct argp_option options[] = {
    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 },
+  {"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 filenames read with -T (default)"), GRID+1 },
   {"no-unquote", NO_UNQUOTE_OPTION, 0, 0,
@@ -1053,16 +1056,16 @@ enum read_file_list_state  /* Result of reading file name from the list file */
     file_list_skip         /* Empty (zero-length) entry encountered, skip it */
   };
 
-/* Read from FP a sequence of characters up to FILENAME_TERMINATOR and put them
+/* Read from FP a sequence of characters up to TERM and put them
    into STK.
  */
 static enum read_file_list_state
-read_name_from_file (FILE *fp, struct obstack *stk)
+read_name_from_file (FILE *fp, struct obstack *stk, int term)
 {
   int c;
   size_t counter = 0;
 
-  for (c = getc (fp); c != EOF && c != filename_terminator; c = getc (fp))
+  for (c = getc (fp); c != EOF && c != term; c = getc (fp))
     {
       if (c == 0)
        {
@@ -1143,7 +1146,8 @@ update_argv (const char *filename, struct argp_state *state)
   size_t new_argc;
   bool is_stdin = false;
   enum read_file_list_state read_state;
-
+  int term = filename_terminator;
+  
   if (!strcmp (filename, "-"))
     {
       is_stdin = true;
@@ -1157,7 +1161,8 @@ update_argv (const char *filename, struct argp_state *state)
        open_fatal (filename);
     }
 
-  while ((read_state = read_name_from_file (fp, &argv_stk)) != file_list_end)
+  while ((read_state = read_name_from_file (fp, &argv_stk, term))
+        != file_list_end)
     {
       switch (read_state)
        {
@@ -1186,7 +1191,7 @@ update_argv (const char *filename, struct argp_state *state)
            obstack_1grow (&argv_stk, 0);
            count = 1;
            /* Read rest of files using new filename terminator */
-           filename_terminator = 0;
+           term = 0;
            break;
          }
 
@@ -1203,7 +1208,7 @@ update_argv (const char *filename, struct argp_state *state)
 
   start = obstack_finish (&argv_stk);
 
-  if (filename_terminator == 0)
+  if (term == 0)
     for (p = start; *p; p += strlen (p) + 1)
       if (p[0] == '-')
        count++;
@@ -1219,7 +1224,7 @@ update_argv (const char *filename, struct argp_state *state)
 
   for (i = state->next, p = start; *p; p += strlen (p) + 1, i++)
     {
-      if (filename_terminator == 0 && p[0] == '-')
+      if (term == 0 && p[0] == '-')
        state->argv[i++] = "--add-file";
       state->argv[i] = p;
     }
@@ -1741,6 +1746,10 @@ parse_opt (int key, char *arg, struct argp_state *state)
       filename_terminator = '\0';
       break;
 
+    case NO_NULL_OPTION:
+      filename_terminator = '\n';
+      break;
+
     case NUMERIC_OWNER_OPTION:
       numeric_owner_option = true;
       break;
This page took 0.057352 seconds and 4 git commands to generate.