auto merge of #16907 : SimonSapin/rust/tempdir-result, r=huonw
This allows using `try!()` [breaking-change] Fixes #16875
This commit is contained in:
commit
20c0ba1279
6 changed files with 21 additions and 17 deletions
|
@ -647,7 +647,7 @@ fn link_rlib<'a>(sess: &'a Session,
|
||||||
// contain the metadata in a separate file. We use a temp directory
|
// contain the metadata in a separate file. We use a temp directory
|
||||||
// here so concurrent builds in the same directory don't try to use
|
// here so concurrent builds in the same directory don't try to use
|
||||||
// the same filename for metadata (stomping over one another)
|
// the same filename for metadata (stomping over one another)
|
||||||
let tmpdir = TempDir::new("rustc").expect("needs a temp dir");
|
let tmpdir = TempDir::new("rustc").ok().expect("needs a temp dir");
|
||||||
let metadata = tmpdir.path().join(METADATA_FILENAME);
|
let metadata = tmpdir.path().join(METADATA_FILENAME);
|
||||||
match fs::File::create(&metadata).write(trans.metadata
|
match fs::File::create(&metadata).write(trans.metadata
|
||||||
.as_slice()) {
|
.as_slice()) {
|
||||||
|
@ -812,7 +812,7 @@ fn link_staticlib(sess: &Session, obj_filename: &Path, out_filename: &Path) {
|
||||||
// links to all upstream files as well.
|
// links to all upstream files as well.
|
||||||
fn link_natively(sess: &Session, trans: &CrateTranslation, dylib: bool,
|
fn link_natively(sess: &Session, trans: &CrateTranslation, dylib: bool,
|
||||||
obj_filename: &Path, out_filename: &Path) {
|
obj_filename: &Path, out_filename: &Path) {
|
||||||
let tmpdir = TempDir::new("rustc").expect("needs a temp dir");
|
let tmpdir = TempDir::new("rustc").ok().expect("needs a temp dir");
|
||||||
|
|
||||||
// The invocations of cc share some flags across platforms
|
// The invocations of cc share some flags across platforms
|
||||||
let pname = get_cc_prog(sess);
|
let pname = get_cc_prog(sess);
|
||||||
|
|
|
@ -170,7 +170,7 @@ fn runtest(test: &str, cratename: &str, libs: HashSet<Path>, externs: core::Exte
|
||||||
None,
|
None,
|
||||||
span_diagnostic_handler);
|
span_diagnostic_handler);
|
||||||
|
|
||||||
let outdir = TempDir::new("rustdoctest").expect("rustdoc needs a tempdir");
|
let outdir = TempDir::new("rustdoctest").ok().expect("rustdoc needs a tempdir");
|
||||||
let out = Some(outdir.path().clone());
|
let out = Some(outdir.path().clone());
|
||||||
let cfg = config::build_configuration(&sess);
|
let cfg = config::build_configuration(&sess);
|
||||||
let libdir = sess.target_filesearch().get_lib_path();
|
let libdir = sess.target_filesearch().get_lib_path();
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
|
|
||||||
use io::{fs, IoResult};
|
use io::{fs, IoResult};
|
||||||
use io;
|
use io;
|
||||||
use iter::range;
|
|
||||||
use libc;
|
use libc;
|
||||||
use ops::Drop;
|
use ops::Drop;
|
||||||
use option::{Option, None, Some};
|
use option::{Option, None, Some};
|
||||||
|
@ -33,15 +32,16 @@ impl TempDir {
|
||||||
/// will have the suffix `suffix`. The directory will be automatically
|
/// will have the suffix `suffix`. The directory will be automatically
|
||||||
/// deleted once the returned wrapper is destroyed.
|
/// deleted once the returned wrapper is destroyed.
|
||||||
///
|
///
|
||||||
/// If no directory can be created, None is returned.
|
/// If no directory can be created, `Err` is returned.
|
||||||
pub fn new_in(tmpdir: &Path, suffix: &str) -> Option<TempDir> {
|
pub fn new_in(tmpdir: &Path, suffix: &str) -> IoResult<TempDir> {
|
||||||
if !tmpdir.is_absolute() {
|
if !tmpdir.is_absolute() {
|
||||||
return TempDir::new_in(&os::make_absolute(tmpdir), suffix);
|
return TempDir::new_in(&os::make_absolute(tmpdir), suffix);
|
||||||
}
|
}
|
||||||
|
|
||||||
static mut CNT: atomic::AtomicUint = atomic::INIT_ATOMIC_UINT;
|
static mut CNT: atomic::AtomicUint = atomic::INIT_ATOMIC_UINT;
|
||||||
|
|
||||||
for _ in range(0u, 1000) {
|
let mut attempts = 0u;
|
||||||
|
loop {
|
||||||
let filename =
|
let filename =
|
||||||
format!("rs-{}-{}-{}",
|
format!("rs-{}-{}-{}",
|
||||||
unsafe { libc::getpid() },
|
unsafe { libc::getpid() },
|
||||||
|
@ -49,19 +49,23 @@ impl TempDir {
|
||||||
suffix);
|
suffix);
|
||||||
let p = tmpdir.join(filename);
|
let p = tmpdir.join(filename);
|
||||||
match fs::mkdir(&p, io::UserRWX) {
|
match fs::mkdir(&p, io::UserRWX) {
|
||||||
Err(..) => {}
|
Err(error) => {
|
||||||
Ok(()) => return Some(TempDir { path: Some(p), disarmed: false })
|
if attempts >= 1000 {
|
||||||
|
return Err(error)
|
||||||
|
}
|
||||||
|
attempts += 1;
|
||||||
|
}
|
||||||
|
Ok(()) => return Ok(TempDir { path: Some(p), disarmed: false })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Attempts to make a temporary directory inside of `os::tmpdir()` whose
|
/// Attempts to make a temporary directory inside of `os::tmpdir()` whose
|
||||||
/// name will have the suffix `suffix`. The directory will be automatically
|
/// name will have the suffix `suffix`. The directory will be automatically
|
||||||
/// deleted once the returned wrapper is destroyed.
|
/// deleted once the returned wrapper is destroyed.
|
||||||
///
|
///
|
||||||
/// If no directory can be created, None is returned.
|
/// If no directory can be created, `Err` is returned.
|
||||||
pub fn new(suffix: &str) -> Option<TempDir> {
|
pub fn new(suffix: &str) -> IoResult<TempDir> {
|
||||||
TempDir::new_in(&os::tmpdir(), suffix)
|
TempDir::new_in(&os::tmpdir(), suffix)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1660,7 +1660,7 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
pub fn ratchet_test() {
|
pub fn ratchet_test() {
|
||||||
|
|
||||||
let dpth = TempDir::new("test-ratchet").expect("missing test for ratchet");
|
let dpth = TempDir::new("test-ratchet").ok().expect("missing test for ratchet");
|
||||||
let pth = dpth.path().join("ratchet.json");
|
let pth = dpth.path().join("ratchet.json");
|
||||||
|
|
||||||
let mut m1 = MetricMap::new();
|
let mut m1 = MetricMap::new();
|
||||||
|
|
|
@ -22,7 +22,7 @@ fn rename_directory() {
|
||||||
unsafe {
|
unsafe {
|
||||||
static U_RWX: i32 = (libc::S_IRUSR | libc::S_IWUSR | libc::S_IXUSR) as i32;
|
static U_RWX: i32 = (libc::S_IRUSR | libc::S_IWUSR | libc::S_IXUSR) as i32;
|
||||||
|
|
||||||
let tmpdir = TempDir::new("rename_directory").expect("rename_directory failed");
|
let tmpdir = TempDir::new("rename_directory").ok().expect("rename_directory failed");
|
||||||
let tmpdir = tmpdir.path();
|
let tmpdir = tmpdir.path();
|
||||||
let old_path = tmpdir.join_many(["foo", "bar", "baz"]);
|
let old_path = tmpdir.join_many(["foo", "bar", "baz"]);
|
||||||
fs::mkdir_recursive(&old_path, io::UserRWX);
|
fs::mkdir_recursive(&old_path, io::UserRWX);
|
||||||
|
|
|
@ -160,8 +160,8 @@ fn recursive_mkdir_rel_2() {
|
||||||
pub fn test_rmdir_recursive_ok() {
|
pub fn test_rmdir_recursive_ok() {
|
||||||
let rwx = io::UserRWX;
|
let rwx = io::UserRWX;
|
||||||
|
|
||||||
let tmpdir = TempDir::new("test").expect("test_rmdir_recursive_ok: \
|
let tmpdir = TempDir::new("test").ok().expect("test_rmdir_recursive_ok: \
|
||||||
couldn't create temp dir");
|
couldn't create temp dir");
|
||||||
let tmpdir = tmpdir.path();
|
let tmpdir = tmpdir.path();
|
||||||
let root = tmpdir.join("foo");
|
let root = tmpdir.join("foo");
|
||||||
|
|
||||||
|
@ -190,7 +190,7 @@ pub fn dont_double_fail() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn in_tmpdir(f: ||) {
|
fn in_tmpdir(f: ||) {
|
||||||
let tmpdir = TempDir::new("test").expect("can't make tmpdir");
|
let tmpdir = TempDir::new("test").ok().expect("can't make tmpdir");
|
||||||
assert!(os::change_dir(tmpdir.path()));
|
assert!(os::change_dir(tmpdir.path()));
|
||||||
|
|
||||||
f();
|
f();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue