On 17/11/16 02:59, Bernhard Voelker wrote:
> On 11/17/2016 03:40 AM, Pádraig Brady wrote:
>> Right that's better for cp, though inaccurate for install(1).
> 
> Good point!
> 
>> I'll do this I think:
>>
>>   if (install)
>>     "omitting directory '/foo/bar'"
>>   else /* cp */
>>     "-r not specified; omitting directory '/foo/bar'"
> 
> I like it.  Please don't forget 'tests/cp/link-deref.sh'.

I'll push the attached later.

Marking this bug as done.

thanks,
Pádraig

>From 2b5338ef9025cd4809f5348e1930d1d876dc2975 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <[email protected]>
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

Reply via email to