Skip to content

Commit 4f6d706

Browse files
committed
Don't hard-code essential rustdoc files
This avoids having to constantly update docs.rs when new files are added.
1 parent 4ee9d89 commit 4f6d706

File tree

1 file changed

+36
-43
lines changed

1 file changed

+36
-43
lines changed

src/docbuilder/rustwide_builder.rs

+36-43
Original file line numberDiff line numberDiff line change
@@ -14,47 +14,16 @@ use docsrs_metadata::{Metadata, DEFAULT_TARGETS, HOST_TARGET};
1414
use failure::ResultExt;
1515
use log::{debug, info, warn, LevelFilter};
1616
use postgres::Client;
17-
use rustwide::cmd::{Command, SandboxBuilder, SandboxImage};
17+
use rustwide::cmd::{Binary, Command, SandboxBuilder, SandboxImage};
1818
use rustwide::logging::{self, LogStorage};
1919
use rustwide::toolchain::ToolchainError;
2020
use rustwide::{Build, Crate, Toolchain, Workspace, WorkspaceBuilder};
2121
use serde_json::Value;
2222
use std::collections::{HashMap, HashSet};
23-
use std::path::Path;
23+
use std::path::{Path, PathBuf};
2424
use std::sync::Arc;
2525

2626
const USER_AGENT: &str = "docs.rs builder (https://github.com/rust-lang/docs.rs)";
27-
const ESSENTIAL_FILES_VERSIONED: &[&str] = &[
28-
"brush.svg",
29-
"favicon.svg",
30-
"wheel.svg",
31-
"down-arrow.svg",
32-
"dark.css",
33-
"light.css",
34-
"ayu.css",
35-
"main.js",
36-
"normalize.css",
37-
"rustdoc.css",
38-
"settings.css",
39-
"settings.js",
40-
"storage.js",
41-
"theme.js",
42-
"source-script.js",
43-
"noscript.css",
44-
"rust-logo.png",
45-
];
46-
const ESSENTIAL_FILES_UNVERSIONED: &[&str] = &[
47-
"FiraSans-Medium.woff",
48-
"FiraSans-Medium.woff2",
49-
"FiraSans-Regular.woff",
50-
"FiraSans-Regular.woff2",
51-
"SourceCodePro-Regular.woff",
52-
"SourceCodePro-Semibold.woff",
53-
"SourceSerifPro-Bold.ttf.woff",
54-
"SourceSerifPro-Regular.ttf.woff",
55-
"SourceSerifPro-It.ttf.woff",
56-
];
57-
5827
const DUMMY_CRATE_NAME: &str = "empty-library";
5928
const DUMMY_CRATE_VERSION: &str = "1.0.0";
6029

@@ -213,6 +182,20 @@ impl RustwideBuilder {
213182
let krate = Crate::crates_io(DUMMY_CRATE_NAME, DUMMY_CRATE_VERSION);
214183
krate.fetch(&self.workspace)?;
215184

185+
// TODO: remove this when https://github.com/rust-lang/rustwide/pull/53 lands.
186+
struct Rustdoc<'a> {
187+
toolchain_version: &'a str,
188+
}
189+
impl rustwide::cmd::Runnable for Rustdoc<'_> {
190+
fn name(&self) -> Binary {
191+
Binary::ManagedByRustwide(PathBuf::from("rustdoc"))
192+
}
193+
194+
fn prepare_command<'w, 'pl>(&self, cmd: Command<'w, 'pl>) -> Command<'w, 'pl> {
195+
cmd.args(&[format!("+{}", self.toolchain_version)])
196+
}
197+
}
198+
216199
build_dir
217200
.build(&self.toolchain, &krate, self.prepare_sandbox(&limits))
218201
.run(|build| {
@@ -229,19 +212,29 @@ impl RustwideBuilder {
229212
.prefix("essential-files")
230213
.tempdir()?;
231214

232-
let files = ESSENTIAL_FILES_VERSIONED
215+
let toolchain_version = self.toolchain.as_dist().unwrap().name();
216+
let output = build.cmd(Rustdoc { toolchain_version })
217+
.args(&["-Zunstable-options", "--print=unversioned-files"])
218+
.run_capture()
219+
.context("failed to learn about unversioned files - make sure you have nightly-2021-03-07 or later")?;
220+
let essential_files_unversioned = output
221+
.stdout_lines()
233222
.iter()
234-
.map(|f| (f, true))
235-
.chain(ESSENTIAL_FILES_UNVERSIONED.iter().map(|f| (f, false)));
236-
for (&file, versioned) in files {
237-
let segments = file.rsplitn(2, '.').collect::<Vec<_>>();
238-
let file_name = if versioned {
239-
format!("{}-{}.{}", segments[1], rustc_version, segments[0])
240-
} else {
241-
file.to_string()
242-
};
223+
.map(PathBuf::from);
224+
let resource_suffix = format!("-{}", parse_rustc_version(&self.rustc_version)?);
225+
let essential_files_versioned: Vec<_> = source.read_dir()?
226+
.collect::<std::result::Result<Vec<_>, _>>()?
227+
.into_iter()
228+
.filter_map(|entry| {
229+
entry.file_name().to_str().and_then(|name| if name.contains(&resource_suffix) {
230+
Some(entry.file_name().into())
231+
} else { None })
232+
})
233+
.collect();
234+
for file_name in essential_files_unversioned.chain(essential_files_versioned) {
243235
let source_path = source.join(&file_name);
244236
let dest_path = dest.path().join(&file_name);
237+
debug!("copying {} to {}", source_path.display(), dest_path.display());
245238
::std::fs::copy(&source_path, &dest_path).with_context(|_| {
246239
format!(
247240
"couldn't copy '{}' to '{}'",

0 commit comments

Comments
 (0)