Pádraig Brady wrote: ... >> Hmm it looks now like we're creating symlinks (with wrong timestamps), >> but in fact we should be creating hardlinks to symlinks. >> >> This seems to have been changed with: >> http://git.sv.gnu.org/gitweb/?p=coreutils.git;a=commit;h=3346c0af > > That commit didn't actually change the logic as far as I can see. > It was actually ca9e212c that introduced the logic bug I think. > > So I'm going to apply the attached. ... > Subject: [PATCH] copy: link rather than copy symlinks, when --link used > > This bug was introduced in commit ca9e212c, 2009-09-24, > "cp, mv: use linkat to guarantee semantics", which > inadvertently disabled the creation of hardlinks to symlinks. > However rather than implementing the intention of that commit > and relying on gnulib linkat emulation, we'll revert to the > previous emulation as that maintains ownership and timestamps. > > * src/copy.c (copy_internal): Use our existing hardlink to > symlink emulation when we're not sure that link() will > not dereference the symlink. Also ensure that we copy the
How about "...when link() might dereference..." > timestamps of the original symlink when we use the emulation. > * tests/cp/link-symlink: Add a test to ensure timestamps copied. > * tests/Makefile.am: Reference the new test. > * NEWS: Mention the fix. > Reported by Ruediger Meier > --- > NEWS | 4 ++++ > src/copy.c | 27 ++++++++++++++++++++------- > tests/Makefile.am | 1 + > tests/cp/link-symlink | 41 +++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 66 insertions(+), 7 deletions(-) > create mode 100755 tests/cp/link-symlink > > diff --git a/NEWS b/NEWS > index 6d66355..f25a696 100644 > --- a/NEWS > +++ b/NEWS > @@ -20,6 +20,10 @@ GNU coreutils NEWS -*- > outline -*- > wc would dereference a NULL pointer upon an early out-of-memory error > [bug introduced in coreutils-7.1] > > + cp -a --link would not create a hardlink to a symlink, instead > + copying the symlink and then not preserving its timestamp. > + [bug introduced in coreutils-8.0] Please move that "up" so they're alphabetized. > dd now accepts the 'nocache' flag to the iflag and oflag options, > diff --git a/src/copy.c b/src/copy.c Thanks for fixing that!