Skip to content

Commit 7382202

Browse files
committed
fix(cp): copy attributes for parents dirs
1 parent ca01f55 commit 7382202

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
@@ -1570,7 +1570,7 @@ fn copy_source(
15701570
&src,
15711571
y,
15721572
&options.attributes,
1573-
false,
1573+
true,
15741574
#[cfg(unix)]
15751575
orig_umask,
15761576
)?;

tests/by-util/test_cp.rs

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

78987898
let d2_mode = at.metadata("d2").mode();
78997899

7900-
assert_eq!(0o777 & !0o700, d2_mode & 0o777);
7900+
assert_eq!(!0o700 & 0o777, d2_mode & 0o777);
79017901
}
79027902

79037903
#[test]
@@ -7921,7 +7921,7 @@ fn test_cp_not_existing_default_file() {
79217921

79227922
let f2_mode = at.metadata("f2").mode();
79237923

7924-
assert_eq!(0o770 & !0o700, f2_mode & 0o777);
7924+
assert_eq!(!0o700 & 0o770, f2_mode & 0o777);
79257925
}
79267926

79277927
#[test]
@@ -7946,7 +7946,7 @@ fn test_cp_not_existing_default_dir() {
79467946

79477947
let d2_mode = at.metadata("d2").mode();
79487948

7949-
assert_eq!(0o770 & !0o700, d2_mode & 0o777);
7949+
assert_eq!(!0o700 & 0o770, d2_mode & 0o777);
79507950
}
79517951

79527952
#[test]
@@ -8003,3 +8003,39 @@ fn test_cp_not_existing_preserve_dir() {
80038003

80048004
assert_eq!(d1_mode, d2_mode);
80058005
}
8006+
8007+
#[test]
8008+
#[cfg(unix)]
8009+
// adapted from GNU tests/cp/cp-parents
8010+
fn test_cp_not_existing_no_preserve_file_parents() {
8011+
use std::io;
8012+
8013+
let scene = TestScenario::new(util_name!());
8014+
let at = &scene.fixtures;
8015+
8016+
scene.cmd("mkdir").arg("d1").succeeds();
8017+
scene.cmd("mkdir").arg("d1/d2").succeeds();
8018+
scene.cmd("touch").arg("d1/d2/f").succeeds();
8019+
scene.cmd("chmod").arg("770").arg("d1").succeeds();
8020+
scene.cmd("chmod").arg("700").arg("d1/d2").succeeds();
8021+
scene.cmd("chmod").arg("775").arg("d1/d2/f").succeeds();
8022+
scene.cmd("mkdir").arg("d3").succeeds();
8023+
8024+
scene
8025+
.ucmd()
8026+
.umask(0o022)
8027+
.arg("--no-preserve=mode")
8028+
.arg("--parents")
8029+
.arg("d1/d2/f")
8030+
.arg("d3")
8031+
.set_stdout(io::stdout())
8032+
.succeeds();
8033+
8034+
let d1_mode = at.metadata("d3/d1").mode();
8035+
let d2_mode = at.metadata("d3/d1/d2").mode();
8036+
let f_mode = at.metadata("d3/d1/d2/f").mode();
8037+
8038+
assert_eq!(!0o022 & 0o777, d1_mode & 0o777);
8039+
assert_eq!(!0o022 & 0o777, d2_mode & 0o777);
8040+
assert_eq!(!0o022 & 0o666, f_mode & 0o777);
8041+
}

0 commit comments

Comments
 (0)