Skip to content

Commit 0cdba85

Browse files
Koenraad VerheydenJoshua Nelson
Koenraad Verheyden
authored and
Joshua Nelson
committed
refactor CrateDetails: add yanked to Release
This avoids doing an additional query to determine the last successful build.
1 parent dc3fbf3 commit 0cdba85

File tree

1 file changed

+18
-27
lines changed

1 file changed

+18
-27
lines changed

src/web/crate_details.rs

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ impl ToJson for CrateDetails {
9696
struct Release {
9797
pub version: String,
9898
pub build_status: bool,
99+
pub yanked: bool,
99100
}
100101

101102

@@ -235,21 +236,11 @@ impl CrateDetails {
235236
crate_details.owners.push((row.get(0), row.get(1)));
236237
}
237238

238-
// retrieve last successful build if build failed
239239
if !crate_details.build_status {
240-
let rows = conn.query(
241-
"SELECT version
242-
FROM releases
243-
INNER JOIN crates ON releases.crate_id = crates.id
244-
WHERE build_status = true AND yanked = false AND crates.name = $1
245-
ORDER BY release_time desc
246-
LIMIT 1;",
247-
&[&name],
248-
).unwrap();
249-
250-
if rows.len() >= 1 {
251-
crate_details.last_successful_build = Some(rows.get(0).get(0));
252-
}
240+
crate_details.last_successful_build = crate_details.releases.iter()
241+
.filter(|release| release.build_status && !release.yanked)
242+
.map(|release| release.version.to_owned())
243+
.nth(0);
253244
}
254245

255246
Some(crate_details)
@@ -264,19 +255,19 @@ impl CrateDetails {
264255

265256
fn map_to_release(conn: &Connection, crate_id: i32, version: String) -> Release {
266257
let rows = conn.query(
267-
"SELECT build_status
258+
"SELECT build_status, yanked
268259
FROM releases
269260
WHERE releases.crate_id = $1 and releases.version = $2;",
270261
&[&crate_id, &version],
271262
).unwrap();
272263

273-
let build_status = if !rows.is_empty() {
274-
rows.get(0).get(0)
264+
let (build_status, yanked) = if !rows.is_empty() {
265+
(rows.get(0).get(0), rows.get(0).get(1))
275266
} else {
276-
false
267+
Default::default()
277268
};
278269

279-
Release { version, build_status }
270+
Release { version, build_status, yanked }
280271
}
281272

282273

@@ -401,18 +392,18 @@ mod tests {
401392
db.fake_release().name("foo").version("0.3.0").build_result_successful(false).create()?;
402393
db.fake_release().name("foo").version("1.0.0").create()?;
403394
db.fake_release().name("foo").version("0.12.0").create()?;
404-
db.fake_release().name("foo").version("0.2.0").create()?;
395+
db.fake_release().name("foo").version("0.2.0").cratesio_data_yanked(true).create()?;
405396
db.fake_release().name("foo").version("0.2.0-alpha").create()?;
406397

407398
let details = CrateDetails::new(&db.conn(), "foo", "0.2.0").unwrap();
408399
assert_eq!(details.releases, vec![
409-
Release { version: "1.0.0".to_string(), build_status: true },
410-
Release { version: "0.12.0".to_string(), build_status: true },
411-
Release { version: "0.3.0".to_string(), build_status: false },
412-
Release { version: "0.2.0".to_string(), build_status: true },
413-
Release { version: "0.2.0-alpha".to_string(), build_status: true },
414-
Release { version: "0.1.1".to_string(), build_status: true },
415-
Release { version: "0.1.0".to_string(), build_status: true },
400+
Release { version: "1.0.0".to_string(), build_status: true, yanked: false },
401+
Release { version: "0.12.0".to_string(), build_status: true, yanked: false },
402+
Release { version: "0.3.0".to_string(), build_status: false, yanked: false },
403+
Release { version: "0.2.0".to_string(), build_status: true, yanked: true },
404+
Release { version: "0.2.0-alpha".to_string(), build_status: true, yanked: false },
405+
Release { version: "0.1.1".to_string(), build_status: true, yanked: false },
406+
Release { version: "0.1.0".to_string(), build_status: true, yanked: false },
416407
]);
417408

418409
Ok(())

0 commit comments

Comments
 (0)