Skip to content

Commit ccac550

Browse files
start adding --extern-html-root-url to rustdoc flags
1 parent 3c06148 commit ccac550

File tree

1 file changed

+39
-2
lines changed

1 file changed

+39
-2
lines changed

src/utils/build_doc.rs

+39-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ use std::sync::Arc;
1010
use cargo::core::{self, SourceId, Dependency, Source, Package, Workspace};
1111
use cargo::core::compiler::{DefaultExecutor, CompileMode, MessageFormat, BuildConfig, Executor};
1212
use cargo::core::package::PackageSet;
13+
use cargo::core::registry::PackageRegistry;
14+
use cargo::core::resolver;
1315
use cargo::core::source::SourceMap;
1416
use cargo::util::{CargoResult, Config, internal, Filesystem};
1517
use cargo::sources::SourceConfigMap;
@@ -70,12 +72,20 @@ pub fn build_doc(name: &str, vers: Option<&str>, target: Option<&str>) -> Result
7072

7173
// since https://github.com/rust-lang/rust/pull/48511 we can pass --resource-suffix to
7274
// 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
7575
let mut rustdoc_args: Vec<String> =
7676
vec!["-Z".to_string(), "unstable-options".to_string(),
7777
"--resource-suffix".to_string(),
7878
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+
7989
if let Some(package_rustdoc_args) = metadata.rustdoc_args {
8090
rustdoc_args.append(&mut package_rustdoc_args.iter().map(|s| s.to_owned()).collect());
8191
}
@@ -114,7 +124,34 @@ pub fn build_doc(name: &str, vers: Option<&str>, target: Option<&str>) -> Result
114124
Ok(try!(ws.current()).clone())
115125
}
116126

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+
}
117152

153+
Ok(ret)
154+
}
118155

119156
/// Downloads a crate and returns Cargo Package.
120157
pub fn get_package(name: &str, vers: Option<&str>) -> CargoResult<Package> {

0 commit comments

Comments
 (0)