Skip to content

Commit

Permalink
rustdoc: auto create output directory when "--output-format json"
Browse files Browse the repository at this point in the history
This PR allows rustdoc to automatically create output directory in case
it does not exist (when run with `--output-format json`).

This fixes rustdoc crash:

````
$ rustdoc --output-format json -Z unstable-options src/main.rs
error: couldn't generate documentation: No such file or directory (os error 2)
  |
  = note: failed to create or modify "doc/main.json"

error: aborting due to previous error
````

With this fix behavior of `rustdoc --output-format json` becomes consistent
with `rustdoc --output-format html` (which already auto-creates output
directory if it's missing)
  • Loading branch information
tomkris committed Jan 20, 2022
1 parent e5e2b0b commit 4e17170
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions src/librustdoc/json/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
mod conversions;

use std::cell::RefCell;
use std::fs::File;
use std::fs::{create_dir_all, File};
use std::path::PathBuf;
use std::rc::Rc;

Expand All @@ -18,13 +18,14 @@ use rustc_session::Session;

use rustdoc_json_types as types;

use crate::clean;
use crate::clean::types::{ExternalCrate, ExternalLocation};
use crate::config::RenderOptions;
use crate::docfs::PathError;
use crate::error::Error;
use crate::formats::cache::Cache;
use crate::formats::FormatRenderer;
use crate::json::conversions::{from_item_id, IntoWithTcx};
use crate::{clean, try_err};

#[derive(Clone)]
crate struct JsonRenderer<'tcx> {
Expand Down Expand Up @@ -256,10 +257,13 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> {
.collect(),
format_version: types::FORMAT_VERSION,
};
let mut p = self.out_path.clone();
let out_dir = self.out_path.clone();
try_err!(create_dir_all(&out_dir), out_dir);

let mut p = out_dir;
p.push(output.index.get(&output.root).unwrap().name.clone().unwrap());
p.set_extension("json");
let file = File::create(&p).map_err(|error| Error { error: error.to_string(), file: p })?;
let file = try_err!(File::create(&p), p);
serde_json::ser::to_writer(&file, &output).unwrap();
Ok(())
}
Expand Down

0 comments on commit 4e17170

Please sign in to comment.