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:
Sergey Poznyakoff
2017-11-09 09:55:43 +02:00
parent dee7e3f16e
commit 1bf590ab2d
6 changed files with 51 additions and 2 deletions

View File

@@ -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);

View File

@@ -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 (&current_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

View File

@@ -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. */

View File

@@ -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
View 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

View File

@@ -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])