From eb6bef9909f1b7bded5af64da1a913e360f06359 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Sat, 4 Oct 2003 14:08:16 +0000 Subject: [PATCH] New option --occurrence --- src/tar.c | 43 ++++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/src/tar.c b/src/tar.c index 0dd48b3..1daaf57 100644 --- 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 (); -} - /* Tar proper. */ -- 2.44.0