Bladeren bron

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.
Sergey Poznyakoff 7 jaren geleden
bovenliggende
commit
1bf590ab2d
6 gewijzigde bestanden met toevoegingen van 51 en 2 verwijderingen
  1. 2 0
      src/common.h
  2. 5 2
      src/compare.c
  3. 5 0
      src/misc.c
  4. 1 0
      tests/Makefile.am
  5. 35 0
      tests/difflink.at
  6. 3 0
      tests/testsuite.at

+ 2 - 0
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);

+ 5 - 2
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

+ 5 - 0
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.  */
 

+ 1 - 0
tests/Makefile.am

@@ -71,6 +71,7 @@ TESTSUITE_AT = \
  delete03.at\
  delete04.at\
  delete05.at\
+ difflink.at\
  exclude.at\
  exclude01.at\
  exclude02.at\

+ 35 - 0
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
+

+ 3 - 0
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])