diff options
author | Jonas Julino <ml-julino@1und1.de> | 2017-04-10 16:37:39 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-05-29 15:59:53 +0300 |
commit | 8b9026f3ae8c03942cb9f8a3593895d5eec82b32 (patch) | |
tree | 9a609f515bedb7fd149d2ab8db0c374d702f8658 | |
parent | 795877532ec98536a9a3fe2395585561c4757a67 (diff) | |
download | tar-8b9026f3ae8c03942cb9f8a3593895d5eec82b32.tar.gz |
Fix handling of directories removed during incremental tar run
Co-authored-by: Sergey Poznyakoff <gray@gnu.org.ua>
* paxutils: Upgrade
* src/create.c (create_archive): Use file_removed_diag
instead of calling the corresponding *_diag function
directly.
* tests/dirrem01.at: New testcase.
* tests/dirrem02.at: New testcase.
* tests/Makefile.am: Add new tests.
* tests/testsuite.at: Likewise.
m--------- | paxutils | 0 | ||||
-rw-r--r-- | src/create.c | 6 | ||||
-rw-r--r-- | tests/Makefile.am | 2 | ||||
-rw-r--r-- | tests/dirrem01.at | 62 | ||||
-rw-r--r-- | tests/dirrem02.at | 60 | ||||
-rw-r--r-- | tests/testsuite.at | 4 |
6 files changed, 132 insertions, 2 deletions
diff --git a/paxutils b/paxutils -Subproject ec72abd9dd63bbff4534ec77e97b1a6cadfc3cf +Subproject d03eab65d31aa4be7682e9c0271b5793d822769 diff --git a/src/create.c b/src/create.c index 4fbdf66d..bb720f7c 100644 --- a/src/create.c +++ b/src/create.c @@ -1395,13 +1395,15 @@ create_archive (void) open_searchdir_flags); if (fd < 0) { - open_diag (p->name); + file_removed_diag (p->name, !p->parent, + open_diag); break; } st.fd = fd; if (fstat (fd, &st.stat) != 0) { - stat_diag (p->name); + file_removed_diag (p->name, !p->parent, + stat_diag); break; } st.orig_file_name = xstrdup (p->name); diff --git a/tests/Makefile.am b/tests/Makefile.am index 70711676..43cc88f4 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -110,6 +110,8 @@ TESTSUITE_AT = \ extrac20.at\ filerem01.at\ filerem02.at\ + dirrem01.at\ + dirrem02.at\ gzip.at\ grow.at\ incremental.at\ diff --git a/tests/dirrem01.at b/tests/dirrem01.at new file mode 100644 index 00000000..40344dc0 --- /dev/null +++ b/tests/dirrem01.at @@ -0,0 +1,62 @@ +# Process this file with autom4te to create testsuite. -*- Autotest -*- + +# Test suite for GNU tar. +# Copyright 2017 Free Software Foundation, Inc. + +# This file is part of GNU tar. + +# 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: +# +# When a directory in a deep directory disappeared during creation +# of incremental dump, tar <= 1.29 exits with TAREXIT_FAILURE (2). +# +# In case of files tar does not return TAREXIT_FAILURE, but instead +# it prints a warning and exits with TAREXIT_DIFFERS. +# +# This test checks whether this behaviour is mimicked for directories, too. + +# Remark: This file is based on 'filerem01.at', which is the test-case for +# a vanishing file. + +AT_SETUP([directory removed before reading]) +AT_KEYWORDS([create incremental listed dirchange dirrem dirrem01]) + +AT_TAR_CHECK([ +mkdir dir +mkdir dir/sub +genfile --file dir/file1 +genfile --file dir/sub/file2 + +case "$TEST_TAR_FORMAT" in +posix) CPT=5;; +gnu) CPT=3;; +*) AT_SKIP_TEST +esac + +genfile --run --checkpoint=$CPT --unlink dir/sub/file2 --unlink dir/sub -- \ + tar --blocking-factor=1 --checkpoint=1 --checkpoint-action='sleep=1' \ + --checkpoint-action='echo' -c -f archive.tar \ + --listed-incremental db -v dir >/dev/null +], +[1], +[ignore], +[tar: dir: Directory is new +tar: dir/sub: Directory is new +tar: dir/sub: File removed before we read it +],[],[],[gnu,posix]) + +AT_CLEANUP + diff --git a/tests/dirrem02.at b/tests/dirrem02.at new file mode 100644 index 00000000..e1cf9ef8 --- /dev/null +++ b/tests/dirrem02.at @@ -0,0 +1,60 @@ +# Process this file with autom4te to create testsuite. -*- Autotest -*- + +# Test suite for GNU tar. +# Copyright 2017 Free Software Foundation, Inc. + +# This file is part of GNU tar. + +# 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: +# +# When an explicitley named directory disappears during creation +# of incremental dump, tar should still exit with TAREXIT_FAILURE (2). +# +# For further details see dirrem01.at + +# Remark: This file is based on 'filerem01/02.at', which are test-cases for +# vanishing files. + +AT_SETUP([explicitly named directory removed before reading]) +AT_KEYWORDS([create incremental listed dirchange dirrem dirrem02]) + +AT_TAR_CHECK([ +mkdir dir +mkdir dir/sub +genfile --file dir/file1 +genfile --file dir/sub/file2 + +case "$TEST_TAR_FORMAT" in +posix) CPT=5;; +gnu) CPT=3;; +*) AT_SKIP_TEST +esac + +genfile --run --checkpoint=$CPT --unlink dir/sub/file2 --unlink dir/sub -- \ + tar --blocking-factor=1 --checkpoint=1 --checkpoint-action='sleep=1' \ + --checkpoint-action='echo' -c -f archive.tar \ + --listed-incremental db -v dir dir/sub >/dev/null +], +[2], +[ignore], +[tar: dir: Directory is new +tar: dir/sub: Directory is new +tar: dir/sub: Cannot open: No such file or directory +tar: Exiting with failure status due to previous errors +],[],[],[gnu,posix]) + +AT_CLEANUP + diff --git a/tests/testsuite.at b/tests/testsuite.at index 8c97e34c..a2ee717d 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -339,6 +339,10 @@ AT_BANNER([Files removed while archiving]) m4_include([filerem01.at]) m4_include([filerem02.at]) +AT_BANNER([Directories removed while archiving]) +m4_include([dirrem01.at]) +m4_include([dirrem02.at]) + AT_BANNER([Renames]) m4_include([rename01.at]) m4_include([rename02.at]) |