summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2017-11-09 09:55:43 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2017-11-09 09:55:43 +0200
commit1bf590ab2da3c40d68d2b4167e494c786ffda6e7 (patch)
treed8565033b1d16c595bb9fd221a328d01994489a6
parentdee7e3f16e74e07504bb8f4d80426005fe4364ae (diff)
downloadtar-1bf590ab2da3c40d68d2b4167e494c786ffda6e7.tar.gz
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.
-rw-r--r--src/common.h2
-rw-r--r--src/compare.c7
-rw-r--r--src/misc.c5
-rw-r--r--tests/Makefile.am1
-rw-r--r--tests/difflink.at35
-rw-r--r--tests/testsuite.at3
6 files changed, 51 insertions, 2 deletions
diff --git a/src/common.h b/src/common.h
index 99a1dd8e..e49bd9f1 100644
--- a/src/common.h
+++ b/src/common.h
@@ -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);
diff --git a/src/compare.c b/src/compare.c
index 32ec8710..8d609e89 100644
--- a/src/compare.c
+++ b/src/compare.c
@@ -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
diff --git a/src/misc.c b/src/misc.c
index 632de291..1e5ca2aa 100644
--- a/src/misc.c
+++ b/src/misc.c
@@ -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. */
diff --git a/tests/Makefile.am b/tests/Makefile.am
index be21efaf..88d183b0 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -71,6 +71,7 @@ TESTSUITE_AT = \
delete03.at\
delete04.at\
delete05.at\
+ difflink.at\
exclude.at\
exclude01.at\
exclude02.at\
diff --git a/tests/difflink.at b/tests/difflink.at
new file mode 100644
index 00000000..eadfb088
--- /dev/null
+++ b/tests/difflink.at
@@ -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
+
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 7682a03e..1f2c4ce9 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -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])