X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftar.c;h=85248091b98b149743d76406805baf6093f8ca28;hb=46da9968df4bad8ce3899f98000aa5612375d29f;hp=7cd25c0472a27db95fd8b98a200af4ffe851a809;hpb=c86b0c21494752dc3fccda8f160af68d1135b13e;p=chaz%2Ftar diff --git a/src/tar.c b/src/tar.c index 7cd25c0..8524809 100644 --- a/src/tar.c +++ b/src/tar.c @@ -51,6 +51,7 @@ #include #include #include +#include /* Local declarations. */ @@ -342,6 +343,7 @@ enum SHOW_SNAPSHOT_FIELD_RANGES_OPTION, SHOW_TRANSFORMED_NAMES_OPTION, SKIP_OLD_FILES_OPTION, + SORT_OPTION, SPARSE_VERSION_OPTION, STRIP_COMPONENTS_OPTION, SUFFIX_OPTION, @@ -551,6 +553,13 @@ static struct argp_option options[] = { " directories until the end of extraction"), GRID+1 }, {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION, 0, 0, N_("cancel the effect of --delay-directory-restore option"), GRID+1 }, + {"sort", SORT_OPTION, N_("ORDER"), 0, +#if D_INO_IN_DIRENT + N_("directory sorting order: none (default), name or inode" +#else + N_("directory sorting order: none (default) or name" +#endif + ), GRID+1 }, #undef GRID #define GRID 55 @@ -1310,6 +1319,21 @@ parse_owner_group (char *arg, uintmax_t field_max, char const **name_option) /* Either NL or NUL, as decided by the --null option. */ static char filename_terminator; +static char const *const sort_mode_arg[] = { + "none", + "name", + "inode", + NULL +}; + +static int sort_mode_flag[] = { + SAVEDIR_SORT_NONE, + SAVEDIR_SORT_NAME, + SAVEDIR_SORT_INODE +}; + +ARGMATCH_VERIFY (sort_mode_arg, sort_mode_flag); + static error_t parse_opt (int key, char *arg, struct argp_state *state) { @@ -1997,6 +2021,11 @@ parse_opt (int key, char *arg, struct argp_state *state) show_transformed_names_option = true; break; + case SORT_OPTION: + savedir_sort_order = XARGMATCH ("--sort", arg, + sort_mode_arg, sort_mode_flag); + break; + case SUFFIX_OPTION: backup_option = true; args->backup_suffix_string = arg; @@ -2274,6 +2303,8 @@ decode_options (int argc, char **argv) tar_sparse_major = 1; tar_sparse_minor = 0; + savedir_sort_order = SAVEDIR_SORT_NONE; + owner_option = -1; owner_name_option = NULL; group_option = -1; group_name_option = NULL; @@ -2518,22 +2549,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. */