Skip to content

Commit 3cf195e

Browse files
author
Koenraad Verheyden
committed
crate_details: show a warning next to releases that failed to build
CrateDetails: replace field 'versions' with 'releases', which contains both the version and the build status of a release. Since CrateDetails::versions was a public field, CrateDetails::versions() is designed to be compatible with the previous exposed field.
1 parent 036c2e7 commit 3cf195e

File tree

4 files changed

+68
-9
lines changed

4 files changed

+68
-9
lines changed

src/web/crate_details.rs

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ pub struct CrateDetails {
3838
keywords: Option<Json>,
3939
have_examples: bool, // need to check this manually
4040
pub target_name: String,
41-
pub versions: Vec<String>,
41+
releases: Vec<Release>,
4242
github: bool, // is crate hosted in github
4343
github_stars: Option<i32>,
4444
github_forks: Option<i32>,
@@ -77,7 +77,7 @@ impl ToJson for CrateDetails {
7777
m.insert("keywords".to_string(), self.keywords.to_json());
7878
m.insert("have_examples".to_string(), self.have_examples.to_json());
7979
m.insert("target_name".to_string(), self.target_name.to_json());
80-
m.insert("versions".to_string(), self.versions.to_json());
80+
m.insert("releases".to_string(), self.releases.to_json());
8181
m.insert("github".to_string(), self.github.to_json());
8282
m.insert("github_stars".to_string(), self.github_stars.to_json());
8383
m.insert("github_forks".to_string(), self.github_forks.to_json());
@@ -92,6 +92,23 @@ impl ToJson for CrateDetails {
9292
}
9393

9494

95+
#[derive(Debug, Eq, PartialEq)]
96+
struct Release {
97+
pub version: String,
98+
pub build_status: bool,
99+
}
100+
101+
102+
impl ToJson for Release {
103+
fn to_json(&self) -> Json {
104+
let mut m: BTreeMap<String, Json> = BTreeMap::new();
105+
m.insert("version".to_string(), self.version.to_json());
106+
m.insert("build_status".to_string(), self.build_status.to_json());
107+
m.to_json()
108+
}
109+
}
110+
111+
95112
impl CrateDetails {
96113
pub fn new(conn: &Connection, name: &str, version: &str) -> Option<CrateDetails> {
97114

@@ -135,7 +152,7 @@ impl CrateDetails {
135152
let release_id: i32 = rows.get(0).get(1);
136153

137154
// sort versions with semver
138-
let versions = {
155+
let releases = {
139156
let mut versions: Vec<semver::Version> = Vec::new();
140157
let versions_from_db: Json = rows.get(0).get(17);
141158

@@ -151,7 +168,7 @@ impl CrateDetails {
151168

152169
versions.sort();
153170
versions.reverse();
154-
versions.iter().map(|semver| format!("{}", semver)).collect()
171+
versions.iter().map(|version| map_to_release(&conn, crate_id, version.to_string())).collect()
155172
};
156173

157174
let metadata = MetaData {
@@ -181,7 +198,7 @@ impl CrateDetails {
181198
keywords: rows.get(0).get(14),
182199
have_examples: rows.get(0).get(15),
183200
target_name: rows.get(0).get(16),
184-
versions: versions,
201+
releases,
185202
github: false,
186203
github_stars: rows.get(0).get(18),
187204
github_forks: rows.get(0).get(19),
@@ -237,6 +254,31 @@ impl CrateDetails {
237254

238255
Some(crate_details)
239256
}
257+
258+
/// Returns all versions of this crate.
259+
pub fn versions(&self) -> Vec<String> {
260+
self.releases.iter()
261+
.map(|release| release.version.clone())
262+
.collect()
263+
}
264+
}
265+
266+
267+
fn map_to_release(conn: &Connection, crate_id: i32, version: String) -> Release {
268+
let rows = conn.query(
269+
"SELECT build_status
270+
FROM releases
271+
WHERE releases.crate_id = $1 and releases.version = $2;",
272+
&[&crate_id, &version],
273+
).unwrap();
274+
275+
let build_status = if !rows.is_empty() {
276+
rows.get(0).get(0)
277+
} else {
278+
false
279+
};
280+
281+
Release { version, build_status }
240282
}
241283

242284

@@ -355,7 +397,13 @@ mod tests {
355397

356398
let details = CrateDetails::new(&db.conn(), "foo", "0.0.2").unwrap();
357399

358-
assert_eq!(details.versions, vec!["1.0.0", "0.0.3", "0.0.2", "0.0.1"]);
400+
assert_eq!(details.versions(), vec!["1.0.0", "0.0.3", "0.0.2", "0.0.1"]);
401+
assert_eq!(details.releases, vec![
402+
Release { version: "1.0.0".to_string(), build_status: true },
403+
Release { version: "0.0.3".to_string(), build_status: false },
404+
Release { version: "0.0.2".to_string(), build_status: true },
405+
Release { version: "0.0.1".to_string(), build_status: true },
406+
]);
359407

360408
Ok(())
361409
});

src/web/rustdoc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ pub fn rustdoc_html_server_handler(req: &mut Request) -> IronResult<Response> {
262262

263263
content.full = file_content;
264264
let crate_details = cexpect!(CrateDetails::new(&conn, &name, &version));
265-
let (path, version) = if let Some(version) = latest_version(&crate_details.versions, &version) {
265+
let (path, version) = if let Some(version) = latest_version(&crate_details.versions(), &version) {
266266
req_path[2] = &version;
267267
(path_for_version(&req_path, &crate_details.target_name, &conn), version)
268268
} else {

templates/crate_details.hbs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,14 @@
4242
<li class="pure-menu-item">
4343
<div class="pure-menu pure-menu-scrollable sub-menu">
4444
<ul class="pure-menu-list">
45-
{{#each versions}}
46-
<li class="pure-menu-item"><a href="/crate/{{../name}}/{{this}}" class="pure-menu-link">{{this}}</a></li>
45+
{{#each releases}}
46+
<li class="pure-menu-item">
47+
{{#if this.build_status}}
48+
<a href="/crate/{{../name}}/{{this.version}}" class="pure-menu-link">{{this.version}}</a>
49+
{{else}}
50+
<a href="/crate/{{../name}}/{{this.version}}" class="pure-menu-link warn"><i class="fa fa-fw fa-warning"></i> {{this.version}} (build failed)</a>
51+
{{/if}}
52+
</li>
4753
{{/each}}
4854
</ul>
4955
</div>

templates/style.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,11 @@ div.package-page-container {
521521
background-color: $color-background-code;
522522
}
523523

524+
// used for versions that failed to build
525+
a.warn {
526+
color: $color-type;
527+
}
528+
524529
div.sub-menu {
525530
max-height: 135px;
526531
overflow-y: auto;

0 commit comments

Comments
 (0)