@@ -70,6 +70,35 @@ book!(
70
70
RustdocBook , "src/doc/rustdoc" , "rustdoc" ;
71
71
) ;
72
72
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
+
73
102
#[ derive( Debug , Copy , Clone , Hash , PartialEq , Eq ) ]
74
103
pub struct UnstableBook {
75
104
target : Interned < String > ,
@@ -200,6 +229,12 @@ impl Step for TheBook {
200
229
201
230
invoke_rustdoc ( builder, compiler, target, path) ;
202
231
}
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
+ }
203
238
}
204
239
}
205
240
@@ -338,6 +373,13 @@ impl Step for Standalone {
338
373
}
339
374
builder. run ( & mut cmd) ;
340
375
}
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
+ }
341
383
}
342
384
}
343
385
@@ -418,10 +460,25 @@ impl Step for Std {
418
460
419
461
builder. run ( & mut cargo. into ( ) ) ;
420
462
} ;
421
- for krate in & [ "alloc" , "core" , "std" , "proc_macro" , "test" ] {
463
+ let krates = [ "alloc" , "core" , "std" , "proc_macro" , "test" ] ;
464
+ for krate in & krates {
422
465
run_cargo_rustdoc_for ( krate) ;
423
466
}
424
467
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
+ }
425
482
}
426
483
}
427
484
0 commit comments