X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftar.c;h=f8102e0aaef34b303664f331679a2ec328c72b49;hb=e9ddc08da0982f36581ae5a8c7763453ff41cfe8;hp=f36e1518455baa8e91abac3473abca73608de25f;hpb=29a6964af3e1baabe978ce608e0466e1250d08ab;p=chaz%2Ftar diff --git a/src/tar.c b/src/tar.c index f36e151..f8102e0 100644 --- a/src/tar.c +++ b/src/tar.c @@ -167,6 +167,14 @@ set_archive_format (char const *name) archive_format = p->fmt; } +static void +set_xattr_option (int value) +{ + if (value == 1) + set_archive_format ("posix"); + xattrs_option = value; +} + const char * archive_format_string (enum archive_format fmt) { @@ -276,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, @@ -706,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, @@ -724,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, @@ -1322,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); @@ -1622,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 */ @@ -1768,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; @@ -1784,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; @@ -2095,16 +2130,16 @@ parse_opt (int key, char *arg, struct argp_state *state) break; case XATTR_OPTION: - set_archive_format ("posix"); - xattrs_option = 1; + set_xattr_option (1); break; case NO_XATTR_OPTION: - xattrs_option = -1; + set_xattr_option (-1); break; case XATTR_INCLUDE: case XATTR_EXCLUDE: + set_xattr_option (1); xattrs_mask_add (arg, (key == XATTR_INCLUDE)); break; @@ -2296,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; @@ -2549,22 +2585,22 @@ decode_options (int argc, char **argv) { char *base; - if (!IS_SUBCOMMAND_CLASS (SUBCL_READ)) - option_conflict_error ("--one-top-level", - subcommand_string (subcommand_option)); if (absolute_names_option) option_conflict_error ("--one-top-level", "--absolute-names"); - /* If the user wants to guarantee that everything is under one directory, - determine its name now and let it be created later. */ - base = base_name (archive_name_array[0]); - one_top_level_dir = strip_compression_suffix (base); - free (base); - if (!one_top_level_dir) - USAGE_ERROR ((0, 0, - _("Cannot deduce top-level directory name; " - "please set it explicitly with --one-top-level=DIR"))); + { + /* If the user wants to guarantee that everything is under one + directory, determine its name now and let it be created later. */ + base = base_name (archive_name_array[0]); + one_top_level_dir = strip_compression_suffix (base); + free (base); + + if (!one_top_level_dir) + USAGE_ERROR ((0, 0, + _("Cannot deduce top-level directory name; " + "please set it explicitly with --one-top-level=DIR"))); + } } /* If ready to unlink hierarchies, so we are for simpler files. */ @@ -2841,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)); }