Skip to content

Commit

Permalink
Auto merge of #4672 - kennytm:fix-4671, r=alexcrichton
Browse files Browse the repository at this point in the history
When uplifting directories, symlink them instead of hard-link them.

Fixes #4671.
  • Loading branch information
bors committed Oct 29, 2017
2 parents 1c9dc0a + 53e90d7 commit 859c230
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 12 deletions.
27 changes: 20 additions & 7 deletions src/cargo/ops/cargo_rustc/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -533,15 +533,28 @@ fn link_targets<'a, 'cfg>(cx: &mut Context<'a, 'cfg>,
format!("failed to remove: {}", dst.display())
})?;
}
fs::hard_link(src, dst)
.or_else(|err| {
debug!("hard link failed {}. falling back to fs::copy", err);
fs::copy(src, dst).map(|_| ())
})
.chain_err(|| {

let link_result = if src.is_dir() {
#[cfg(unix)]
use std::os::unix::fs::symlink;
#[cfg(target_os = "redox")]
use std::os::redox::fs::symlink;
#[cfg(windows)]
use std::os::windows::fs::symlink_dir as symlink;

symlink(src, dst)
} else {
fs::hard_link(src, dst)
};
link_result
.or_else(|err| {
debug!("link failed {}. falling back to fs::copy", err);
fs::copy(src, dst).map(|_| ())
})
.chain_err(|| {
format!("failed to link or copy `{}` to `{}`",
src.display(), dst.display())
})?;
})?;
}

if json_messages {
Expand Down
7 changes: 7 additions & 0 deletions tests/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3877,6 +3877,13 @@ fn uplift_dsym_of_bin_on_mac() {
);
assert_that(&p.bin("foo.dSYM"), existing_dir());
assert_that(&p.bin("b.dSYM"), existing_dir());
assert!(
p.bin("b.dSYM")
.symlink_metadata()
.expect("read metadata from b.dSYM")
.file_type()
.is_symlink()
);
assert_that(&p.bin("c.dSYM"), is_not(existing_dir()));
assert_that(&p.bin("d.dSYM"), is_not(existing_dir()));
}
9 changes: 4 additions & 5 deletions tests/cargotest/support/paths.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,15 +81,14 @@ impl CargoPathExt for Path {
}

for file in t!(fs::read_dir(self)) {
let file = t!(file).path();

if file.is_dir() {
file.rm_rf();
let file = t!(file);
if file.file_type().map(|m| m.is_dir()).unwrap_or(false) {
file.path().rm_rf();
} else {
// On windows we can't remove a readonly file, and git will
// often clone files as readonly. As a result, we have some
// special logic to remove readonly files on windows.
do_op(&file, "remove file", |p| fs::remove_file(p));
do_op(&file.path(), "remove file", |p| fs::remove_file(p));
}
}
do_op(self, "remove dir", |p| fs::remove_dir(p));
Expand Down

0 comments on commit 859c230

Please sign in to comment.