From: Sergey Poznyakoff Date: Thu, 2 Oct 2003 10:29:00 +0000 (+0000) Subject: New option --first-copy X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=6c161972265f72bdaab3eb60bef253450f176691;p=chaz%2Ftar New option --first-copy --- diff --git a/src/tar.c b/src/tar.c index 6a875ca..962d04c 100644 --- 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"))); +} + + /* 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. */