@@ -70,6 +70,35 @@ book!(
7070 RustdocBook , "src/doc/rustdoc" , "rustdoc" ;
7171) ;
7272
73+ fn open ( builder : & Builder < ' _ > , path : impl AsRef < Path > ) {
74+ if builder. config . dry_run || !builder. config . cmd . open ( ) {
75+ return ;
76+ }
77+
78+ let path = path. as_ref ( ) ;
79+ builder. info ( & format ! ( "Opening doc {}" , path. display( ) ) ) ;
80+ if let Err ( err) = opener:: open ( path) {
81+ builder. info ( & format ! ( "{}\n " , err) ) ;
82+ }
83+ }
84+
85+ // "src/libstd" -> ["src", "libstd"]
86+ //
87+ // Used for deciding whether a particular step is one requested by the user on
88+ // the `x.py doc` command line, which determines whether `--open` will open that
89+ // page.
90+ fn components_simplified ( path : & PathBuf ) -> Vec < & str > {
91+ path. iter ( ) . map ( |component| component. to_str ( ) . unwrap_or ( "???" ) ) . collect ( )
92+ }
93+
94+ fn is_explicit_request ( builder : & Builder < ' _ > , path : & str ) -> bool {
95+ builder
96+ . paths
97+ . iter ( )
98+ . map ( components_simplified)
99+ . any ( |requested| requested. iter ( ) . copied ( ) . eq ( path. split ( "/" ) ) )
100+ }
101+
73102#[ derive( Debug , Copy , Clone , Hash , PartialEq , Eq ) ]
74103pub struct UnstableBook {
75104 target : Interned < String > ,
@@ -200,6 +229,12 @@ impl Step for TheBook {
200229
201230 invoke_rustdoc ( builder, compiler, target, path) ;
202231 }
232+
233+ if is_explicit_request ( builder, "src/doc/book" ) {
234+ let out = builder. doc_out ( target) ;
235+ let index = out. join ( "book" ) . join ( "index.html" ) ;
236+ open ( builder, & index) ;
237+ }
203238 }
204239}
205240
@@ -338,6 +373,13 @@ impl Step for Standalone {
338373 }
339374 builder. run ( & mut cmd) ;
340375 }
376+
377+ // We open doc/index.html as the default if invoked as `x.py doc --open`
378+ // with no particular explicit doc requested (e.g. src/libcore).
379+ if builder. paths . is_empty ( ) || is_explicit_request ( builder, "src/doc" ) {
380+ let index = out. join ( "index.html" ) ;
381+ open ( builder, & index) ;
382+ }
341383 }
342384}
343385
@@ -418,10 +460,25 @@ impl Step for Std {
418460
419461 builder. run ( & mut cargo. into ( ) ) ;
420462 } ;
421- for krate in & [ "alloc" , "core" , "std" , "proc_macro" , "test" ] {
463+ let krates = [ "alloc" , "core" , "std" , "proc_macro" , "test" ] ;
464+ for krate in & krates {
422465 run_cargo_rustdoc_for ( krate) ;
423466 }
424467 builder. cp_r ( & my_out, & out) ;
468+
469+ // Look for src/libstd, src/libcore etc in the `x.py doc` arguments and
470+ // open the corresponding rendered docs.
471+ for path in builder. paths . iter ( ) . map ( components_simplified) {
472+ if path. get ( 0 ) == Some ( & "src" )
473+ && path. get ( 1 ) . map_or ( false , |dir| dir. starts_with ( "lib" ) )
474+ {
475+ let requested_crate = & path[ 1 ] [ 3 ..] ;
476+ if krates. contains ( & requested_crate) {
477+ let index = out. join ( requested_crate) . join ( "index.html" ) ;
478+ open ( builder, & index) ;
479+ }
480+ }
481+ }
425482 }
426483}
427484
0 commit comments