diff --git a/tar-1.26-add-skip-old-files-option.patch b/tar-1.26-add-skip-old-files-option.patch new file mode 100644 index 0000000..fa70669 --- /dev/null +++ b/tar-1.26-add-skip-old-files-option.patch @@ -0,0 +1,371 @@ +diff --git a/doc/tar.texi b/doc/tar.texi +index 567745b..38c8bae 100644 +--- a/doc/tar.texi ++++ b/doc/tar.texi +@@ -1994,6 +1994,7 @@ The other operations of @command{tar} (@option{--list}, + @option{--extract}, @option{--compare}, and @option{--update}) + will act on the entire contents of the archive. + ++@anchor{exit status} + @cindex exit status + @cindex return status + Besides successful exits, @GNUTAR{} may fail for +@@ -2932,7 +2933,10 @@ when extracting files from an archive. + @item --keep-old-files + @itemx -k + +-Do not overwrite existing files when extracting files from an archive. ++Do not overwrite existing files when extracting files from an ++archive. Return error if such files exist. See also ++@ref{--skip-old-files}. ++ + @xref{Keep Old Files}. + + @opsummary{label} +@@ -3404,6 +3408,20 @@ the archive creation operations it instructs @command{tar} to list the + member names stored in the archive, as opposed to the actual file + names. @xref{listing member and file names}. + ++@opsummary{skip-old-files} ++@item --skip-old-files ++ ++Do not overwrite existing files when extracting files from an ++archive. @xref{Keep Old Files}. ++ ++This option differs from @option{--keep-old-files} in that it does not ++treat such files as an error, instead it just silently avoids ++overwriting them. ++ ++The @option{--warning=existing-file} option can be used together with ++this option to produce warning messages about existing old files ++(@pxref{warnings}). ++ + @opsummary{sparse} + @item --sparse + @itemx -S +@@ -4589,11 +4607,11 @@ in the archive; the most recently archived members will be extracted + last. Additionally, an extracted member will @emph{replace} a file of + the same name which existed in the directory already, and @command{tar} + will not prompt you about this@footnote{Unless you give it +-@option{--keep-old-files} option, or the disk copy is newer than +-the one in the archive and you invoke @command{tar} with +-@option{--keep-newer-files} option.}. Thus, only the most recently archived +-member will end up being extracted, as it will replace the one +-extracted before it, and so on. ++@option{--keep-old-files} (or @option{--skip-old-files}) option, or ++the disk copy is newer than the one in the archive and you invoke ++@command{tar} with @option{--keep-newer-files} option.}. Thus, only ++the most recently archived member will end up being extracted, as it ++will replace the one extracted before it, and so on. + + @cindex extracting @var{n}th copy of the file + @xopindex{occurrence, described} +@@ -5269,10 +5287,25 @@ such a directory, use the @option{--no-overwrite-dir} option. + @cindex Overwriting old files, prevention + @xopindex{keep-old-files, introduced} + To be even more cautious and prevent existing files from being replaced, use +-the @option{--keep-old-files} (@option{-k}) option. It causes @command{tar} to refuse +-to replace or update a file that already exists, i.e., a file with the +-same name as an archive member prevents extraction of that archive +-member. Instead, it reports an error. ++the @option{--keep-old-files} (@option{-k}) option. It causes ++@command{tar} to refuse to replace or update a file that already ++exists, i.e., a file with the same name as an archive member prevents ++extraction of that archive member. Instead, it reports an error. For ++example: ++ ++@example ++$ @kbd{ls} ++blues ++$ @kbd{tar -x -k -f archive.tar} ++tar: blues: Cannot open: File exists ++tar: Exiting with failure status due to previous errors ++@end example ++ ++@xopindex{skip-old-files, introduced} ++If you wish to preserve old files untouched, but don't want ++@command{tar} to treat them as errors, use the ++@option{--skip-old-files} option. This option causes @command{tar} to ++silently skip extracting over existing files. + + @xopindex{overwrite, introduced} + To be more aggressive about altering existing files, use the +@@ -5338,16 +5371,24 @@ archive, but remove other files before extracting. + @node Keep Old Files + @unnumberedsubsubsec Keep Old Files + ++@GNUTAR{} provides two options to control its actions in a situation ++when it is about to extract a file which already exists on disk. ++ + @table @option + @opindex keep-old-files + @item --keep-old-files + @itemx -k +-Do not replace existing files from archive. The +-@option{--keep-old-files} (@option{-k}) option prevents @command{tar} +-from replacing existing files with files with the same name from the +-archive. The @option{--keep-old-files} option is meaningless with +-@option{--list} (@option{-t}). Prevents @command{tar} from replacing +-files in the file system during extraction. ++Do not replace existing files from archive. When such a file is ++encountered, @command{tar} issues an error message. Upon end of ++extraction, @command{tar} exits with code 2 (@pxref{exit status}). ++ ++@item --skip-old-files ++Do not replace existing files from archive, but do not treat that ++as error. Such files are silently skipped and do not affect ++@command{tar} exit status. ++ ++Additional verbosity can be obtained using @option{--warning=existing-file} ++together with that option (@pxref{warnings}). + @end table + + @node Keep Newer Files +diff --git a/src/common.h b/src/common.h +index 4cf1459..b34aef0 100644 +--- a/src/common.h ++++ b/src/common.h +@@ -187,6 +187,7 @@ enum old_files + OVERWRITE_OLD_FILES, /* --overwrite */ + UNLINK_FIRST_OLD_FILES, /* --unlink-first */ + KEEP_OLD_FILES, /* --keep-old-files */ ++ SKIP_OLD_FILES, /* --skip-old-files */ + KEEP_NEWER_FILES /* --keep-newer-files */ + }; + GLOBAL enum old_files old_files_option; +@@ -830,13 +831,15 @@ void checkpoint_run (bool do_write); + #define WARN_UNKNOWN_KEYWORD 0x00020000 + #define WARN_XDEV 0x00040000 + #define WARN_DECOMPRESS_PROGRAM 0x00080000 ++#define WARN_EXISTING_FILE 0x00100000 ++ + + #define WARN_XATTR_WRITE 0x00200000 + + /* The warnings composing WARN_VERBOSE_WARNINGS are enabled by default + in verbose mode */ + #define WARN_VERBOSE_WARNINGS (WARN_RENAME_DIRECTORY|WARN_NEW_DIRECTORY|\ +- WARN_DECOMPRESS_PROGRAM) ++ WARN_DECOMPRESS_PROGRAM|WARN_EXISTING_FILE) + #define WARN_ALL (~WARN_VERBOSE_WARNINGS) + + void set_warning_option (const char *arg); +diff --git a/src/extract.c b/src/extract.c +index 8a7a6ad..87b383a 100644 +--- a/src/extract.c ++++ b/src/extract.c +@@ -696,9 +696,14 @@ maybe_recoverable (char *file_name, bool regular, bool *interdir_made) + + switch (old_files_option) + { +- case KEEP_OLD_FILES: ++ case SKIP_OLD_FILES: ++ WARNOPT (WARN_EXISTING_FILE, ++ (0, 0, _("%s: skipping existing file"), file_name)); + return RECOVER_SKIP; + ++ case KEEP_OLD_FILES: ++ return RECOVER_NO; ++ + case KEEP_NEWER_FILES: + if (file_newer_p (file_name, stp, ¤t_stat_info)) + break; +diff --git a/src/tar.c b/src/tar.c +index 0ed1717..e244808 100644 +--- a/src/tar.c ++++ b/src/tar.c +@@ -334,6 +334,7 @@ enum + SHOW_DEFAULTS_OPTION, + SHOW_OMITTED_DIRS_OPTION, + SHOW_TRANSFORMED_NAMES_OPTION, ++ SKIP_OLD_FILES_OPTION, + SPARSE_VERSION_OPTION, + STRIP_COMPONENTS_OPTION, + SUFFIX_OPTION, +@@ -461,7 +462,11 @@ static struct argp_option options[] = { + {"remove-files", REMOVE_FILES_OPTION, 0, 0, + N_("remove files after adding them to the archive"), GRID+1 }, + {"keep-old-files", 'k', 0, 0, +- N_("don't replace existing files when extracting"), GRID+1 }, ++ N_("don't replace existing files when extracting, " ++ "treat them as errors"), GRID+1 }, ++ {"skip-old-files", SKIP_OLD_FILES_OPTION, 0, 0, ++ N_("don't replace existing files when extracting, silently skip over them"), ++ GRID+1 }, + {"keep-newer-files", KEEP_NEWER_FILES_OPTION, 0, 0, + N_("don't replace existing files that are newer than their archive copies"), GRID+1 }, + {"overwrite", OVERWRITE_OPTION, 0, 0, +@@ -1649,6 +1654,10 @@ parse_opt (int key, char *arg, struct argp_state *state) + sparse_option = true; + break; + ++ case SKIP_OLD_FILES_OPTION: ++ old_files_option = SKIP_OLD_FILES; ++ break; ++ + case SPARSE_VERSION_OPTION: + sparse_option = true; + { +diff --git a/src/warning.c b/src/warning.c +index b0b9884..f00a842 100644 +--- a/src/warning.c ++++ b/src/warning.c +@@ -42,6 +42,7 @@ static char const *const warning_args[] = { + "unknown-keyword", + "xdev", + "decompress-program", ++ "existing-file", + "xattr-write", + NULL + }; +@@ -68,6 +69,7 @@ static int warning_types[] = { + WARN_UNKNOWN_KEYWORD, + WARN_XDEV, + WARN_DECOMPRESS_PROGRAM, ++ WARN_EXISTING_FILE, + WARN_XATTR_WRITE + }; + +diff --git a/tests/Makefile.am b/tests/Makefile.am +index b3c24dc..cbdda29 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -77,6 +77,8 @@ TESTSUITE_AT = \ + extrac07.at\ + extrac08.at\ + extrac09.at\ ++ extrac18.at\ ++ extrac19.at\ + extrac10.at\ + extrac11.at\ + extrac12.at\ +diff --git a/tests/extrac18.at b/tests/extrac18.at +new file mode 100644 +index 0000000..8b42ef7 +--- /dev/null ++++ b/tests/extrac18.at +@@ -0,0 +1,60 @@ ++# Process this file with autom4te to create testsuite. -*- Autotest -*- ++# ++# Test suite for GNU tar. ++# Copyright (C) 2011 Free Software Foundation, Inc. ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3, or (at your option) ++# any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++# Description: Check the functionality of the --keep-old-files option. ++# It should report an error and cause tar to exit with status 2. ++# ++# There was a regression in versions 1.23 to 1.26 inclusive, where ++# this option silently skipped such files. ++# Reported by: Doug McLaren , ++# Gary Partis , ++# Jim Meyering ++# ++# References: <20111117045433.GA8245@algol.frenzied.us>, ++# <4F3D824717847C4487F77228F83329A3514CBB@server.Partis.local>, ++# <87wrar6zzz.fsf@rho.meyering.net> ++ ++AT_SETUP([keep-old-files]) ++AT_KEYWORDS([extract extrac18 old-files keep-old-files]) ++ ++AT_TAR_CHECK([ ++mkdir dir ++cd dir ++echo 'Old file a' > a ++echo 'Old file b' > b ++ ++tar cf ../archive . ++ ++rm b ++echo 'File a' > a ++ ++tar -x -k -f ../archive ++echo status=$? ++ ++cat a ++], ++[0], ++[status=2 ++File a ++], ++[tar: ./a: Cannot open: File exists ++tar: Exiting with failure status due to previous errors ++]) ++ ++AT_CLEANUP ++ +diff --git a/tests/extrac19.at b/tests/extrac19.at +new file mode 100644 +index 0000000..43c4c50 +--- /dev/null ++++ b/tests/extrac19.at +@@ -0,0 +1,44 @@ ++# Process this file with autom4te to create testsuite. -*- Autotest -*- ++# ++# Test suite for GNU tar. ++# Copyright (C) 2011 Free Software Foundation, Inc. ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3, or (at your option) ++# any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++AT_SETUP([skip-old-files]) ++AT_KEYWORDS([extract extrac19 old-files skip-old-files]) ++ ++AT_TAR_CHECK([ ++mkdir dir ++cd dir ++echo 'Old file a' > a ++echo 'Old file b' > b ++ ++tar cf ../archive . ++ ++rm b ++echo 'File a' > a ++ ++tar -x --skip-old-files -f ../archive ++echo status=$? ++ ++cat a ++], ++[0], ++[status=0 ++File a ++]) ++ ++AT_CLEANUP ++ +diff --git a/tests/testsuite.at b/tests/testsuite.at +index 3f02a52..4d59532 100644 +--- a/tests/testsuite.at ++++ b/tests/testsuite.at +@@ -231,6 +231,9 @@ m4_include([extrac15.at]) + m4_include([extrac16.at]) + m4_include([extrac17.at]) + ++m4_include([extrac18.at]) ++m4_include([extrac19.at]) ++ + m4_include([label01.at]) + m4_include([label02.at]) + m4_include([label03.at]) diff --git a/tar.spec b/tar.spec index 37aa127..984b880 100644 --- a/tar.spec +++ b/tar.spec @@ -5,7 +5,7 @@ Summary: A GNU file archiving program Name: tar Epoch: 2 Version: 1.26 -Release: 13%{?dist} +Release: 14%{?dist} License: GPLv3+ Group: Applications/Archiving URL: http://www.gnu.org/software/tar/ @@ -39,6 +39,8 @@ Patch10: tar-1.26-stdio.in.patch # Prepare gnulib for xattrs and apply xattrs & acls & selinux (#850291) Patch11: tar-1.26-xattrs-gnulib-prepare.patch Patch12: tar-1.26-xattrs.patch +# fix regression with --keep-old-files option (#799252) +Patch13: tar-1.26-add-skip-old-files-option.patch BuildRequires: autoconf automake texinfo gettext libacl-devel rsh # allow proper tests for extended attributes @@ -76,6 +78,7 @@ the rmt package. %patch10 -p1 -b .gets %{?_rawbuild} %patch11 -p1 -b .xattrs_gnulib_prep %patch12 -p1 -b .xattrs2 +%patch13 -p1 -b .skip-old-files autoreconf @@ -136,6 +139,10 @@ fi %{_infodir}/tar.info* %changelog +* Thu Oct 18 2012 Pavel Raiskup - 2:1.26-14 +- fix bad behaviour of --keep-old-files and add --skip-old-files option + (#799252) + * Wed Oct 10 2012 Pavel Raiskup 2:1.26-13 - fix badly written macro for building --without-selinux - allow to build tar in difference CoverityScan by forcing the '.gets' patch to