Ondrej Vasik ae4020
When "cp -i --update old new" would do nothing because "new" is
Ondrej Vasik ae4020
newer than "old", cp would nonetheless prompt for whether it is
Ondrej Vasik ae4020
ok to overwrite "new".  Then, regardless of the response (because
Ondrej Vasik ae4020
of the --update option), cp would do nothing.
Ondrej Vasik ae4020
Ondrej Vasik ae4020
The following patch eliminates the unnecessary prompt in that case.
Ondrej Vasik ae4020
Ondrej Vasik ae4020
diff --git a/src/copy.c b/src/copy.c
Ondrej Vasik ae4020
index b7bf73b..0e549d2 100644
Ondrej Vasik ae4020
--- a/src/copy.c
Ondrej Vasik ae4020
+++ b/src/copy.c
Ondrej Vasik ae4020
@@ -1210,6 +1210,30 @@ copy_internal (char const *src_name, char const *dst_name,
Ondrej Vasik ae4020
 	      return false;
Ondrej Vasik ae4020
 	    }
Ondrej Vasik ae4020
Ondrej Vasik ae4020
+	  if (!S_ISDIR (src_mode) && x->update)
Ondrej Vasik ae4020
+	    {
Ondrej Vasik ae4020
+	      /* When preserving time stamps (but not moving within a file
Ondrej Vasik ae4020
+		 system), don't worry if the destination time stamp is
Ondrej Vasik ae4020
+		 less than the source merely because of time stamp
Ondrej Vasik ae4020
+		 truncation.  */
Ondrej Vasik ae4020
+	      int options = ((x->preserve_timestamps
Ondrej Vasik ae4020
+			      && ! (x->move_mode
Ondrej Vasik ae4020
+				    && dst_sb.st_dev == src_sb.st_dev))
Ondrej Vasik ae4020
+			     ? UTIMECMP_TRUNCATE_SOURCE
Ondrej Vasik ae4020
+			     : 0);
Ondrej Vasik ae4020
+
Ondrej Vasik ae4020
+	      if (0 <= utimecmp (dst_name, &dst_sb, &src_sb, options))
Ondrej Vasik ae4020
+		{
Ondrej Vasik ae4020
+		  /* We're using --update and the destination is not older
Ondrej Vasik ae4020
+		     than the source, so do not copy or move.  Pretend the
Ondrej Vasik ae4020
+		     rename succeeded, so the caller (if it's mv) doesn't
Ondrej Vasik ae4020
+		     end up removing the source file.  */
Ondrej Vasik ae4020
+		  if (rename_succeeded)
Ondrej Vasik ae4020
+		    *rename_succeeded = true;
Ondrej Vasik ae4020
+		  return true;
Ondrej Vasik ae4020
+		}
Ondrej Vasik ae4020
+	    }
Ondrej Vasik ae4020
+
Ondrej Vasik ae4020
 	  /* When there is an existing destination file, we may end up
Ondrej Vasik ae4020
 	     returning early, and hence not copying/moving the file.
Ondrej Vasik ae4020
 	     This may be due to an interactive `negative' reply to the
Ondrej Vasik ae4020
@@ -1302,30 +1326,6 @@ copy_internal (char const *src_name, char const *dst_name,
Ondrej Vasik ae4020
 		      return false;
Ondrej Vasik ae4020
 		    }
Ondrej Vasik ae4020
 		}
Ondrej Vasik ae4020
-
Ondrej Vasik ae4020
-	      if (x->update)
Ondrej Vasik ae4020
-		{
Ondrej Vasik ae4020
-		  /* When preserving time stamps (but not moving within a file
Ondrej Vasik ae4020
-		     system), don't worry if the destination time stamp is
Ondrej Vasik ae4020
-		     less than the source merely because of time stamp
Ondrej Vasik ae4020
-		     truncation.  */
Ondrej Vasik ae4020
-		  int options = ((x->preserve_timestamps
Ondrej Vasik ae4020
-				  && ! (x->move_mode
Ondrej Vasik ae4020
-					&& dst_sb.st_dev == src_sb.st_dev))
Ondrej Vasik ae4020
-				 ? UTIMECMP_TRUNCATE_SOURCE
Ondrej Vasik ae4020
-				 : 0);
Ondrej Vasik ae4020
-
Ondrej Vasik ae4020
-		  if (0 <= utimecmp (dst_name, &dst_sb, &src_sb, options))
Ondrej Vasik ae4020
-		    {
Ondrej Vasik ae4020
-		      /* We're using --update and the destination is not older
Ondrej Vasik ae4020
-			 than the source, so do not copy or move.  Pretend the
Ondrej Vasik ae4020
-			 rename succeeded, so the caller (if it's mv) doesn't
Ondrej Vasik ae4020
-			 end up removing the source file.  */
Ondrej Vasik ae4020
-		      if (rename_succeeded)
Ondrej Vasik ae4020
-			*rename_succeeded = true;
Ondrej Vasik ae4020
-		      return true;
Ondrej Vasik ae4020
-		    }
Ondrej Vasik ae4020
-		}
Ondrej Vasik ae4020
 	    }
