From: Tim Kientzle Date: Sun, 11 Apr 2010 21:29:32 +0000 (-0400) Subject: Fix tar --keep-newer X-Git-Tag: v3.0.0a~1114 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1584a716bfc7e7a6377bfd41b73d970b8eb2102b;p=thirdparty%2Flibarchive.git Fix tar --keep-newer This solution isn't ideal; bsdtar does the right thing now (doesn't overwrite and exits without error) but it should display a warning message about the failure to extract the file. SVN-Revision: 2234 --- diff --git a/Makefile.am b/Makefile.am index 48be996a2..28b60c7e7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -488,6 +488,7 @@ bsdtar_test_SOURCES= \ tar/test/test_option_X_upper.c \ tar/test/test_option_b.c \ tar/test/test_option_exclude.c \ + tar/test/test_option_keep_newer.c \ tar/test/test_option_q.c \ tar/test/test_option_r.c \ tar/test/test_option_s.c \ @@ -522,6 +523,7 @@ bsdtar_TESTS_ENVIRONMENT= endif bsdtar_test_EXTRA_DIST= \ + tar/test/test_option_keep_newer.tgz.uu \ tar/test/test_patterns_2.tar.uu \ tar/test/test_patterns_3.tar.uu \ tar/test/test_patterns_4.tar.uu \ diff --git a/libarchive/archive_write_disk.c b/libarchive/archive_write_disk.c index 1890a7eb9..bcc8dd41e 100644 --- a/libarchive/archive_write_disk.c +++ b/libarchive/archive_write_disk.c @@ -1090,7 +1090,7 @@ restore_entry(struct archive_write_disk *a) archive_entry_unset_size(a->entry); archive_set_error(&a->archive, 0, "File on disk is not older; skipping."); - return (ARCHIVE_FAILED); + return (ARCHIVE_OK); } } diff --git a/tar/test/CMakeLists.txt b/tar/test/CMakeLists.txt index 3b28d5ba2..5ae3b6a8d 100644 --- a/tar/test/CMakeLists.txt +++ b/tar/test/CMakeLists.txt @@ -18,6 +18,7 @@ IF(ENABLE_TAR AND ENABLE_TEST) test_option_T_upper.c test_option_X_upper.c test_option_exclude.c + test_option_keep_newer.c test_option_b.c test_option_q.c test_option_r.c diff --git a/tar/test/test_option_keep_newer.c b/tar/test/test_option_keep_newer.c new file mode 100644 index 000000000..9efa6ed77 --- /dev/null +++ b/tar/test/test_option_keep_newer.c @@ -0,0 +1,56 @@ +/*- + * Copyright (c) 2010 Tim Kientzle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" +__FBSDID("$FreeBSD$"); + +DEFINE_TEST(test_option_keep_newer) +{ + const char *reffile = "test_option_keep_newer.tgz"; + + /* Reference file has one entry "file" with a very old timestamp. */ + extract_reference_file(reffile); + + /* Test 1: Without --keep-newer */ + assertMakeDir("test1", 0755); + assertChdir("test1"); + assertMakeFile("file", 0644, "new"); + assertEqualInt(0, + systemf("pwd;%s -xf ../%s >test.out 2>test.err", testprog, reffile)); + assertFileContents("old\n", 4, "file"); + assertEmptyFile("test.out"); + assertEmptyFile("test.err"); + assertChdir(".."); + + /* Test 2: With --keep-newer */ + assertMakeDir("test2", 0755); + assertChdir("test2"); + assertMakeFile("file", 0644, "new"); + assertEqualInt(0, + systemf("%s -xf ../%s --keep-newer >test.out 2>test.err", testprog, reffile)); + assertFileContents("new", 3, "file"); + assertEmptyFile("test.out"); + assertEmptyFile("test.err"); + assertChdir(".."); +} diff --git a/tar/test/test_option_keep_newer.tgz.uu b/tar/test/test_option_keep_newer.tgz.uu new file mode 100644 index 000000000..9e30ff272 --- /dev/null +++ b/tar/test/test_option_keep_newer.tgz.uu @@ -0,0 +1,8 @@ +$FreeBSD$ + +begin 644 test_option_keep_newer.tgz +M'XL("#,RPDL``W1E