Bläddra i källkod

New option --first-copy

Sergey Poznyakoff 21 år sedan
förälder
incheckning
6c16197226
1 ändrade filer med 52 tillägg och 1 borttagningar
  1. 52 1
      src/tar.c

+ 52 - 1
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")));
+}
+
+
 
 /* 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 ();
+}
+
 
 /* Tar proper.  */