>From 2b5338ef9025cd4809f5348e1930d1d876dc2975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= Date: Sat, 19 Nov 2016 11:26:43 +0000 Subject: [PATCH] cp: improve status message when omitting directories * src/copy.h (cp_options): Add a new flag for install(1). * src/copy.c (copy_internal): For cp, also output remediation advice which also indicates why directories aren't copied by default. The message is unchanged for install(1). * src/cp.c (cp_option_init): Init install_mode to false. * src/mv.c (cp_option_init): Likewise. * src/install.c (cp_option_init): Init install_mode to true. * tests/install/basic-1.sh: Add a test case. * tests/cp/link-deref.sh: Adjust test case. Fixes http://bugs.gnu.org/24958 --- src/copy.c | 5 ++++- src/copy.h | 3 +++ src/cp.c | 1 + src/install.c | 1 + src/mv.c | 1 + tests/cp/link-deref.sh | 2 +- tests/install/basic-1.sh | 5 +++++ 7 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/copy.c b/src/copy.c index 422d50e..b3acff3 100644 --- a/src/copy.c +++ b/src/copy.c @@ -1873,7 +1873,10 @@ copy_internal (char const *src_name, char const *dst_name, if (S_ISDIR (src_mode) && !x->recursive) { - error (0, 0, _("omitting directory %s"), quoteaf (src_name)); + error (0, 0, ! x->install_mode /* cp */ + ? _("-r not specified; omitting directory %s") + : _("omitting directory %s"), + quoteaf (src_name)); return false; } diff --git a/src/copy.h b/src/copy.h index fa0c2ae..a516002 100644 --- a/src/copy.h +++ b/src/copy.h @@ -137,6 +137,9 @@ struct cp_options If that fails, then resort to copying. */ bool move_mode; + /* If true, install(1) is the caller. */ + bool install_mode; + /* Whether this process has appropriate privileges to chown a file whose owner is not the effective user ID. */ bool chown_privileges; diff --git a/src/cp.c b/src/cp.c index 926e05b..1b528c6 100644 --- a/src/cp.c +++ b/src/cp.c @@ -771,6 +771,7 @@ cp_option_init (struct cp_options *x) x->hard_link = false; x->interactive = I_UNSPECIFIED; x->move_mode = false; + x->install_mode = false; x->one_file_system = false; x->reflink_mode = REFLINK_NEVER; diff --git a/src/install.c b/src/install.c index 4fa4bb3..414d645 100644 --- a/src/install.c +++ b/src/install.c @@ -271,6 +271,7 @@ cp_option_init (struct cp_options *x) x->hard_link = false; x->interactive = I_UNSPECIFIED; x->move_mode = false; + x->install_mode = true; x->one_file_system = false; x->preserve_ownership = false; x->preserve_links = false; diff --git a/src/mv.c b/src/mv.c index 6a3d0d2..04d2be3 100644 --- a/src/mv.c +++ b/src/mv.c @@ -114,6 +114,7 @@ cp_option_init (struct cp_options *x) x->hard_link = false; x->interactive = I_UNSPECIFIED; x->move_mode = true; + x->install_mode = false; x->one_file_system = false; x->preserve_ownership = true; x->preserve_links = true; diff --git a/tests/cp/link-deref.sh b/tests/cp/link-deref.sh index 51b228c..f5b7160 100755 --- a/tests/cp/link-deref.sh +++ b/tests/cp/link-deref.sh @@ -92,7 +92,7 @@ for src in dirlink filelink danglink; do exp_result=1 exp_inode= exp_ftype= - exp_error="cp: omitting directory 'dirlink'" + exp_error="cp: -r not specified; omitting directory 'dirlink'" elif [ "$src" = 'dirlink' ]; then # cp --link -R 'dirlink' should create a new directory. exp_result=0 diff --git a/tests/install/basic-1.sh b/tests/install/basic-1.sh index 23a2d58..1a7147c 100755 --- a/tests/install/basic-1.sh +++ b/tests/install/basic-1.sh @@ -143,4 +143,9 @@ compare - out <<\EOF || fail=1 'file' -> 'sub4/dir_exists/file' EOF +# Ensure omitted directories are diagnosed +returns_ 1 ginstall . . 2>err || fail=1 +printf '%s\n' "ginstall: omitting directory '.'" >exp || framework_failure_ +compare exp err || fail=1 + Exit $fail -- 2.5.5