Skip to content

Commit a72cbf7

Browse files
committed
fix(cp): copy attributes for parents dirs
1 parent 62d7cbe commit a72cbf7

2 files changed

Lines changed: 40 additions & 4 deletions

File tree

src/uu/cp/src/cp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1587,7 +1587,7 @@ fn copy_source(
15871587
&src,
15881588
y,
15891589
&options.attributes,
1590-
false,
1590+
true,
15911591
options.set_selinux_context,
15921592
#[cfg(unix)]
15931593
orig_umask,

tests/by-util/test_cp.rs

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8082,7 +8082,7 @@ fn test_cp_not_existing_no_preserve_dir() {
80828082

80838083
let d2_mode = at.metadata("d2").mode();
80848084

8085-
assert_eq!(0o777 & !0o700, d2_mode & 0o777);
8085+
assert_eq!(!0o700 & 0o777, d2_mode & 0o777);
80868086
}
80878087

80888088
#[test]
@@ -8106,7 +8106,7 @@ fn test_cp_not_existing_default_file() {
81068106

81078107
let f2_mode = at.metadata("f2").mode();
81088108

8109-
assert_eq!(0o770 & !0o700, f2_mode & 0o777);
8109+
assert_eq!(!0o700 & 0o770, f2_mode & 0o777);
81108110
}
81118111

81128112
#[test]
@@ -8131,7 +8131,7 @@ fn test_cp_not_existing_default_dir() {
81318131

81328132
let d2_mode = at.metadata("d2").mode();
81338133

8134-
assert_eq!(0o770 & !0o700, d2_mode & 0o777);
8134+
assert_eq!(!0o700 & 0o770, d2_mode & 0o777);
81358135
}
81368136

81378137
#[test]
@@ -8188,3 +8188,39 @@ fn test_cp_not_existing_preserve_dir() {
81888188

81898189
assert_eq!(d1_mode, d2_mode);
81908190
}
8191+
8192+
#[test]
8193+
#[cfg(unix)]
8194+
// adapted from GNU tests/cp/cp-parents
8195+
fn test_cp_not_existing_no_preserve_file_parents() {
8196+
use std::io;
8197+
8198+
let scene = TestScenario::new(util_name!());
8199+
let at = &scene.fixtures;
8200+
8201+
scene.cmd("mkdir").arg("d1").succeeds();
8202+
scene.cmd("mkdir").arg("d1/d2").succeeds();
8203+
scene.cmd("touch").arg("d1/d2/f").succeeds();
8204+
scene.cmd("chmod").arg("770").arg("d1").succeeds();
8205+
scene.cmd("chmod").arg("700").arg("d1/d2").succeeds();
8206+
scene.cmd("chmod").arg("775").arg("d1/d2/f").succeeds();
8207+
scene.cmd("mkdir").arg("d3").succeeds();
8208+
8209+
scene
8210+
.ucmd()
8211+
.umask(0o022)
8212+
.arg("--no-preserve=mode")
8213+
.arg("--parents")
8214+
.arg("d1/d2/f")
8215+
.arg("d3")
8216+
.set_stdout(io::stdout())
8217+
.succeeds();
8218+
8219+
let d1_mode = at.metadata("d3/d1").mode();
8220+
let d2_mode = at.metadata("d3/d1/d2").mode();
8221+
let f_mode = at.metadata("d3/d1/d2/f").mode();
8222+
8223+
assert_eq!(!0o022 & 0o777, d1_mode & 0o777);
8224+
assert_eq!(!0o022 & 0o777, d2_mode & 0o777);
8225+
assert_eq!(!0o022 & 0o666, f_mode & 0o777);
8226+
}

0 commit comments

Comments
 (0)