Skip to content

Commit 0053932

Browse files
committed
Add "Go to latest version" link for outdated docs
Closes: #57
1 parent 48e07b2 commit 0053932

File tree

4 files changed

+74
-3
lines changed

4 files changed

+74
-3
lines changed

src/web/mod.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,41 @@ fn render_markdown(text: &str) -> String {
329329

330330

331331

332+
/// Returns latest version if required version is not the latest
333+
/// req_version must be an exact version
334+
fn latest_version(versions_json: &Json, req_version: &str) -> Option<String> {
335+
let req_version = match Version::parse(req_version) {
336+
Ok(v) => v,
337+
Err(_) => return None,
338+
};
339+
let versions = {
340+
let mut versions: Vec<Version> = Vec::new();
341+
for version in versions_json.as_array().unwrap() {
342+
let version: String = version.as_string().unwrap().to_owned();
343+
let version = match Version::parse(&version) {
344+
Ok(v) => v,
345+
Err(_) => return None,
346+
};
347+
versions.push(version);
348+
}
349+
350+
versions.sort();
351+
versions.reverse();
352+
versions
353+
};
354+
355+
if req_version != versions[0] {
356+
for i in 1..versions.len() {
357+
if req_version == versions[i] {
358+
return Some(format!("{}", versions[0]))
359+
}
360+
}
361+
}
362+
None
363+
}
364+
365+
366+
332367
/// Starts cratesfyi web server
333368
pub fn start_web_server(sock_addr: Option<&str>) {
334369
let cratesfyi = CratesfyiHandler::new();
@@ -441,4 +476,21 @@ mod test {
441476
let _ = env_logger::init();
442477
start_web_server(None);
443478
}
479+
480+
#[test]
481+
fn test_latest_version() {
482+
let json = r#"
483+
[
484+
"1.0.0",
485+
"1.1.0",
486+
"0.9.0",
487+
"0.9.1"
488+
]
489+
"#;
490+
let json = Json::from_str(json).unwrap();
491+
assert_eq!(latest_version(&json, "1.1.0"), None);
492+
assert_eq!(latest_version(&json, "1.0.0"), Some("1.1.0".to_owned()));
493+
assert_eq!(latest_version(&json, "0.9.0"), Some("1.1.0".to_owned()));
494+
assert_eq!(latest_version(&json, "invalidversion"), None);
495+
}
444496
}

src/web/rustdoc.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
use super::pool::Pool;
55
use super::file::File;
66
use super::MetaData;
7+
use super::latest_version;
78
use iron::prelude::*;
89
use iron::{status, Url};
910
use iron::modifiers::Redirect;
@@ -180,13 +181,14 @@ pub fn rustdoc_html_server_handler(req: &mut Request) -> IronResult<Response> {
180181
}
181182

182183
// content.metadata = MetaData::from_crate(&conn, &name, &version);
183-
let (metadata, platforms) = {
184+
let (metadata, platforms, latest_version) = {
184185
let rows = ctry!(conn.query("SELECT crates.name,
185186
releases.version,
186187
releases.description,
187188
releases.target_name,
188189
releases.rustdoc_status,
189-
doc_targets
190+
doc_targets,
191+
crates.versions
190192
FROM releases
191193
INNER JOIN crates ON crates.id = releases.crate_id
192194
WHERE crates.name = $1 AND releases.version = $2",
@@ -200,7 +202,8 @@ pub fn rustdoc_html_server_handler(req: &mut Request) -> IronResult<Response> {
200202
rustdoc_status: rows.get(0).get(4),
201203
};
202204
let platforms: Json = rows.get(0).get(5);
203-
(Some(metadata), platforms)
205+
let versions = rows.get(0).get(6);
206+
(Some(metadata), platforms, latest_version(&versions, &version))
204207
};
205208

206209
content.metadata = metadata;
@@ -210,6 +213,8 @@ pub fn rustdoc_html_server_handler(req: &mut Request) -> IronResult<Response> {
210213
.set_true("show_package_navigation")
211214
.set_true("package_navigation_documentation_tab")
212215
.set_true("package_navigation_show_platforms_tab")
216+
.set_bool("is_latest_version", latest_version.is_none())
217+
.set("latest_version", &latest_version.unwrap_or(String::new()))
213218
.to_resp("rustdoc")
214219
}
215220

templates/navigation_rustdoc.hbs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111
<li class="pure-menu-item">
1212
<a href="/crate/{{name}}/{{version}}" class="pure-menu-link" title="{{description}}"><i class="fa fa-fw fa-cube"></i><span class="title"> {{name}}-{{version}}</span></a>
1313
</li>
14+
{{#unless ../../varsb.is_latest_version}}
15+
<li class="pure-menu-item">
16+
<a href="/{{name}}/{{../../varss.latest_version}}" class="pure-menu-link warn" title="You are seeing an outdated version of {{name}} crate. Click here to go to latest version."><i class="fa fa-fw fa-warning"></i><span class="title"> Go to latest version</span></a>
17+
</li>
18+
{{/unless}}
1419
<li class="pure-menu-item">
1520
<a href="/crate/{{name}}/{{version}}/source/" title="Browse source of {{name}}-{{version}}" class="pure-menu-link{{#if ../../varsb.package_source_tab}} pure-menu-active{{/if}}"><i class="fa fa-fw fa-folder-open-o"></i><span class="title"> Source</span></a>
1621
</li>

templates/style.scss

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,15 @@ div.nav-container {
154154
}
155155
}
156156

157+
// used for latest version warning
158+
.warn {
159+
color: $color-type;
160+
}
161+
162+
.warn:hover {
163+
color: darken($color-type, 10%);
164+
}
165+
157166
div.rustdoc-navigation {
158167
span.title {
159168
display: none;

0 commit comments

Comments
 (0)