@@ -14,47 +14,16 @@ use docsrs_metadata::{Metadata, DEFAULT_TARGETS, HOST_TARGET};
14
14
use failure:: ResultExt ;
15
15
use log:: { debug, info, warn, LevelFilter } ;
16
16
use postgres:: Client ;
17
- use rustwide:: cmd:: { Command , SandboxBuilder , SandboxImage } ;
17
+ use rustwide:: cmd:: { Binary , Command , SandboxBuilder , SandboxImage } ;
18
18
use rustwide:: logging:: { self , LogStorage } ;
19
19
use rustwide:: toolchain:: ToolchainError ;
20
20
use rustwide:: { Build , Crate , Toolchain , Workspace , WorkspaceBuilder } ;
21
21
use serde_json:: Value ;
22
22
use std:: collections:: { HashMap , HashSet } ;
23
- use std:: path:: Path ;
23
+ use std:: path:: { Path , PathBuf } ;
24
24
use std:: sync:: Arc ;
25
25
26
26
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
-
58
27
const DUMMY_CRATE_NAME : & str = "empty-library" ;
59
28
const DUMMY_CRATE_VERSION : & str = "1.0.0" ;
60
29
@@ -213,6 +182,20 @@ impl RustwideBuilder {
213
182
let krate = Crate :: crates_io ( DUMMY_CRATE_NAME , DUMMY_CRATE_VERSION ) ;
214
183
krate. fetch ( & self . workspace ) ?;
215
184
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
+
216
199
build_dir
217
200
. build ( & self . toolchain , & krate, self . prepare_sandbox ( & limits) )
218
201
. run ( |build| {
@@ -229,19 +212,29 @@ impl RustwideBuilder {
229
212
. prefix ( "essential-files" )
230
213
. tempdir ( ) ?;
231
214
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 ( )
233
222
. 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) {
243
235
let source_path = source. join ( & file_name) ;
244
236
let dest_path = dest. path ( ) . join ( & file_name) ;
237
+ debug ! ( "copying {} to {}" , source_path. display( ) , dest_path. display( ) ) ;
245
238
:: std:: fs:: copy ( & source_path, & dest_path) . with_context ( |_| {
246
239
format ! (
247
240
"couldn't copy '{}' to '{}'" ,
0 commit comments