1
Fork 0

auto merge of #16907 : SimonSapin/rust/tempdir-result, r=huonw

This allows using `try!()`

[breaking-change]

Fixes #16875
This commit is contained in:
bors 2014-09-06 08:01:33 +00:00
commit 20c0ba1279
6 changed files with 21 additions and 17 deletions

View file

@ -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);

View file

@ -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();

View file

@ -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)
} }

View file

@ -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();

View file

@ -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);

View file

@ -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();