From 065cf0958c39600f2062cbeeb5b76929d03c207b Mon Sep 17 00:00:00 2001 From: Paul Eggert 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 . * 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 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 . + +# This checks for the bug reported by Martin Weigel +# . +# The test is derived from the ideas in Jean-Louis Martineau's followup email +# . + +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])