220 lines
6.8 KiB
Diff
220 lines
6.8 KiB
Diff
|
From 065cf0958c39600f2062cbeeb5b76929d03c207b Mon Sep 17 00:00:00 2001
|
|||
|
From: Paul Eggert <eggert@cs.ucla.edu>
|
|||
|
Date: Mon, 22 Nov 2010 22:50:58 -0800
|
|||
|
Subject: [PATCH] * src/names.c: tar: fix bug with --one-file-system --listed-incremental
|
|||
|
|
|||
|
Problem (and idea for fix) reported by Martin Weigel
|
|||
|
<http://lists.gnu.org/archive/html/bug-tar/2010-11/msg00071.html>.
|
|||
|
* src/common.h (is_individual_file): Remove decl.
|
|||
|
* src/create.c (dump_file0): Replace "is_individual_file (p)"
|
|||
|
with "top_level".
|
|||
|
* src/incremen.c (procdir): Replace "!is_individual_file
|
|||
|
(name_buffer)" with "st->parent". Fix bug with --one-file-system
|
|||
|
and --listed-incremental.
|
|||
|
* src/names.c (individual_file_table, register_individual_file):
|
|||
|
(is_individual_file): Remove. All uses removed.
|
|||
|
---
|
|||
|
src/common.h | 1 -
|
|||
|
src/create.c | 4 ++--
|
|||
|
src/incremen.c | 8 ++------
|
|||
|
src/names.c | 26 --------------------------
|
|||
|
4 files changed, 4 insertions(+), 35 deletions(-)
|
|||
|
|
|||
|
diff --git a/src/common.h b/src/common.h
|
|||
|
index 35e056e..9444fd7 100644
|
|||
|
--- a/src/common.h
|
|||
|
+++ b/src/common.h
|
|||
|
@@ -680,7 +680,6 @@ bool excluded_name (char const *name);
|
|||
|
|
|||
|
void add_avoided_name (char const *name);
|
|||
|
bool is_avoided_name (char const *name);
|
|||
|
-bool is_individual_file (char const *name);
|
|||
|
|
|||
|
bool contains_dot_dot (char const *name);
|
|||
|
|
|||
|
diff --git a/src/create.c b/src/create.c
|
|||
|
index a1e90a3..e8de6b9 100644
|
|||
|
--- a/src/create.c
|
|||
|
+++ b/src/create.c
|
|||
|
@@ -1678,9 +1678,9 @@ dump_file0 (struct tar_stat_info *st, char const *name, char const *p)
|
|||
|
put in the archive.
|
|||
|
|
|||
|
This check is omitted if incremental_option is set *and* the
|
|||
|
- requested file is not explicitely listed in the command line. */
|
|||
|
+ requested file is not explicitly listed in the command line. */
|
|||
|
|
|||
|
- if (!(incremental_option && !is_individual_file (p))
|
|||
|
+ if (! (incremental_option && ! top_level)
|
|||
|
&& !S_ISDIR (st->stat.st_mode)
|
|||
|
&& OLDER_TAR_STAT_TIME (*st, m)
|
|||
|
&& (!after_date_option || OLDER_TAR_STAT_TIME (*st, c)))
|
|||
|
diff --git a/src/incremen.c b/src/incremen.c
|
|||
|
index 628ff29..2b33c5d 100644
|
|||
|
--- a/src/incremen.c
|
|||
|
+++ b/src/incremen.c
|
|||
|
@@ -426,7 +426,6 @@ procdir (const char *name_buffer, struct tar_stat_info *st,
|
|||
|
{
|
|||
|
struct directory *directory;
|
|||
|
struct stat *stat_data = &st->stat;
|
|||
|
- dev_t device = st->parent ? st->parent->stat.st_dev : 0;
|
|||
|
bool nfs = NFS_FILE_STAT (*stat_data);
|
|||
|
|
|||
|
if ((directory = find_directory (name_buffer)) != NULL)
|
|||
|
@@ -540,11 +539,8 @@ procdir (const char *name_buffer, struct tar_stat_info *st,
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
- /* If the directory is on another device and --one-file-system was given,
|
|||
|
- omit it... */
|
|||
|
- if (one_file_system_option && device != stat_data->st_dev
|
|||
|
- /* ... except if it was explicitely given in the command line */
|
|||
|
- && !is_individual_file (name_buffer))
|
|||
|
+ if (one_file_system_option && st->parent
|
|||
|
+ && stat_data->st_dev != st->parent->stat.st_dev)
|
|||
|
/* FIXME:
|
|||
|
WARNOPT (WARN_XDEV,
|
|||
|
(0, 0,
|
|||
|
diff --git a/src/names.c b/src/names.c
|
|||
|
index 6e214bf..ba4d509 100644
|
|||
|
--- a/src/names.c
|
|||
|
+++ b/src/names.c
|
|||
|
@@ -47,8 +47,6 @@ static char *cached_no_such_gname;
|
|||
|
static uid_t cached_no_such_uid;
|
|||
|
static gid_t cached_no_such_gid;
|
|||
|
|
|||
|
-static void register_individual_file (char const *name);
|
|||
|
-
|
|||
|
/* Given UID, find the corresponding UNAME. */
|
|||
|
void
|
|||
|
uid_to_uname (uid_t uid, char **uname)
|
|||
|
@@ -360,8 +358,6 @@ name_next_elt (int change_dirs)
|
|||
|
{
|
|||
|
if (unquote_option)
|
|||
|
unquote_string (name_buffer);
|
|||
|
- if (incremental_option)
|
|||
|
- register_individual_file (name_buffer);
|
|||
|
entry.type = ep->type;
|
|||
|
entry.v.name = name_buffer;
|
|||
|
return &entry;
|
|||
|
@@ -1152,28 +1148,6 @@ excluded_name (char const *name)
|
|||
|
return excluded_file_name (excluded, name + FILE_SYSTEM_PREFIX_LEN (name));
|
|||
|
}
|
|||
|
|
|||
|
-static Hash_table *individual_file_table;
|
|||
|
-
|
|||
|
-static void
|
|||
|
-register_individual_file (char const *name)
|
|||
|
-{
|
|||
|
- struct stat st;
|
|||
|
-
|
|||
|
- if (deref_stat (name, &st) != 0)
|
|||
|
- return; /* Will be complained about later */
|
|||
|
- if (S_ISDIR (st.st_mode))
|
|||
|
- return;
|
|||
|
-
|
|||
|
- hash_string_insert (&individual_file_table, name);
|
|||
|
-}
|
|||
|
-
|
|||
|
-bool
|
|||
|
-is_individual_file (char const *name)
|
|||
|
-{
|
|||
|
- return hash_string_lookup (individual_file_table, name);
|
|||
|
-}
|
|||
|
-
|
|||
|
-
|
|||
|
|
|||
|
/* Return the size of the prefix of FILE_NAME that is removed after
|
|||
|
stripping NUM leading file name components. NUM must be
|
|||
|
--
|
|||
|
1.7.1
|
|||
|
|
|||
|
From: Paul Eggert <eggert@cs.ucla.edu>
|
|||
|
Date: Tue, 23 Nov 2010 01:58:55 +0000 (-0800)
|
|||
|
Subject: tests: new test listed04 for --one-file-system --listed-incremental
|
|||
|
X-Git-Url: http://git.savannah.gnu.org/gitweb/?p=tar.git;a=commitdiff_plain;h=2a55b4b0373eef2e879408f9df6638bb03e16170
|
|||
|
|
|||
|
tests: new test listed04 for --one-file-system --listed-incremental
|
|||
|
|
|||
|
* tests/Makefile.am (TESTSUITE_AT): Add listed04.at.
|
|||
|
* tests/listed04.at: New file.
|
|||
|
* tests/testsuite.at: Include it.
|
|||
|
---
|
|||
|
|
|||
|
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
|||
|
index f289067..7b1e226 100644
|
|||
|
--- a/tests/Makefile.am
|
|||
|
+++ b/tests/Makefile.am
|
|||
|
@@ -110,6 +110,7 @@ TESTSUITE_AT = \
|
|||
|
listed01.at\
|
|||
|
listed02.at\
|
|||
|
listed03.at\
|
|||
|
+ listed04.at\
|
|||
|
long01.at\
|
|||
|
longv7.at\
|
|||
|
lustar01.at\
|
|||
|
diff --git a/tests/listed04.at b/tests/listed04.at
|
|||
|
new file mode 100644
|
|||
|
index 0000000..239998d
|
|||
|
--- /dev/null
|
|||
|
+++ b/tests/listed04.at
|
|||
|
@@ -0,0 +1,47 @@
|
|||
|
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|||
|
+
|
|||
|
+# Test suite for GNU tar.
|
|||
|
+# Copyright (C) 2010 Free Software Foundation, Inc.
|
|||
|
+
|
|||
|
+# This program is free software; you can redistribute it and/or modify
|
|||
|
+# it under the terms of the GNU General Public License as published by
|
|||
|
+# the Free Software Foundation; either version 3, or (at your option)
|
|||
|
+# any later version.
|
|||
|
+
|
|||
|
+# This program is distributed in the hope that it will be useful,
|
|||
|
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||
|
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|||
|
+# GNU General Public License for more details.
|
|||
|
+
|
|||
|
+# You should have received a copy of the GNU General Public License
|
|||
|
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
|
+
|
|||
|
+# This checks for the bug reported by Martin Weigel
|
|||
|
+# <http://lists.gnu.org/archive/html/bug-tar/2010-11/msg00071.html>.
|
|||
|
+# The test is derived from the ideas in Jean-Louis Martineau's followup email
|
|||
|
+# <http://lists.gnu.org/archive/html/bug-tar/2010-11/msg00087.html>.
|
|||
|
+
|
|||
|
+AT_SETUP([--listed-incremental and --one-file-system])
|
|||
|
+AT_KEYWORDS([listed incremental listed04])
|
|||
|
+
|
|||
|
+AT_TAR_CHECK([
|
|||
|
+
|
|||
|
+mkdir dir
|
|||
|
+echo a >dir/a
|
|||
|
+echo b >dir/b
|
|||
|
+
|
|||
|
+tar --one-file-system -cvf archive.tar -g archive.incr dir || exit
|
|||
|
+tar -tf archive.tar || exit
|
|||
|
+],
|
|||
|
+[0],
|
|||
|
+[dir/
|
|||
|
+dir/a
|
|||
|
+dir/b
|
|||
|
+dir/
|
|||
|
+dir/a
|
|||
|
+dir/b
|
|||
|
+],
|
|||
|
+[tar: dir: Directory is new
|
|||
|
+],[],[],[gnu])
|
|||
|
+
|
|||
|
+AT_CLEANUP
|
|||
|
diff --git a/tests/testsuite.at b/tests/testsuite.at
|
|||
|
index db0db3a..e8df868 100644
|
|||
|
--- a/tests/testsuite.at
|
|||
|
+++ b/tests/testsuite.at
|
|||
|
@@ -174,6 +174,7 @@ m4_include([incr02.at])
|
|||
|
m4_include([listed01.at])
|
|||
|
m4_include([listed02.at])
|
|||
|
m4_include([listed03.at])
|
|||
|
+m4_include([listed04.at])
|
|||
|
m4_include([incr03.at])
|
|||
|
m4_include([incr04.at])
|
|||
|
m4_include([incr05.at])
|