uutils / coreutils

Cross-platform Rust rewrite of the GNU coreutils
https://uutils.github.io/
MIT License
17.61k stars 1.27k forks source link

cp: should report file removal when replacing symlink by hardlink to same source #6530

Open BenWiederhake opened 3 months ago

BenWiederhake commented 3 months ago

When doing cp -vl --remove-destination regularfile existing_symlink_to_regularfile, cp should report that it removes the destination file (because it needs to make space in order to create the new hardlink).

$ rm -f symlink; ln -s README.md symlink; ls -1i README.md symlink; cp -vl --remove-destination README.md symlink; ls -1i README.md symlink
20092600 README.md
20074037 symlink
removed 'symlink'
'README.md' -> 'symlink'
20092600 README.md
20092600 symlink
$ rm -f symlink; ln -s README.md symlink; ls -1i README.md symlink; cargo run -q cp -vl --remove-destination README.md symlink; ls -1i README.md symlink
20092600 README.md
20074037 symlink
'README.md' -> 'symlink'
20092600 README.md
20092600 symlink

Found while reading #6496, but only remotely related.

BenWiederhake commented 2 months ago

Very similar scenario, probably the same bug, but perhaps not:

$ mkdir a; ln -s README.md a/symlink; ln -s README.md symlink # setup
$ cp -vP a/symlink . # Overwrites ./symlink
removed './symlink'
'a/symlink' -> './symlink'
$ cargo run -q cp -vP a/symlink . # Also overwrites ./symlink, but doesn't report removal
'a/symlink' -> './symlink'

Found while reading #6586.