Merge pull request #5484 from cakebaker/cp_l_with_dest_hardlink_to_source

cp --link: don't fail if destination is hardlink to source
This commit is contained in:
Sylvestre Ledru 2023-12-26 16:12:15 +01:00 committed by GitHub
commit 167acb5147
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 0 deletions

View file

@ -1706,6 +1706,12 @@ fn copy_file(
}
if file_or_link_exists(dest) {
if are_hardlinks_to_same_file(source, dest)
&& !options.force()
&& options.backup == BackupMode::NoBackup
{
return Ok(());
}
handle_existing_dest(source, dest, options, source_in_command_line)?;
}

View file

@ -531,6 +531,25 @@ fn test_cp_arg_link() {
assert_eq!(at.metadata(TEST_HELLO_WORLD_SOURCE).st_nlink(), 2);
}
#[test]
#[cfg(target_os = "linux")]
fn test_cp_arg_link_with_dest_hardlink_to_source() {
use std::os::linux::fs::MetadataExt;
let (at, mut ucmd) = at_and_ucmd!();
let file = "file";
let hardlink = "hardlink";
at.touch(file);
at.hard_link(file, hardlink);
ucmd.args(&["--link", file, hardlink]).succeeds();
assert_eq!(at.metadata(file).st_nlink(), 2);
assert!(at.file_exists(file));
assert!(at.file_exists(hardlink));
}
#[test]
fn test_cp_arg_symlink() {
let (at, mut ucmd) = at_and_ucmd!();