Ondrej Vasik ae4020
Ondrej Vasik ae4020
 	  if (x->move_mode)
Ondrej Vasik ae4020
diff --git a/tests/mv/update b/tests/mv/update
Ondrej Vasik ae4020
index 0c06024..6c3d149 100755
Ondrej Vasik ae4020
--- a/tests/mv/update
Ondrej Vasik ae4020
+++ b/tests/mv/update
Ondrej Vasik ae4020
@@ -1,7 +1,7 @@
Ondrej Vasik ae4020
 #!/bin/sh
Ondrej Vasik ae4020
 # make sure --update works as advertised
Ondrej Vasik ae4020
Ondrej Vasik ae4020
-# Copyright (C) 2001, 2004, 2006 Free Software Foundation, Inc.
Ondrej Vasik ae4020
+# Copyright (C) 2001, 2004, 2006-2007 Free Software Foundation, Inc.
Ondrej Vasik ae4020
Ondrej Vasik ae4020
 # This program is free software; you can redistribute it and/or modify
Ondrej Vasik ae4020
 # it under the terms of the GNU General Public License as published by
Ondrej Vasik ae4020
@@ -46,11 +46,16 @@ fi
Ondrej Vasik ae4020
Ondrej Vasik ae4020
 fail=0
Ondrej Vasik ae4020
Ondrej Vasik ae4020
-for cp_or_mv in cp mv; do
Ondrej Vasik ae4020
-  # This is a no-op.
Ondrej Vasik ae4020
-  $cp_or_mv --update old new || fail=1
Ondrej Vasik ae4020
-  case "`cat new`" in new) ;; *) fail=1 ;; esac
Ondrej Vasik ae4020
-  case "`cat old`" in old) ;; *) fail=1 ;; esac
Ondrej Vasik ae4020
+for interactive in '' -i; do
Ondrej Vasik ae4020
+  for cp_or_mv in cp mv; do
Ondrej Vasik ae4020
+    # This is a no-op, with no prompt.
Ondrej Vasik ae4020
+    # With coreutils-6.9 and earlier, using --update with -i would
Ondrej Vasik ae4020
+    # mistakenly elicit a prompt.
Ondrej Vasik ae4020
+    $cp_or_mv $interactive --update old new < /dev/null > out 2>&1 || fail=1
Ondrej Vasik ae4020
+    test -s out && fail=1
Ondrej Vasik ae4020
+    case "`cat new`" in new) ;; *) fail=1 ;; esac
Ondrej Vasik ae4020
+    case "`cat old`" in old) ;; *) fail=1 ;; esac
Ondrej Vasik ae4020
+  done
Ondrej Vasik ae4020
 done
Ondrej Vasik ae4020
Ondrej Vasik ae4020
 # This will actually perform the rename.
Ondrej Vasik ae4020
--
Ondrej Vasik ae4020
1.5.3.rc1.16.g9d6f