Fix reporting of hardlink mismatch during compare
* src/common.h (quote_n_colon): New prototype. * src/misc.c (quote_n_colon): New function. * src/compare.c (report_difference, diff_link): Use quote_n_colon. * tests/difflink.at: New file. * tests/Makefile.am: Add difflink.at * tests/testsuite.at: Likewise.
This commit is contained in:
@@ -619,6 +619,8 @@ void skip_member (void);
|
||||
|
||||
#define min(a, b) ((a) < (b) ? (a) : (b))
|
||||
#define max(a, b) ((a) < (b) ? (b) : (a))
|
||||
|
||||
char const *quote_n_colon (int n, char const *arg);
|
||||
void assign_string (char **dest, const char *src);
|
||||
int unquote_string (char *str);
|
||||
char *zap_slashes (char *name);
|
||||
|
||||
@@ -51,6 +51,8 @@ diff_init (void)
|
||||
read_directory_file ();
|
||||
}
|
||||
|
||||
enum { QUOTE_ARG, QUOTE_NAME };
|
||||
|
||||
/* Sigh about something that differs by writing a MESSAGE to stdlis,
|
||||
given MESSAGE is nonzero. Also set the exit status if not already. */
|
||||
void
|
||||
@@ -60,7 +62,7 @@ report_difference (struct tar_stat_info *st, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
fprintf (stdlis, "%s: ", quotearg_colon (st->file_name));
|
||||
fprintf (stdlis, "%s: ", quote_n_colon (QUOTE_NAME, st->file_name));
|
||||
va_start (ap, fmt);
|
||||
vfprintf (stdlis, fmt, ap);
|
||||
va_end (ap);
|
||||
@@ -263,7 +265,8 @@ diff_link (void)
|
||||
&& !sys_compare_links (&file_data, &link_data))
|
||||
report_difference (¤t_stat_info,
|
||||
_("Not linked to %s"),
|
||||
quote (current_stat_info.link_name));
|
||||
quote_n_colon (QUOTE_ARG,
|
||||
current_stat_info.link_name));
|
||||
}
|
||||
|
||||
#ifdef HAVE_READLINK
|
||||
|
||||
@@ -33,6 +33,11 @@ static void namebuf_add_dir (namebuf_t, char const *);
|
||||
static char *namebuf_finish (namebuf_t);
|
||||
static const char *tar_getcdpath (int);
|
||||
|
||||
char const *
|
||||
quote_n_colon (int n, char const *arg)
|
||||
{
|
||||
return quotearg_n_style_colon (n, get_quoting_style (NULL), arg);
|
||||
}
|
||||
|
||||
/* Handling strings. */
|
||||
|
||||
|
||||
@@ -71,6 +71,7 @@ TESTSUITE_AT = \
|
||||
delete03.at\
|
||||
delete04.at\
|
||||
delete05.at\
|
||||
difflink.at\
|
||||
exclude.at\
|
||||
exclude01.at\
|
||||
exclude02.at\
|
||||
|
||||
35
tests/difflink.at
Normal file
35
tests/difflink.at
Normal file
@@ -0,0 +1,35 @@
|
||||
# This file is part of GNU tar test suite -*- Autotest -*-
|
||||
#
|
||||
# Copyright 2017 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 <http://www.gnu.org/licenses/>.
|
||||
AT_SETUP([link mismatch])
|
||||
AT_KEYWORDS([diff difflink])
|
||||
AT_TAR_CHECK([
|
||||
mkdir a
|
||||
genfile -f a/x
|
||||
ln -s x a/y
|
||||
ln a/y a/z
|
||||
tar cf a.tar a
|
||||
rm a/z
|
||||
ln -s x a/z
|
||||
tar df a.tar
|
||||
],
|
||||
[1],
|
||||
[a/z: Not linked to a/y
|
||||
],
|
||||
[],
|
||||
[],[],[ustar]) # Testing one format is enough
|
||||
AT_CLEANUP
|
||||
|
||||
@@ -310,6 +310,9 @@ m4_include([extrac19.at])
|
||||
m4_include([extrac20.at])
|
||||
m4_include([backup01.at])
|
||||
|
||||
AT_BANNER([Comparing])
|
||||
m4_include([difflink.at])
|
||||
|
||||
AT_BANNER([Volume label operations])
|
||||
m4_include([label01.at])
|
||||
m4_include([label02.at])
|
||||
|
||||
Reference in New Issue
Block a user