Skip to content

Commit 395daf7

Browse files
jyn514Joshua Nelson
authored and
Joshua Nelson
committed
Redirect to documentation in the version link
Previously it would redirect to /crate, which no one wanted to look at.
1 parent ae0a4ed commit 395daf7

File tree

4 files changed

+72
-10
lines changed

4 files changed

+72
-10
lines changed

src/web/rustdoc.rs

Lines changed: 61 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ pub fn rustdoc_redirector_handler(req: &mut Request) -> IronResult<Response> {
181181
struct RustdocPage {
182182
latest_path: String,
183183
latest_version: String,
184+
target: String,
184185
inner_path: String,
185186
is_latest_version: bool,
186187
is_prerelease: bool,
@@ -400,23 +401,29 @@ pub fn rustdoc_html_server_handler(req: &mut Request) -> IronResult<Response> {
400401
}
401402

402403
// The path within this crate version's rustdoc output
403-
let inner_path = {
404+
let (target, inner_path) = {
404405
let mut inner_path = req_path.clone();
405406

406407
// Drop the `rustdoc/:crate/:version[/:platform]` prefix
407408
inner_path.drain(..3).for_each(drop);
408409

409-
if inner_path.len() > 1 && krate.doc_targets.iter().any(|s| s == inner_path[0]) {
410-
inner_path.remove(0);
411-
}
410+
let target = if inner_path.len() > 1 && krate.doc_targets.iter().any(|s| s == inner_path[0])
411+
{
412+
let mut target = inner_path.remove(0).to_string();
413+
target.push('/');
414+
target
415+
} else {
416+
String::new()
417+
};
412418

413-
inner_path.join("/")
419+
(target, inner_path.join("/"))
414420
};
415421

416422
rendering_time.step("rewrite html");
417423
RustdocPage {
418424
latest_path,
419425
latest_version,
426+
target,
420427
inner_path,
421428
is_latest_version,
422429
is_prerelease,
@@ -1513,7 +1520,7 @@ mod test {
15131520
let status = |version| -> Result<_, failure::Error> {
15141521
let page =
15151522
kuchiki::parse_html().one(web.get("/crate/hexponent/0.3.0").send()?.text()?);
1516-
let selector = format!(r#"ul > li a[href="/crate/hexponent/{}""#, version);
1523+
let selector = format!(r#"ul > li a[href="/crate/hexponent/{}"]"#, version);
15171524
let anchor = page
15181525
.select(&selector)
15191526
.unwrap()
@@ -1569,4 +1576,52 @@ mod test {
15691576
Ok(())
15701577
});
15711578
}
1579+
1580+
#[test]
1581+
fn test_version_link_goes_to_docs() {
1582+
wrapper(|env| {
1583+
env.fake_release()
1584+
.name("hexponent")
1585+
.version("0.3.0")
1586+
.rustdoc_file("hexponent/index.html")
1587+
.create()?;
1588+
env.fake_release()
1589+
.name("hexponent")
1590+
.version("0.3.1")
1591+
.rustdoc_file("hexponent/index.html")
1592+
.create()?;
1593+
1594+
// test rustdoc pages stay on the documentation
1595+
let page = kuchiki::parse_html().one(
1596+
env.frontend()
1597+
.get("/hexponent/0.3.0/hexponent/")
1598+
.send()?
1599+
.text()?,
1600+
);
1601+
let selector = format!(
1602+
r#"ul > li a[href="/crate/hexponent/0.3.1/target-redirect/hexponent/index.html"]"#
1603+
);
1604+
assert_eq!(
1605+
page.select(&selector).unwrap().count(),
1606+
1,
1607+
"link to /target-redirect/ not found"
1608+
);
1609+
1610+
// test /crate pages stay on /crate
1611+
let page = kuchiki::parse_html().one(
1612+
env.frontend()
1613+
.get("/crate/hexponent/0.3.0/")
1614+
.send()?
1615+
.text()?,
1616+
);
1617+
let selector = format!(r#"ul > li a[href="/crate/hexponent/0.3.1"]"#);
1618+
assert_eq!(
1619+
page.select(&selector).unwrap().count(),
1620+
1,
1621+
"link to /crate not found"
1622+
);
1623+
1624+
Ok(())
1625+
})
1626+
}
15721627
}

templates/crate/details.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@
103103
<div class="pure-menu pure-menu-scrollable sub-menu">
104104
<ul class="pure-menu-list">
105105
{# Display all releases of this crate #}
106-
{{ macros::releases_list(name=details.name, releases=details.releases) }}
106+
{{ macros::releases_list(name=details.name, releases=details.releases, target="", inner_path="") }}
107107
</ul>
108108
</div>
109109
</li>

templates/macros.html

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,18 @@
114114
* `yanked` A boolean of the release's yanked status
115115
* `build_status` A boolean of the crate's build status (true for built, false for failed build)
116116
* `is_library` A boolean that's true if the crate is a library and false if it's a binary
117+
* `target` The target platform (empty string if the default or a `/crate` page)
118+
* `inner_path` The current rustdoc page (empty string if a `/crate` page)
117119
#}
118-
{% macro releases_list(name, releases) %}
120+
{% macro releases_list(name, releases, target, inner_path) %}
119121
{%- for release in releases -%}
120122
{# The url for the release, `/crate/:name/:version` #}
121-
{%- set release_url = "/crate/" ~ name ~ "/" ~ release.version -%}
123+
{# NOTE: `/` is part of target if it exists (to avoid `target-direct//path`) #}
124+
{% if inner_path == "" %} {# /crate #}
125+
{%- set release_url = "/crate/" ~ name ~ "/" ~ release.version -%}
126+
{% else %}
127+
{%- set release_url = "/crate/" ~ name ~ "/" ~ release.version ~ "/target-redirect/" ~ target ~ inner_path -%}
128+
{% endif %}
122129
{# The release's name and version, `:name-:version` #}
123130
{%- set release_name = name ~ "-" ~ release.version -%}
124131

templates/rustdoc/header.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@
147147
<div class="pure-menu pure-menu-scrollable sub-menu">
148148
<ul class="pure-menu-list">
149149
{# Display all releases of this crate #}
150-
{{ macros::releases_list(name=krate.name, releases=krate.releases) }}
150+
{{ macros::releases_list(name=krate.name, releases=krate.releases, target=target, inner_path=inner_path) }}
151151
</ul>
152152
</div>
153153
</li>

0 commit comments

Comments
 (0)