]> git.ipfire.org Git - thirdparty/tar.git/commitdiff
Fix reporting of hardlink mismatch during compare
authorSergey Poznyakoff <gray@gnu.org.ua>
Thu, 9 Nov 2017 07:55:43 +0000 (09:55 +0200)
committerSergey Poznyakoff <gray@gnu.org.ua>
Thu, 9 Nov 2017 07:55:43 +0000 (09:55 +0200)
* 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.

src/common.h
src/compare.c
src/misc.c
tests/Makefile.am
tests/difflink.at [new file with mode: 0644]
tests/testsuite.at

index 99a1dd8e15978232e2a56d21f8787845b35db441..e49bd9f11c6ba9766bdb8b044295563315178cb6 100644 (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);
index 32ec871053d0926879a55d84dcde3bdcfdeed68c..8d609e89a79a7aec51a68ea7b9b3d54c87c8937e 100644 (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
index 632de291950bc2dc6836be935c3f2825935ff16a..1e5ca2aa2b85a9a0f58102be034f2917dd68b8a5 100644 (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);
+}
 \f
 /* Handling strings.  */
 
index be21efafdbf81eb5542e2e63e27abbf84e3afb28..88d183b064282704ec01fce5b36683396ebde9e3 100644 (file)
@@ -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 (file)
index 0000000..eadfb08
--- /dev/null
@@ -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
+
index 7682a03e7435ad12d0f51f84d32b0f0279f6c8fb..1f2c4ce9a7833ad4f65ff2fd7a796bf97d0df230 100644 (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])