]> Dogcows Code - chaz/tar/commitdiff
New option --occurrence
authorSergey Poznyakoff <gray@gnu.org.ua>
Sat, 4 Oct 2003 14:08:16 +0000 (14:08 +0000)
committerSergey Poznyakoff <gray@gnu.org.ua>
Sat, 4 Oct 2003 14:08:16 +0000 (14:08 +0000)
src/tar.c

index 0dd48b3ebd57f11ecaf7f473306c0c53b63555e4..1daaf5754ce3f604adafa6940452a461a5d75c12 100644 (file)
--- a/src/tar.c
+++ b/src/tar.c
@@ -187,7 +187,6 @@ enum
   CHECKPOINT_OPTION,
   DELETE_OPTION,
   EXCLUDE_OPTION,
-  FIRST_COPY_OPTION,
   FORCE_LOCAL_OPTION,
   FORMAT_OPTION,
   GROUP_OPTION,
@@ -203,6 +202,7 @@ enum
   NO_WILDCARDS_MATCH_SLASH_OPTION,
   NULL_OPTION,
   NUMERIC_OWNER_OPTION,
+  OCCURRENCE_OPTION,
   OVERWRITE_OPTION,
   OWNER_OPTION,
   POSIX_OPTION,
@@ -227,10 +227,6 @@ static int show_help;
 /* If nonzero, print the version on standard output and exit.  */
 static int show_version;
 
-/* If nonzero, stop processing when all the files from the namelist
-   where handled */
-static int first_copy_option;
-
 static struct option long_options[] =
 {
   {"absolute-names", no_argument, 0, 'P'},
@@ -260,7 +256,6 @@ static struct option long_options[] =
   {"extract", no_argument, 0, 'x'},
   {"file", required_argument, 0, 'f'},
   {"files-from", required_argument, 0, 'T'},
-  {"first-copy", no_argument, &first_copy_option, 1},
   {"force-local", no_argument, 0, FORCE_LOCAL_OPTION},
   {"format", required_argument, 0, FORMAT_OPTION},
   {"get", no_argument, 0, 'x'},
@@ -295,6 +290,7 @@ static struct option long_options[] =
   {"no-same-owner", no_argument, &same_owner_option, -1},
   {"no-same-permissions", no_argument, &same_permissions_option, -1},
   {"numeric-owner", no_argument, 0, NUMERIC_OWNER_OPTION},
+  {"occurrence", optional_argument, 0, OCCURRENCE_OPTION},
   {"old-archive", no_argument, 0, 'o'},
   {"one-file-system", no_argument, 0, 'l'},
   {"overwrite", no_argument, 0, OVERWRITE_OPTION},
@@ -392,8 +388,13 @@ Operation modifiers:\n\
   -g, --listed-incremental=FILE\n\
                              handle new GNU-format incremental backup\n\
       --ignore-failed-read   do not exit with nonzero on unreadable files\n\
-      --first-copy           process only the first copy of each file in the\
-                            archive\n"),
+      --occurrence[=NUM]     process only the NUMth occurrence of each file in\n\
+                             the archive. This option is valid only in\n\
+                             conjunction with one of the subcommands --delete,\n\
+                             --diff, --extract or --list and when a list of\n\
+                             files is given either on the command line or\n\
+                             via -T option.\n\
+                             NUM defaults to 1.\n"),
             stdout);
       fputs (_("\
 \n\
@@ -1038,6 +1039,20 @@ decode_options (int argc, char **argv)
        numeric_owner_option = true;
        break;
 
+      case OCCURRENCE_OPTION:
+       if (!optarg)
+         occurrence_option = 1;
+       else
+         {
+           uintmax_t u;
+           if (xstrtoumax (optarg, 0, 10, &u, "") == LONGINT_OK)
+             occurrence_option = u;
+           else
+             FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (optarg),
+                           _("Invalid number")));
+         }
+       break;
+       
       case OVERWRITE_OPTION:
        old_files_option = OVERWRITE_OLD_FILES;
        break;
@@ -1277,17 +1292,17 @@ see the file named COPYING for details."));
     assert_format (FORMAT_MASK (OLDGNU_FORMAT)
                   | FORMAT_MASK (GNU_FORMAT));
   
-  if (first_copy_option)
+  if (occurrence_option)
     {
       if (!input_files && !files_from_option)
        USAGE_ERROR ((0, 0,
-                     _("--first-copy is meaningless without file list")));
+                     _("--occurrence is meaningless without file list")));
       if (subcommand_option != DELETE_SUBCOMMAND
          && subcommand_option != DIFF_SUBCOMMAND
          && subcommand_option != EXTRACT_SUBCOMMAND
          && subcommand_option != LIST_SUBCOMMAND)
            USAGE_ERROR ((0, 0,
-                         _("--first-copy cannot be used in the requested operation mode")));
+                         _("--occurrence cannot be used in the requested operation mode")));
     }
   
   if (archive_names == 0)
@@ -1390,12 +1405,6 @@ see the file named COPYING for details."));
     }
 }
 
-bool
-all_names_found ()
-{
-  return first_copy_option && names_done ();
-}
-
 \f
 /* Tar proper.  */
 
This page took 0.031848 seconds and 4 git commands to generate.