Skip to content

Commit

Permalink
cp: fix cp -dR --no-preserve=links d c should have different inodes (#…
Browse files Browse the repository at this point in the history
…5320)

* fix issue 5308
  • Loading branch information
tommady authored Sep 27, 2023
1 parent df584f6 commit 2789885
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 15 deletions.
38 changes: 24 additions & 14 deletions src/uu/cp/src/cp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -931,23 +931,33 @@ impl Options {
};

// Parse attributes to preserve
let attributes = if let Some(attribute_strs) = matches.get_many::<String>(options::PRESERVE)
{
if attribute_strs.len() == 0 {
let mut attributes =
if let Some(attribute_strs) = matches.get_many::<String>(options::PRESERVE) {
if attribute_strs.len() == 0 {
Attributes::DEFAULT
} else {
Attributes::parse_iter(attribute_strs)?
}
} else if matches.get_flag(options::ARCHIVE) {
// --archive is used. Same as --preserve=all
Attributes::ALL
} else if matches.get_flag(options::NO_DEREFERENCE_PRESERVE_LINKS) {
Attributes::LINKS
} else if matches.get_flag(options::PRESERVE_DEFAULT_ATTRIBUTES) {
Attributes::DEFAULT
} else {
Attributes::parse_iter(attribute_strs)?
Attributes::NONE
};

// handling no-preserve options and adjusting the attributes
if let Some(attribute_strs) = matches.get_many::<String>(options::NO_PRESERVE) {
if attribute_strs.len() > 0 {
let no_preserve_attributes = Attributes::parse_iter(attribute_strs)?;
if matches!(no_preserve_attributes.links, Preserve::Yes { .. }) {
attributes.links = Preserve::No;
}
}
} else if matches.get_flag(options::ARCHIVE) {
// --archive is used. Same as --preserve=all
Attributes::ALL
} else if matches.get_flag(options::NO_DEREFERENCE_PRESERVE_LINKS) {
Attributes::LINKS
} else if matches.get_flag(options::PRESERVE_DEFAULT_ATTRIBUTES) {
Attributes::DEFAULT
} else {
Attributes::NONE
};
}

#[cfg(not(feature = "feat_selinux"))]
if let Preserve::Yes { required } = attributes.context {
Expand Down
2 changes: 1 addition & 1 deletion tests/by-util/test_cp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1494,7 +1494,7 @@ fn test_cp_preserve_links_case_5() {
let metadata_a = std::fs::metadata(at.subdir.join("c").join("a")).unwrap();
let metadata_b = std::fs::metadata(at.subdir.join("c").join("b")).unwrap();

assert_eq!(metadata_a.ino(), metadata_b.ino());
assert_ne!(metadata_a.ino(), metadata_b.ino());
}
}

Expand Down

0 comments on commit 2789885

Please sign in to comment.