Skip to content

Commit 3539e32

Browse files
committed
fix(cp): copy attributes for parents dirs
1 parent 8237a28 commit 3539e32

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
@@ -8103,7 +8103,7 @@ fn test_cp_not_existing_no_preserve_dir() {
81038103

81048104
let d2_mode = at.metadata("d2").mode();
81058105

8106-
assert_eq!(0o777 & !0o700, d2_mode & 0o777);
8106+
assert_eq!(!0o700 & 0o777, d2_mode & 0o777);
81078107
}
81088108

81098109
#[test]
@@ -8127,7 +8127,7 @@ fn test_cp_not_existing_default_file() {
81278127

81288128
let f2_mode = at.metadata("f2").mode();
81298129

8130-
assert_eq!(0o770 & !0o700, f2_mode & 0o777);
8130+
assert_eq!(!0o700 & 0o770, f2_mode & 0o777);
81318131
}
81328132

81338133
#[test]
@@ -8152,7 +8152,7 @@ fn test_cp_not_existing_default_dir() {
81528152

81538153
let d2_mode = at.metadata("d2").mode();
81548154

8155-
assert_eq!(0o770 & !0o700, d2_mode & 0o777);
8155+
assert_eq!(!0o700 & 0o770, d2_mode & 0o777);
81568156
}
81578157

81588158
#[test]
@@ -8209,3 +8209,39 @@ fn test_cp_not_existing_preserve_dir() {
82098209

82108210
assert_eq!(d1_mode, d2_mode);
82118211
}
8212+
8213+
#[test]
8214+
#[cfg(unix)]
8215+
// adapted from GNU tests/cp/cp-parents
8216+
fn test_cp_not_existing_no_preserve_file_parents() {
8217+
use std::io;
8218+
8219+
let scene = TestScenario::new(util_name!());
8220+
let at = &scene.fixtures;
8221+
8222+
scene.cmd("mkdir").arg("d1").succeeds();
8223+
scene.cmd("mkdir").arg("d1/d2").succeeds();
8224+
scene.cmd("touch").arg("d1/d2/f").succeeds();
8225+
scene.cmd("chmod").arg("770").arg("d1").succeeds();
8226+
scene.cmd("chmod").arg("700").arg("d1/d2").succeeds();
8227+
scene.cmd("chmod").arg("775").arg("d1/d2/f").succeeds();
8228+
scene.cmd("mkdir").arg("d3").succeeds();
8229+
8230+
scene
8231+
.ucmd()
8232+
.umask(0o022)
8233+
.arg("--no-preserve=mode")
8234+
.arg("--parents")
8235+
.arg("d1/d2/f")
8236+
.arg("d3")
8237+
.set_stdout(io::stdout())
8238+
.succeeds();
8239+
8240+
let d1_mode = at.metadata("d3/d1").mode();
8241+
let d2_mode = at.metadata("d3/d1/d2").mode();
8242+
let f_mode = at.metadata("d3/d1/d2/f").mode();
8243+
8244+
assert_eq!(!0o022 & 0o777, d1_mode & 0o777);
8245+
assert_eq!(!0o022 & 0o777, d2_mode & 0o777);
8246+
assert_eq!(!0o022 & 0o666, f_mode & 0o777);
8247+
}

0 commit comments

Comments
 (0)