@@ -10,6 +10,8 @@ use std::sync::Arc;
10
10
use cargo:: core:: { self , SourceId , Dependency , Source , Package , Workspace } ;
11
11
use cargo:: core:: compiler:: { DefaultExecutor , CompileMode , MessageFormat , BuildConfig , Executor } ;
12
12
use cargo:: core:: package:: PackageSet ;
13
+ use cargo:: core:: registry:: PackageRegistry ;
14
+ use cargo:: core:: resolver;
13
15
use cargo:: core:: source:: SourceMap ;
14
16
use cargo:: util:: { CargoResult , Config , internal, Filesystem } ;
15
17
use cargo:: sources:: SourceConfigMap ;
@@ -70,12 +72,20 @@ pub fn build_doc(name: &str, vers: Option<&str>, target: Option<&str>) -> Result
70
72
71
73
// since https://github.com/rust-lang/rust/pull/48511 we can pass --resource-suffix to
72
74
// add correct version numbers to css and javascript files
73
- // TODO: we can add --extern-html-root-url too, thanks to
74
- // https://github.com/rust-lang/rust/pull/51384
75
75
let mut rustdoc_args: Vec < String > =
76
76
vec ! [ "-Z" . to_string( ) , "unstable-options" . to_string( ) ,
77
77
"--resource-suffix" . to_string( ) ,
78
78
format!( "-{}" , parse_rustc_version( get_current_versions( ) ?. 0 ) ?) ] ;
79
+
80
+ // since https://github.com/rust-lang/rust/pull/51384, we can pass --extern-html-root-url to
81
+ // force rustdoc to link to other docs.rs docs for dependencies
82
+ let source = try!( source_cfg_map. load ( & source_id) ) ;
83
+ for ( name, dep) in try!( resolve_deps ( & pkg, & config, source) ) {
84
+ rustdoc_args. push ( "--extern-html-root-url" . to_string ( ) ) ;
85
+ rustdoc_args. push ( format ! ( "{}=https://docs.rs/{}/{}" ,
86
+ name. replace( "-" , "_" ) , dep. name( ) , dep. version( ) ) ) ;
87
+ }
88
+
79
89
if let Some ( package_rustdoc_args) = metadata. rustdoc_args {
80
90
rustdoc_args. append ( & mut package_rustdoc_args. iter ( ) . map ( |s| s. to_owned ( ) ) . collect ( ) ) ;
81
91
}
@@ -114,7 +124,34 @@ pub fn build_doc(name: &str, vers: Option<&str>, target: Option<&str>) -> Result
114
124
Ok ( try!( ws. current ( ) ) . clone ( ) )
115
125
}
116
126
127
+ fn resolve_deps < ' cfg > ( pkg : & Package , config : & ' cfg Config , src : Box < Source + ' cfg > )
128
+ -> CargoResult < Vec < ( String , Package ) > >
129
+ {
130
+ let mut registry = try!( PackageRegistry :: new ( config) ) ;
131
+ registry. add_preloaded ( src) ;
132
+ registry. lock_patches ( ) ;
133
+
134
+ let resolver = try!( resolver:: resolve (
135
+ & [ ( pkg. summary ( ) . clone ( ) , resolver:: Method :: Everything ) ] ,
136
+ pkg. manifest ( ) . replace ( ) ,
137
+ & mut registry,
138
+ & Default :: default ( ) ,
139
+ None ,
140
+ false ,
141
+ ) ) ;
142
+ let dep_ids = resolver. deps ( pkg. package_id ( ) ) . map ( |p| p. 0 ) . cloned ( ) . collect :: < Vec < _ > > ( ) ;
143
+ let pkg_set = try!( registry. get ( & dep_ids) ) ;
144
+ let deps = try!( pkg_set. get_many ( & dep_ids) ) ;
145
+
146
+ let mut ret = Vec :: new ( ) ;
147
+ for dep in deps {
148
+ if let Some ( d) = pkg. dependencies ( ) . iter ( ) . find ( |d| d. package_name ( ) == dep. name ( ) ) {
149
+ ret. push ( ( d. name_in_toml ( ) . to_string ( ) , dep. clone ( ) ) ) ;
150
+ }
151
+ }
117
152
153
+ Ok ( ret)
154
+ }
118
155
119
156
/// Downloads a crate and returns Cargo Package.
120
157
pub fn get_package ( name : & str , vers : Option < & str > ) -> CargoResult < Package > {
0 commit comments