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.
This commit is contained in:
committed by
Sergey Poznyakoff
parent
795877532e
commit
8b9026f3ae
2
paxutils
2
paxutils
Submodule paxutils updated: ec72abd9dd...d03eab65d3
@@ -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);
|
||||
|
||||
@@ -110,6 +110,8 @@ TESTSUITE_AT = \
|
||||
extrac20.at\
|
||||
filerem01.at\
|
||||
filerem02.at\
|
||||
dirrem01.at\
|
||||
dirrem02.at\
|
||||
gzip.at\
|
||||
grow.at\
|
||||
incremental.at\
|
||||
|
||||
62
tests/dirrem01.at
Normal file
62
tests/dirrem01.at
Normal file
@@ -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
|
||||
|
||||
60
tests/dirrem02.at
Normal file
60
tests/dirrem02.at
Normal file
@@ -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
|
||||
|
||||
@@ -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])
|
||||
|
||||
Reference in New Issue
Block a user