]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Fix tar --keep-newer
authorTim Kientzle <kientzle@gmail.com>
Sun, 11 Apr 2010 21:29:32 +0000 (17:29 -0400)
committerTim Kientzle <kientzle@gmail.com>
Sun, 11 Apr 2010 21:29:32 +0000 (17:29 -0400)
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

Makefile.am
libarchive/archive_write_disk.c
tar/test/CMakeLists.txt
tar/test/test_option_keep_newer.c [new file with mode: 0644]
tar/test/test_option_keep_newer.tgz.uu [new file with mode: 0644]

index 48be996a2ac4b0c58f97ebcb9b86a9f2b0b28ecf..28b60c7e7d976501eac1618d0e2e5212ffc4b396 100644 (file)
@@ -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 \
index 1890a7eb96c14246ace9ea027c98dbc848420bd7..bcc8dd41eaa5bda9fcbc56c4591d58973d00d560 100644 (file)
@@ -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);
                        }
                }
 
index 3b28d5ba2d3acbfb243ec934133d52451b98ae69..5ae3b6a8daa5231c1e363a8a3f0e35062cf7d4ba 100644 (file)
@@ -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 (file)
index 0000000..9efa6ed
--- /dev/null
@@ -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 (file)
index 0000000..9e30ff2
--- /dev/null
@@ -0,0 +1,8 @@
+$FreeBSD$
+
+begin 644 test_option_keep_newer.tgz
+M'XL("#,RPDL``W1E<W1?;W!T:6]N7VME97!?;F5W97(N=&%R`$O+S$EEH#$P
+M,#`P,S%1`-*&YJ8&R#0,F"@8&!F9&9L9&1D;`MF&AL;&9@P*!K1V&`B4%I<D
+L%@&=4I*9BU<=(7F(1Q3@]!`!^3DI7`/MAE$P"D;!*!@%]`<`ZV8("``(````
+`
+end