summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2014-09-18 11:31:22 +0100
committerPádraig Brady <P@draigBrady.com>2014-09-19 11:25:23 +0100
commit756a928c8c4823bd0ed541ecbbc5b4ea7a2ccaa9 (patch)
tree822857b880e991b55b831791db5180d166b7a1c3
parent90aa291c39ca8970fbce310cc317c5cc7b392691 (diff)
downloadcoreutils-756a928c8c4823bd0ed541ecbbc5b4ea7a2ccaa9.tar.xz
cp: fix handling of -H with multiply specified source dirs
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.
-rw-r--r--NEWS5
-rw-r--r--src/copy.c4
-rwxr-xr-xtests/cp/duplicate-sources.sh13
3 files changed, 17 insertions, 5 deletions
diff --git a/NEWS b/NEWS
index 7e623dca9..f25aaaf0b 100644
--- 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
diff --git a/src/copy.c b/src/copy.c
index 4e0d266b6..b7baee4b6 100644
--- a/src/copy.c
+++ b/src/copy.c
@@ -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
diff --git a/tests/cp/duplicate-sources.sh b/tests/cp/duplicate-sources.sh
index e15c6d213..35b2e460c 100755
--- a/tests/cp/duplicate-sources.sh
+++ b/tests/cp/duplicate-sources.sh
@@ -20,10 +20,19 @@
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
print_ver_ cp
-mkdir a b || 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