From 7ddeba4b98615dea328d2d3ab8dd2be8ad02bfe4 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Mon, 1 Jan 2024 14:30:27 +0100 Subject: [PATCH] cp: show no "same file" error for --link a a --- src/uu/cp/src/cp.rs | 2 ++ tests/by-util/test_cp.rs | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index 332bb5785..d58eec13d 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -150,6 +150,7 @@ pub enum TargetType { } /// Copy action to perform +#[derive(PartialEq)] pub enum CopyMode { Link, SymLink, @@ -1714,6 +1715,7 @@ fn copy_file( && !options.force() && options.backup == BackupMode::NoBackup && source != dest + || (source == dest && options.copy_mode == CopyMode::Link) { return Ok(()); } diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index d166243ed..884e71a3c 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -566,6 +566,22 @@ fn test_cp_arg_link_with_dest_hardlink_to_source() { assert!(at.file_exists(hardlink)); } +#[test] +#[cfg(target_os = "linux")] +fn test_cp_arg_link_with_same_file() { + use std::os::linux::fs::MetadataExt; + + let (at, mut ucmd) = at_and_ucmd!(); + let file = "file"; + + at.touch(file); + + ucmd.args(&["--link", file, file]).succeeds(); + + assert_eq!(at.metadata(file).st_nlink(), 1); + assert!(at.file_exists(file)); +} + #[test] fn test_cp_arg_symlink() { let (at, mut ucmd) = at_and_ucmd!();