upstream patch - fixing cp -iu options(#248591)
This commit is contained in:
parent
12698104bc
commit
ae40204605
110
coreutils-6.9-cp-i-u.patch
Normal file
110
coreutils-6.9-cp-i-u.patch
Normal file
@ -0,0 +1,110 @@
|
||||
When "cp -i --update old new" would do nothing because "new" is
|
||||
newer than "old", cp would nonetheless prompt for whether it is
|
||||
ok to overwrite "new". Then, regardless of the response (because
|
||||
of the --update option), cp would do nothing.
|
||||
|
||||
The following patch eliminates the unnecessary prompt in that case.
|
||||
|
||||
diff --git a/src/copy.c b/src/copy.c
|
||||
index b7bf73b..0e549d2 100644
|
||||
--- a/src/copy.c
|
||||
+++ b/src/copy.c
|
||||
@@ -1210,6 +1210,30 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
return false;
|
||||
}
|
||||
|
||||
+ if (!S_ISDIR (src_mode) && x->update)
|
||||
+ {
|
||||
+ /* When preserving time stamps (but not moving within a file
|
||||
+ system), don't worry if the destination time stamp is
|
||||
+ less than the source merely because of time stamp
|
||||
+ truncation. */
|
||||
+ int options = ((x->preserve_timestamps
|
||||
+ && ! (x->move_mode
|
||||
+ && dst_sb.st_dev == src_sb.st_dev))
|
||||
+ ? UTIMECMP_TRUNCATE_SOURCE
|
||||
+ : 0);
|
||||
+
|
||||
+ if (0 <= utimecmp (dst_name, &dst_sb, &src_sb, options))
|
||||
+ {
|
||||
+ /* We're using --update and the destination is not older
|
||||
+ than the source, so do not copy or move. Pretend the
|
||||
+ rename succeeded, so the caller (if it's mv) doesn't
|
||||
+ end up removing the source file. */
|
||||
+ if (rename_succeeded)
|
||||
+ *rename_succeeded = true;
|
||||
+ return true;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* When there is an existing destination file, we may end up
|
||||
returning early, and hence not copying/moving the file.
|
||||
This may be due to an interactive `negative' reply to the
|
||||
@@ -1302,30 +1326,6 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
return false;
|
||||
}
|
||||
}
|
||||
-
|
||||
- if (x->update)
|
||||
- {
|
||||
- /* When preserving time stamps (but not moving within a file
|
||||
- system), don't worry if the destination time stamp is
|
||||
- less than the source merely because of time stamp
|
||||
- truncation. */
|
||||
- int options = ((x->preserve_timestamps
|
||||
- && ! (x->move_mode
|
||||
- && dst_sb.st_dev == src_sb.st_dev))
|
||||
- ? UTIMECMP_TRUNCATE_SOURCE
|
||||
- : 0);
|
||||
-
|
||||
- if (0 <= utimecmp (dst_name, &dst_sb, &src_sb, options))
|
||||
- {
|
||||
- /* We're using --update and the destination is not older
|
||||
- than the source, so do not copy or move. Pretend the
|
||||
- rename succeeded, so the caller (if it's mv) doesn't
|
||||
- end up removing the source file. */
|
||||
- if (rename_succeeded)
|
||||
- *rename_succeeded = true;
|
||||
- return true;
|
||||
- }
|
||||
- }
|
||||
}
|
||||
|
||||
if (x->move_mode)
|
||||
diff --git a/tests/mv/update b/tests/mv/update
|
||||
index 0c06024..6c3d149 100755
|
||||
--- a/tests/mv/update
|
||||
+++ b/tests/mv/update
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
# make sure --update works as advertised
|
||||
|
||||
-# Copyright (C) 2001, 2004, 2006 Free Software Foundation, Inc.
|
||||
+# Copyright (C) 2001, 2004, 2006-2007 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@@ -46,11 +46,16 @@ fi
|
||||
|
||||
fail=0
|
||||
|
||||
-for cp_or_mv in cp mv; do
|
||||
- # This is a no-op.
|
||||
- $cp_or_mv --update old new || fail=1
|
||||
- case "`cat new`" in new) ;; *) fail=1 ;; esac
|
||||
- case "`cat old`" in old) ;; *) fail=1 ;; esac
|
||||
+for interactive in '' -i; do
|
||||
+ for cp_or_mv in cp mv; do
|
||||
+ # This is a no-op, with no prompt.
|
||||
+ # With coreutils-6.9 and earlier, using --update with -i would
|
||||
+ # mistakenly elicit a prompt.
|
||||
+ $cp_or_mv $interactive --update old new < /dev/null > out 2>&1 || fail=1
|
||||
+ test -s out && fail=1
|
||||
+ case "`cat new`" in new) ;; *) fail=1 ;; esac
|
||||
+ case "`cat old`" in old) ;; *) fail=1 ;; esac
|
||||
+ done
|
||||
done
|
||||
|
||||
# This will actually perform the rename.
|
||||
--
|
||||
1.5.3.rc1.16.g9d6f
|
@ -1,7 +1,7 @@
|
||||
Summary: The GNU core utilities: a set of tools commonly used in shell scripts
|
||||
Name: coreutils
|
||||
Version: 6.9
|
||||
Release: 7%{?dist}
|
||||
Release: 8%{?dist}
|
||||
License: GPL
|
||||
Group: System Environment/Base
|
||||
Url: http://www.gnu.org/software/coreutils/
|
||||
@ -19,6 +19,7 @@ Source203: coreutils-runuser-l.pamd
|
||||
# From upstream
|
||||
Patch1: coreutils-futimens.patch
|
||||
Patch2: coreutils-ls-x.patch
|
||||
Patch3: coreutils-6.9-cp-i-u.patch
|
||||
|
||||
# Our patches
|
||||
Patch100: coreutils-chgrp.patch
|
||||
@ -85,6 +86,7 @@ the old GNU fileutils, sh-utils, and textutils packages.
|
||||
# From upstream
|
||||
%patch1 -p1 -b .futimens
|
||||
%patch2 -p1 -b .ls-x
|
||||
%patch3 -p1 -b .cp-i-u
|
||||
|
||||
# Our patches
|
||||
%patch100 -p1 -b .chgrp
|
||||
@ -280,6 +282,9 @@ fi
|
||||
/sbin/runuser
|
||||
|
||||
%changelog
|
||||
* Thu Oct 25 2007 Ondrej Vasik <ovasik@redhat.com> - 6.9-8
|
||||
- applied upstream patch for cp and mv(#248591)
|
||||
|
||||
* Thu Aug 23 2007 Pete Graner <pgraner@redhat.com> - 6.9-7
|
||||
- Fix typo in spec file. (CVS merge conflict leftovers)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user