]> Dogcows Code - chaz/tar/commitdiff
New option --first-copy
authorSergey Poznyakoff <gray@gnu.org.ua>
Thu, 2 Oct 2003 10:29:00 +0000 (10:29 +0000)
committerSergey Poznyakoff <gray@gnu.org.ua>
Thu, 2 Oct 2003 10:29:00 +0000 (10:29 +0000)
src/tar.c

index 6a875ca070ccdf90403b40a4998113334ea9a4a4..962d04c753586453572b5628274ba700b43359ad 100644 (file)
--- a/src/tar.c
+++ b/src/tar.c
@@ -158,6 +158,17 @@ archive_format_string (enum archive_format fmt)
   return "unknown?";
 }
 
+#define FORMAT_MASK(n) (1<<(n))
+
+static void
+assert_format(unsigned fmt_mask)
+{
+  if ((FORMAT_MASK(archive_format) & fmt_mask) == 0)
+    USAGE_ERROR ((0, 0,
+                 _("GNU features wanted on incompatible archive format")));
+}
+
+
 \f
 /* Options.  */
 
@@ -176,6 +187,7 @@ enum
   CHECKPOINT_OPTION,
   DELETE_OPTION,
   EXCLUDE_OPTION,
+  FIRST_COPY_OPTION,
   FORCE_LOCAL_OPTION,
   FORMAT_OPTION,
   GROUP_OPTION,
@@ -215,6 +227,10 @@ 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'},
@@ -244,6 +260,7 @@ 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'},
@@ -374,7 +391,9 @@ Operation modifiers:\n\
   -G, --incremental          handle old GNU-format incremental backup\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"),
+      --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"),
             stdout);
       fputs (_("\
 \n\
@@ -1248,6 +1267,31 @@ see the file named COPYING for details."));
     USAGE_ERROR ((0, 0,
                  _("GNU features wanted on incompatible archive format")));
 
+  if (volume_label_option && subcommand_option == CREATE_SUBCOMMAND)
+    assert_format (FORMAT_MASK (OLDGNU_FORMAT)
+                  | FORMAT_MASK (GNU_FORMAT));
+
+  if (incremental_option
+      || multi_volume_option
+      || sparse_option
+      || subcommand_option == CAT_SUBCOMMAND)
+    assert_format (FORMAT_MASK (OLDGNU_FORMAT)
+                  | FORMAT_MASK (GNU_FORMAT));
+  
+  if (first_copy_option)
+    {
+      if (!input_files && !files_from_option)
+       USAGE_ERROR ((0, 0,
+                     _("--first-copy is meaningless without file list")));
+      if (subcommand_option != DELETE_SUBCOMMAND
+         && subcommand_option != DIFF_SUBCOMMAND
+         && subcommand_option != EXTRACT_SUBCOMMAND
+         && subcommand_option != LIST_SUBCOMMAND
+         && subcommand_option != UPDATE_SUBCOMMAND)
+           USAGE_ERROR ((0, 0,
+                         _("--first-copy cannot be used in the requested operation mode")));
+    }
+  
   if (archive_names == 0)
     {
       /* If no archive file name given, try TAPE from the environment, or
@@ -1347,6 +1391,13 @@ see the file named COPYING for details."));
               textual_date_option, treated_as));
     }
 }
+
+bool
+all_names_found ()
+{
+  return first_copy_option && names_done ();
+}
+
 \f
 /* Tar proper.  */
 
This page took 0.026047 seconds and 4 git commands to generate.