(ANCHORED_OPTION, IGNORE_CASE_OPTION, NO_ANCHORED_OPTION,

NO_IGNORE_CASE_OPTION, NO_WILDCARDS_OPTION, NO_WILDCARDS_MATCH_SLASH_OPTION,
WILDCARDS_OPTION, WILDCARDS_MATCH_SLASH_OPTION): New enum values.

(long_options, usage, decode_options): Add support for --anchored,
--ignore-case, --no-anchored, --no-ignore-case, --no-wildcards,
--no-wildcards-match-slash, --recursion, --wildcards,
--wildcards-match-slash.

(decode_options): Implement the new way of interpreting exclude patterns.

(usage): --newer-mtime takes a DATE operand.  DATE may be a file name.

(OPTION_STRING, decode_options): Add -I, -y.  Currently these options
just print error messages suggesting alternatives.

(add_filtered_exclude): Remove.
This commit is contained in:
Paul Eggert
2001-08-27 14:41:56 +00:00
parent 998ecf08c0
commit 17afd0438f

115
src/tar.c
View File

@@ -1,5 +1,8 @@
/* A tar (tape archiver) program.
Copyright 1988,92,93,94,95,96,97,99,2000,2001 Free Software Foundation, Inc.
Copyright 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001 Free
Software Foundation, Inc.
Written by John Gilmore, starting 1985-08-25.
This program is free software; you can redistribute it and/or modify it
@@ -122,12 +125,18 @@ confirm (const char *message_action, const char *message_name)
enum
{
BACKUP_OPTION = CHAR_MAX + 1,
ANCHORED_OPTION = CHAR_MAX + 1,
BACKUP_OPTION,
DELETE_OPTION,
EXCLUDE_OPTION,
GROUP_OPTION,
IGNORE_CASE_OPTION,
MODE_OPTION,
NEWER_MTIME_OPTION,
NO_ANCHORED_OPTION,
NO_IGNORE_CASE_OPTION,
NO_WILDCARDS_OPTION,
NO_WILDCARDS_MATCH_SLASH_OPTION,
NULL_OPTION,
OVERWRITE_OPTION,
OWNER_OPTION,
@@ -138,6 +147,8 @@ enum
SUFFIX_OPTION,
USE_COMPRESS_PROGRAM_OPTION,
VOLNO_FILE_OPTION,
WILDCARDS_OPTION,
WILDCARDS_MATCH_SLASH_OPTION,
/* Some cleanup is being made in GNU tar long options. Using old names is
allowed for a while, but will also send a warning to stderr. Take old
@@ -163,6 +174,7 @@ static struct option long_options[] =
{"absolute-names", no_argument, 0, 'P'},
{"absolute-paths", no_argument, 0, OBSOLETE_ABSOLUTE_NAMES},
{"after-date", required_argument, 0, 'N'},
{"anchored", no_argument, 0, ANCHORED_OPTION},
{"append", no_argument, 0, 'r'},
{"atime-preserve", no_argument, &atime_preserve_option, 1},
{"backup", optional_argument, 0, BACKUP_OPTION},
@@ -194,6 +206,7 @@ static struct option long_options[] =
{"gunzip", no_argument, 0, 'z'},
{"gzip", no_argument, 0, 'z'},
{"help", no_argument, &show_help, 1},
{"ignore-case", no_argument, 0, IGNORE_CASE_OPTION},
{"ignore-failed-read", no_argument, &ignore_failed_read_option, 1},
{"ignore-zeros", no_argument, 0, 'i'},
/* FIXME: --ignore-end as a new name for --ignore-zeros? */
@@ -211,6 +224,10 @@ static struct option long_options[] =
{"newer", required_argument, 0, 'N'},
{"newer-mtime", required_argument, 0, NEWER_MTIME_OPTION},
{"null", no_argument, 0, NULL_OPTION},
{"no-anchored", no_argument, 0, NO_ANCHORED_OPTION},
{"no-ignore-case", no_argument, 0, NO_IGNORE_CASE_OPTION},
{"no-wildcards", no_argument, 0, NO_WILDCARDS_OPTION},
{"no-wildcards-match-slash", no_argument, 0, NO_WILDCARDS_MATCH_SLASH_OPTION},
{"no-recursion", no_argument, &recursion_option, 0},
{"no-same-owner", no_argument, &same_owner_option, -1},
{"no-same-permissions", no_argument, &same_permissions_option, -1},
@@ -224,6 +241,7 @@ static struct option long_options[] =
{"preserve", no_argument, 0, PRESERVE_OPTION},
{"preserve-order", no_argument, 0, 's'},
{"preserve-permissions", no_argument, 0, 'p'},
{"recursion", no_argument, &recursion_option, FNM_LEADING_DIR},
{"recursive-unlink", no_argument, &recursive_unlink_option, 1},
{"read-full-blocks", no_argument, 0, OBSOLETE_READ_FULL_RECORDS},
{"read-full-records", no_argument, 0, 'B'},
@@ -253,6 +271,8 @@ static struct option long_options[] =
{"version", no_argument, &show_version, 1},
{"version-control", required_argument, 0, OBSOLETE_VERSION_CONTROL},
{"volno-file", required_argument, 0, VOLNO_FILE_OPTION},
{"wildcards", no_argument, 0, WILDCARDS_OPTION},
{"wildcards-match-slash", no_argument, 0, WILDCARDS_MATCH_SLASH_OPTION},
{0, 0, 0, 0}
};
@@ -368,8 +388,16 @@ Local file selection:\n\
-C, --directory=DIR change to directory DIR\n\
-T, --files-from=NAME get names to extract or create from file NAME\n\
--null -T reads null-terminated names, disable -C\n\
--exclude=PATTERN exclude files, given as a globbing PATTERN\n\
-X, --exclude-from=FILE exclude globbing patterns listed in FILE\n\
--exclude=PATTERN exclude files, given as a PATTERN\n\
-X, --exclude-from=FILE exclude patterns listed in FILE\n\
--anchored exclude patterns match file name start (default)\n\
--no-anchored exclude patterns match after any /\n\
--ignore-case exclusion ignores case\n\
--no-ignore-case exclusion is case sensitive (default)\n\
--wildcards exclude patterns use wildcards (default)\n\
--no-wildcards exclude patterns are plain strings\n\
--wildcards-match-slash exclude pattern wildcards match '/' (default)\n\
--no-wildcards-match-slash exclude pattern wildcards do not match '/'\n\
-P, --absolute-names don't strip leading `/'s from file names\n\
-h, --dereference dump instead the files symlinks point to\n\
--no-recursion avoid descending automatically in directories\n\
@@ -379,7 +407,7 @@ Local file selection:\n\
#if !MSDOS
fputs (_("\
-N, --newer=DATE only store files newer than DATE\n\
--newer-mtime compare date and time when data changed only\n\
--newer-mtime=DATE compare date and time when data changed only\n\
--after-date=DATE same as -N\n"),
stdout);
#endif
@@ -413,8 +441,9 @@ The version control may be set with --backup or VERSION_CONTROL, values are:\n\
GNU tar cannot read nor produce `--posix' archives. If POSIXLY_CORRECT\n\
is set in the environment, GNU extensions are disallowed with `--posix'.\n\
Support for POSIX is only partially implemented, don't count on it yet.\n\
ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; and FILE may be a file\n\
or a device. *This* `tar' defaults to `-f%s -b%d'.\n"),
ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; DATE may be a textual date\n\
or a file name starting with `/' or `.', in which case the file's date is used.\n\
*This* `tar' defaults to `-f%s -b%d'.\n"),
DEFAULT_ARCHIVE, DEFAULT_BLOCKING);
fputs (_("\nReport bugs to <bug-tar@gnu.org>.\n"), stdout);
}
@@ -434,7 +463,7 @@ or a device. *This* `tar' defaults to `-f%s -b%d'.\n"),
Y per-block gzip compression */
#define OPTION_STRING \
"-01234567ABC:F:GK:L:MN:OPRST:UV:WX:Zb:cdf:g:hijklmoprstuvwxz"
"-01234567ABC:F:GIK:L:MN:OPRST:UV:WX:Zb:cdf:g:hijklmoprstuvwxyz"
static void
set_subcommand_option (enum subcommand subcommand)
@@ -456,18 +485,6 @@ set_use_compress_program_option (const char *string)
use_compress_program_option = string;
}
/* Ignore DUMMY (which will always be null in practice), and add
PATTERN to the proper set of patterns to be excluded -- either
patterns with slashes, or patterns without. */
static void
add_filtered_exclude (struct exclude *dummy, char const *pattern)
{
add_exclude ((strchr (pattern, '/')
? excluded_with_slash
: excluded_without_slash),
pattern);
}
static void
decode_options (int argc, char **argv)
{
@@ -475,6 +492,7 @@ decode_options (int argc, char **argv)
int input_files; /* number of input files */
const char *backup_suffix_string;
const char *version_control_string = 0;
int exclude_options = EXCLUDE_WILDCARDS;
/* Set some default option values. */
@@ -482,8 +500,7 @@ decode_options (int argc, char **argv)
archive_format = DEFAULT_FORMAT;
blocking_factor = DEFAULT_BLOCKING;
record_size = DEFAULT_BLOCKING * BLOCKSIZE;
excluded_with_slash = new_exclude ();
excluded_without_slash = new_exclude ();
excluded = new_exclude ();
newer_mtime_option = TYPE_MINIMUM (time_t);
recursion_option = FNM_LEADING_DIR;
@@ -670,6 +687,12 @@ decode_options (int argc, char **argv)
ignore_zeros_option = 1;
break;
case 'I':
USAGE_ERROR ((0, 0,
_("Warning: the -I option is not supported;"
" perhaps you meant -j or -T?")));
break;
case 'j':
set_use_compress_program_option ("bzip2");
break;
@@ -839,13 +862,21 @@ decode_options (int argc, char **argv)
break;
case 'X':
if (add_exclude_file (add_filtered_exclude, 0, optarg, '\n') != 0)
if (add_exclude_file (add_exclude, excluded, optarg,
exclude_options | recursion_option, '\n')
!= 0)
{
int e = errno;
FATAL_ERROR ((0, e, "%s", quotearg_colon (optarg)));
}
break;
case 'y':
USAGE_ERROR ((0, 0,
_("Warning: the -y option is not supported;"
" perhaps you meant -j?")));
break;
case 'z':
set_use_compress_program_option ("gzip");
break;
@@ -858,6 +889,10 @@ decode_options (int argc, char **argv)
WARN ((0, 0, _("Obsolete option name replaced by --backup")));
/* Fall through. */
case ANCHORED_OPTION:
exclude_options |= EXCLUDE_ANCHORED;
break;
case BACKUP_OPTION:
backup_option = 1;
if (optarg)
@@ -869,7 +904,11 @@ decode_options (int argc, char **argv)
break;
case EXCLUDE_OPTION:
add_filtered_exclude (0, optarg);
add_exclude (excluded, optarg, exclude_options | recursion_option);
break;
case IGNORE_CASE_OPTION:
exclude_options |= FNM_CASEFOLD;
break;
case GROUP_OPTION:
@@ -896,6 +935,22 @@ decode_options (int argc, char **argv)
xalloc_die ();
break;
case NO_ANCHORED_OPTION:
exclude_options &= ~ EXCLUDE_ANCHORED;
break;
case NO_IGNORE_CASE_OPTION:
exclude_options &= ~ FNM_CASEFOLD;
break;
case NO_WILDCARDS_OPTION:
exclude_options &= ~ EXCLUDE_WILDCARDS;
break;
case NO_WILDCARDS_MATCH_SLASH_OPTION:
exclude_options |= FNM_FILE_NAME;
break;
case NULL_OPTION:
filename_terminator = '\0';
break;
@@ -961,12 +1016,20 @@ decode_options (int argc, char **argv)
backup_suffix_string = optarg;
break;
case USE_COMPRESS_PROGRAM_OPTION:
set_use_compress_program_option (optarg);
break;
case VOLNO_FILE_OPTION:
volno_file_option = optarg;
break;
case USE_COMPRESS_PROGRAM_OPTION:
set_use_compress_program_option (optarg);
case WILDCARDS_OPTION:
exclude_options |= EXCLUDE_WILDCARDS;
break;
case WILDCARDS_MATCH_SLASH_OPTION:
exclude_options &= ~ FNM_FILE_NAME;
break;
case '0':