From 756a928c8c4823bd0ed541ecbbc5b4ea7a2ccaa9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?P=C3=A1draig=20Brady?= Date: Thu, 18 Sep 2014 11:31:22 +0100 Subject: [PATCH] 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. --- NEWS | 5 +++-- src/copy.c | 4 +++- tests/cp/duplicate-sources.sh | 13 +++++++++++-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 7e623dca91..f25aaaf0b9 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 4e0d266b6d..b7baee4b61 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 e15c6d213f..35b2e460cc 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 <exp cp: warning: source directory 'a' specified more than once -- 2.47.2