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. */
CHECKPOINT_OPTION,
DELETE_OPTION,
EXCLUDE_OPTION,
+ FIRST_COPY_OPTION,
FORCE_LOCAL_OPTION,
FORMAT_OPTION,
GROUP_OPTION,
/* 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'},
{"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'},
-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\
if (show_version)
{
- printf ("tar (%s) %s\n", PACKAGE_NAME, PACKAGE_VERSION);
- printf (_("Copyright (C) %d Free Software Foundation, Inc.\n"), 2003);
+ printf ("tar (%s) %s\n%s\n", PACKAGE_NAME, PACKAGE_VERSION,
+ "Copyright (C) 2003 Free Software Foundation, Inc.");
puts (_("\
This program comes with NO WARRANTY, to the extent permitted by law.\n\
You may redistribute it under the terms of the GNU General Public License;\n\
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)
+ 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
: 0));
if (volume_label_max_len < strlen (volume_label_option))
USAGE_ERROR ((0, 0,
- _("%s: Volume label is too long (limit is %lu bytes)"),
+ ngettext ("%s: Volume label is too long (limit is %lu byte)",
+ "%s: Volume label is too long (limit is %lu bytes)",
+ volume_label_max_len),
quotearg_colon (volume_label_option),
(unsigned long) volume_label_max_len));
}
textual_date_option, treated_as));
}
}
+
+bool
+all_names_found ()
+{
+ return first_copy_option && names_done ();
+}
+
\f
/* Tar proper. */