]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
cp: fix handling of -H with multiply specified source dirs
authorPádraig Brady <P@draigBrady.com>
Thu, 18 Sep 2014 10:31:22 +0000 (11:31 +0100)
committerPádraig Brady <P@draigBrady.com>
Fri, 19 Sep 2014 10:25:23 +0000 (11:25 +0100)
Following on from commit v5.92-729-g130dd06, also avoid
the erroneous directory hardlink warning with -H.

* src/copy.c (copy_internal): Also handle the -H case
for command line arguments.
* tests/cp/duplicate-sources.sh: Augment the test case.
* NEWS: Augment the news entry.

NEWS
src/copy.c
tests/cp/duplicate-sources.sh

diff --git a/NEWS b/NEWS
index 7e623dca919aaf1821232865e36dff61589a471c..f25aaaf0b9929ac1cfe059c9517501fd43bbb026 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,8 +5,9 @@ GNU coreutils NEWS                                    -*- outline -*-
 ** Bug fixes
 
   cp no longer issues an incorrect warning about directory hardlinks when a
-  source directory is specified multiple times.  Instead a warning is issued
-  and the duplicate source directory is skipped, as already the case for files.
+  source directory is specified multiple times.  Now, consistent with other
+  file types, a warning is issued for source directories with duplicate names,
+  or with -H the directory is copied again using the symlink name.
 
 ** New features
 
index 4e0d266b6dc57ea13a81365bf4b3e0957f62dbbb..b7baee4b613310389c19014fd359955789e97605 100644 (file)
@@ -2198,7 +2198,9 @@ copy_internal (char const *src_name, char const *dst_name,
                  There we just warn and return here.  */
               return true;
             }
-          else if (x->dereference == DEREF_ALWAYS)
+          else if (x->dereference == DEREF_ALWAYS
+                   || (command_line_arg
+                       && x->dereference == DEREF_COMMAND_LINE_ARGUMENTS))
             {
               /* This happens when e.g., encountering a directory for the
                  second or subsequent time via symlinks when cp is invoked
index e15c6d213fed5b343893654f530a8418e7632e24..35b2e460cc90cec9b997588e7c25d6dd4c8bbbae 100755 (executable)
 . "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
 print_ver_ cp
 
-mkdir a || framework_failure_
+mkdir a || framework_failure_
 touch f || framework_failure_
 
-cp -a a a f f b 2>err || fail=1
+# verify multiple files and dir sources only warned about
+mkdir dest || framework_failure_
+cp -a a a f f dest 2>err || fail=1
+rm -Rf dest || framework_failure_
+
+# verify multiple dirs and files with different names copied
+mkdir dest || framework_failure_
+ln -s a al || framework_failure_
+ln -s f fl || framework_failure_
+cp -aH a al f fl dest 2>>err || fail=1
 
 cat <<EOF >exp
 cp: warning: source directory 'a' specified more than once