Auto merge of #42572 - ollie27:rustdoc_create_dir_all, r=GuillaumeGomez
rustdoc: Use `create_dir_all` to create output directory Currently rustdoc will fail if passed `-o foo/doc` if the `foo` directory doesn't exist. Also remove unneeded `mkdir` as `create_dir_all` can now handle concurrent invocations since #39799.
This commit is contained in:
commit
0a5218b506
@ -492,7 +492,7 @@ pub fn run(mut krate: clean::Crate,
|
||||
}
|
||||
}
|
||||
}
|
||||
try_err!(mkdir(&dst), &dst);
|
||||
try_err!(fs::create_dir_all(&dst), &dst);
|
||||
krate = render_sources(&dst, &mut scx, krate)?;
|
||||
let cx = Context {
|
||||
current: Vec::new(),
|
||||
@ -658,7 +658,7 @@ fn write_shared(cx: &Context,
|
||||
// Write out the shared files. Note that these are shared among all rustdoc
|
||||
// docs placed in the output directory, so this needs to be a synchronized
|
||||
// operation with respect to all other rustdocs running around.
|
||||
try_err!(mkdir(&cx.dst), &cx.dst);
|
||||
try_err!(fs::create_dir_all(&cx.dst), &cx.dst);
|
||||
let _lock = flock::Lock::panicking_new(&cx.dst.join(".lock"), true, true, true);
|
||||
|
||||
// Add all the static files. These may already exist, but we just
|
||||
@ -808,10 +808,8 @@ fn write_shared(cx: &Context,
|
||||
fn render_sources(dst: &Path, scx: &mut SharedContext,
|
||||
krate: clean::Crate) -> Result<clean::Crate, Error> {
|
||||
info!("emitting source files");
|
||||
let dst = dst.join("src");
|
||||
try_err!(mkdir(&dst), &dst);
|
||||
let dst = dst.join(&krate.name);
|
||||
try_err!(mkdir(&dst), &dst);
|
||||
let dst = dst.join("src").join(&krate.name);
|
||||
try_err!(fs::create_dir_all(&dst), &dst);
|
||||
let mut folder = SourceCollector {
|
||||
dst: dst,
|
||||
scx: scx,
|
||||
@ -825,19 +823,6 @@ fn write(dst: PathBuf, contents: &[u8]) -> Result<(), Error> {
|
||||
Ok(try_err!(try_err!(File::create(&dst), &dst).write_all(contents), &dst))
|
||||
}
|
||||
|
||||
/// Makes a directory on the filesystem, failing the thread if an error occurs
|
||||
/// and skipping if the directory already exists.
|
||||
///
|
||||
/// Note that this also handles races as rustdoc is likely to be run
|
||||
/// concurrently against another invocation.
|
||||
fn mkdir(path: &Path) -> io::Result<()> {
|
||||
match fs::create_dir(path) {
|
||||
Ok(()) => Ok(()),
|
||||
Err(ref e) if e.kind() == io::ErrorKind::AlreadyExists => Ok(()),
|
||||
Err(e) => Err(e)
|
||||
}
|
||||
}
|
||||
|
||||
/// Takes a path to a source file and cleans the path to it. This canonicalizes
|
||||
/// things like ".." to components which preserve the "top down" hierarchy of a
|
||||
/// static HTML tree. Each component in the cleaned path will be passed as an
|
||||
@ -951,7 +936,7 @@ impl<'a> SourceCollector<'a> {
|
||||
let mut href = String::new();
|
||||
clean_srcpath(&self.scx.src_root, &p, false, |component| {
|
||||
cur.push(component);
|
||||
mkdir(&cur).unwrap();
|
||||
fs::create_dir_all(&cur).unwrap();
|
||||
root_path.push_str("../");
|
||||
href.push_str(component);
|
||||
href.push('/');
|
||||
|
4
src/test/run-make/rustdoc-output-path/Makefile
Normal file
4
src/test/run-make/rustdoc-output-path/Makefile
Normal file
@ -0,0 +1,4 @@
|
||||
-include ../tools.mk
|
||||
|
||||
all:
|
||||
$(HOST_RPATH_ENV) '$(RUSTDOC)' -o "$(TMPDIR)/foo/bar/doc" foo.rs
|
11
src/test/run-make/rustdoc-output-path/foo.rs
Normal file
11
src/test/run-make/rustdoc-output-path/foo.rs
Normal file
@ -0,0 +1,11 @@
|
||||
// Copyright 2017 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.
|
||||
|
||||
pub struct Foo;
|
Loading…
Reference in New Issue
Block a user