diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2014-03-14 11:16:10 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2014-03-14 13:59:02 -0700 |
| commit | 58e4ab2b33f559107dbdfa9d3cab882cf8029481 (patch) | |
| tree | 749ec81e1a287e6ce082c201d97cec7243612a79 /src/libstd/io | |
| parent | e99d523707c8058383e7a551e49d59ce622d5765 (diff) | |
| download | rust-58e4ab2b33f559107dbdfa9d3cab882cf8029481.tar.gz rust-58e4ab2b33f559107dbdfa9d3cab882cf8029481.zip | |
extra: Put the nail in the coffin, delete libextra
This commit shreds all remnants of libextra from the compiler and standard distribution. Two modules, c_vec/tempfile, were moved into libstd after some cleanup, and the other modules were moved to separate crates as seen fit. Closes #8784 Closes #12413 Closes #12576
Diffstat (limited to 'src/libstd/io')
| -rw-r--r-- | src/libstd/io/mod.rs | 29 | ||||
| -rw-r--r-- | src/libstd/io/tempfile.rs | 93 |
2 files changed, 103 insertions, 19 deletions
diff --git a/src/libstd/io/mod.rs b/src/libstd/io/mod.rs index 869643336a9..28f6d13070e 100644 --- a/src/libstd/io/mod.rs +++ b/src/libstd/io/mod.rs @@ -241,40 +241,31 @@ pub use self::net::tcp::TcpStream; pub use self::net::udp::UdpStream; pub use self::pipe::PipeStream; pub use self::process::{Process, ProcessConfig}; +pub use self::tempfile::TempDir; pub use self::mem::{MemReader, BufReader, MemWriter, BufWriter}; pub use self::buffered::{BufferedReader, BufferedWriter, BufferedStream, LineBufferedWriter}; pub use self::comm_adapters::{ChanReader, ChanWriter}; +// this comes first to get the iotest! macro pub mod test; +mod buffered; +mod comm_adapters; +mod mem; +mod result; +mod tempfile; +pub mod extensions; pub mod fs; - +pub mod net; pub mod pipe; - pub mod process; - -pub mod net; - -mod mem; - +pub mod signal; pub mod stdio; - -mod result; - -pub mod extensions; - pub mod timer; - -mod buffered; - -pub mod signal; - pub mod util; -mod comm_adapters; - /// The default buffer size for various I/O operations // libuv recommends 64k buffers to maximize throughput // https://groups.google.com/forum/#!topic/libuv/oQO1HJAIDdA diff --git a/src/libstd/io/tempfile.rs b/src/libstd/io/tempfile.rs new file mode 100644 index 00000000000..34d6b19199a --- /dev/null +++ b/src/libstd/io/tempfile.rs @@ -0,0 +1,93 @@ +// Copyright 2013 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Temporary files and directories + +use io::fs; +use io; +use iter::{Iterator, range}; +use libc; +use ops::Drop; +use option::{Option, None, Some}; +use os; +use path::{Path, GenericPath}; +use result::{Ok, Err}; +use sync::atomics; + +/// A wrapper for a path to temporary directory implementing automatic +/// scope-based deletion. +pub struct TempDir { + priv path: Option<Path> +} + +impl TempDir { + /// Attempts to make a temporary directory inside of `tmpdir` whose name + /// will have the suffix `suffix`. The directory will be automatically + /// deleted once the returned wrapper is destroyed. + /// + /// If no directory can be created, None is returned. + pub fn new_in(tmpdir: &Path, suffix: &str) -> Option<TempDir> { + if !tmpdir.is_absolute() { + return TempDir::new_in(&os::make_absolute(tmpdir), suffix); + } + + static mut CNT: atomics::AtomicUint = atomics::INIT_ATOMIC_UINT; + + for _ in range(0u, 1000) { + let filename = format!("rs-{}-{}-{}", + unsafe { libc::getpid() }, + unsafe { CNT.fetch_add(1, atomics::SeqCst) }, + suffix); + let p = tmpdir.join(filename); + match fs::mkdir(&p, io::UserRWX) { + Err(..) => {} + Ok(()) => return Some(TempDir { path: Some(p) }) + } + } + None + } + + /// Attempts to make a temporary directory inside of `os::tmpdir()` whose + /// name will have the suffix `suffix`. The directory will be automatically + /// deleted once the returned wrapper is destroyed. + /// + /// If no directory can be created, None is returned. + pub fn new(suffix: &str) -> Option<TempDir> { + TempDir::new_in(&os::tmpdir(), suffix) + } + + /// Unwrap the wrapped `std::path::Path` from the `TempDir` wrapper. + /// This discards the wrapper so that the automatic deletion of the + /// temporary directory is prevented. + pub fn unwrap(self) -> Path { + let mut tmpdir = self; + tmpdir.path.take_unwrap() + } + + /// Access the wrapped `std::path::Path` to the temporary directory. + pub fn path<'a>(&'a self) -> &'a Path { + self.path.get_ref() + } +} + +impl Drop for TempDir { + fn drop(&mut self) { + for path in self.path.iter() { + if path.exists() { + // FIXME: is failing the right thing to do? + fs::rmdir_recursive(path).unwrap(); + } + } + } +} + +// the tests for this module need to change the path using change_dir, +// and this doesn't play nicely with other tests so these unit tests are located +// in src/test/run-pass/tempfile.rs |
