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
|
Summary: The GNU core utilities: a set of tools commonly used in shell scripts
|
||||||
Name: coreutils
|
Name: coreutils
|
||||||
Version: 6.9
|
Version: 6.9
|
||||||
Release: 7%{?dist}
|
Release: 8%{?dist}
|
||||||
License: GPL
|
License: GPL
|
||||||
Group: System Environment/Base
|
Group: System Environment/Base
|
||||||
Url: http://www.gnu.org/software/coreutils/
|
Url: http://www.gnu.org/software/coreutils/
|
||||||
@ -19,6 +19,7 @@ Source203: coreutils-runuser-l.pamd
|
|||||||
# From upstream
|
# From upstream
|
||||||
Patch1: coreutils-futimens.patch
|
Patch1: coreutils-futimens.patch
|
||||||
Patch2: coreutils-ls-x.patch
|
Patch2: coreutils-ls-x.patch
|
||||||
|
Patch3: coreutils-6.9-cp-i-u.patch
|
||||||
|
|
||||||
# Our patches
|
# Our patches
|
||||||
Patch100: coreutils-chgrp.patch
|
Patch100: coreutils-chgrp.patch
|
||||||
@ -85,6 +86,7 @@ the old GNU fileutils, sh-utils, and textutils packages.
|
|||||||
# From upstream
|
# From upstream
|
||||||
%patch1 -p1 -b .futimens
|
%patch1 -p1 -b .futimens
|
||||||
%patch2 -p1 -b .ls-x
|
%patch2 -p1 -b .ls-x
|
||||||
|
%patch3 -p1 -b .cp-i-u
|
||||||
|
|
||||||
# Our patches
|
# Our patches
|
||||||
%patch100 -p1 -b .chgrp
|
%patch100 -p1 -b .chgrp
|
||||||
@ -280,6 +282,9 @@ fi
|
|||||||
/sbin/runuser
|
/sbin/runuser
|
||||||
|
|
||||||
%changelog
|
%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
|
* Thu Aug 23 2007 Pete Graner <pgraner@redhat.com> - 6.9-7
|
||||||
- Fix typo in spec file. (CVS merge conflict leftovers)
|
- Fix typo in spec file. (CVS merge conflict leftovers)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user