about summary refs log tree commit diff
path: root/src/bootstrap
diff options
context:
space:
mode:
authorozkanonur <work@onurozkan.dev>2022-11-20 15:51:50 +0300
committerozkanonur <work@onurozkan.dev>2022-11-20 15:51:50 +0300
commit7e28df9561cbfb98c0b5a7f4868823709c1914c1 (patch)
tree996b45b040df0157fd18d08947b43d901a79bd44 /src/bootstrap
parent0a275abec64398ece3ebba1a5db3efa24f49728b (diff)
downloadrust-7e28df9561cbfb98c0b5a7f4868823709c1914c1.tar.gz
rust-7e28df9561cbfb98c0b5a7f4868823709c1914c1.zip
refactor doc copying process
Signed-off-by: ozkanonur <work@onurozkan.dev>
Diffstat (limited to 'src/bootstrap')
-rw-r--r--src/bootstrap/builder.rs8
-rw-r--r--src/bootstrap/doc.rs56
2 files changed, 16 insertions, 48 deletions
diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs
index 31158870f39..7ee80eceb95 100644
--- a/src/bootstrap/builder.rs
+++ b/src/bootstrap/builder.rs
@@ -1345,7 +1345,13 @@ impl<'a> Builder<'a> {
             let my_out = match mode {
                 // This is the intended out directory for compiler documentation.
                 Mode::Rustc | Mode::ToolRustc => self.compiler_doc_out(target),
-                Mode::Std => out_dir.join(target.triple).join("doc"),
+                Mode::Std => {
+                    if self.config.cmd.json() {
+                        out_dir.join(target.triple).join("json-doc")
+                    } else {
+                        out_dir.join(target.triple).join("doc")
+                    }
+                }
                 _ => panic!("doc mode {:?} not expected", mode),
             };
             let rustdoc = self.rustdoc(compiler);
diff --git a/src/bootstrap/doc.rs b/src/bootstrap/doc.rs
index fd6f3926817..e267d179797 100644
--- a/src/bootstrap/doc.rs
+++ b/src/bootstrap/doc.rs
@@ -551,49 +551,6 @@ fn doc_std(
     extra_args: &[&OsStr],
     requested_crates: &[String],
 ) {
-    // `cargo` uses the same directory for both JSON docs and HTML docs.
-    // This could lead to cross-contamination when copying files into the specified `out` directory.
-    // For example:
-    // ```bash
-    // x doc std
-    // x doc std --json
-    // ```
-    // could lead to HTML docs being copied into the JSON docs output directory.
-    // To avoid this issue, we copy generated docs instead of whole directory by
-    // checking doc format and generated files.
-    fn cp_docs_by_doc_format(
-        format: &DocumentationFormat,
-        builder: &Builder<'_>,
-        src: &Path,
-        dst: &Path,
-    ) {
-        for f in builder.read_dir(src) {
-            let path = f.path();
-            let name = path.file_name().unwrap();
-            let dst = dst.join(name);
-
-            if t!(f.file_type()).is_dir() && format == &DocumentationFormat::HTML {
-                t!(fs::create_dir_all(&dst));
-                cp_docs_by_doc_format(format, builder, &path, &dst);
-            } else {
-                let _ = fs::remove_file(&dst);
-                let extension = path.extension().and_then(OsStr::to_str);
-
-                match format {
-                    DocumentationFormat::HTML if extension != Some("json") => {
-                        builder.copy(&path, &dst)
-                    }
-                    DocumentationFormat::JSON
-                        if extension == Some("json") || name.to_str() == Some(".stamp") =>
-                    {
-                        builder.copy(&path, &dst)
-                    }
-                    _ => {}
-                }
-            }
-        }
-    }
-
     builder.info(&format!(
         "Documenting stage{} std ({}) in {} format",
         stage,
@@ -607,15 +564,22 @@ fn doc_std(
         );
     }
     let compiler = builder.compiler(stage, builder.config.build);
+
+    let target_doc_dir_name = if format == DocumentationFormat::JSON { "json-doc" } else { "doc" };
+    let target_dir =
+        builder.stage_out(compiler, Mode::Std).join(target.triple).join(target_doc_dir_name);
+
     // This is directory where the compiler will place the output of the command.
     // We will then copy the files from this directory into the final `out` directory, the specified
     // as a function parameter.
-    let out_dir = builder.stage_out(compiler, Mode::Std).join(target.triple).join("doc");
+    let out_dir = target_dir.join(target.triple).join("doc");
 
     let run_cargo_rustdoc_for = |package: &str| {
         let mut cargo = builder.cargo(compiler, Mode::Std, SourceType::InTree, target, "rustdoc");
         compile::std_cargo(builder, target, compiler.stage, &mut cargo);
         cargo
+            .arg("--target-dir")
+            .arg(&*target_dir.to_string_lossy())
             .arg("-p")
             .arg(package)
             .arg("-Zskip-rustdoc-fingerprint")
@@ -636,9 +600,7 @@ fn doc_std(
         }
     }
 
-    if !builder.config.dry_run() {
-        cp_docs_by_doc_format(&format, builder, &out_dir, &out);
-    }
+    builder.cp_r(&out_dir, &out);
 }
 
 #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]