|
|
|
|
From 4bf4efe97d25784eb5e56c8ee337af3c7866ec34 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Sergey Poznyakoff <gray@gnu.org.ua>
|
|
|
|
|
Date: Tue, 24 Sep 2013 14:01:13 +0300
|
|
|
|
|
Subject: [PATCH 01/11] Fix normalize_filename.
|
|
|
|
|
|
|
|
|
|
The function did not take into account eventual -C options, which
|
|
|
|
|
in particular led to various problems when using -C and --remove-files
|
|
|
|
|
together.
|
|
|
|
|
|
|
|
|
|
* src/common.h (namebuf_add_dir,namebuf_finish)
|
|
|
|
|
(tar_getcwd): New prototypes.
|
|
|
|
|
* src/misc.c (namebuf_add_dir,namebuf_finish)
|
|
|
|
|
(tar_getcwd): New functions.
|
|
|
|
|
(normalize_filename): Use tar_getcwd.
|
|
|
|
|
---
|
|
|
|
|
src/common.h | 4 ++++
|
|
|
|
|
src/misc.c | 41 ++++++++++++++++++++++++++++++++++++++++-
|
|
|
|
|
2 files changed, 44 insertions(+), 1 deletion(-)
|
|
|
|
|
|
|
|
|
|
diff --git a/src/common.h b/src/common.h
|
|
|
|
|
index 16ba401..85a6977 100644
|
|
|
|
|
--- a/src/common.h
|
|
|
|
|
+++ b/src/common.h
|
|
|
|
|
@@ -603,6 +603,10 @@ typedef struct namebuf *namebuf_t;
|
|
|
|
|
namebuf_t namebuf_create (const char *dir);
|
|
|
|
|
void namebuf_free (namebuf_t buf);
|
|
|
|
|
char *namebuf_name (namebuf_t buf, const char *name);
|
|
|
|
|
+void namebuf_add_dir (namebuf_t buf, const char *name);
|
|
|
|
|
+char *namebuf_finish (namebuf_t buf);
|
|
|
|
|
+
|
|
|
|
|
+char *tar_getcwd (void);
|
|
|
|
|
|
|
|
|
|
void code_ns_fraction (int ns, char *p);
|
|
|
|
|
char const *code_timespec (struct timespec ts, char *sbuf);
|
|
|
|
|
diff --git a/src/misc.c b/src/misc.c
|
|
|
|
|
index b75f2ab..f45f79a 100644
|
|
|
|
|
--- a/src/misc.c
|
|
|
|
|
+++ b/src/misc.c
|
|
|
|
|
@@ -283,7 +283,7 @@ normalize_filename (const char *name)
|
|
|
|
|
getcwd is slow, it might fail, and it does not necessarily
|
|
|
|
|
return a canonical name even when it succeeds. Perhaps we
|
|
|
|
|
can use dev+ino pairs instead of names? */
|
|
|
|
|
- copy = xgetcwd ();
|
|
|
|
|
+ copy = tar_getcwd ();
|
|
|
|
|
if (copy)
|
|
|
|
|
{
|
|
|
|
|
size_t copylen = strlen (copy);
|
|
|
|
|
@@ -777,6 +777,21 @@ chdir_do (int i)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
+char *
|
|
|
|
|
+tar_getcwd (void)
|
|
|
|
|
+{
|
|
|
|
|
+ static char *cwd;
|
|
|
|
|
+ namebuf_t nbuf;
|
|
|
|
|
+ int i;
|
|
|
|
|
+
|
|
|
|
|
+ if (!cwd)
|
|
|
|
|
+ cwd = xgetcwd ();
|
|
|
|
|
+ nbuf = namebuf_create (cwd);
|
|
|
|
|
+ for (i = 1; i <= chdir_current; i++)
|
|
|
|
|
+ namebuf_add_dir (nbuf, wd[i].name);
|
|
|
|
|
+ return namebuf_finish (nbuf);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
void
|
|
|
|
|
close_diag (char const *name)
|
|
|
|
|
{
|
|
|
|
|
@@ -945,3 +960,27 @@ namebuf_name (namebuf_t buf, const char *name)
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+void
|
|
|
|
|
+namebuf_add_dir (namebuf_t buf, const char *name)
|
|
|
|
|
+{
|
|
|
|
|
+ static char dirsep[] = { DIRECTORY_SEPARATOR, 0 };
|
|
|
|
|
+ if (!ISSLASH (buf->buffer[buf->dir_length - 1]))
|
|
|
|
|
+ {
|
|
|
|
|
+ namebuf_name (buf, dirsep);
|
|
|
|
|
+ buf->dir_length++;
|
|
|
|
|
+ }
|
|
|
|
|
+ namebuf_name (buf, name);
|
|
|
|
|
+ buf->dir_length += strlen (name);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+char *
|
|
|
|
|
+namebuf_finish (namebuf_t buf)
|
|
|
|
|
+{
|
|
|
|
|
+ char *res = buf->buffer;
|
|
|
|
|
+
|
|
|
|
|
+ if (ISSLASH (buf->buffer[buf->dir_length - 1]))
|
|
|
|
|
+ buf->buffer[buf->dir_length] = 0;
|
|
|
|
|
+ free (buf);
|
|
|
|
|
+ return res;
|
|
|
|
|
+}
|
|
|
|
|
--
|
|
|
|
|
2.9.3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
From 272e1c879644b3684031acd62c9adb0adc5133b5 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Sergey Poznyakoff <gray@gnu.org.ua>
|
|
|
|
|
Date: Wed, 25 Sep 2013 15:58:43 +0300
|
|
|
|
|
Subject: [PATCH 02/11] Improve tar_getcwd
|
|
|
|
|
|
|
|
|
|
* src/common.h (tar_getcwd): Return pointer is const.
|
|
|
|
|
* src/misc.c (wd) <cwd>: New member.
|
|
|
|
|
(chdir_arg): Initialize cwd.
|
|
|
|
|
(tar_getcwd): Use cwd member to cache the result. Take into
|
|
|
|
|
account absolute pathnames,
|
|
|
|
|
(normalize_filename): Don't free the value
|
|
|
|
|
returned from tar_getcwd.
|
|
|
|
|
* src/names.c (name_next_elt): Remove leftover call chdir().
|
|
|
|
|
* tests/Makefile.am: Add new tests.
|
|
|
|
|
* tests/testsuite.at: Likewise.
|
|
|
|
|
|
|
|
|
|
* tests/incr08.at: New testcase.
|
|
|
|
|
* tests/remfiles04.at: New testcase.
|
|
|
|
|
* tests/remfiles05.at: New testcase.
|
|
|
|
|
* tests/remfiles06.at: New testcase.
|
|
|
|
|
* tests/remfiles07.at: New testcase.
|
|
|
|
|
---
|
|
|
|
|
src/common.h | 2 +-
|
|
|
|
|
src/misc.c | 57 +++++++++++++++++++++++------------
|
|
|
|
|
src/names.c | 3 +-
|
|
|
|
|
tests/Makefile.am | 5 ++++
|
|
|
|
|
tests/incr08.at | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
tests/remfiles04.at | 53 +++++++++++++++++++++++++++++++++
|
|
|
|
|
tests/remfiles05.at | 60 +++++++++++++++++++++++++++++++++++++
|
|
|
|
|
tests/remfiles06.at | 66 ++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
tests/remfiles07.at | 63 +++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
tests/testsuite.at | 5 ++++
|
|
|
|
|
10 files changed, 378 insertions(+), 22 deletions(-)
|
|
|
|
|
create mode 100644 tests/incr08.at
|
|
|
|
|
create mode 100644 tests/remfiles04.at
|
|
|
|
|
create mode 100644 tests/remfiles05.at
|
|
|
|
|
create mode 100644 tests/remfiles06.at
|
|
|
|
|
create mode 100644 tests/remfiles07.at
|
|
|
|
|
|
|
|
|
|
diff --git a/src/common.h b/src/common.h
|
|
|
|
|
index 85a6977..99f8552 100644
|
|
|
|
|
--- a/src/common.h
|
|
|
|
|
+++ b/src/common.h
|
|
|
|
|
@@ -606,7 +606,7 @@ char *namebuf_name (namebuf_t buf, const char *name);
|
|
|
|
|
void namebuf_add_dir (namebuf_t buf, const char *name);
|
|
|
|
|
char *namebuf_finish (namebuf_t buf);
|
|
|
|
|
|
|
|
|
|
-char *tar_getcwd (void);
|
|
|
|
|
+const char *tar_getcwd (void);
|
|
|
|
|
|
|
|
|
|
void code_ns_fraction (int ns, char *p);
|
|
|
|
|
char const *code_timespec (struct timespec ts, char *sbuf);
|
|
|
|
|
diff --git a/src/misc.c b/src/misc.c
|
|
|
|
|
index f45f79a..2fd5280 100644
|
|
|
|
|
--- a/src/misc.c
|
|
|
|
|
+++ b/src/misc.c
|
|
|
|
|
@@ -283,21 +283,20 @@ normalize_filename (const char *name)
|
|
|
|
|
getcwd is slow, it might fail, and it does not necessarily
|
|
|
|
|
return a canonical name even when it succeeds. Perhaps we
|
|
|
|
|
can use dev+ino pairs instead of names? */
|
|
|
|
|
- copy = tar_getcwd ();
|
|
|
|
|
- if (copy)
|
|
|
|
|
- {
|
|
|
|
|
- size_t copylen = strlen (copy);
|
|
|
|
|
- bool need_separator = ! (DOUBLE_SLASH_IS_DISTINCT_ROOT
|
|
|
|
|
- && copylen == 2 && ISSLASH (copy[1]));
|
|
|
|
|
- copy = xrealloc (copy, copylen + need_separator + strlen (name) + 1);
|
|
|
|
|
- copy[copylen] = DIRECTORY_SEPARATOR;
|
|
|
|
|
- strcpy (copy + copylen + need_separator, name);
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
- WARN ((0, errno, _("Cannot get working directory")));
|
|
|
|
|
+ const char *cwd = tar_getcwd ();
|
|
|
|
|
+ size_t copylen;
|
|
|
|
|
+ bool need_separator;
|
|
|
|
|
+
|
|
|
|
|
+ copylen = strlen (cwd);
|
|
|
|
|
+ need_separator = ! (DOUBLE_SLASH_IS_DISTINCT_ROOT
|
|
|
|
|
+ && copylen == 2 && ISSLASH (cwd[1]));
|
|
|
|
|
+ copy = xmalloc (copylen + need_separator + strlen (name) + 1);
|
|
|
|
|
+ strcpy (copy, cwd);
|
|
|
|
|
+ copy[copylen] = DIRECTORY_SEPARATOR;
|
|
|
|
|
+ strcpy (copy + copylen + need_separator, name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- if (! copy)
|
|
|
|
|
+ if (!copy)
|
|
|
|
|
copy = xstrdup (name);
|
|
|
|
|
normalize_filename_x (copy);
|
|
|
|
|
return copy;
|
|
|
|
|
@@ -632,7 +631,8 @@ struct wd
|
|
|
|
|
{
|
|
|
|
|
/* The directory's name. */
|
|
|
|
|
char const *name;
|
|
|
|
|
-
|
|
|
|
|
+ /* Current working directory; initialized by tar_getcwd */
|
|
|
|
|
+ char *cwd;
|
|
|
|
|
/* If nonzero, the file descriptor of the directory, or AT_FDCWD if
|
|
|
|
|
the working directory. If zero, the directory needs to be opened
|
|
|
|
|
to be used. */
|
|
|
|
|
@@ -687,6 +687,7 @@ chdir_arg (char const *dir)
|
|
|
|
|
if (! wd_count)
|
|
|
|
|
{
|
|
|
|
|
wd[wd_count].name = ".";
|
|
|
|
|
+ wd[wd_count].cwd = NULL;
|
|
|
|
|
wd[wd_count].fd = AT_FDCWD;
|
|
|
|
|
wd_count++;
|
|
|
|
|
}
|
|
|
|
|
@@ -704,6 +705,7 @@ chdir_arg (char const *dir)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
wd[wd_count].name = dir;
|
|
|
|
|
+ wd[wd_count].cwd = NULL;
|
|
|
|
|
wd[wd_count].fd = 0;
|
|
|
|
|
return wd_count++;
|
|
|
|
|
}
|
|
|
|
|
@@ -777,7 +779,7 @@ chdir_do (int i)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
-char *
|
|
|
|
|
+const char *
|
|
|
|
|
tar_getcwd (void)
|
|
|
|
|
{
|
|
|
|
|
static char *cwd;
|
|
|
|
|
@@ -786,10 +788,27 @@ tar_getcwd (void)
|
|
|
|
|
|
|
|
|
|
if (!cwd)
|
|
|
|
|
cwd = xgetcwd ();
|
|
|
|
|
- nbuf = namebuf_create (cwd);
|
|
|
|
|
- for (i = 1; i <= chdir_current; i++)
|
|
|
|
|
- namebuf_add_dir (nbuf, wd[i].name);
|
|
|
|
|
- return namebuf_finish (nbuf);
|
|
|
|
|
+ if (!wd)
|
|
|
|
|
+ return cwd;
|
|
|
|
|
+
|
|
|
|
|
+ if (0 == chdir_current || !wd[chdir_current].cwd)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (IS_ABSOLUTE_FILE_NAME (wd[chdir_current].name))
|
|
|
|
|
+ return wd[chdir_current].name;
|
|
|
|
|
+
|
|
|
|
|
+ if (!wd[0].cwd)
|
|
|
|
|
+ wd[0].cwd = cwd;
|
|
|
|
|
+
|
|
|
|
|
+ for (i = chdir_current - 1; i > 0; i--)
|
|
|
|
|
+ if (wd[i].cwd)
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ nbuf = namebuf_create (wd[i].cwd);
|
|
|
|
|
+ for (i++; i <= chdir_current; i++)
|
|
|
|
|
+ namebuf_add_dir (nbuf, wd[i].name);
|
|
|
|
|
+ wd[chdir_current].cwd = namebuf_finish (nbuf);
|
|
|
|
|
+ }
|
|
|
|
|
+ return wd[chdir_current].cwd;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
diff --git a/src/names.c b/src/names.c
|
|
|
|
|
index 3911f8c..8c3052f 100644
|
|
|
|
|
--- a/src/names.c
|
|
|
|
|
+++ b/src/names.c
|
|
|
|
|
@@ -351,8 +351,7 @@ name_next_elt (int change_dirs)
|
|
|
|
|
|
|
|
|
|
if (change_dirs && ep->type == NELT_CHDIR)
|
|
|
|
|
{
|
|
|
|
|
- if (chdir (name_buffer) < 0)
|
|
|
|
|
- chdir_fatal (name_buffer);
|
|
|
|
|
+ chdir_do (chdir_arg (xstrdup (ep->v.name)));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
|
|
|
|
index 228e936..1d10360 100644
|
|
|
|
|
--- a/tests/Makefile.am
|
|
|
|
|
+++ b/tests/Makefile.am
|
|
|
|
|
@@ -99,6 +99,7 @@ TESTSUITE_AT = \
|
|
|
|
|
incr05.at\
|
|
|
|
|
incr06.at\
|
|
|
|
|
incr07.at\
|
|
|
|
|
+ incr08.at\
|
|
|
|
|
indexfile.at\
|
|
|
|
|
ignfail.at\
|
|
|
|
|
label01.at\
|
|
|
|
|
@@ -139,6 +140,10 @@ TESTSUITE_AT = \
|
|
|
|
|
remfiles01.at\
|
|
|
|
|
remfiles02.at\
|
|
|
|
|
remfiles03.at\
|
|
|
|
|
+ remfiles04.at\
|
|
|
|
|
+ remfiles05.at\
|
|
|
|
|
+ remfiles06.at\
|
|
|
|
|
+ remfiles07.at\
|
|
|
|
|
same-order01.at\
|
|
|
|
|
same-order02.at\
|
|
|
|
|
shortfile.at\
|
|
|
|
|
diff --git a/tests/incr08.at b/tests/incr08.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..5210d28
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/incr08.at
|
|
|
|
|
@@ -0,0 +1,86 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: In tar 1.26 listed-incremental with -C and absolute path
|
|
|
|
|
+# would malfunction under certain conditions due to buggy filename
|
|
|
|
|
+# normalization.
|
|
|
|
|
+#
|
|
|
|
|
+# The value returned by normalize_filename() is used to populate the "caname"
|
|
|
|
|
+# field in both the "directory" structure in incremen.c and the "name"
|
|
|
|
|
+# structure in names.c, and in both cases that field is then used in the
|
|
|
|
|
+# "hash" and "compare" functions for the related hash tables. Thus, the
|
|
|
|
|
+# fact that the returned value doesn't reflect the operation of previous
|
|
|
|
|
+# "-C" options means that it's possible for two different directories to
|
|
|
|
|
+# be given the same "caname" value in the hashed structure and thus end up
|
|
|
|
|
+# being confused with each other.
|
|
|
|
|
+#
|
|
|
|
|
+# The bug is triggered when dumping both relative paths after -C and
|
|
|
|
|
+# absolute paths that match the process' current working directory.
|
|
|
|
|
+#
|
|
|
|
|
+# Reported by: Nathan Stratton Treadway <nathanst@ontko.com>
|
|
|
|
|
+# References: <20130922192135.GJ32256@shire.ontko.com>,
|
|
|
|
|
+# http://lists.gnu.org/archive/html/bug-tar/2013-09/msg00034.html
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([filename normalization])
|
|
|
|
|
+AT_KEYWORDS([incremental create incr08])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir tartest
|
|
|
|
|
+cd tartest
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+mkdir foo/subdir
|
|
|
|
|
+mkdir foo/subdir/dir1
|
|
|
|
|
+mkdir subdir
|
|
|
|
|
+mkdir subdir/dir2
|
|
|
|
|
+decho A
|
|
|
|
|
+find|sort
|
|
|
|
|
+
|
|
|
|
|
+decho B
|
|
|
|
|
+DIR=`pwd`
|
|
|
|
|
+tar -cvf ../foo.tar --listed-incremental=../foo.snar -C foo . $DIR 2>../err |\
|
|
|
|
|
+ sed "s|$DIR|ABSPATH|"
|
|
|
|
|
+sed "s|$DIR|ABSPATH|" ../err >&2
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+.
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo/subdir
|
|
|
|
|
+./foo/subdir/dir1
|
|
|
|
|
+./subdir
|
|
|
|
|
+./subdir/dir2
|
|
|
|
|
+B
|
|
|
|
|
+./
|
|
|
|
|
+./subdir/
|
|
|
|
|
+./subdir/dir1/
|
|
|
|
|
+ABSPATH/
|
|
|
|
|
+ABSPATH/subdir/
|
|
|
|
|
+ABSPATH/subdir/dir2/
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+B
|
|
|
|
|
+tar: .: Directory is new
|
|
|
|
|
+tar: ./subdir: Directory is new
|
|
|
|
|
+tar: ./subdir/dir1: Directory is new
|
|
|
|
|
+tar: ABSPATH: Directory is new
|
|
|
|
|
+tar: ABSPATH/subdir: Directory is new
|
|
|
|
|
+tar: ABSPATH/subdir/dir2: Directory is new
|
|
|
|
|
+tar: Removing leading `/' from member names
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/remfiles04.at b/tests/remfiles04.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..04df45b
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles04.at
|
|
|
|
|
@@ -0,0 +1,53 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: Tar 1.26 would remove wrong files when called with
|
|
|
|
|
+# --remove-files and -C
|
|
|
|
|
+# Reported by: Jörgen Strand <Jorgen.Strand@sonymobile.com>
|
|
|
|
|
+# References: <9FC79E5CB90CEC47B9647DCAB7BD327A01AD83B452EE@seldmbx02.corpusers.net>
|
|
|
|
|
+# http://lists.gnu.org/archive/html/bug-tar/2013-09/msg00024.html
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([remove-files with -C])
|
|
|
|
|
+AT_KEYWORDS([create remove-files remfiles04])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+echo bar > bar
|
|
|
|
|
+echo foobar > foo/bar
|
|
|
|
|
+tar -cf foo.tar --remove-files -C foo bar
|
|
|
|
|
+echo A
|
|
|
|
|
+find . | sort
|
|
|
|
|
+echo foobar > foo/bar
|
|
|
|
|
+tar -rf foo.tar --remove-files -C foo bar
|
|
|
|
|
+echo B
|
|
|
|
|
+find . | sort
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+B
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+],[],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/remfiles05.at b/tests/remfiles05.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..04425a7
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles05.at
|
|
|
|
|
@@ -0,0 +1,60 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: Tar 1.26 would remove wrong files when invoked with
|
|
|
|
|
+# --listed-incremental and -C
|
|
|
|
|
+# Reported by: Nathan Stratton Treadway <nathanst@ontko.com>
|
|
|
|
|
+# References: <20130921171234.GG32256@shire.ontko.com>,
|
|
|
|
|
+# http://lists.gnu.org/archive/html/bug-tar/2013-09/msg00028.html
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([incremental and -C])
|
|
|
|
|
+AT_KEYWORDS([incremental create remove-files remfiles05])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+echo bar > bar
|
|
|
|
|
+echo foo/bar > foo/bar
|
|
|
|
|
+decho A
|
|
|
|
|
+find . | sort
|
|
|
|
|
+
|
|
|
|
|
+decho B
|
|
|
|
|
+tar -cvf foo.tar --listed-incremental=foo.snar --remove-files -C foo bar
|
|
|
|
|
+decho C
|
|
|
|
|
+find . | sort
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo/bar
|
|
|
|
|
+B
|
|
|
|
|
+bar
|
|
|
|
|
+C
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.snar
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+B
|
|
|
|
|
+C
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/remfiles06.at b/tests/remfiles06.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..75ddcfa
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles06.at
|
|
|
|
|
@@ -0,0 +1,66 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: There was a leftover call to chdir in name_next_elt() in
|
|
|
|
|
+# tar 1.26. After commit e3d28d84 this call would confuse the tar_getcwd
|
|
|
|
|
+# function.
|
|
|
|
|
+# Reported by: Nathan Stratton Treadway <nathanst@ontko.com>
|
|
|
|
|
+# References: <20130924145657.GM32256@shire.ontko.com>,
|
|
|
|
|
+# http://lists.gnu.org/archive/html/bug-tar/2013-09/msg00045.html
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([incremental with two -C])
|
|
|
|
|
+AT_KEYWORDS([incremental create remove-files remfiles06])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir tartest
|
|
|
|
|
+cd tartest
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+echo foo/file > foo/file
|
|
|
|
|
+mkdir bar
|
|
|
|
|
+echo bar/file > bar/file
|
|
|
|
|
+decho A
|
|
|
|
|
+find|sort
|
|
|
|
|
+
|
|
|
|
|
+decho B
|
|
|
|
|
+tar -cvf ../foo.tar --remove-files -C foo file -C ../bar file
|
|
|
|
|
+
|
|
|
|
|
+decho C
|
|
|
|
|
+find|sort
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./bar/file
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo/file
|
|
|
|
|
+B
|
|
|
|
|
+file
|
|
|
|
|
+file
|
|
|
|
|
+C
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./foo
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+B
|
|
|
|
|
+C
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
+
|
|
|
|
|
diff --git a/tests/remfiles07.at b/tests/remfiles07.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..84ab625
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles07.at
|
|
|
|
|
@@ -0,0 +1,63 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: See remfiles06.at
|
|
|
|
|
+# Reported by: Nathan Stratton Treadway <nathanst@ontko.com>
|
|
|
|
|
+# References: <20130924185129.GO32256@shire.ontko.com>
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([incremental with -C to absolute path])
|
|
|
|
|
+AT_KEYWORDS([incremental create remove-files remfiles07])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir tartest
|
|
|
|
|
+cd tartest
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+echo foo/file > foo/file
|
|
|
|
|
+mkdir bar
|
|
|
|
|
+echo bar/file > bar/file
|
|
|
|
|
+decho A
|
|
|
|
|
+find|sort
|
|
|
|
|
+
|
|
|
|
|
+DIR=`pwd`
|
|
|
|
|
+decho B
|
|
|
|
|
+tar -cvf ../foo.tar --remove-files -C foo file -C $DIR/bar file
|
|
|
|
|
+
|
|
|
|
|
+decho C
|
|
|
|
|
+find|sort
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./bar/file
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo/file
|
|
|
|
|
+B
|
|
|
|
|
+file
|
|
|
|
|
+file
|
|
|
|
|
+C
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./foo
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+B
|
|
|
|
|
+C
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/testsuite.at b/tests/testsuite.at
|
|
|
|
|
index 10cf26a..5c805e7 100644
|
|
|
|
|
--- a/tests/testsuite.at
|
|
|
|
|
+++ b/tests/testsuite.at
|
|
|
|
|
@@ -260,6 +260,7 @@ m4_include([incr03.at])
|
|
|
|
|
m4_include([incr05.at])
|
|
|
|
|
m4_include([incr06.at])
|
|
|
|
|
m4_include([incr07.at])
|
|
|
|
|
+m4_include([incr08.at])
|
|
|
|
|
|
|
|
|
|
m4_include([filerem01.at])
|
|
|
|
|
m4_include([filerem02.at])
|
|
|
|
|
@@ -330,6 +331,10 @@ m4_include([grow.at])
|
|
|
|
|
m4_include([remfiles01.at])
|
|
|
|
|
m4_include([remfiles02.at])
|
|
|
|
|
m4_include([remfiles03.at])
|
|
|
|
|
+m4_include([remfiles04.at])
|
|
|
|
|
+m4_include([remfiles05.at])
|
|
|
|
|
+m4_include([remfiles06.at])
|
|
|
|
|
+m4_include([remfiles07.at])
|
|
|
|
|
|
|
|
|
|
m4_include([sigpipe.at])
|
|
|
|
|
|
|
|
|
|
--
|
|
|
|
|
2.9.3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
From 0c5f95ca80d507a00825c8e3fd05ed5ad993ce17 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Sergey Poznyakoff <gray@gnu.org.ua>
|
|
|
|
|
Date: Thu, 26 Sep 2013 15:41:47 +0300
|
|
|
|
|
Subject: [PATCH 03/11] Use relative addressing in deferred unlinks.
|
|
|
|
|
|
|
|
|
|
* src/common.h (tar_dirname): New function.
|
|
|
|
|
* src/misc.c (normalize_filename_x): Make extern.
|
|
|
|
|
(tar_dirname): New function.
|
|
|
|
|
(tar_getcwd): Take into account absoulte pathnames.
|
|
|
|
|
* src/unlink.c (deferred_unlink) <dir_idx>: New member; keeps the
|
|
|
|
|
value of chdir_current at the moment of structure allocation.
|
|
|
|
|
(flush_deferred_unlinks): Use chdir_do and relative addressing.
|
|
|
|
|
(queue_deferred_unlink): Initialize dir_idx.
|
|
|
|
|
* tests/Makefile.am: Add new tests.
|
|
|
|
|
* tests/testsuite.at: Add new tests.
|
|
|
|
|
* tests/remfiles06.at: Fix description.
|
|
|
|
|
* tests/remfiles07.at: Fix description.
|
|
|
|
|
* tests/remfiles08.at: New test case.
|
|
|
|
|
---
|
|
|
|
|
src/common.h | 2 ++
|
|
|
|
|
src/misc.c | 28 +++++++++++++++++++---------
|
|
|
|
|
src/unlink.c | 27 +++++++++++++++++++++++----
|
|
|
|
|
tests/Makefile.am | 1 +
|
|
|
|
|
tests/remfiles06.at | 4 ++--
|
|
|
|
|
tests/remfiles07.at | 4 ++--
|
|
|
|
|
tests/remfiles08.at | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
tests/testsuite.at | 1 +
|
|
|
|
|
8 files changed, 98 insertions(+), 17 deletions(-)
|
|
|
|
|
create mode 100644 tests/remfiles08.at
|
|
|
|
|
|
|
|
|
|
diff --git a/src/common.h b/src/common.h
|
|
|
|
|
index 99f8552..7d64227 100644
|
|
|
|
|
--- a/src/common.h
|
|
|
|
|
+++ b/src/common.h
|
|
|
|
|
@@ -596,6 +596,7 @@ void assign_string (char **dest, const char *src);
|
|
|
|
|
int unquote_string (char *str);
|
|
|
|
|
char *zap_slashes (char *name);
|
|
|
|
|
char *normalize_filename (const char *name);
|
|
|
|
|
+void normalize_filename_x (char *name);
|
|
|
|
|
void replace_prefix (char **pname, const char *samp, size_t slen,
|
|
|
|
|
const char *repl, size_t rlen);
|
|
|
|
|
char *tar_savedir (const char *name, int must_exist);
|
|
|
|
|
@@ -607,6 +608,7 @@ void namebuf_add_dir (namebuf_t buf, const char *name);
|
|
|
|
|
char *namebuf_finish (namebuf_t buf);
|
|
|
|
|
|
|
|
|
|
const char *tar_getcwd (void);
|
|
|
|
|
+const char *tar_dirname (void);
|
|
|
|
|
|
|
|
|
|
void code_ns_fraction (int ns, char *p);
|
|
|
|
|
char const *code_timespec (struct timespec ts, char *sbuf);
|
|
|
|
|
diff --git a/src/misc.c b/src/misc.c
|
|
|
|
|
index 2fd5280..c7d51b2 100644
|
|
|
|
|
--- a/src/misc.c
|
|
|
|
|
+++ b/src/misc.c
|
|
|
|
|
@@ -229,11 +229,12 @@ zap_slashes (char *name)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Normalize FILE_NAME by removing redundant slashes and "."
|
|
|
|
|
- components, including redundant trailing slashes. Leave ".."
|
|
|
|
|
- alone, as it may be significant in the presence of symlinks and on
|
|
|
|
|
- platforms where "/.." != "/". Destructive version: modifies its
|
|
|
|
|
- argument. */
|
|
|
|
|
-static void
|
|
|
|
|
+ components, including redundant trailing slashes.
|
|
|
|
|
+ Leave ".." alone, as it may be significant in the presence
|
|
|
|
|
+ of symlinks and on platforms where "/.." != "/".
|
|
|
|
|
+
|
|
|
|
|
+ Destructive version: modifies its argument. */
|
|
|
|
|
+void
|
|
|
|
|
normalize_filename_x (char *file_name)
|
|
|
|
|
{
|
|
|
|
|
char *name = file_name + FILE_SYSTEM_PREFIX_LEN (file_name);
|
|
|
|
|
@@ -267,8 +268,9 @@ normalize_filename_x (char *file_name)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Normalize NAME by removing redundant slashes and "." components,
|
|
|
|
|
- including redundant trailing slashes. Return a normalized
|
|
|
|
|
- newly-allocated copy. */
|
|
|
|
|
+ including redundant trailing slashes.
|
|
|
|
|
+
|
|
|
|
|
+ Return a normalized newly-allocated copy. */
|
|
|
|
|
|
|
|
|
|
char *
|
|
|
|
|
normalize_filename (const char *name)
|
|
|
|
|
@@ -780,6 +782,12 @@ chdir_do (int i)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char *
|
|
|
|
|
+tar_dirname (void)
|
|
|
|
|
+{
|
|
|
|
|
+ return wd[chdir_current].name;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const char *
|
|
|
|
|
tar_getcwd (void)
|
|
|
|
|
{
|
|
|
|
|
static char *cwd;
|
|
|
|
|
@@ -794,8 +802,10 @@ tar_getcwd (void)
|
|
|
|
|
if (0 == chdir_current || !wd[chdir_current].cwd)
|
|
|
|
|
{
|
|
|
|
|
if (IS_ABSOLUTE_FILE_NAME (wd[chdir_current].name))
|
|
|
|
|
- return wd[chdir_current].name;
|
|
|
|
|
-
|
|
|
|
|
+ {
|
|
|
|
|
+ wd[chdir_current].cwd = xstrdup (wd[chdir_current].name);
|
|
|
|
|
+ return wd[chdir_current].cwd;
|
|
|
|
|
+ }
|
|
|
|
|
if (!wd[0].cwd)
|
|
|
|
|
wd[0].cwd = cwd;
|
|
|
|
|
|
|
|
|
|
diff --git a/src/unlink.c b/src/unlink.c
|
|
|
|
|
index b281636..10e0b41 100644
|
|
|
|
|
--- a/src/unlink.c
|
|
|
|
|
+++ b/src/unlink.c
|
|
|
|
|
@@ -22,7 +22,9 @@
|
|
|
|
|
struct deferred_unlink
|
|
|
|
|
{
|
|
|
|
|
struct deferred_unlink *next; /* Next unlink in the queue */
|
|
|
|
|
- char *file_name; /* Absolute name of the file to unlink */
|
|
|
|
|
+ int dir_idx; /* Directory index in wd */
|
|
|
|
|
+ char *file_name; /* Name of the file to unlink, relative
|
|
|
|
|
+ to dir_idx */
|
|
|
|
|
bool is_dir; /* True if file_name is a directory */
|
|
|
|
|
off_t records_written; /* Number of records written when this
|
|
|
|
|
entry got added to the queue */
|
|
|
|
|
@@ -68,16 +70,30 @@ static void
|
|
|
|
|
flush_deferred_unlinks (bool force)
|
|
|
|
|
{
|
|
|
|
|
struct deferred_unlink *p, *prev = NULL;
|
|
|
|
|
+ int saved_chdir = chdir_current;
|
|
|
|
|
|
|
|
|
|
for (p = dunlink_head; p; )
|
|
|
|
|
{
|
|
|
|
|
struct deferred_unlink *next = p->next;
|
|
|
|
|
+
|
|
|
|
|
if (force
|
|
|
|
|
|| records_written > p->records_written + deferred_unlink_delay)
|
|
|
|
|
{
|
|
|
|
|
+ chdir_do (p->dir_idx);
|
|
|
|
|
if (p->is_dir)
|
|
|
|
|
{
|
|
|
|
|
- if (unlinkat (chdir_fd, p->file_name, AT_REMOVEDIR) != 0)
|
|
|
|
|
+ const char *fname;
|
|
|
|
|
+
|
|
|
|
|
+ if (p->file_name[0] == 0 ||
|
|
|
|
|
+ strcmp (p->file_name, ".") == 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ fname = tar_dirname ();
|
|
|
|
|
+ chdir_do (p->dir_idx - 1);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ fname = p->file_name;
|
|
|
|
|
+
|
|
|
|
|
+ if (unlinkat (chdir_fd, fname, AT_REMOVEDIR) != 0)
|
|
|
|
|
{
|
|
|
|
|
switch (errno)
|
|
|
|
|
{
|
|
|
|
|
@@ -95,7 +111,7 @@ flush_deferred_unlinks (bool force)
|
|
|
|
|
}
|
|
|
|
|
/* fall through */
|
|
|
|
|
default:
|
|
|
|
|
- rmdir_error (p->file_name);
|
|
|
|
|
+ rmdir_error (fname);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -120,6 +136,7 @@ flush_deferred_unlinks (bool force)
|
|
|
|
|
}
|
|
|
|
|
if (!dunlink_head)
|
|
|
|
|
dunlink_tail = NULL;
|
|
|
|
|
+ chdir_do (saved_chdir);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
@@ -145,7 +162,9 @@ queue_deferred_unlink (const char *name, bool is_dir)
|
|
|
|
|
|
|
|
|
|
p = dunlink_alloc ();
|
|
|
|
|
p->next = NULL;
|
|
|
|
|
- p->file_name = normalize_filename (name);
|
|
|
|
|
+ p->dir_idx = chdir_current;
|
|
|
|
|
+ p->file_name = xstrdup (name);
|
|
|
|
|
+ normalize_filename_x (p->file_name);
|
|
|
|
|
p->is_dir = is_dir;
|
|
|
|
|
p->records_written = records_written;
|
|
|
|
|
|
|
|
|
|
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
|
|
|
|
index 1d10360..29ebab1 100644
|
|
|
|
|
--- a/tests/Makefile.am
|
|
|
|
|
+++ b/tests/Makefile.am
|
|
|
|
|
@@ -144,6 +144,7 @@ TESTSUITE_AT = \
|
|
|
|
|
remfiles05.at\
|
|
|
|
|
remfiles06.at\
|
|
|
|
|
remfiles07.at\
|
|
|
|
|
+ remfiles08.at\
|
|
|
|
|
same-order01.at\
|
|
|
|
|
same-order02.at\
|
|
|
|
|
shortfile.at\
|
|
|
|
|
diff --git a/tests/remfiles06.at b/tests/remfiles06.at
|
|
|
|
|
index 75ddcfa..c2d9876 100644
|
|
|
|
|
--- a/tests/remfiles06.at
|
|
|
|
|
+++ b/tests/remfiles06.at
|
|
|
|
|
@@ -22,8 +22,8 @@
|
|
|
|
|
# References: <20130924145657.GM32256@shire.ontko.com>,
|
|
|
|
|
# http://lists.gnu.org/archive/html/bug-tar/2013-09/msg00045.html
|
|
|
|
|
|
|
|
|
|
-AT_SETUP([incremental with two -C])
|
|
|
|
|
-AT_KEYWORDS([incremental create remove-files remfiles06])
|
|
|
|
|
+AT_SETUP([remove with two -C])
|
|
|
|
|
+AT_KEYWORDS([remove-files remfiles06])
|
|
|
|
|
|
|
|
|
|
AT_TAR_CHECK([
|
|
|
|
|
AT_SORT_PREREQ
|
|
|
|
|
diff --git a/tests/remfiles07.at b/tests/remfiles07.at
|
|
|
|
|
index 84ab625..742e0a1 100644
|
|
|
|
|
--- a/tests/remfiles07.at
|
|
|
|
|
+++ b/tests/remfiles07.at
|
|
|
|
|
@@ -19,8 +19,8 @@
|
|
|
|
|
# Reported by: Nathan Stratton Treadway <nathanst@ontko.com>
|
|
|
|
|
# References: <20130924185129.GO32256@shire.ontko.com>
|
|
|
|
|
|
|
|
|
|
-AT_SETUP([incremental with -C to absolute path])
|
|
|
|
|
-AT_KEYWORDS([incremental create remove-files remfiles07])
|
|
|
|
|
+AT_SETUP([remove with -C to absolute path])
|
|
|
|
|
+AT_KEYWORDS([create remove-files remfiles07])
|
|
|
|
|
|
|
|
|
|
AT_TAR_CHECK([
|
|
|
|
|
AT_SORT_PREREQ
|
|
|
|
|
diff --git a/tests/remfiles08.at b/tests/remfiles08.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..54f5de1
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles08.at
|
|
|
|
|
@@ -0,0 +1,48 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: See remfiles06.at
|
|
|
|
|
+# Reported by: Nathan Stratton Treadway <nathanst@ontko.com>
|
|
|
|
|
+# References: <20130926050634.GW32256@shire.ontko.com>
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([remove with -C to absolute and relative paths])
|
|
|
|
|
+AT_KEYWORDS([incremental create remove-files remfiles08])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+mkdir bar
|
|
|
|
|
+echo foo/foo_file > foo/foo_file
|
|
|
|
|
+echo bar/bar_file > bar/bar_file
|
|
|
|
|
+decho A
|
|
|
|
|
+tar -cvf foo.tar --remove-files -C `pwd`/foo . -C ../bar .
|
|
|
|
|
+decho B
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+./
|
|
|
|
|
+./foo_file
|
|
|
|
|
+./
|
|
|
|
|
+./bar_file
|
|
|
|
|
+B
|
|
|
|
|
+.
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+B
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/testsuite.at b/tests/testsuite.at
|
|
|
|
|
index 5c805e7..d468dcf 100644
|
|
|
|
|
--- a/tests/testsuite.at
|
|
|
|
|
+++ b/tests/testsuite.at
|
|
|
|
|
@@ -335,6 +335,7 @@ m4_include([remfiles04.at])
|
|
|
|
|
m4_include([remfiles05.at])
|
|
|
|
|
m4_include([remfiles06.at])
|
|
|
|
|
m4_include([remfiles07.at])
|
|
|
|
|
+m4_include([remfiles08.at])
|
|
|
|
|
|
|
|
|
|
m4_include([sigpipe.at])
|
|
|
|
|
|
|
|
|
|
--
|
|
|
|
|
2.9.3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
From 195c6f2b71f49ecc374ae01e20d7287f24501178 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Sergey Poznyakoff <gray@gnu.org.ua>
|
|
|
|
|
Date: Fri, 27 Sep 2013 00:59:18 +0300
|
|
|
|
|
Subject: [PATCH 04/11] Bugfix
|
|
|
|
|
|
|
|
|
|
* tests/remfiles08.at: Restore missing find
|
|
|
|
|
---
|
|
|
|
|
tests/remfiles08.at | 1 +
|
|
|
|
|
1 file changed, 1 insertion(+)
|
|
|
|
|
|
|
|
|
|
diff --git a/tests/remfiles08.at b/tests/remfiles08.at
|
|
|
|
|
index 54f5de1..0649e85 100644
|
|
|
|
|
--- a/tests/remfiles08.at
|
|
|
|
|
+++ b/tests/remfiles08.at
|
|
|
|
|
@@ -30,6 +30,7 @@ echo bar/bar_file > bar/bar_file
|
|
|
|
|
decho A
|
|
|
|
|
tar -cvf foo.tar --remove-files -C `pwd`/foo . -C ../bar .
|
|
|
|
|
decho B
|
|
|
|
|
+find
|
|
|
|
|
],
|
|
|
|
|
[0],
|
|
|
|
|
[A
|
|
|
|
|
--
|
|
|
|
|
2.9.3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
From 2cce74ec554ec7fca4c3b1d2963beb6a729881fe Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Sergey Poznyakoff <gray@gnu.org.ua>
|
|
|
|
|
Date: Tue, 1 Oct 2013 21:48:30 +0300
|
|
|
|
|
Subject: [PATCH 05/11] Revamp tar_getcwd/normalize_filename stuff.
|
|
|
|
|
|
|
|
|
|
The changes are based on the discussion with Nathan.
|
|
|
|
|
|
|
|
|
|
* src/common.h (normalize_filename): Take two arguments. All
|
|
|
|
|
callers updated.
|
|
|
|
|
(tar_getcwd): Replaced with ..
|
|
|
|
|
(tar_getcdpath): New proto.
|
|
|
|
|
* src/misc.c (normalize_filename): Take two arguments.
|
|
|
|
|
(chdir_arg): Populate cwd along with creating the
|
|
|
|
|
structure.
|
|
|
|
|
(tar_getcwd): Removed.
|
|
|
|
|
(tar_getcdpath): New function.
|
|
|
|
|
|
|
|
|
|
* tests/incr09.at: New test case.
|
|
|
|
|
* tests/Makefile.am: Add new tests.
|
|
|
|
|
* tests/testsuite.at: Likewise.
|
|
|
|
|
---
|
|
|
|
|
src/common.h | 4 ++--
|
|
|
|
|
src/incremen.c | 4 ++--
|
|
|
|
|
src/misc.c | 48 ++++++++++++++++----------------------------
|
|
|
|
|
src/names.c | 6 ++----
|
|
|
|
|
tests/Makefile.am | 1 +
|
|
|
|
|
tests/incr09.at | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
tests/testsuite.at | 1 +
|
|
|
|
|
7 files changed, 84 insertions(+), 39 deletions(-)
|
|
|
|
|
create mode 100644 tests/incr09.at
|
|
|
|
|
|
|
|
|
|
diff --git a/src/common.h b/src/common.h
|
|
|
|
|
index 7d64227..16b501b 100644
|
|
|
|
|
--- a/src/common.h
|
|
|
|
|
+++ b/src/common.h
|
|
|
|
|
@@ -595,7 +595,7 @@ void skip_member (void);
|
|
|
|
|
void assign_string (char **dest, const char *src);
|
|
|
|
|
int unquote_string (char *str);
|
|
|
|
|
char *zap_slashes (char *name);
|
|
|
|
|
-char *normalize_filename (const char *name);
|
|
|
|
|
+char *normalize_filename (int cdidx, const char *name);
|
|
|
|
|
void normalize_filename_x (char *name);
|
|
|
|
|
void replace_prefix (char **pname, const char *samp, size_t slen,
|
|
|
|
|
const char *repl, size_t rlen);
|
|
|
|
|
@@ -607,7 +607,7 @@ char *namebuf_name (namebuf_t buf, const char *name);
|
|
|
|
|
void namebuf_add_dir (namebuf_t buf, const char *name);
|
|
|
|
|
char *namebuf_finish (namebuf_t buf);
|
|
|
|
|
|
|
|
|
|
-const char *tar_getcwd (void);
|
|
|
|
|
+const char *tar_getcdpath (int);
|
|
|
|
|
const char *tar_dirname (void);
|
|
|
|
|
|
|
|
|
|
void code_ns_fraction (int ns, char *p);
|
|
|
|
|
diff --git a/src/incremen.c b/src/incremen.c
|
|
|
|
|
index b2ab5bf..cb12bbc 100644
|
|
|
|
|
--- a/src/incremen.c
|
|
|
|
|
+++ b/src/incremen.c
|
|
|
|
|
@@ -279,7 +279,7 @@ free_directory (struct directory *dir)
|
|
|
|
|
static struct directory *
|
|
|
|
|
attach_directory (const char *name)
|
|
|
|
|
{
|
|
|
|
|
- char *cname = normalize_filename (name);
|
|
|
|
|
+ char *cname = normalize_filename (chdir_current, name);
|
|
|
|
|
struct directory *dir = make_directory (name, cname);
|
|
|
|
|
if (dirtail)
|
|
|
|
|
dirtail->next = dir;
|
|
|
|
|
@@ -350,7 +350,7 @@ find_directory (const char *name)
|
|
|
|
|
return 0;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
- char *caname = normalize_filename (name);
|
|
|
|
|
+ char *caname = normalize_filename (chdir_current, name);
|
|
|
|
|
struct directory *dir = make_directory (name, caname);
|
|
|
|
|
struct directory *ret = hash_lookup (directory_table, dir);
|
|
|
|
|
free_directory (dir);
|
|
|
|
|
diff --git a/src/misc.c b/src/misc.c
|
|
|
|
|
index c7d51b2..280f85c 100644
|
|
|
|
|
--- a/src/misc.c
|
|
|
|
|
+++ b/src/misc.c
|
|
|
|
|
@@ -273,7 +273,7 @@ normalize_filename_x (char *file_name)
|
|
|
|
|
Return a normalized newly-allocated copy. */
|
|
|
|
|
|
|
|
|
|
char *
|
|
|
|
|
-normalize_filename (const char *name)
|
|
|
|
|
+normalize_filename (int cdidx, const char *name)
|
|
|
|
|
{
|
|
|
|
|
char *copy = NULL;
|
|
|
|
|
|
|
|
|
|
@@ -285,7 +285,7 @@ normalize_filename (const char *name)
|
|
|
|
|
getcwd is slow, it might fail, and it does not necessarily
|
|
|
|
|
return a canonical name even when it succeeds. Perhaps we
|
|
|
|
|
can use dev+ino pairs instead of names? */
|
|
|
|
|
- const char *cwd = tar_getcwd ();
|
|
|
|
|
+ const char *cwd = tar_getcdpath (cdidx);
|
|
|
|
|
size_t copylen;
|
|
|
|
|
bool need_separator;
|
|
|
|
|
|
|
|
|
|
@@ -689,7 +689,7 @@ chdir_arg (char const *dir)
|
|
|
|
|
if (! wd_count)
|
|
|
|
|
{
|
|
|
|
|
wd[wd_count].name = ".";
|
|
|
|
|
- wd[wd_count].cwd = NULL;
|
|
|
|
|
+ wd[wd_count].cwd = xgetcwd ();
|
|
|
|
|
wd[wd_count].fd = AT_FDCWD;
|
|
|
|
|
wd_count++;
|
|
|
|
|
}
|
|
|
|
|
@@ -707,7 +707,14 @@ chdir_arg (char const *dir)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
wd[wd_count].name = dir;
|
|
|
|
|
- wd[wd_count].cwd = NULL;
|
|
|
|
|
+ if (IS_ABSOLUTE_FILE_NAME (wd[wd_count].name))
|
|
|
|
|
+ wd[wd_count].cwd = xstrdup (wd[wd_count].name);
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ namebuf_t nbuf = namebuf_create (wd[wd_count - 1].cwd);
|
|
|
|
|
+ namebuf_add_dir (nbuf, wd[wd_count].name);
|
|
|
|
|
+ wd[wd_count].cwd = namebuf_finish (nbuf);
|
|
|
|
|
+ }
|
|
|
|
|
wd[wd_count].fd = 0;
|
|
|
|
|
return wd_count++;
|
|
|
|
|
}
|
|
|
|
|
@@ -788,37 +795,16 @@ tar_dirname (void)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char *
|
|
|
|
|
-tar_getcwd (void)
|
|
|
|
|
+tar_getcdpath (int idx)
|
|
|
|
|
{
|
|
|
|
|
- static char *cwd;
|
|
|
|
|
- namebuf_t nbuf;
|
|
|
|
|
- int i;
|
|
|
|
|
-
|
|
|
|
|
- if (!cwd)
|
|
|
|
|
- cwd = xgetcwd ();
|
|
|
|
|
if (!wd)
|
|
|
|
|
- return cwd;
|
|
|
|
|
-
|
|
|
|
|
- if (0 == chdir_current || !wd[chdir_current].cwd)
|
|
|
|
|
{
|
|
|
|
|
- if (IS_ABSOLUTE_FILE_NAME (wd[chdir_current].name))
|
|
|
|
|
- {
|
|
|
|
|
- wd[chdir_current].cwd = xstrdup (wd[chdir_current].name);
|
|
|
|
|
- return wd[chdir_current].cwd;
|
|
|
|
|
- }
|
|
|
|
|
- if (!wd[0].cwd)
|
|
|
|
|
- wd[0].cwd = cwd;
|
|
|
|
|
-
|
|
|
|
|
- for (i = chdir_current - 1; i > 0; i--)
|
|
|
|
|
- if (wd[i].cwd)
|
|
|
|
|
- break;
|
|
|
|
|
-
|
|
|
|
|
- nbuf = namebuf_create (wd[i].cwd);
|
|
|
|
|
- for (i++; i <= chdir_current; i++)
|
|
|
|
|
- namebuf_add_dir (nbuf, wd[i].name);
|
|
|
|
|
- wd[chdir_current].cwd = namebuf_finish (nbuf);
|
|
|
|
|
+ static char *cwd;
|
|
|
|
|
+ if (!cwd)
|
|
|
|
|
+ cwd = xgetcwd ();
|
|
|
|
|
+ return cwd;
|
|
|
|
|
}
|
|
|
|
|
- return wd[chdir_current].cwd;
|
|
|
|
|
+ return wd[idx].cwd;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
diff --git a/src/names.c b/src/names.c
|
|
|
|
|
index 8c3052f..125f0b5 100644
|
|
|
|
|
--- a/src/names.c
|
|
|
|
|
+++ b/src/names.c
|
|
|
|
|
@@ -1004,13 +1004,11 @@ collect_and_sort_names (void)
|
|
|
|
|
namelist = merge_sort (namelist, num_names, compare_names);
|
|
|
|
|
|
|
|
|
|
num_names = 0;
|
|
|
|
|
- nametab = hash_initialize (0, 0,
|
|
|
|
|
- name_hash,
|
|
|
|
|
- name_compare, NULL);
|
|
|
|
|
+ nametab = hash_initialize (0, 0, name_hash, name_compare, NULL);
|
|
|
|
|
for (name = namelist; name; name = next_name)
|
|
|
|
|
{
|
|
|
|
|
next_name = name->next;
|
|
|
|
|
- name->caname = normalize_filename (name->name);
|
|
|
|
|
+ name->caname = normalize_filename (name->change_dir, name->name);
|
|
|
|
|
if (prev_name)
|
|
|
|
|
{
|
|
|
|
|
struct name *p = hash_lookup (nametab, name);
|
|
|
|
|
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
|
|
|
|
index 29ebab1..b05a151 100644
|
|
|
|
|
--- a/tests/Makefile.am
|
|
|
|
|
+++ b/tests/Makefile.am
|
|
|
|
|
@@ -99,6 +99,7 @@ TESTSUITE_AT = \
|
|
|
|
|
incr06.at\
|
|
|
|
|
incr07.at\
|
|
|
|
|
incr08.at\
|
|
|
|
|
+ incr09.at\
|
|
|
|
|
indexfile.at\
|
|
|
|
|
ignfail.at\
|
|
|
|
|
label01.at\
|
|
|
|
|
diff --git a/tests/incr09.at b/tests/incr09.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..b6130a6
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/incr09.at
|
|
|
|
|
@@ -0,0 +1,59 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([incremental with alternating -C])
|
|
|
|
|
+AT_KEYWORDS([incremental create incr09])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir foo bar middle
|
|
|
|
|
+echo foo/foo_file > foo/foo_file
|
|
|
|
|
+echo bar/bar_file > bar/bar_file
|
|
|
|
|
+echo middle/file > middle/middle_file
|
|
|
|
|
+decho A
|
|
|
|
|
+tar -cvf foo.tar --incremental -C foo . -C `pwd` middle -C bar .
|
|
|
|
|
+
|
|
|
|
|
+rm foo.tar
|
|
|
|
|
+>toplevel_file
|
|
|
|
|
+decho B
|
|
|
|
|
+tar -cvf foo.tar --incremental -C foo . -C `pwd` toplevel_file -C bar .
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+./
|
|
|
|
|
+./
|
|
|
|
|
+middle/
|
|
|
|
|
+./bar_file
|
|
|
|
|
+./foo_file
|
|
|
|
|
+middle/middle_file
|
|
|
|
|
+B
|
|
|
|
|
+./
|
|
|
|
|
+./
|
|
|
|
|
+toplevel_file
|
|
|
|
|
+./bar_file
|
|
|
|
|
+./foo_file
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+tar: .: Directory is new
|
|
|
|
|
+tar: middle: Directory is new
|
|
|
|
|
+tar: .: Directory is new
|
|
|
|
|
+B
|
|
|
|
|
+tar: .: Directory is new
|
|
|
|
|
+tar: .: Directory is new
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/testsuite.at b/tests/testsuite.at
|
|
|
|
|
index d468dcf..a9f2ab6 100644
|
|
|
|
|
--- a/tests/testsuite.at
|
|
|
|
|
+++ b/tests/testsuite.at
|
|
|
|
|
@@ -260,6 +260,7 @@ m4_include([incr04.at])
|
|
|
|
|
m4_include([incr06.at])
|
|
|
|
|
m4_include([incr07.at])
|
|
|
|
|
m4_include([incr08.at])
|
|
|
|
|
+m4_include([incr09.at])
|
|
|
|
|
|
|
|
|
|
m4_include([filerem01.at])
|
|
|
|
|
m4_include([filerem02.at])
|
|
|
|
|
--
|
|
|
|
|
2.9.3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
From 779b02280a9561029d0e459275af3b3a59e521c3 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Sergey Poznyakoff <gray@gnu.org.ua>
|
|
|
|
|
Date: Thu, 3 Oct 2013 22:41:04 +0300
|
|
|
|
|
Subject: [PATCH 06/11] Tiny changes.
|
|
|
|
|
|
|
|
|
|
* src/misc.c: Fix comments, rename wd.cwd to wd.abspath (Nathan Stratton
|
|
|
|
|
Treadway);
|
|
|
|
|
* src/tar.c (options): Reword description of the --starting-file and
|
|
|
|
|
--preserve-order options.
|
|
|
|
|
(decode_options): Both --starting-file and --preserve-order have meaning
|
|
|
|
|
only when used together with an archive reading command. (Pavel Raiskup).
|
|
|
|
|
---
|
|
|
|
|
src/misc.c | 44 +++++++++++++++++++++++++++++---------------
|
|
|
|
|
src/tar.c | 5 +++--
|
|
|
|
|
2 files changed, 32 insertions(+), 17 deletions(-)
|
|
|
|
|
|
|
|
|
|
diff --git a/src/misc.c b/src/misc.c
|
|
|
|
|
index 280f85c..201ed16 100644
|
|
|
|
|
--- a/src/misc.c
|
|
|
|
|
+++ b/src/misc.c
|
|
|
|
|
@@ -279,21 +279,23 @@ normalize_filename (int cdidx, const char *name)
|
|
|
|
|
|
|
|
|
|
if (IS_RELATIVE_FILE_NAME (name))
|
|
|
|
|
{
|
|
|
|
|
- /* Set COPY to the absolute file name if possible.
|
|
|
|
|
+ /* Set COPY to the absolute path for this name.
|
|
|
|
|
|
|
|
|
|
FIXME: There should be no need to get the absolute file name.
|
|
|
|
|
- getcwd is slow, it might fail, and it does not necessarily
|
|
|
|
|
- return a canonical name even when it succeeds. Perhaps we
|
|
|
|
|
- can use dev+ino pairs instead of names? */
|
|
|
|
|
- const char *cwd = tar_getcdpath (cdidx);
|
|
|
|
|
+ tar_getcdpath does not return a true "canonical" path, so
|
|
|
|
|
+ this following approach may lead to situations where the same
|
|
|
|
|
+ file or directory is processed twice under different absolute
|
|
|
|
|
+ paths without that duplication being detected. Perhaps we
|
|
|
|
|
+ should use dev+ino pairs instead of names? */
|
|
|
|
|
+ const char *cdpath = tar_getcdpath (cdidx);
|
|
|
|
|
size_t copylen;
|
|
|
|
|
bool need_separator;
|
|
|
|
|
|
|
|
|
|
- copylen = strlen (cwd);
|
|
|
|
|
+ copylen = strlen (cdpath);
|
|
|
|
|
need_separator = ! (DOUBLE_SLASH_IS_DISTINCT_ROOT
|
|
|
|
|
- && copylen == 2 && ISSLASH (cwd[1]));
|
|
|
|
|
+ && copylen == 2 && ISSLASH (cdpath[1]));
|
|
|
|
|
copy = xmalloc (copylen + need_separator + strlen (name) + 1);
|
|
|
|
|
- strcpy (copy, cwd);
|
|
|
|
|
+ strcpy (copy, cdpath);
|
|
|
|
|
copy[copylen] = DIRECTORY_SEPARATOR;
|
|
|
|
|
strcpy (copy + copylen + need_separator, name);
|
|
|
|
|
}
|
|
|
|
|
@@ -633,8 +635,10 @@ struct wd
|
|
|
|
|
{
|
|
|
|
|
/* The directory's name. */
|
|
|
|
|
char const *name;
|
|
|
|
|
- /* Current working directory; initialized by tar_getcwd */
|
|
|
|
|
- char *cwd;
|
|
|
|
|
+ /* "absolute" path representing this directory; in the contrast to
|
|
|
|
|
+ the real absolute pathname, it can contain /../ components (see
|
|
|
|
|
+ normalize_filename_x for the reason of it). */
|
|
|
|
|
+ char *abspath;
|
|
|
|
|
/* If nonzero, the file descriptor of the directory, or AT_FDCWD if
|
|
|
|
|
the working directory. If zero, the directory needs to be opened
|
|
|
|
|
to be used. */
|
|
|
|
|
@@ -689,7 +693,7 @@ chdir_arg (char const *dir)
|
|
|
|
|
if (! wd_count)
|
|
|
|
|
{
|
|
|
|
|
wd[wd_count].name = ".";
|
|
|
|
|
- wd[wd_count].cwd = xgetcwd ();
|
|
|
|
|
+ wd[wd_count].abspath = xgetcwd ();
|
|
|
|
|
wd[wd_count].fd = AT_FDCWD;
|
|
|
|
|
wd_count++;
|
|
|
|
|
}
|
|
|
|
|
@@ -707,13 +711,16 @@ chdir_arg (char const *dir)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
wd[wd_count].name = dir;
|
|
|
|
|
+ /* if the given name is an absolute path, then use that path
|
|
|
|
|
+ to represent this working directory; otherwise, construct
|
|
|
|
|
+ a path based on the previous -C option's absolute path */
|
|
|
|
|
if (IS_ABSOLUTE_FILE_NAME (wd[wd_count].name))
|
|
|
|
|
- wd[wd_count].cwd = xstrdup (wd[wd_count].name);
|
|
|
|
|
+ wd[wd_count].abspath = xstrdup (wd[wd_count].name);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
- namebuf_t nbuf = namebuf_create (wd[wd_count - 1].cwd);
|
|
|
|
|
+ namebuf_t nbuf = namebuf_create (wd[wd_count - 1].abspath);
|
|
|
|
|
namebuf_add_dir (nbuf, wd[wd_count].name);
|
|
|
|
|
- wd[wd_count].cwd = namebuf_finish (nbuf);
|
|
|
|
|
+ wd[wd_count].abspath = namebuf_finish (nbuf);
|
|
|
|
|
}
|
|
|
|
|
wd[wd_count].fd = 0;
|
|
|
|
|
return wd_count++;
|
|
|
|
|
@@ -794,6 +801,13 @@ tar_dirname (void)
|
|
|
|
|
return wd[chdir_current].name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
+/* Return the absolute path that represents the working
|
|
|
|
|
+ directory referenced by IDX.
|
|
|
|
|
+
|
|
|
|
|
+ If wd is empty, then there were no -C options given, and
|
|
|
|
|
+ chdir_args() has never been called, so we simply return the
|
|
|
|
|
+ process's actual cwd. (Note that in this case IDX is ignored,
|
|
|
|
|
+ since it should always be 0.) */
|
|
|
|
|
const char *
|
|
|
|
|
tar_getcdpath (int idx)
|
|
|
|
|
{
|
|
|
|
|
@@ -804,7 +818,7 @@ tar_getcdpath (int idx)
|
|
|
|
|
cwd = xgetcwd ();
|
|
|
|
|
return cwd;
|
|
|
|
|
}
|
|
|
|
|
- return wd[idx].cwd;
|
|
|
|
|
+ return wd[idx].abspath;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
diff --git a/src/tar.c b/src/tar.c
|
|
|
|
|
index 18277e4..d11daa1 100644
|
|
|
|
|
--- a/src/tar.c
|
|
|
|
|
+++ b/src/tar.c
|
|
|
|
|
@@ -536,7 +536,8 @@ static struct argp_option options[] = {
|
|
|
|
|
{"no-same-permissions", NO_SAME_PERMISSIONS_OPTION, 0, 0,
|
|
|
|
|
N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID+1 },
|
|
|
|
|
{"preserve-order", 's', 0, 0,
|
|
|
|
|
- N_("sort names to extract to match archive"), GRID+1 },
|
|
|
|
|
+ N_("member arguments are listed in the same order as the "
|
|
|
|
|
+ "files in the archive"), GRID+1 },
|
|
|
|
|
{"same-order", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
|
|
|
|
|
{"preserve", PRESERVE_OPTION, 0, 0,
|
|
|
|
|
N_("same as both -p and -s"), GRID+1 },
|
|
|
|
|
@@ -730,7 +731,7 @@ static struct argp_option options[] = {
|
|
|
|
|
{"hard-dereference", HARD_DEREFERENCE_OPTION, 0, 0,
|
|
|
|
|
N_("follow hard links; archive and dump the files they refer to"), GRID+1 },
|
|
|
|
|
{"starting-file", 'K', N_("MEMBER-NAME"), 0,
|
|
|
|
|
- N_("begin at member MEMBER-NAME in the archive"), GRID+1 },
|
|
|
|
|
+ N_("begin at member MEMBER-NAME when reading the archive"), GRID+1 },
|
|
|
|
|
{"newer", 'N', N_("DATE-OR-FILE"), 0,
|
|
|
|
|
N_("only store files newer than DATE-OR-FILE"), GRID+1 },
|
|
|
|
|
{"after-date", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
|
|
|
|
|
--
|
|
|
|
|
2.9.3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
From 79f04038e17dec01031113f4ba68f291f22012c3 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Nathan Stratton Treadway <nathanst@ontko.com>
|
|
|
|
|
Date: Sat, 5 Oct 2013 08:53:08 +0300
|
|
|
|
|
Subject: [PATCH 07/11] Provide comprehensive testcases for various file
|
|
|
|
|
removal modes.
|
|
|
|
|
|
|
|
|
|
* tests/Makefile.am: Add new testcases.
|
|
|
|
|
* tests/testsuite.at: Likewise.
|
|
|
|
|
* tests/incr09.at: Add description.
|
|
|
|
|
* tests/remfiles04a.at: New file.
|
|
|
|
|
* tests/remfiles05.at: Rename to ...
|
|
|
|
|
* tests/remfiles04b.at: ... this.
|
|
|
|
|
* tests/remfiles04.at: Rename to ...
|
|
|
|
|
* tests/remfiles04c.at: ... this.
|
|
|
|
|
* tests/remfiles05a.at: New file.
|
|
|
|
|
* tests/remfiles05b.at: New file.
|
|
|
|
|
* tests/remfiles06.at: Rename to ...
|
|
|
|
|
* tests/remfiles05c.at: ... this.
|
|
|
|
|
* tests/remfiles06a.at: New file.
|
|
|
|
|
* tests/remfiles06b.at: New file.
|
|
|
|
|
* tests/remfiles06c.at: New file.
|
|
|
|
|
* tests/remfiles07a.at: New file.
|
|
|
|
|
* tests/remfiles07b.at: New file.
|
|
|
|
|
* tests/remfiles07c.at: New file.
|
|
|
|
|
* tests/remfiles08a.at: New file.
|
|
|
|
|
* tests/remfiles08b.at: New file.
|
|
|
|
|
* tests/remfiles08c.at: New file.
|
|
|
|
|
* tests/remfiles08.at: Rename to ...
|
|
|
|
|
* tests/remfiles09a.at: ... this.
|
|
|
|
|
* tests/remfiles09b.at: New file.
|
|
|
|
|
* tests/remfiles07.at: Rename to ...
|
|
|
|
|
* tests/remfiles09c.at: ... this.
|
|
|
|
|
---
|
|
|
|
|
tests/Makefile.am | 23 ++++++++---
|
|
|
|
|
tests/incr09.at | 8 ++++
|
|
|
|
|
tests/remfiles04a.at | 45 ++++++++++++++++++++++
|
|
|
|
|
tests/remfiles04b.at | 53 +++++++++++++++++++++++++
|
|
|
|
|
tests/{remfiles04.at => remfiles04c.at} | 21 +++++++---
|
|
|
|
|
tests/remfiles05a.at | 64 +++++++++++++++++++++++++++++++
|
|
|
|
|
tests/remfiles05b.at | 55 ++++++++++++++++++++++++++
|
|
|
|
|
tests/{remfiles05.at => remfiles05c.at} | 35 ++++++++++-------
|
|
|
|
|
tests/remfiles06.at | 65 -------------------------------
|
|
|
|
|
tests/remfiles06a.at | 56 +++++++++++++++++++++++++++
|
|
|
|
|
tests/remfiles06b.at | 56 +++++++++++++++++++++++++++
|
|
|
|
|
tests/remfiles06c.at | 68 +++++++++++++++++++++++++++++++++
|
|
|
|
|
tests/remfiles07a.at | 56 +++++++++++++++++++++++++++
|
|
|
|
|
tests/remfiles07b.at | 56 +++++++++++++++++++++++++++
|
|
|
|
|
tests/remfiles07c.at | 68 +++++++++++++++++++++++++++++++++
|
|
|
|
|
tests/remfiles08a.at | 56 +++++++++++++++++++++++++++
|
|
|
|
|
tests/remfiles08b.at | 56 +++++++++++++++++++++++++++
|
|
|
|
|
tests/remfiles08c.at | 68 +++++++++++++++++++++++++++++++++
|
|
|
|
|
tests/{remfiles08.at => remfiles09a.at} | 27 +++++++------
|
|
|
|
|
tests/remfiles09b.at | 57 +++++++++++++++++++++++++++
|
|
|
|
|
tests/{remfiles07.at => remfiles09c.at} | 37 ++++++++----------
|
|
|
|
|
tests/testsuite.at | 23 ++++++++---
|
|
|
|
|
22 files changed, 923 insertions(+), 130 deletions(-)
|
|
|
|
|
create mode 100644 tests/remfiles04a.at
|
|
|
|
|
create mode 100644 tests/remfiles04b.at
|
|
|
|
|
rename tests/{remfiles04.at => remfiles04c.at} (69%)
|
|
|
|
|
create mode 100644 tests/remfiles05a.at
|
|
|
|
|
create mode 100644 tests/remfiles05b.at
|
|
|
|
|
rename tests/{remfiles05.at => remfiles05c.at} (63%)
|
|
|
|
|
create mode 100644 tests/remfiles06a.at
|
|
|
|
|
create mode 100644 tests/remfiles06b.at
|
|
|
|
|
create mode 100644 tests/remfiles06c.at
|
|
|
|
|
create mode 100644 tests/remfiles07a.at
|
|
|
|
|
create mode 100644 tests/remfiles07b.at
|
|
|
|
|
create mode 100644 tests/remfiles07c.at
|
|
|
|
|
create mode 100644 tests/remfiles08a.at
|
|
|
|
|
create mode 100644 tests/remfiles08b.at
|
|
|
|
|
create mode 100644 tests/remfiles08c.at
|
|
|
|
|
rename tests/{remfiles08.at => remfiles09a.at} (66%)
|
|
|
|
|
create mode 100644 tests/remfiles09b.at
|
|
|
|
|
rename tests/{remfiles07.at => remfiles09c.at} (68%)
|
|
|
|
|
|
|
|
|
|
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
|
|
|
|
index b05a151..cf6f576 100644
|
|
|
|
|
--- a/tests/Makefile.am
|
|
|
|
|
+++ b/tests/Makefile.am
|
|
|
|
|
@@ -141,11 +141,24 @@ TESTSUITE_AT = \
|
|
|
|
|
remfiles01.at\
|
|
|
|
|
remfiles02.at\
|
|
|
|
|
remfiles03.at\
|
|
|
|
|
- remfiles04.at\
|
|
|
|
|
- remfiles05.at\
|
|
|
|
|
- remfiles06.at\
|
|
|
|
|
- remfiles07.at\
|
|
|
|
|
- remfiles08.at\
|
|
|
|
|
+ remfiles04a.at\
|
|
|
|
|
+ remfiles04b.at\
|
|
|
|
|
+ remfiles04c.at\
|
|
|
|
|
+ remfiles05a.at\
|
|
|
|
|
+ remfiles05b.at\
|
|
|
|
|
+ remfiles05c.at\
|
|
|
|
|
+ remfiles06a.at\
|
|
|
|
|
+ remfiles06b.at\
|
|
|
|
|
+ remfiles06c.at\
|
|
|
|
|
+ remfiles07a.at\
|
|
|
|
|
+ remfiles07b.at\
|
|
|
|
|
+ remfiles07c.at\
|
|
|
|
|
+ remfiles08a.at\
|
|
|
|
|
+ remfiles08b.at\
|
|
|
|
|
+ remfiles08c.at\
|
|
|
|
|
+ remfiles09a.at\
|
|
|
|
|
+ remfiles09b.at\
|
|
|
|
|
+ remfiles09c.at\
|
|
|
|
|
same-order01.at\
|
|
|
|
|
same-order02.at\
|
|
|
|
|
shortfile.at\
|
|
|
|
|
diff --git a/tests/incr09.at b/tests/incr09.at
|
|
|
|
|
index b6130a6..e91fb5a 100644
|
|
|
|
|
--- a/tests/incr09.at
|
|
|
|
|
+++ b/tests/incr09.at
|
|
|
|
|
@@ -15,6 +15,14 @@
|
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
+# Description: For some intermediate versions of tar 1.26.90,
|
|
|
|
|
+# tar would fail to correctly cannonicalize archive member names
|
|
|
|
|
+# in incremental mode if there was a -C options with an absolute path
|
|
|
|
|
+# on the command line without any archive members specified within that
|
|
|
|
|
+# directory. (In that case, the canonical name generated for
|
|
|
|
|
+# members specified after later -C options wouldn't correctly reflect the
|
|
|
|
|
+# previous absolute path.)
|
|
|
|
|
+
|
|
|
|
|
AT_SETUP([incremental with alternating -C])
|
|
|
|
|
AT_KEYWORDS([incremental create incr09])
|
|
|
|
|
|
|
|
|
|
diff --git a/tests/remfiles04a.at b/tests/remfiles04a.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..d1e4614
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles04a.at
|
|
|
|
|
@@ -0,0 +1,45 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
+# files due to the --remove-files option.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the use of a single relative-path -C option,
|
|
|
|
|
+# in --create/non-incremental mode.
|
|
|
|
|
+#
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([remove-files with -C:rel in -c/non-incr. mode])
|
|
|
|
|
+AT_KEYWORDS([create remove-files remfiles04 remfiles04a])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+echo bar > bar
|
|
|
|
|
+echo foobar > foo/bar
|
|
|
|
|
+tar -cf foo.tar --remove-files -C foo bar
|
|
|
|
|
+echo A
|
|
|
|
|
+find . | sort
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+],[],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/remfiles04b.at b/tests/remfiles04b.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..3208557
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles04b.at
|
|
|
|
|
@@ -0,0 +1,53 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
+# files due to the --remove-files option.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the use of a single relative-path -C option,
|
|
|
|
|
+# in --create/incremental mode.
|
|
|
|
|
+#
|
|
|
|
|
+# (Tar 1.26 would remove files in original working directory when called in
|
|
|
|
|
+# this manner. [It would follow the -C for archiving the files, but ignore it
|
|
|
|
|
+# for removing them afterwards.]
|
|
|
|
|
+#
|
|
|
|
|
+# Reported by: Nathan Stratton Treadway <nathanst@ontko.com>
|
|
|
|
|
+# References: <20130921171234.GG32256@shire.ontko.com>,
|
|
|
|
|
+# http://lists.gnu.org/archive/html/bug-tar/2013-09/msg00028.html
|
|
|
|
|
+# )
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([remove-files with -C:rel in -c/incr. mode])
|
|
|
|
|
+AT_KEYWORDS([create incremental remove-files remfiles04 remfiles04b])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+echo bar > bar
|
|
|
|
|
+echo foobar > foo/bar
|
|
|
|
|
+tar -cf foo.tar --incremental --remove-files -C foo bar
|
|
|
|
|
+echo A
|
|
|
|
|
+find . | sort
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+],[],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/remfiles04.at b/tests/remfiles04c.at
|
|
|
|
|
similarity index 69%
|
|
|
|
|
rename from tests/remfiles04.at
|
|
|
|
|
rename to tests/remfiles04c.at
|
|
|
|
|
index 04df45b..a1b6d56 100644
|
|
|
|
|
--- a/tests/remfiles04.at
|
|
|
|
|
+++ b/tests/remfiles04c.at
|
|
|
|
|
@@ -15,24 +15,32 @@
|
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
-# Description: Tar 1.26 would remove wrong files when called with
|
|
|
|
|
-# --remove-files and -C
|
|
|
|
|
+# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
+# files due to the --remove-files option.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the use of a single relative-path -C option,
|
|
|
|
|
+# in --append mode.
|
|
|
|
|
+#
|
|
|
|
|
+# (Tar 1.26 would remove files in original working directory when called in
|
|
|
|
|
+# this manner. [It would follow the -C for archiving the files, but ignore it
|
|
|
|
|
+# for removing them afterwards.]
|
|
|
|
|
+#
|
|
|
|
|
# Reported by: Jörgen Strand <Jorgen.Strand@sonymobile.com>
|
|
|
|
|
# References: <9FC79E5CB90CEC47B9647DCAB7BD327A01AD83B452EE@seldmbx02.corpusers.net>
|
|
|
|
|
# http://lists.gnu.org/archive/html/bug-tar/2013-09/msg00024.html
|
|
|
|
|
+# )
|
|
|
|
|
|
|
|
|
|
-AT_SETUP([remove-files with -C])
|
|
|
|
|
-AT_KEYWORDS([create remove-files remfiles04])
|
|
|
|
|
+AT_SETUP([remove-files with -C:rel in -r mode])
|
|
|
|
|
+AT_KEYWORDS([create append remove-files remfiles04 remfiles04c])
|
|
|
|
|
|
|
|
|
|
AT_TAR_CHECK([
|
|
|
|
|
AT_SORT_PREREQ
|
|
|
|
|
mkdir foo
|
|
|
|
|
echo bar > bar
|
|
|
|
|
echo foobar > foo/bar
|
|
|
|
|
-tar -cf foo.tar --remove-files -C foo bar
|
|
|
|
|
+tar -cf foo.tar -C foo bar
|
|
|
|
|
echo A
|
|
|
|
|
find . | sort
|
|
|
|
|
-echo foobar > foo/bar
|
|
|
|
|
tar -rf foo.tar --remove-files -C foo bar
|
|
|
|
|
echo B
|
|
|
|
|
find . | sort
|
|
|
|
|
@@ -43,6 +51,7 @@ find . | sort
|
|
|
|
|
./bar
|
|
|
|
|
./foo
|
|
|
|
|
./foo.tar
|
|
|
|
|
+./foo/bar
|
|
|
|
|
B
|
|
|
|
|
.
|
|
|
|
|
./bar
|
|
|
|
|
diff --git a/tests/remfiles05a.at b/tests/remfiles05a.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..4ceec37
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles05a.at
|
|
|
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
+# files due to the --remove-files option.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the use of two relative-path -C options,
|
|
|
|
|
+# in --create/non-incremental mode.
|
|
|
|
|
+#
|
|
|
|
|
+# (This specific case failed during development of tar 1.26.90:
|
|
|
|
|
+# There was a leftover call to chdir in name_next_elt() in
|
|
|
|
|
+# tar 1.26. After commit e3d28d84 this call would confuse the
|
|
|
|
|
+# tar_getcwd function.
|
|
|
|
|
+#
|
|
|
|
|
+# Reported by: Nathan Stratton Treadway <nathanst@ontko.com>
|
|
|
|
|
+# References: <20130924145657.GM32256@shire.ontko.com>,
|
|
|
|
|
+# http://lists.gnu.org/archive/html/bug-tar/2013-09/msg00045.html
|
|
|
|
|
+# )
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([remove-files with -C:rel,rel in -c/non-incr. mode])
|
|
|
|
|
+AT_KEYWORDS([create remove-files remfiles05 remfiles05a])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+mkdir bar
|
|
|
|
|
+echo file > file
|
|
|
|
|
+echo foo/file > foo/file
|
|
|
|
|
+echo bar/file > bar/file
|
|
|
|
|
+decho A
|
|
|
|
|
+tar -cvf foo.tar --remove-files -C foo file -C ../bar file
|
|
|
|
|
+decho B
|
|
|
|
|
+find . | sort
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+file
|
|
|
|
|
+file
|
|
|
|
|
+B
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./file
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+B
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/remfiles05b.at b/tests/remfiles05b.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..d120efd
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles05b.at
|
|
|
|
|
@@ -0,0 +1,55 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
+# files due to the --remove-files option.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the use of two relative-path -C options,
|
|
|
|
|
+# in --create/incremental mode.
|
|
|
|
|
+#
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([remove-files with -C:rel,rel in -c/incr. mode])
|
|
|
|
|
+AT_KEYWORDS([create incremental remove-files remfiles05 remfiles05b])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+mkdir bar
|
|
|
|
|
+echo file > file
|
|
|
|
|
+echo foo/file > foo/file
|
|
|
|
|
+echo bar/file > bar/file
|
|
|
|
|
+decho A
|
|
|
|
|
+tar -cvf foo.tar --incremental --remove-files -C foo file -C ../bar file
|
|
|
|
|
+decho B
|
|
|
|
|
+find . | sort
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+file
|
|
|
|
|
+file
|
|
|
|
|
+B
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./file
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+B
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/remfiles05.at b/tests/remfiles05c.at
|
|
|
|
|
similarity index 63%
|
|
|
|
|
rename from tests/remfiles05.at
|
|
|
|
|
rename to tests/remfiles05c.at
|
|
|
|
|
index 04425a7..a01b092 100644
|
|
|
|
|
--- a/tests/remfiles05.at
|
|
|
|
|
+++ b/tests/remfiles05c.at
|
|
|
|
|
@@ -15,25 +15,28 @@
|
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
-# Description: Tar 1.26 would remove wrong files when invoked with
|
|
|
|
|
-# --listed-incremental and -C
|
|
|
|
|
-# Reported by: Nathan Stratton Treadway <nathanst@ontko.com>
|
|
|
|
|
-# References: <20130921171234.GG32256@shire.ontko.com>,
|
|
|
|
|
-# http://lists.gnu.org/archive/html/bug-tar/2013-09/msg00028.html
|
|
|
|
|
+# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
+# files due to the --remove-files option.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the use of two relative-path -C options,
|
|
|
|
|
+# in --append mode.
|
|
|
|
|
+#
|
|
|
|
|
|
|
|
|
|
-AT_SETUP([incremental and -C])
|
|
|
|
|
-AT_KEYWORDS([incremental create remove-files remfiles05])
|
|
|
|
|
+AT_SETUP([remove-files with -C:rel,rel in -r mode])
|
|
|
|
|
+AT_KEYWORDS([create append remove-files remfiles05 remfiles05c])
|
|
|
|
|
|
|
|
|
|
AT_TAR_CHECK([
|
|
|
|
|
AT_SORT_PREREQ
|
|
|
|
|
mkdir foo
|
|
|
|
|
-echo bar > bar
|
|
|
|
|
-echo foo/bar > foo/bar
|
|
|
|
|
+mkdir bar
|
|
|
|
|
+echo file > file
|
|
|
|
|
+echo foo/file > foo/file
|
|
|
|
|
+echo bar/file > bar/file
|
|
|
|
|
+tar -cf foo.tar -C foo file -C ../bar file
|
|
|
|
|
decho A
|
|
|
|
|
find . | sort
|
|
|
|
|
-
|
|
|
|
|
decho B
|
|
|
|
|
-tar -cvf foo.tar --listed-incremental=foo.snar --remove-files -C foo bar
|
|
|
|
|
+tar -rvf foo.tar --remove-files -C foo file -C ../bar file
|
|
|
|
|
decho C
|
|
|
|
|
find . | sort
|
|
|
|
|
],
|
|
|
|
|
@@ -41,15 +44,19 @@ find . | sort
|
|
|
|
|
[A
|
|
|
|
|
.
|
|
|
|
|
./bar
|
|
|
|
|
+./bar/file
|
|
|
|
|
+./file
|
|
|
|
|
./foo
|
|
|
|
|
-./foo/bar
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+./foo/file
|
|
|
|
|
B
|
|
|
|
|
-bar
|
|
|
|
|
+file
|
|
|
|
|
+file
|
|
|
|
|
C
|
|
|
|
|
.
|
|
|
|
|
./bar
|
|
|
|
|
+./file
|
|
|
|
|
./foo
|
|
|
|
|
-./foo.snar
|
|
|
|
|
./foo.tar
|
|
|
|
|
],
|
|
|
|
|
[A
|
|
|
|
|
diff --git a/tests/remfiles06.at b/tests/remfiles06.at
|
|
|
|
|
deleted file mode 100644
|
|
|
|
|
index c2d9876..8b13789
|
|
|
|
|
--- a/tests/remfiles06.at
|
|
|
|
|
+++ /dev/null
|
|
|
|
|
@@ -1,66 +0,0 @@
|
|
|
|
|
-# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
-# Test suite for GNU tar.
|
|
|
|
|
-# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
-#
|
|
|
|
|
-# GNU tar 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 of the License, or
|
|
|
|
|
-# (at your option) any later version.
|
|
|
|
|
-#
|
|
|
|
|
-# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
-
|
|
|
|
|
-# Description: There was a leftover call to chdir in name_next_elt() in
|
|
|
|
|
-# tar 1.26. After commit e3d28d84 this call would confuse the tar_getcwd
|
|
|
|
|
-# function.
|
|
|
|
|
-# Reported by: Nathan Stratton Treadway <nathanst@ontko.com>
|
|
|
|
|
-# References: <20130924145657.GM32256@shire.ontko.com>,
|
|
|
|
|
-# http://lists.gnu.org/archive/html/bug-tar/2013-09/msg00045.html
|
|
|
|
|
-
|
|
|
|
|
-AT_SETUP([remove with two -C])
|
|
|
|
|
-AT_KEYWORDS([remove-files remfiles06])
|
|
|
|
|
-
|
|
|
|
|
-AT_TAR_CHECK([
|
|
|
|
|
-AT_SORT_PREREQ
|
|
|
|
|
-mkdir tartest
|
|
|
|
|
-cd tartest
|
|
|
|
|
-mkdir foo
|
|
|
|
|
-echo foo/file > foo/file
|
|
|
|
|
-mkdir bar
|
|
|
|
|
-echo bar/file > bar/file
|
|
|
|
|
-decho A
|
|
|
|
|
-find|sort
|
|
|
|
|
-
|
|
|
|
|
-decho B
|
|
|
|
|
-tar -cvf ../foo.tar --remove-files -C foo file -C ../bar file
|
|
|
|
|
-
|
|
|
|
|
-decho C
|
|
|
|
|
-find|sort
|
|
|
|
|
-],
|
|
|
|
|
-[0],
|
|
|
|
|
-[A
|
|
|
|
|
-.
|
|
|
|
|
-./bar
|
|
|
|
|
-./bar/file
|
|
|
|
|
-./foo
|
|
|
|
|
-./foo/file
|
|
|
|
|
-B
|
|
|
|
|
-file
|
|
|
|
|
-file
|
|
|
|
|
-C
|
|
|
|
|
-.
|
|
|
|
|
-./bar
|
|
|
|
|
-./foo
|
|
|
|
|
-],
|
|
|
|
|
-[A
|
|
|
|
|
-B
|
|
|
|
|
-C
|
|
|
|
|
-],[],[],[gnu])
|
|
|
|
|
-
|
|
|
|
|
-AT_CLEANUP
|
|
|
|
|
-
|
|
|
|
|
diff --git a/tests/remfiles06a.at b/tests/remfiles06a.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..fe762c1
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles06a.at
|
|
|
|
|
@@ -0,0 +1,56 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
+# files due to the --remove-files option.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the use of a relative -C option followed by an absolute -C,
|
|
|
|
|
+# in --create/non-incremental mode.
|
|
|
|
|
+#
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([remove-files with -C:rel,abs in -c/non-incr. mode])
|
|
|
|
|
+AT_KEYWORDS([create remove-files remfiles06 remfiles06a])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+mkdir bar
|
|
|
|
|
+echo file > file
|
|
|
|
|
+echo foo/file > foo/file
|
|
|
|
|
+echo bar/file > bar/file
|
|
|
|
|
+DIR=`pwd`
|
|
|
|
|
+decho A
|
|
|
|
|
+tar -cvf foo.tar --remove-files -C foo file -C $DIR/bar file
|
|
|
|
|
+decho B
|
|
|
|
|
+find . | sort
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+file
|
|
|
|
|
+file
|
|
|
|
|
+B
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./file
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+B
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/remfiles06b.at b/tests/remfiles06b.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..3b867fb
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles06b.at
|
|
|
|
|
@@ -0,0 +1,56 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
+# files due to the --remove-files option.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the use of a relative -C option followed by an absolute -C,
|
|
|
|
|
+# in --create/incremental mode.
|
|
|
|
|
+#
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([remove-files with -C:rel,abs in -c/incr. mode])
|
|
|
|
|
+AT_KEYWORDS([create incremental remove-files remfiles06 remfiles06b])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+mkdir bar
|
|
|
|
|
+echo file > file
|
|
|
|
|
+echo foo/file > foo/file
|
|
|
|
|
+echo bar/file > bar/file
|
|
|
|
|
+DIR=`pwd`
|
|
|
|
|
+decho A
|
|
|
|
|
+tar -cvf foo.tar --incremental --remove-files -C foo file -C $DIR/bar file
|
|
|
|
|
+decho B
|
|
|
|
|
+find . | sort
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+file
|
|
|
|
|
+file
|
|
|
|
|
+B
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./file
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+B
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/remfiles06c.at b/tests/remfiles06c.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..ad9164d
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles06c.at
|
|
|
|
|
@@ -0,0 +1,68 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
+# files due to the --remove-files option.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the use of a relative -C option followed by an absolute -C,
|
|
|
|
|
+# in --append mode.
|
|
|
|
|
+#
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([remove-files with -C:rel,abs in -r mode])
|
|
|
|
|
+AT_KEYWORDS([create append remove-files remfiles06 remfiles06c])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+mkdir bar
|
|
|
|
|
+echo file > file
|
|
|
|
|
+echo foo/file > foo/file
|
|
|
|
|
+echo bar/file > bar/file
|
|
|
|
|
+DIR=`pwd`
|
|
|
|
|
+tar -cf foo.tar -C foo file -C $DIR/bar file
|
|
|
|
|
+decho A
|
|
|
|
|
+find . | sort
|
|
|
|
|
+decho B
|
|
|
|
|
+tar -rvf foo.tar --remove-files -C foo file -C ../bar file
|
|
|
|
|
+decho C
|
|
|
|
|
+find . | sort
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./bar/file
|
|
|
|
|
+./file
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+./foo/file
|
|
|
|
|
+B
|
|
|
|
|
+file
|
|
|
|
|
+file
|
|
|
|
|
+C
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./file
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+B
|
|
|
|
|
+C
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/remfiles07a.at b/tests/remfiles07a.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..95f645c
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles07a.at
|
|
|
|
|
@@ -0,0 +1,56 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
+# files due to the --remove-files option.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the use of a relative -C option followed by an absolute -C,
|
|
|
|
|
+# in --create/non-incremental mode.
|
|
|
|
|
+#
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([remove-files with -C:rel,abs in -c/non-incr. mode])
|
|
|
|
|
+AT_KEYWORDS([create remove-files remfiles07 remfiles07a])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+mkdir bar
|
|
|
|
|
+echo file > file
|
|
|
|
|
+echo foo/file > foo/file
|
|
|
|
|
+echo bar/file > bar/file
|
|
|
|
|
+DIR=`pwd`
|
|
|
|
|
+decho A
|
|
|
|
|
+tar -cvf foo.tar --remove-files -C foo file -C $DIR/bar file
|
|
|
|
|
+decho B
|
|
|
|
|
+find . | sort
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+file
|
|
|
|
|
+file
|
|
|
|
|
+B
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./file
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+B
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/remfiles07b.at b/tests/remfiles07b.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..ca67e5d
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles07b.at
|
|
|
|
|
@@ -0,0 +1,56 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
+# files due to the --remove-files option.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the use of a relative -C option followed by an absolute -C,
|
|
|
|
|
+# in --create/incremental mode.
|
|
|
|
|
+#
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([remove-files with -C:rel,abs in -c/incr. mode])
|
|
|
|
|
+AT_KEYWORDS([create incremental remove-files remfiles07 remfiles07b])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+mkdir bar
|
|
|
|
|
+echo file > file
|
|
|
|
|
+echo foo/file > foo/file
|
|
|
|
|
+echo bar/file > bar/file
|
|
|
|
|
+DIR=`pwd`
|
|
|
|
|
+decho A
|
|
|
|
|
+tar -cvf foo.tar --incremental --remove-files -C foo file -C $DIR/bar file
|
|
|
|
|
+decho B
|
|
|
|
|
+find . | sort
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+file
|
|
|
|
|
+file
|
|
|
|
|
+B
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./file
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+B
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/remfiles07c.at b/tests/remfiles07c.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..6a5c870
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles07c.at
|
|
|
|
|
@@ -0,0 +1,68 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
+# files due to the --remove-files option.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the use of a relative -C option followed by an absolute -C,
|
|
|
|
|
+# in --append mode.
|
|
|
|
|
+#
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([remove-files with -C:rel,abs in -r mode])
|
|
|
|
|
+AT_KEYWORDS([create append remove-files remfiles07 remfiles07c])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+mkdir bar
|
|
|
|
|
+echo file > file
|
|
|
|
|
+echo foo/file > foo/file
|
|
|
|
|
+echo bar/file > bar/file
|
|
|
|
|
+DIR=`pwd`
|
|
|
|
|
+tar -cf foo.tar -C foo file -C $DIR/bar file
|
|
|
|
|
+decho A
|
|
|
|
|
+find . | sort
|
|
|
|
|
+decho B
|
|
|
|
|
+tar -rvf foo.tar --remove-files -C foo file -C $DIR/bar file
|
|
|
|
|
+decho C
|
|
|
|
|
+find . | sort
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./bar/file
|
|
|
|
|
+./file
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+./foo/file
|
|
|
|
|
+B
|
|
|
|
|
+file
|
|
|
|
|
+file
|
|
|
|
|
+C
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./file
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+B
|
|
|
|
|
+C
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/remfiles08a.at b/tests/remfiles08a.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..eadf149
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles08a.at
|
|
|
|
|
@@ -0,0 +1,56 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
+# files due to the --remove-files option.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the use of an absolute -C option followed by a relative -C,
|
|
|
|
|
+# in --create/non-incremental mode.
|
|
|
|
|
+#
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([remove-files with -C:abs,rel in -c/non-incr. mode])
|
|
|
|
|
+AT_KEYWORDS([create remove-files remfiles08 remfiles08a])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+mkdir bar
|
|
|
|
|
+echo file > file
|
|
|
|
|
+echo foo/file > foo/file
|
|
|
|
|
+echo bar/file > bar/file
|
|
|
|
|
+DIR=`pwd`
|
|
|
|
|
+decho A
|
|
|
|
|
+tar -cvf foo.tar --remove-files -C $DIR/foo file -C ../bar file
|
|
|
|
|
+decho B
|
|
|
|
|
+find . | sort
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+file
|
|
|
|
|
+file
|
|
|
|
|
+B
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./file
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+B
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/remfiles08b.at b/tests/remfiles08b.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..9faf2bb
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles08b.at
|
|
|
|
|
@@ -0,0 +1,56 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
+# files due to the --remove-files option.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the use of an absolute -C option followed by a relative -C,
|
|
|
|
|
+# in --create/incremental mode.
|
|
|
|
|
+#
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([remove-files with -C:abs,rel in -c/incr. mode])
|
|
|
|
|
+AT_KEYWORDS([create incremental remove-files remfiles08 remfiles08b])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+mkdir bar
|
|
|
|
|
+echo file > file
|
|
|
|
|
+echo foo/file > foo/file
|
|
|
|
|
+echo bar/file > bar/file
|
|
|
|
|
+DIR=`pwd`
|
|
|
|
|
+decho A
|
|
|
|
|
+tar -cvf foo.tar --incremental --remove-files -C $DIR/foo file -C ../bar file
|
|
|
|
|
+decho B
|
|
|
|
|
+find . | sort
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+file
|
|
|
|
|
+file
|
|
|
|
|
+B
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./file
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+B
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/remfiles08c.at b/tests/remfiles08c.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..a220f4c
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles08c.at
|
|
|
|
|
@@ -0,0 +1,68 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
+# files due to the --remove-files option.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the use of an absolute -C option followed by a relative -C,
|
|
|
|
|
+# in --append mode.
|
|
|
|
|
+#
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([remove-files with -C:abs,rel in -r mode])
|
|
|
|
|
+AT_KEYWORDS([create append remove-files remfiles08 remfiles08c])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+mkdir bar
|
|
|
|
|
+echo file > file
|
|
|
|
|
+echo foo/file > foo/file
|
|
|
|
|
+echo bar/file > bar/file
|
|
|
|
|
+DIR=`pwd`
|
|
|
|
|
+tar -cf foo.tar -C $DIR/foo file -C ../bar file
|
|
|
|
|
+decho A
|
|
|
|
|
+find . | sort
|
|
|
|
|
+decho B
|
|
|
|
|
+tar -rvf foo.tar --remove-files -C $DIR/foo file -C ../bar file
|
|
|
|
|
+decho C
|
|
|
|
|
+find . | sort
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./bar/file
|
|
|
|
|
+./file
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+./foo/file
|
|
|
|
|
+B
|
|
|
|
|
+file
|
|
|
|
|
+file
|
|
|
|
|
+C
|
|
|
|
|
+.
|
|
|
|
|
+./bar
|
|
|
|
|
+./file
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+B
|
|
|
|
|
+C
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/remfiles08.at b/tests/remfiles09a.at
|
|
|
|
|
similarity index 66%
|
|
|
|
|
rename from tests/remfiles08.at
|
|
|
|
|
rename to tests/remfiles09a.at
|
|
|
|
|
index 0649e85..fd28b4f 100644
|
|
|
|
|
--- a/tests/remfiles08.at
|
|
|
|
|
+++ b/tests/remfiles09a.at
|
|
|
|
|
@@ -15,29 +15,28 @@
|
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
-# Description: See remfiles06.at
|
|
|
|
|
-# Reported by: Nathan Stratton Treadway <nathanst@ontko.com>
|
|
|
|
|
-# References: <20130926050634.GW32256@shire.ontko.com>
|
|
|
|
|
+# Description: check --remove-files operation when archiving/deleting
|
|
|
|
|
+# directory trees.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the operation
|
|
|
|
|
+# in --create/non-incremental mode.
|
|
|
|
|
+#
|
|
|
|
|
|
|
|
|
|
-AT_SETUP([remove with -C to absolute and relative paths])
|
|
|
|
|
-AT_KEYWORDS([incremental create remove-files remfiles08])
|
|
|
|
|
+AT_SETUP([remove-files on full directory in -c/non-incr. mode])
|
|
|
|
|
+AT_KEYWORDS([create remove-files remfiles09 remfiles09a])
|
|
|
|
|
|
|
|
|
|
AT_TAR_CHECK([
|
|
|
|
|
mkdir foo
|
|
|
|
|
-mkdir bar
|
|
|
|
|
-echo foo/foo_file > foo/foo_file
|
|
|
|
|
-echo bar/bar_file > bar/bar_file
|
|
|
|
|
+echo foo/file > foo/file
|
|
|
|
|
decho A
|
|
|
|
|
-tar -cvf foo.tar --remove-files -C `pwd`/foo . -C ../bar .
|
|
|
|
|
+tar -cvf foo.tar --remove-files foo
|
|
|
|
|
decho B
|
|
|
|
|
-find
|
|
|
|
|
+find .
|
|
|
|
|
],
|
|
|
|
|
[0],
|
|
|
|
|
[A
|
|
|
|
|
-./
|
|
|
|
|
-./foo_file
|
|
|
|
|
-./
|
|
|
|
|
-./bar_file
|
|
|
|
|
+foo/
|
|
|
|
|
+foo/file
|
|
|
|
|
B
|
|
|
|
|
.
|
|
|
|
|
./foo.tar
|
|
|
|
|
diff --git a/tests/remfiles09b.at b/tests/remfiles09b.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..30cc3ee
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles09b.at
|
|
|
|
|
@@ -0,0 +1,57 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2013 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Description: check --remove-files operation when archiving/deleting
|
|
|
|
|
+# directory trees.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the operation
|
|
|
|
|
+# in --create/incremental mode.
|
|
|
|
|
+#
|
|
|
|
|
+# Note: in tar 1.27, when run in incremental mode tar will attempt to remove
|
|
|
|
|
+# the directory before removing the files within that directory, and thus
|
|
|
|
|
+# the --remove-files operation will cause tar to abort with an error status.
|
|
|
|
|
+# This issue will be fixed in a later version of tar.
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([remove-files on full directory in -c/incr. mode])
|
|
|
|
|
+AT_KEYWORDS([create incremental remove-files remfiles09 remfiles09b])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+AT_SORT_PREREQ
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+echo foo/file > foo/file
|
|
|
|
|
+decho A
|
|
|
|
|
+tar -cvf foo.tar --incremental --remove-files foo
|
|
|
|
|
+TARSTAT=$?
|
|
|
|
|
+decho B
|
|
|
|
|
+find .
|
|
|
|
|
+test $TARSTAT -ne 0 && AT_SKIP_TEST # we expect to fail in tar 1.27
|
|
|
|
|
+],
|
|
|
|
|
+[0],
|
|
|
|
|
+[A
|
|
|
|
|
+foo/
|
|
|
|
|
+foo/file
|
|
|
|
|
+B
|
|
|
|
|
+.
|
|
|
|
|
+./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+tar: foo: Directory is new
|
|
|
|
|
+B
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/remfiles07.at b/tests/remfiles09c.at
|
|
|
|
|
similarity index 68%
|
|
|
|
|
rename from tests/remfiles07.at
|
|
|
|
|
rename to tests/remfiles09c.at
|
|
|
|
|
index 742e0a1..7241608 100644
|
|
|
|
|
--- a/tests/remfiles07.at
|
|
|
|
|
+++ b/tests/remfiles09c.at
|
|
|
|
|
@@ -15,45 +15,40 @@
|
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
-# Description: See remfiles06.at
|
|
|
|
|
-# Reported by: Nathan Stratton Treadway <nathanst@ontko.com>
|
|
|
|
|
-# References: <20130924185129.GO32256@shire.ontko.com>
|
|
|
|
|
+# Description: check --remove-files operation when archiving/deleting
|
|
|
|
|
+# directory trees.
|
|
|
|
|
+#
|
|
|
|
|
+# This case checks the operation
|
|
|
|
|
+# in --append mode.
|
|
|
|
|
+#
|
|
|
|
|
|
|
|
|
|
-AT_SETUP([remove with -C to absolute path])
|
|
|
|
|
-AT_KEYWORDS([create remove-files remfiles07])
|
|
|
|
|
+AT_SETUP([remove-files on full directory in -r mode])
|
|
|
|
|
+AT_KEYWORDS([create append remove-files remfiles09 remfiles09c])
|
|
|
|
|
|
|
|
|
|
AT_TAR_CHECK([
|
|
|
|
|
AT_SORT_PREREQ
|
|
|
|
|
-mkdir tartest
|
|
|
|
|
-cd tartest
|
|
|
|
|
mkdir foo
|
|
|
|
|
echo foo/file > foo/file
|
|
|
|
|
-mkdir bar
|
|
|
|
|
-echo bar/file > bar/file
|
|
|
|
|
+tar -cf foo.tar foo
|
|
|
|
|
decho A
|
|
|
|
|
-find|sort
|
|
|
|
|
-
|
|
|
|
|
-DIR=`pwd`
|
|
|
|
|
+find . | sort
|
|
|
|
|
decho B
|
|
|
|
|
-tar -cvf ../foo.tar --remove-files -C foo file -C $DIR/bar file
|
|
|
|
|
-
|
|
|
|
|
+tar -rvf foo.tar --remove-files foo
|
|
|
|
|
decho C
|
|
|
|
|
-find|sort
|
|
|
|
|
+find . | sort
|
|
|
|
|
],
|
|
|
|
|
[0],
|
|
|
|
|
[A
|
|
|
|
|
.
|
|
|
|
|
-./bar
|
|
|
|
|
-./bar/file
|
|
|
|
|
./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
./foo/file
|
|
|
|
|
B
|
|
|
|
|
-file
|
|
|
|
|
-file
|
|
|
|
|
+foo/
|
|
|
|
|
+foo/file
|
|
|
|
|
C
|
|
|
|
|
.
|
|
|
|
|
-./bar
|
|
|
|
|
-./foo
|
|
|
|
|
+./foo.tar
|
|
|
|
|
],
|
|
|
|
|
[A
|
|
|
|
|
B
|
|
|
|
|
diff --git a/tests/testsuite.at b/tests/testsuite.at
|
|
|
|
|
index a9f2ab6..1cc425f 100644
|
|
|
|
|
--- a/tests/testsuite.at
|
|
|
|
|
+++ b/tests/testsuite.at
|
|
|
|
|
@@ -332,11 +332,24 @@ m4_include([grow.at])
|
|
|
|
|
m4_include([remfiles01.at])
|
|
|
|
|
m4_include([remfiles02.at])
|
|
|
|
|
m4_include([remfiles03.at])
|
|
|
|
|
-m4_include([remfiles04.at])
|
|
|
|
|
-m4_include([remfiles05.at])
|
|
|
|
|
-m4_include([remfiles06.at])
|
|
|
|
|
-m4_include([remfiles07.at])
|
|
|
|
|
-m4_include([remfiles08.at])
|
|
|
|
|
+m4_include([remfiles04a.at])
|
|
|
|
|
+m4_include([remfiles04b.at])
|
|
|
|
|
+m4_include([remfiles04c.at])
|
|
|
|
|
+m4_include([remfiles05a.at])
|
|
|
|
|
+m4_include([remfiles05b.at])
|
|
|
|
|
+m4_include([remfiles05c.at])
|
|
|
|
|
+m4_include([remfiles06a.at])
|
|
|
|
|
+m4_include([remfiles06b.at])
|
|
|
|
|
+m4_include([remfiles06c.at])
|
|
|
|
|
+m4_include([remfiles07a.at])
|
|
|
|
|
+m4_include([remfiles07b.at])
|
|
|
|
|
+m4_include([remfiles07c.at])
|
|
|
|
|
+m4_include([remfiles08a.at])
|
|
|
|
|
+m4_include([remfiles08b.at])
|
|
|
|
|
+m4_include([remfiles08c.at])
|
|
|
|
|
+m4_include([remfiles09a.at])
|
|
|
|
|
+m4_include([remfiles09b.at])
|
|
|
|
|
+m4_include([remfiles09c.at])
|
|
|
|
|
|
|
|
|
|
m4_include([sigpipe.at])
|
|
|
|
|
|
|
|
|
|
--
|
|
|
|
|
2.9.3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
From c3d32c9c848f1f305cd9aefd9f485cdfbcee51b2 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Sergey Poznyakoff <gray@gnu.org.ua>
|
|
|
|
|
Date: Sat, 5 Oct 2013 09:29:55 +0300
|
|
|
|
|
Subject: [PATCH 08/11] Xfail the remfiles09b test.
|
|
|
|
|
|
|
|
|
|
* tests/remfiles09b.at: Turn into expected failure.
|
|
|
|
|
---
|
|
|
|
|
tests/remfiles09b.at | 3 ++-
|
|
|
|
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
|
|
|
|
|
|
|
|
diff --git a/tests/remfiles09b.at b/tests/remfiles09b.at
|
|
|
|
|
index 30cc3ee..de9b172 100644
|
|
|
|
|
--- a/tests/remfiles09b.at
|
|
|
|
|
+++ b/tests/remfiles09b.at
|
|
|
|
|
@@ -29,6 +29,8 @@
|
|
|
|
|
AT_SETUP([remove-files on full directory in -c/incr. mode])
|
|
|
|
|
AT_KEYWORDS([create incremental remove-files remfiles09 remfiles09b])
|
|
|
|
|
|
|
|
|
|
+AT_XFAIL_IF(true) # we expect to fail in tar 1.27
|
|
|
|
|
+
|
|
|
|
|
AT_TAR_CHECK([
|
|
|
|
|
AT_SORT_PREREQ
|
|
|
|
|
mkdir foo
|
|
|
|
|
@@ -38,7 +40,6 @@ tar -cvf foo.tar --incremental --remove-files foo
|
|
|
|
|
TARSTAT=$?
|
|
|
|
|
decho B
|
|
|
|
|
find .
|
|
|
|
|
-test $TARSTAT -ne 0 && AT_SKIP_TEST # we expect to fail in tar 1.27
|
|
|
|
|
],
|
|
|
|
|
[0],
|
|
|
|
|
[A
|
|
|
|
|
--
|
|
|
|
|
2.9.3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
From 2c5449cc473b0a9affed02feaf3ad42e5e89bfb5 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
|
|
|
Date: Tue, 29 Apr 2014 14:22:07 -0700
|
|
|
|
|
Subject: [PATCH 09/11] tar: do not dereference NULL pointer with
|
|
|
|
|
'--remove-files .'
|
|
|
|
|
|
|
|
|
|
Problem reported by Thorsten Hirsch in:
|
|
|
|
|
http://lists.gnu.org/archive/html/bug-tar/2014-04/msg00011.html
|
|
|
|
|
* src/unlink.c (flush_deferred_unlinks):
|
|
|
|
|
Do not attempt to find the parent of "." when "." is
|
|
|
|
|
at the top level.
|
|
|
|
|
* tests/remfiles10.at: New file.
|
|
|
|
|
* tests/Makefile.am (TESTSUITE_AT):
|
|
|
|
|
* tests/testsuite.at: Add it.
|
|
|
|
|
---
|
|
|
|
|
src/unlink.c | 5 +++--
|
|
|
|
|
tests/Makefile.am | 1 +
|
|
|
|
|
tests/remfiles10.at | 46 ++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
tests/testsuite.at | 1 +
|
|
|
|
|
4 files changed, 51 insertions(+), 2 deletions(-)
|
|
|
|
|
create mode 100644 tests/remfiles10.at
|
|
|
|
|
|
|
|
|
|
diff --git a/src/unlink.c b/src/unlink.c
|
|
|
|
|
index 10e0b41..6e41acc 100644
|
|
|
|
|
--- a/src/unlink.c
|
|
|
|
|
+++ b/src/unlink.c
|
|
|
|
|
@@ -84,8 +84,9 @@ flush_deferred_unlinks (bool force)
|
|
|
|
|
{
|
|
|
|
|
const char *fname;
|
|
|
|
|
|
|
|
|
|
- if (p->file_name[0] == 0 ||
|
|
|
|
|
- strcmp (p->file_name, ".") == 0)
|
|
|
|
|
+ if (p->dir_idx
|
|
|
|
|
+ && (p->file_name[0] == 0
|
|
|
|
|
+ || strcmp (p->file_name, ".") == 0))
|
|
|
|
|
{
|
|
|
|
|
fname = tar_dirname ();
|
|
|
|
|
chdir_do (p->dir_idx - 1);
|
|
|
|
|
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
|
|
|
|
index cf6f576..792c83c 100644
|
|
|
|
|
--- a/tests/Makefile.am
|
|
|
|
|
+++ b/tests/Makefile.am
|
|
|
|
|
@@ -159,6 +159,7 @@ TESTSUITE_AT = \
|
|
|
|
|
remfiles09a.at\
|
|
|
|
|
remfiles09b.at\
|
|
|
|
|
remfiles09c.at\
|
|
|
|
|
+ remfiles10.at\
|
|
|
|
|
same-order01.at\
|
|
|
|
|
same-order02.at\
|
|
|
|
|
shortfile.at\
|
|
|
|
|
diff --git a/tests/remfiles10.at b/tests/remfiles10.at
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..b4fe139
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/tests/remfiles10.at
|
|
|
|
|
@@ -0,0 +1,46 @@
|
|
|
|
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
|
+# Test suite for GNU tar.
|
|
|
|
|
+# Copyright 2014 Free Software Foundation, Inc.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 of the License, or
|
|
|
|
|
+# (at your option) any later version.
|
|
|
|
|
+#
|
|
|
|
|
+# GNU tar 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
+
|
|
|
|
|
+# Check --remove-files with .
|
|
|
|
|
+
|
|
|
|
|
+AT_SETUP([remove-files])
|
|
|
|
|
+AT_KEYWORDS([create remove-files remfiles10])
|
|
|
|
|
+
|
|
|
|
|
+AT_TAR_CHECK([
|
|
|
|
|
+mkdir foo
|
|
|
|
|
+echo foo/file > foo/file
|
|
|
|
|
+decho A
|
|
|
|
|
+(cd foo && tar -cvf ../foo.tar --remove-files .)
|
|
|
|
|
+tar_status=$?
|
|
|
|
|
+decho B
|
|
|
|
|
+find foo
|
|
|
|
|
+exit $tar_status
|
|
|
|
|
+],
|
|
|
|
|
+[2],
|
|
|
|
|
+[A
|
|
|
|
|
+./
|
|
|
|
|
+./file
|
|
|
|
|
+B
|
|
|
|
|
+foo
|
|
|
|
|
+],
|
|
|
|
|
+[A
|
|
|
|
|
+tar: .: Cannot rmdir: Invalid argument
|
|
|
|
|
+tar: Exiting with failure status due to previous errors
|
|
|
|
|
+B
|
|
|
|
|
+],[],[],[gnu])
|
|
|
|
|
+
|
|
|
|
|
+AT_CLEANUP
|
|
|
|
|
diff --git a/tests/testsuite.at b/tests/testsuite.at
|
|
|
|
|
index 1cc425f..1078724 100644
|
|
|
|
|
--- a/tests/testsuite.at
|
|
|
|
|
+++ b/tests/testsuite.at
|
|
|
|
|
@@ -350,6 +350,7 @@ m4_include([remfiles08c.at])
|
|
|
|
|
m4_include([remfiles09a.at])
|
|
|
|
|
m4_include([remfiles09b.at])
|
|
|
|
|
m4_include([remfiles09c.at])
|
|
|
|
|
+m4_include([remfiles10.at])
|
|
|
|
|
|
|
|
|
|
m4_include([sigpipe.at])
|
|
|
|
|
|
|
|
|
|
--
|
|
|
|
|
2.9.3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
From 612e134f4905f479b78b6d7faf9798494697a742 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Nathan Stratton Treadway <nathanst@ontko.com>
|
|
|
|
|
Date: Sun, 27 Jul 2014 23:27:28 +0300
|
|
|
|
|
Subject: [PATCH 10/11] Restructure the remfiles testsuite.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
tests/remfiles06c.at | 2 +-
|
|
|
|
|
tests/remfiles07a.at | 6 +++---
|
|
|
|
|
tests/remfiles07b.at | 6 +++---
|
|
|
|
|
tests/remfiles07c.at | 8 ++++----
|
|
|
|
|
tests/remfiles08a.at | 31 +++++++++++++++----------------
|
|
|
|
|
tests/remfiles08b.at | 38 ++++++++++++++++++++++----------------
|
|
|
|
|
tests/remfiles08c.at | 37 ++++++++++++++++++-------------------
|
|
|
|
|
tests/remfiles09a.at | 2 +-
|
|
|
|
|
tests/remfiles09b.at | 3 ---
|
|
|
|
|
9 files changed, 67 insertions(+), 66 deletions(-)
|
|
|
|
|
|
|
|
|
|
diff --git a/tests/remfiles06c.at b/tests/remfiles06c.at
|
|
|
|
|
index ad9164d..abb8e68 100644
|
|
|
|
|
--- a/tests/remfiles06c.at
|
|
|
|
|
+++ b/tests/remfiles06c.at
|
|
|
|
|
@@ -37,7 +37,7 @@ tar -cf foo.tar -C foo file -C $DIR/bar file
|
|
|
|
|
decho A
|
|
|
|
|
find . | sort
|
|
|
|
|
decho B
|
|
|
|
|
-tar -rvf foo.tar --remove-files -C foo file -C ../bar file
|
|
|
|
|
+tar -rvf foo.tar --remove-files -C foo file -C $DIR/bar file
|
|
|
|
|
decho C
|
|
|
|
|
find . | sort
|
|
|
|
|
],
|
|
|
|
|
diff --git a/tests/remfiles07a.at b/tests/remfiles07a.at
|
|
|
|
|
index 95f645c..5b7df3e 100644
|
|
|
|
|
--- a/tests/remfiles07a.at
|
|
|
|
|
+++ b/tests/remfiles07a.at
|
|
|
|
|
@@ -18,11 +18,11 @@
|
|
|
|
|
# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
# files due to the --remove-files option.
|
|
|
|
|
#
|
|
|
|
|
-# This case checks the use of a relative -C option followed by an absolute -C,
|
|
|
|
|
+# This case checks the use of an absolute -C option followed by a relative -C,
|
|
|
|
|
# in --create/non-incremental mode.
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
-AT_SETUP([remove-files with -C:rel,abs in -c/non-incr. mode])
|
|
|
|
|
+AT_SETUP([remove-files with -C:abs,rel in -c/non-incr. mode])
|
|
|
|
|
AT_KEYWORDS([create remove-files remfiles07 remfiles07a])
|
|
|
|
|
|
|
|
|
|
AT_TAR_CHECK([
|
|
|
|
|
@@ -34,7 +34,7 @@ echo foo/file > foo/file
|
|
|
|
|
echo bar/file > bar/file
|
|
|
|
|
DIR=`pwd`
|
|
|
|
|
decho A
|
|
|
|
|
-tar -cvf foo.tar --remove-files -C foo file -C $DIR/bar file
|
|
|
|
|
+tar -cvf foo.tar --remove-files -C $DIR/foo file -C ../bar file
|
|
|
|
|
decho B
|
|
|
|
|
find . | sort
|
|
|
|
|
],
|
|
|
|
|
diff --git a/tests/remfiles07b.at b/tests/remfiles07b.at
|
|
|
|
|
index ca67e5d..0147c5d 100644
|
|
|
|
|
--- a/tests/remfiles07b.at
|
|
|
|
|
+++ b/tests/remfiles07b.at
|
|
|
|
|
@@ -18,11 +18,11 @@
|
|
|
|
|
# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
# files due to the --remove-files option.
|
|
|
|
|
#
|
|
|
|
|
-# This case checks the use of a relative -C option followed by an absolute -C,
|
|
|
|
|
+# This case checks the use of an absolute -C option followed by a relative -C,
|
|
|
|
|
# in --create/incremental mode.
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
-AT_SETUP([remove-files with -C:rel,abs in -c/incr. mode])
|
|
|
|
|
+AT_SETUP([remove-files with -C:abs,rel in -c/incr. mode])
|
|
|
|
|
AT_KEYWORDS([create incremental remove-files remfiles07 remfiles07b])
|
|
|
|
|
|
|
|
|
|
AT_TAR_CHECK([
|
|
|
|
|
@@ -34,7 +34,7 @@ echo foo/file > foo/file
|
|
|
|
|
echo bar/file > bar/file
|
|
|
|
|
DIR=`pwd`
|
|
|
|
|
decho A
|
|
|
|
|
-tar -cvf foo.tar --incremental --remove-files -C foo file -C $DIR/bar file
|
|
|
|
|
+tar -cvf foo.tar --incremental --remove-files -C $DIR/foo file -C ../bar file
|
|
|
|
|
decho B
|
|
|
|
|
find . | sort
|
|
|
|
|
],
|
|
|
|
|
diff --git a/tests/remfiles07c.at b/tests/remfiles07c.at
|
|
|
|
|
index 6a5c870..f190539 100644
|
|
|
|
|
--- a/tests/remfiles07c.at
|
|
|
|
|
+++ b/tests/remfiles07c.at
|
|
|
|
|
@@ -18,11 +18,11 @@
|
|
|
|
|
# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
# files due to the --remove-files option.
|
|
|
|
|
#
|
|
|
|
|
-# This case checks the use of a relative -C option followed by an absolute -C,
|
|
|
|
|
+# This case checks the use of an absolute -C option followed by a relative -C,
|
|
|
|
|
# in --append mode.
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
-AT_SETUP([remove-files with -C:rel,abs in -r mode])
|
|
|
|
|
+AT_SETUP([remove-files with -C:abs,rel in -r mode])
|
|
|
|
|
AT_KEYWORDS([create append remove-files remfiles07 remfiles07c])
|
|
|
|
|
|
|
|
|
|
AT_TAR_CHECK([
|
|
|
|
|
@@ -33,11 +33,11 @@ echo file > file
|
|
|
|
|
echo foo/file > foo/file
|
|
|
|
|
echo bar/file > bar/file
|
|
|
|
|
DIR=`pwd`
|
|
|
|
|
-tar -cf foo.tar -C foo file -C $DIR/bar file
|
|
|
|
|
+tar -cf foo.tar -C $DIR/foo file -C ../bar file
|
|
|
|
|
decho A
|
|
|
|
|
find . | sort
|
|
|
|
|
decho B
|
|
|
|
|
-tar -rvf foo.tar --remove-files -C foo file -C $DIR/bar file
|
|
|
|
|
+tar -rvf foo.tar --remove-files -C $DIR/foo file -C ../bar file
|
|
|
|
|
decho C
|
|
|
|
|
find . | sort
|
|
|
|
|
],
|
|
|
|
|
diff --git a/tests/remfiles08a.at b/tests/remfiles08a.at
|
|
|
|
|
index eadf149..1ffffb2 100644
|
|
|
|
|
--- a/tests/remfiles08a.at
|
|
|
|
|
+++ b/tests/remfiles08a.at
|
|
|
|
|
@@ -15,38 +15,37 @@
|
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
-# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
-# files due to the --remove-files option.
|
|
|
|
|
+# Description: If tar 1.26 was called with the --remove-files option and told
|
|
|
|
|
+# to archive (and thus delete) two subdirectories where the second was
|
|
|
|
|
+# specified relative to the first, it would be unable to delete the
|
|
|
|
|
+# second directory (and its contents), since the relative path would no
|
|
|
|
|
+# longer be valid once the first directory was deleted.
|
|
|
|
|
#
|
|
|
|
|
-# This case checks the use of an absolute -C option followed by a relative -C,
|
|
|
|
|
+# This case checks for successful deletion of all archived items
|
|
|
|
|
# in --create/non-incremental mode.
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
-AT_SETUP([remove-files with -C:abs,rel in -c/non-incr. mode])
|
|
|
|
|
+AT_SETUP([remove-files deleting two subdirs in -c/non-incr. mode])
|
|
|
|
|
AT_KEYWORDS([create remove-files remfiles08 remfiles08a])
|
|
|
|
|
|
|
|
|
|
AT_TAR_CHECK([
|
|
|
|
|
-AT_SORT_PREREQ
|
|
|
|
|
mkdir foo
|
|
|
|
|
mkdir bar
|
|
|
|
|
-echo file > file
|
|
|
|
|
-echo foo/file > foo/file
|
|
|
|
|
-echo bar/file > bar/file
|
|
|
|
|
-DIR=`pwd`
|
|
|
|
|
+echo foo/foo_file > foo/foo_file
|
|
|
|
|
+echo bar/bar_file > bar/bar_file
|
|
|
|
|
decho A
|
|
|
|
|
-tar -cvf foo.tar --remove-files -C $DIR/foo file -C ../bar file
|
|
|
|
|
+tar -cvf foo.tar --remove-files -C foo . -C ../bar .
|
|
|
|
|
decho B
|
|
|
|
|
-find . | sort
|
|
|
|
|
+find .
|
|
|
|
|
],
|
|
|
|
|
[0],
|
|
|
|
|
[A
|
|
|
|
|
-file
|
|
|
|
|
-file
|
|
|
|
|
+./
|
|
|
|
|
+./foo_file
|
|
|
|
|
+./
|
|
|
|
|
+./bar_file
|
|
|
|
|
B
|
|
|
|
|
.
|
|
|
|
|
-./bar
|
|
|
|
|
-./file
|
|
|
|
|
-./foo
|
|
|
|
|
./foo.tar
|
|
|
|
|
],
|
|
|
|
|
[A
|
|
|
|
|
diff --git a/tests/remfiles08b.at b/tests/remfiles08b.at
|
|
|
|
|
index 9faf2bb..d61c9ab 100644
|
|
|
|
|
--- a/tests/remfiles08b.at
|
|
|
|
|
+++ b/tests/remfiles08b.at
|
|
|
|
|
@@ -15,41 +15,47 @@
|
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
-# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
-# files due to the --remove-files option.
|
|
|
|
|
+# Description: If tar 1.26 was called with the --remove-files option and told
|
|
|
|
|
+# to archive (and thus delete) two subdirectories where the second was
|
|
|
|
|
+# specified relative to the first, it would be unable to delete the
|
|
|
|
|
+# second directory (and its contents), since the relative path would no
|
|
|
|
|
+# longer be valid once the first directory was deleted.
|
|
|
|
|
#
|
|
|
|
|
-# This case checks the use of an absolute -C option followed by a relative -C,
|
|
|
|
|
+# This case checks for successful deletion of all archived items
|
|
|
|
|
# in --create/incremental mode.
|
|
|
|
|
#
|
|
|
|
|
+# Note: tar 1.27 fails this test case due to a more general issue
|
|
|
|
|
+# archving-and-removing a full directory tree when run in incremental
|
|
|
|
|
+# mode; see remfiles09b.at for that specific test case.
|
|
|
|
|
|
|
|
|
|
-AT_SETUP([remove-files with -C:abs,rel in -c/incr. mode])
|
|
|
|
|
+AT_SETUP([remove-files deleting two subdirs in -c/incr. mode])
|
|
|
|
|
AT_KEYWORDS([create incremental remove-files remfiles08 remfiles08b])
|
|
|
|
|
|
|
|
|
|
+AT_XFAIL_IF(true) # we expect to fail in tar 1.27
|
|
|
|
|
+
|
|
|
|
|
AT_TAR_CHECK([
|
|
|
|
|
-AT_SORT_PREREQ
|
|
|
|
|
mkdir foo
|
|
|
|
|
mkdir bar
|
|
|
|
|
-echo file > file
|
|
|
|
|
-echo foo/file > foo/file
|
|
|
|
|
-echo bar/file > bar/file
|
|
|
|
|
-DIR=`pwd`
|
|
|
|
|
+echo foo/foo_file > foo/foo_file
|
|
|
|
|
+echo bar/bar_file > bar/bar_file
|
|
|
|
|
decho A
|
|
|
|
|
-tar -cvf foo.tar --incremental --remove-files -C $DIR/foo file -C ../bar file
|
|
|
|
|
+tar -cvf foo.tar --incremental --remove-files -C foo . -C ../bar .
|
|
|
|
|
decho B
|
|
|
|
|
-find . | sort
|
|
|
|
|
+find .
|
|
|
|
|
],
|
|
|
|
|
[0],
|
|
|
|
|
[A
|
|
|
|
|
-file
|
|
|
|
|
-file
|
|
|
|
|
+./
|
|
|
|
|
+./
|
|
|
|
|
+./foo_file
|
|
|
|
|
+./bar_file
|
|
|
|
|
B
|
|
|
|
|
.
|
|
|
|
|
-./bar
|
|
|
|
|
-./file
|
|
|
|
|
-./foo
|
|
|
|
|
./foo.tar
|
|
|
|
|
],
|
|
|
|
|
[A
|
|
|
|
|
+tar: .: Directory is new
|
|
|
|
|
+tar: .: Directory is new
|
|
|
|
|
B
|
|
|
|
|
],[],[],[gnu])
|
|
|
|
|
|
|
|
|
|
diff --git a/tests/remfiles08c.at b/tests/remfiles08c.at
|
|
|
|
|
index a220f4c..19b18e2 100644
|
|
|
|
|
--- a/tests/remfiles08c.at
|
|
|
|
|
+++ b/tests/remfiles08c.at
|
|
|
|
|
@@ -15,49 +15,48 @@
|
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
-# Description: ensure tar correctly respects -C option when deleting
|
|
|
|
|
-# files due to the --remove-files option.
|
|
|
|
|
+# Description: If tar 1.26 was called with the --remove-files option and told
|
|
|
|
|
+# to archive (and thus delete) two subdirectories where the second was
|
|
|
|
|
+# specified relative to the first, it would be unable to delete the
|
|
|
|
|
+# second directory (and its contents), since the relative path would no
|
|
|
|
|
+# longer be valid once the first directory was deleted.
|
|
|
|
|
#
|
|
|
|
|
-# This case checks the use of an absolute -C option followed by a relative -C,
|
|
|
|
|
+# This case checks for successful deletion of all archived items
|
|
|
|
|
# in --append mode.
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
-AT_SETUP([remove-files with -C:abs,rel in -r mode])
|
|
|
|
|
+AT_SETUP([remove-files deleting two subdirs in -r mode])
|
|
|
|
|
AT_KEYWORDS([create append remove-files remfiles08 remfiles08c])
|
|
|
|
|
|
|
|
|
|
AT_TAR_CHECK([
|
|
|
|
|
AT_SORT_PREREQ
|
|
|
|
|
mkdir foo
|
|
|
|
|
mkdir bar
|
|
|
|
|
-echo file > file
|
|
|
|
|
-echo foo/file > foo/file
|
|
|
|
|
-echo bar/file > bar/file
|
|
|
|
|
-DIR=`pwd`
|
|
|
|
|
-tar -cf foo.tar -C $DIR/foo file -C ../bar file
|
|
|
|
|
+echo foo/foo_file > foo/foo_file
|
|
|
|
|
+echo bar/bar_file > bar/bar_file
|
|
|
|
|
+tar -cf foo.tar -C foo . -C ../bar .
|
|
|
|
|
decho A
|
|
|
|
|
find . | sort
|
|
|
|
|
decho B
|
|
|
|
|
-tar -rvf foo.tar --remove-files -C $DIR/foo file -C ../bar file
|
|
|
|
|
+tar -rvf foo.tar --remove-files -C foo . -C ../bar .
|
|
|
|
|
decho C
|
|
|
|
|
-find . | sort
|
|
|
|
|
+find .
|
|
|
|
|
],
|
|
|
|
|
[0],
|
|
|
|
|
[A
|
|
|
|
|
.
|
|
|
|
|
./bar
|
|
|
|
|
-./bar/file
|
|
|
|
|
-./file
|
|
|
|
|
+./bar/bar_file
|
|
|
|
|
./foo
|
|
|
|
|
./foo.tar
|
|
|
|
|
-./foo/file
|
|
|
|
|
+./foo/foo_file
|
|
|
|
|
B
|
|
|
|
|
-file
|
|
|
|
|
-file
|
|
|
|
|
+./
|
|
|
|
|
+./foo_file
|
|
|
|
|
+./
|
|
|
|
|
+./bar_file
|
|
|
|
|
C
|
|
|
|
|
.
|
|
|
|
|
-./bar
|
|
|
|
|
-./file
|
|
|
|
|
-./foo
|
|
|
|
|
./foo.tar
|
|
|
|
|
],
|
|
|
|
|
[A
|
|
|
|
|
diff --git a/tests/remfiles09a.at b/tests/remfiles09a.at
|
|
|
|
|
index fd28b4f..f4a3bf5 100644
|
|
|
|
|
--- a/tests/remfiles09a.at
|
|
|
|
|
+++ b/tests/remfiles09a.at
|
|
|
|
|
@@ -31,7 +31,7 @@ echo foo/file > foo/file
|
|
|
|
|
decho A
|
|
|
|
|
tar -cvf foo.tar --remove-files foo
|
|
|
|
|
decho B
|
|
|
|
|
-find .
|
|
|
|
|
+find .
|
|
|
|
|
],
|
|
|
|
|
[0],
|
|
|
|
|
[A
|
|
|
|
|
diff --git a/tests/remfiles09b.at b/tests/remfiles09b.at
|
|
|
|
|
index de9b172..e12fe32 100644
|
|
|
|
|
--- a/tests/remfiles09b.at
|
|
|
|
|
+++ b/tests/remfiles09b.at
|
|
|
|
|
@@ -32,12 +32,10 @@ AT_KEYWORDS([create incremental remove-files remfiles09 remfiles09b])
|
|
|
|
|
AT_XFAIL_IF(true) # we expect to fail in tar 1.27
|
|
|
|
|
|
|
|
|
|
AT_TAR_CHECK([
|
|
|
|
|
-AT_SORT_PREREQ
|
|
|
|
|
mkdir foo
|
|
|
|
|
echo foo/file > foo/file
|
|
|
|
|
decho A
|
|
|
|
|
tar -cvf foo.tar --incremental --remove-files foo
|
|
|
|
|
-TARSTAT=$?
|
|
|
|
|
decho B
|
|
|
|
|
find .
|
|
|
|
|
],
|
|
|
|
|
@@ -47,7 +45,6 @@ foo/
|
|
|
|
|
foo/file
|
|
|
|
|
B
|
|
|
|
|
.
|
|
|
|
|
-./foo
|
|
|
|
|
./foo.tar
|
|
|
|
|
],
|
|
|
|
|
[A
|
|
|
|
|
--
|
|
|
|
|
2.9.3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
From 6030b8a2589ff69d9200578e0aecc1f10aedb073 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Sergey Poznyakoff <gray@gnu.org>
|
|
|
|
|
Date: Wed, 11 Nov 2015 13:01:45 +0200
|
|
|
|
|
Subject: [PATCH 11/11] Work around unlinkat bug on FreeBSD and GNU/Hurd
|
|
|
|
|
|
|
|
|
|
* src/unlink.c (dunlink_insert): New function.
|
|
|
|
|
(flush_deferred_unlinks): Skip cwds and nonempty directories
|
|
|
|
|
at the first pass. If force is requested, run a second pass
|
|
|
|
|
removing them.
|
|
|
|
|
(queue_deferred_unlink): Make sure current working directory
|
|
|
|
|
entries are sorted in descending order by the value of dir_idx.
|
|
|
|
|
This makes sure they will be removed in right order, which works
|
|
|
|
|
around unlinkat bug on FreeBSD and GNU/Hurd.
|
|
|
|
|
* tests/remfiles08b.at: Remove expected failure.
|
|
|
|
|
* tests/remfiles09b.at: Likewise.
|
|
|
|
|
---
|
|
|
|
|
src/unlink.c | 91 +++++++++++++++++++++++++++++++++++++++++-----------
|
|
|
|
|
tests/remfiles08b.at | 2 --
|
|
|
|
|
tests/remfiles09b.at | 2 --
|
|
|
|
|
3 files changed, 72 insertions(+), 23 deletions(-)
|
|
|
|
|
|
|
|
|
|
diff --git a/src/unlink.c b/src/unlink.c
|
|
|
|
|
index 6e41acc..f5fb81d 100644
|
|
|
|
|
--- a/src/unlink.c
|
|
|
|
|
+++ b/src/unlink.c
|
|
|
|
|
@@ -30,6 +30,10 @@ struct deferred_unlink
|
|
|
|
|
entry got added to the queue */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
+#define IS_CWD(p) \
|
|
|
|
|
+ ((p)->is_dir \
|
|
|
|
|
+ && ((p)->file_name[0] == 0 || strcmp ((p)->file_name, ".") == 0))
|
|
|
|
|
+
|
|
|
|
|
/* The unlink queue */
|
|
|
|
|
static struct deferred_unlink *dunlink_head, *dunlink_tail;
|
|
|
|
|
|
|
|
|
|
@@ -59,6 +63,24 @@ dunlink_alloc (void)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
+dunlink_insert (struct deferred_unlink *anchor, struct deferred_unlink *p)
|
|
|
|
|
+{
|
|
|
|
|
+ if (anchor)
|
|
|
|
|
+ {
|
|
|
|
|
+ p->next = anchor->next;
|
|
|
|
|
+ anchor->next = p;
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ p->next = dunlink_head;
|
|
|
|
|
+ dunlink_head = p;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!p->next)
|
|
|
|
|
+ dunlink_tail = p;
|
|
|
|
|
+ dunlink_count++;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+static void
|
|
|
|
|
dunlink_reclaim (struct deferred_unlink *p)
|
|
|
|
|
{
|
|
|
|
|
free (p->file_name);
|
|
|
|
|
@@ -84,12 +106,11 @@ flush_deferred_unlinks (bool force)
|
|
|
|
|
{
|
|
|
|
|
const char *fname;
|
|
|
|
|
|
|
|
|
|
- if (p->dir_idx
|
|
|
|
|
- && (p->file_name[0] == 0
|
|
|
|
|
- || strcmp (p->file_name, ".") == 0))
|
|
|
|
|
+ if (p->dir_idx && IS_CWD (p))
|
|
|
|
|
{
|
|
|
|
|
- fname = tar_dirname ();
|
|
|
|
|
- chdir_do (p->dir_idx - 1);
|
|
|
|
|
+ prev = p;
|
|
|
|
|
+ p = next;
|
|
|
|
|
+ continue;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
fname = p->file_name;
|
|
|
|
|
@@ -102,15 +123,12 @@ flush_deferred_unlinks (bool force)
|
|
|
|
|
/* nothing to worry about */
|
|
|
|
|
break;
|
|
|
|
|
case ENOTEMPTY:
|
|
|
|
|
- if (!force)
|
|
|
|
|
- {
|
|
|
|
|
- /* Keep the record in list, in the hope we'll
|
|
|
|
|
- be able to remove it later */
|
|
|
|
|
- prev = p;
|
|
|
|
|
- p = next;
|
|
|
|
|
- continue;
|
|
|
|
|
- }
|
|
|
|
|
- /* fall through */
|
|
|
|
|
+ /* Keep the record in list, in the hope we'll
|
|
|
|
|
+ be able to remove it later */
|
|
|
|
|
+ prev = p;
|
|
|
|
|
+ p = next;
|
|
|
|
|
+ continue;
|
|
|
|
|
+
|
|
|
|
|
default:
|
|
|
|
|
rmdir_error (fname);
|
|
|
|
|
}
|
|
|
|
|
@@ -137,6 +155,34 @@ flush_deferred_unlinks (bool force)
|
|
|
|
|
}
|
|
|
|
|
if (!dunlink_head)
|
|
|
|
|
dunlink_tail = NULL;
|
|
|
|
|
+ else if (force)
|
|
|
|
|
+ {
|
|
|
|
|
+ for (p = dunlink_head; p; )
|
|
|
|
|
+ {
|
|
|
|
|
+ struct deferred_unlink *next = p->next;
|
|
|
|
|
+ const char *fname;
|
|
|
|
|
+
|
|
|
|
|
+ chdir_do (p->dir_idx);
|
|
|
|
|
+ if (p->dir_idx && IS_CWD (p))
|
|
|
|
|
+ {
|
|
|
|
|
+ fname = tar_dirname ();
|
|
|
|
|
+ chdir_do (p->dir_idx - 1);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ fname = p->file_name;
|
|
|
|
|
+
|
|
|
|
|
+ if (unlinkat (chdir_fd, fname, AT_REMOVEDIR) != 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (errno != ENOENT)
|
|
|
|
|
+ rmdir_error (fname);
|
|
|
|
|
+ }
|
|
|
|
|
+ dunlink_reclaim (p);
|
|
|
|
|
+ dunlink_count--;
|
|
|
|
|
+ p = next;
|
|
|
|
|
+ }
|
|
|
|
|
+ dunlink_head = dunlink_tail = NULL;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
chdir_do (saved_chdir);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -169,10 +215,17 @@ queue_deferred_unlink (const char *name, bool is_dir)
|
|
|
|
|
p->is_dir = is_dir;
|
|
|
|
|
p->records_written = records_written;
|
|
|
|
|
|
|
|
|
|
- if (dunlink_tail)
|
|
|
|
|
- dunlink_tail->next = p;
|
|
|
|
|
+ if (IS_CWD (p))
|
|
|
|
|
+ {
|
|
|
|
|
+ struct deferred_unlink *q, *prev;
|
|
|
|
|
+ for (q = dunlink_head, prev = NULL; q; prev = q, q = q->next)
|
|
|
|
|
+ if (IS_CWD (q) && q->dir_idx < p->dir_idx)
|
|
|
|
|
+ break;
|
|
|
|
|
+ if (q)
|
|
|
|
|
+ dunlink_insert (prev, p);
|
|
|
|
|
+ else
|
|
|
|
|
+ dunlink_insert (dunlink_tail, p);
|
|
|
|
|
+ }
|
|
|
|
|
else
|
|
|
|
|
- dunlink_head = p;
|
|
|
|
|
- dunlink_tail = p;
|
|
|
|
|
- dunlink_count++;
|
|
|
|
|
+ dunlink_insert (dunlink_tail, p);
|
|
|
|
|
}
|
|
|
|
|
diff --git a/tests/remfiles08b.at b/tests/remfiles08b.at
|
|
|
|
|
index d61c9ab..4487f83 100644
|
|
|
|
|
--- a/tests/remfiles08b.at
|
|
|
|
|
+++ b/tests/remfiles08b.at
|
|
|
|
|
@@ -31,8 +31,6 @@
|
|
|
|
|
AT_SETUP([remove-files deleting two subdirs in -c/incr. mode])
|
|
|
|
|
AT_KEYWORDS([create incremental remove-files remfiles08 remfiles08b])
|
|
|
|
|
|
|
|
|
|
-AT_XFAIL_IF(true) # we expect to fail in tar 1.27
|
|
|
|
|
-
|
|
|
|
|
AT_TAR_CHECK([
|
|
|
|
|
mkdir foo
|
|
|
|
|
mkdir bar
|
|
|
|
|
diff --git a/tests/remfiles09b.at b/tests/remfiles09b.at
|
|
|
|
|
index e12fe32..4d05aa5 100644
|
|
|
|
|
--- a/tests/remfiles09b.at
|
|
|
|
|
+++ b/tests/remfiles09b.at
|
|
|
|
|
@@ -29,8 +29,6 @@
|
|
|
|
|
AT_SETUP([remove-files on full directory in -c/incr. mode])
|
|
|
|
|
AT_KEYWORDS([create incremental remove-files remfiles09 remfiles09b])
|
|
|
|
|
|
|
|
|
|
-AT_XFAIL_IF(true) # we expect to fail in tar 1.27
|
|
|
|
|
-
|
|
|
|
|
AT_TAR_CHECK([
|
|
|
|
|
mkdir foo
|
|
|
|
|
echo foo/file > foo/file
|
|
|
|
|
--
|
|
|
|
|
2.9.3
|