From b17665b2c0548c77b6cd8d2d5b61e4c4fcc4f770 Mon Sep 17 00:00:00 2001 From: Pavel Cahyna Date: Mon, 25 May 2026 19:42:59 +0200 Subject: [PATCH] Add tests for cyclic renames Using options to extract to a subdirectory: one test with -C, another with --one-top-level. --- tests/Makefile.am | 2 + tests/rename08.at | 131 +++++++++++++++++++++++++++++++++++++++++++++ tests/rename09.at | 129 ++++++++++++++++++++++++++++++++++++++++++++ tests/testsuite.at | 2 + 4 files changed, 264 insertions(+) create mode 100644 tests/rename08.at create mode 100644 tests/rename09.at diff --git a/tests/Makefile.am b/tests/Makefile.am index 4f666b09..6583ba1b 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -244,6 +244,8 @@ TESTSUITE_AT = \ rename04.at\ rename05.at\ rename06.at\ + rename08.at\ + rename09.at\ same-order01.at\ same-order02.at\ selacl01.at\ diff --git a/tests/rename08.at b/tests/rename08.at new file mode 100644 index 00000000..5452fb4f --- /dev/null +++ b/tests/rename08.at @@ -0,0 +1,131 @@ +# Process this file with autom4te to create testsuite. -*- Autotest -*- + +# Test suite for GNU tar. +# Copyright 2006-2026 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 . + +# Description: Handling of cyclic renames in incremental archives. + +AT_SETUP([cyclic renames]) +AT_KEYWORDS([incremental rename rename08 cyclic-rename]) + +AT_TAR_CHECK([ +AT_SORT_PREREQ + +mkdir foo +genfile --file foo/file1 +genfile --file foo/file2 + +mkdir foo/a +genfile --file foo/a/filea + +mkdir foo/b +genfile --file foo/b/fileb + +mkdir foo/c +genfile --file foo/c/filec + +sleep 1 + +echo "First dump" +echo "First dump">&2 +tar -g incr -cf arch.1 -v foo 2>tmperr +sort tmperr >&2 + +# Shuffle directories: +(cd foo +mv a $$ +mv c a +mv b c +mv $$ b) + +echo "Second dump" +echo "Second dump" >&2 +tar -g incr -cf arch.2 -v foo 2>tmperr +sort tmperr >&2 + +mkdir -p restoreparent/restore +cd restoreparent +tar xfg ../arch.1 /dev/null --warning=no-timestamp -C restore + +echo "Begin directory listing 1" +( cd restore; find foo ) | sort +echo "End directory listing 1" + +tar xfgv ../arch.2 /dev/null --warning=no-timestamp -C restore +echo Begin directory listing 2 +( cd restore ; find foo ) | sort +echo End directory listing 2 +], +[0], +[First dump +foo/ +foo/a/ +foo/b/ +foo/c/ +foo/file1 +foo/file2 +foo/a/filea +foo/b/fileb +foo/c/filec +Second dump +foo/ +foo/a/ +foo/b/ +foo/c/ +Begin directory listing 1 +foo +foo/a +foo/a/filea +foo/b +foo/b/fileb +foo/c +foo/c/filec +foo/file1 +foo/file2 +End directory listing 1 +foo/ +foo/a/ +foo/b/ +foo/c/ +Begin directory listing 2 +foo +foo/a +foo/a/filec +foo/b +foo/b/filea +foo/c +foo/c/fileb +foo/file1 +foo/file2 +End directory listing 2 +], +[First dump +tar: foo/a: Directory is new +tar: foo/b: Directory is new +tar: foo/c: Directory is new +tar: foo: Directory is new +Second dump +tar: foo/a: Directory has been renamed from 'foo/c' +tar: foo/b: Directory has been renamed from 'foo/a' +tar: foo/c: Directory has been renamed from 'foo/b' +], +[],[],[gnu, oldgnu, posix]) + +AT_CLEANUP + +# End of rename03.at diff --git a/tests/rename09.at b/tests/rename09.at new file mode 100644 index 00000000..8346ff0a --- /dev/null +++ b/tests/rename09.at @@ -0,0 +1,129 @@ +# Process this file with autom4te to create testsuite. -*- Autotest -*- + +# Test suite for GNU tar. +# Copyright 2006-2026 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 . + +# Description: Handling of cyclic renames in incremental archives. + +AT_SETUP([cyclic renames]) +AT_KEYWORDS([incremental rename rename09 cyclic-rename]) + +AT_TAR_CHECK([ +AT_SORT_PREREQ + +mkdir foo +genfile --file foo/file1 +genfile --file foo/file2 + +mkdir foo/a +genfile --file foo/a/filea + +mkdir foo/b +genfile --file foo/b/fileb + +mkdir foo/c +genfile --file foo/c/filec + +sleep 1 + +echo "First dump" +echo "First dump">&2 +tar -g incr -cf arch.1 -v foo 2>tmperr +sort tmperr >&2 + +# Shuffle directories: +(cd foo +mv a $$ +mv c a +mv b c +mv $$ b) + +echo "Second dump" +echo "Second dump" >&2 +tar -g incr -cf arch.2 -v foo 2>tmperr +sort tmperr >&2 + +tar xfg arch.1 /dev/null --warning=no-timestamp --one-top-level=restore + +echo "Begin directory listing 1" +( cd restore; find foo ) | sort +echo "End directory listing 1" + +tar xfgv arch.2 /dev/null --warning=no-timestamp --one-top-level=restore +echo Begin directory listing 2 +( cd restore ; find foo ) | sort +echo End directory listing 2 +], +[0], +[First dump +foo/ +foo/a/ +foo/b/ +foo/c/ +foo/file1 +foo/file2 +foo/a/filea +foo/b/fileb +foo/c/filec +Second dump +foo/ +foo/a/ +foo/b/ +foo/c/ +Begin directory listing 1 +foo +foo/a +foo/a/filea +foo/b +foo/b/fileb +foo/c +foo/c/filec +foo/file1 +foo/file2 +End directory listing 1 +foo/ +foo/a/ +foo/b/ +foo/c/ +Begin directory listing 2 +foo +foo/a +foo/a/filec +foo/b +foo/b/filea +foo/c +foo/c/fileb +foo/file1 +foo/file2 +End directory listing 2 +], +[First dump +tar: foo/a: Directory is new +tar: foo/b: Directory is new +tar: foo/c: Directory is new +tar: foo: Directory is new +Second dump +tar: foo/a: Directory has been renamed from 'foo/c' +tar: foo/b: Directory has been renamed from 'foo/a' +tar: foo/c: Directory has been renamed from 'foo/b' +], +[],[],[gnu, oldgnu, posix]) + +AT_CLEANUP + +# End of rename03.at diff --git a/tests/testsuite.at b/tests/testsuite.at index ab30c2ab..9eb0d11c 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -409,6 +409,8 @@ m4_include([rename03.at]) m4_include([rename04.at]) m4_include([rename05.at]) m4_include([rename06.at]) +m4_include([rename08.at]) +m4_include([rename09.at]) m4_include([chtype.at]) AT_BANNER([Ignore failing reads])