Skip to content

Commit

Permalink
cp: fix preserved hardlinks are not reported in --verbose
Browse files Browse the repository at this point in the history
  • Loading branch information
djedi23 committed Jun 26, 2024
1 parent 9266514 commit 2e223df
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 4 deletions.
8 changes: 4 additions & 4 deletions src/uu/cp/src/cp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2108,6 +2108,10 @@ fn copy_file(
.into());
}

if options.verbose {
print_verbose_output(options.parents, progress_bar, source, dest);
}

if options.preserve_hard_links() {
// if we encounter a matching device/inode pair in the source tree
// we can arrange to create a hard link between the corresponding names
Expand All @@ -2121,10 +2125,6 @@ fn copy_file(
};
}

if options.verbose {
print_verbose_output(options.parents, progress_bar, source, dest);
}

// Calculate the context upfront before canonicalizing the path
let context = context_for(source, dest);
let context = context.as_str();
Expand Down
30 changes: 30 additions & 0 deletions tests/by-util/test_cp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -608,6 +608,36 @@ fn test_cp_arg_link_with_same_file() {
assert!(at.file_exists(file));
}

#[test]
#[cfg(target_os = "linux")]
fn test_cp_verbose_preserved_link_to_dir() {
use std::os::linux::fs::MetadataExt;

let (at, mut ucmd) = at_and_ucmd!();
let file = "file";
let hardlink = "hardlink";
let dir = "dir";
let dst_file = "dir/file";
let dst_hardlink = "dir/hardlink";

at.touch(file);
at.hard_link(file, hardlink);
at.mkdir(dir);

ucmd.args(&["-d", "--verbose", file, hardlink, dir])
.succeeds()
.stdout_is("'file' -> 'dir/file'\n'hardlink' -> 'dir/hardlink'\n");

assert!(at.file_exists(dst_file));
assert!(at.file_exists(dst_hardlink));
assert_eq!(at.metadata(dst_file).st_nlink(), 2);
assert_eq!(at.metadata(dst_hardlink).st_nlink(), 2);
assert_eq!(
at.metadata(dst_file).st_ino(),
at.metadata(dst_hardlink).st_ino()
);
}

#[test]
fn test_cp_arg_symlink() {
let (at, mut ucmd) = at_and_ucmd!();
Expand Down

0 comments on commit 2e223df

Please sign in to comment.