Fix --update --wildcards

* src/common.h (name): New field: is_wildcard.
(name_scan): Change protoype.
* src/delete.c: Update calls to name_scan.
* src/names.c (addname, add_starting_file): Initialize is_wildcard.
(namelist_match): Take two arguments.  If second one is true, return
only exact matches.
(name_scan): Likewise.  All callers updated.
(name_from_list): Skip patterns.
* src/update.c (remove_exact_name): New function.
(update_archive): Do not remove matching name, if it is a pattern.
Instead, add a new entry with the matching file name.

* tests/update04.at: New test.
* tests/Makefile.am: Add new test.
* tests/testsuite.at: Include new test.

* NEWS: Update.
This commit is contained in:
Sergey Poznyakoff
2023-07-10 21:09:57 +03:00
parent b3a71dbdb9
commit 10954cf163
8 changed files with 121 additions and 20 deletions

View File

@@ -254,6 +254,7 @@ TESTSUITE_AT = \
update01.at\
update02.at\
update03.at\
update04.at\
volsize.at\
volume.at\
verbose.at\

View File

@@ -455,6 +455,7 @@ m4_include([update.at])
m4_include([update01.at])
m4_include([update02.at])
m4_include([update03.at])
m4_include([update04.at])
AT_BANNER([Verifying the archive])
m4_include([verify.at])

56
tests/update04.at Normal file
View File

@@ -0,0 +1,56 @@
# Process this file with autom4te to create testsuite. -*- Autotest -*-
# Test suite for GNU tar.
# Copyright 2016-2023 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/>.
AT_SETUP([update with wildcards])
AT_KEYWORDS([update update04 wildcards])
AT_TAR_CHECK([
genfile --file file.a
genfile --file file.b
genfile --file file.c
echo Create
tar cf archive ./file.*
sleep 1
echo "update" > file.b
echo First update
tar ufv archive --wildcards './file.*'
echo "Second update"
tar ufv archive --wildcards './file.*'
echo "Non-matching pattern"
tar ufv archive --wildcards './file.*' './foo.*'
echo $?
],
[0],
[Create
First update
./file.b
Second update
Non-matching pattern
2
],
[tar: ./foo.*: Not found in archive
tar: Exiting with failure status due to previous errors
])
AT_CLEANUP