X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftar.c;h=f8102e0aaef34b303664f331679a2ec328c72b49;hb=e7c99a4dd16685012e42519f1b4fb2b37b19dec5;hp=08f334f554f50f0376576baaf51aa2199549f9de;hpb=8e10d93d01049d4c5c58ebe57da499a3873be9db;p=chaz%2Ftar diff --git a/src/tar.c b/src/tar.c index 08f334f..f8102e0 100644 --- a/src/tar.c +++ b/src/tar.c @@ -284,10 +284,13 @@ enum EXCLUDE_CACHES_UNDER_OPTION, EXCLUDE_CACHES_ALL_OPTION, EXCLUDE_OPTION, + EXCLUDE_IGNORE_OPTION, + EXCLUDE_IGNORE_RECURSIVE_OPTION, EXCLUDE_TAG_OPTION, EXCLUDE_TAG_UNDER_OPTION, EXCLUDE_TAG_ALL_OPTION, EXCLUDE_VCS_OPTION, + EXCLUDE_VCS_IGNORES_OPTION, FORCE_LOCAL_OPTION, FULL_TIME_OPTION, GROUP_OPTION, @@ -714,9 +717,9 @@ static struct argp_option options[] = { {"no-null", NO_NULL_OPTION, 0, 0, N_("disable the effect of the previous --null option"), GRID+1 }, {"unquote", UNQUOTE_OPTION, 0, 0, - N_("unquote filenames read with -T (default)"), GRID+1 }, + N_("unquote input file or member names (default)"), GRID+1 }, {"no-unquote", NO_UNQUOTE_OPTION, 0, 0, - N_("do not unquote filenames read with -T"), GRID+1 }, + N_("do not unquote input file or member names"), GRID+1 }, {"exclude", EXCLUDE_OPTION, N_("PATTERN"), 0, N_("exclude files, given as a PATTERN"), GRID+1 }, {"exclude-from", 'X', N_("FILE"), 0, @@ -732,12 +735,20 @@ static struct argp_option options[] = { {"exclude-tag", EXCLUDE_TAG_OPTION, N_("FILE"), 0, N_("exclude contents of directories containing FILE, except" " for FILE itself"), GRID+1 }, + {"exclude-ignore", EXCLUDE_IGNORE_OPTION, N_("FILE"), 0, + N_("read exclude patterns for each directory from FILE, if it exists"), + GRID+1 }, + {"exclude-ignore-recursive", EXCLUDE_IGNORE_RECURSIVE_OPTION, N_("FILE"), 0, + N_("read exclude patterns for each directory and its subdirectories " + "from FILE, if it exists"), GRID+1 }, {"exclude-tag-under", EXCLUDE_TAG_UNDER_OPTION, N_("FILE"), 0, N_("exclude everything under directories containing FILE"), GRID+1 }, {"exclude-tag-all", EXCLUDE_TAG_ALL_OPTION, N_("FILE"), 0, N_("exclude directories containing FILE"), GRID+1 }, {"exclude-vcs", EXCLUDE_VCS_OPTION, NULL, 0, N_("exclude version control system directories"), GRID+1 }, + {"exclude-vcs-ignores", EXCLUDE_VCS_IGNORES_OPTION, NULL, 0, + N_("read exclude patterns from the VCS ignore files"), GRID+1 }, {"exclude-backups", EXCLUDE_BACKUPS_OPTION, NULL, 0, N_("exclude backup and lock files"), GRID+1 }, {"no-recursion", NO_RECURSION_OPTION, 0, 0, @@ -1330,14 +1341,18 @@ static char filename_terminator; static char const *const sort_mode_arg[] = { "none", "name", +#if D_INO_IN_DIRENT "inode", +#endif NULL }; static int sort_mode_flag[] = { SAVEDIR_SORT_NONE, SAVEDIR_SORT_NAME, +#if D_INO_IN_DIRENT SAVEDIR_SORT_INODE +#endif }; ARGMATCH_VERIFY (sort_mode_arg, sort_mode_flag); @@ -1630,7 +1645,7 @@ parse_opt (int key, char *arg, struct argp_state *state) break; case 'T': - name_add_file (arg, filename_terminator); + name_add_file (arg, filename_terminator, MAKE_INCL_OPTIONS (args)); /* Indicate we've been given -T option. This is for backward compatibility only, so that `tar cfT archive /dev/null will succeed */ @@ -1776,6 +1791,14 @@ parse_opt (int key, char *arg, struct argp_state *state) cachedir_file_p); break; + case EXCLUDE_IGNORE_OPTION: + excfile_add (arg, EXCL_NON_RECURSIVE); + break; + + case EXCLUDE_IGNORE_RECURSIVE_OPTION: + excfile_add (arg, EXCL_RECURSIVE); + break; + case EXCLUDE_TAG_OPTION: add_exclusion_tag (arg, exclusion_tag_contents, NULL); break; @@ -1792,6 +1815,10 @@ parse_opt (int key, char *arg, struct argp_state *state) add_exclude_array (vcs_file_table, 0); break; + case EXCLUDE_VCS_IGNORES_OPTION: + exclude_vcs_ignores (); + break; + case FORCE_LOCAL_OPTION: force_local_option = true; break; @@ -2304,6 +2331,7 @@ decode_options (int argc, char **argv) blocking_factor = DEFAULT_BLOCKING; record_size = DEFAULT_BLOCKING * BLOCKSIZE; excluded = new_exclude (); + newer_mtime_option.tv_sec = TYPE_MINIMUM (time_t); newer_mtime_option.tv_nsec = -1; recursion_option = FNM_LEADING_DIR; @@ -2849,6 +2877,7 @@ tar_stat_destroy (struct tar_stat_info *st) free (st->sparse_map); free (st->dumpdir); xheader_destroy (&st->xhdr); + info_free_exclist (st); memset (st, 0, sizeof (*st)); }