tar/tar-1.25-listedincremental.patch

220 lines
6.8 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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])