Skip to content

Commit 644ebfd

Browse files
Nemo157syphar
authored andcommitted
Include all versions of a crate on recent + recent-failures pages
1 parent 93c7bab commit 644ebfd

File tree

1 file changed

+70
-33
lines changed

1 file changed

+70
-33
lines changed

src/web/releases.rs

Lines changed: 70 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,13 @@ impl Default for Order {
5656
}
5757
}
5858

59-
pub(crate) fn get_releases(conn: &mut Client, page: i64, limit: i64, order: Order) -> Vec<Release> {
59+
pub(crate) fn get_releases(
60+
conn: &mut Client,
61+
page: i64,
62+
limit: i64,
63+
order: Order,
64+
latest_only: bool,
65+
) -> Vec<Release> {
6066
let offset = (page - 1) * limit;
6167

6268
// WARNING: it is _crucial_ that this always be hard-coded and NEVER be user input
@@ -66,6 +72,7 @@ pub(crate) fn get_releases(conn: &mut Client, page: i64, limit: i64, order: Orde
6672
Order::RecentFailures => ("builds.build_time", true),
6773
Order::FailuresByGithubStars => ("repositories.stars", true),
6874
};
75+
6976
let query = format!(
7077
"SELECT crates.name,
7178
releases.version,
@@ -75,31 +82,35 @@ pub(crate) fn get_releases(conn: &mut Client, page: i64, limit: i64, order: Orde
7582
builds.build_time,
7683
repositories.stars
7784
FROM crates
78-
INNER JOIN releases ON crates.latest_version_id = releases.id
85+
INNER JOIN releases ON crates.id = releases.crate_id
7986
INNER JOIN builds ON releases.id = builds.rid
8087
LEFT JOIN repositories ON releases.repository_id = repositories.id
8188
WHERE
8289
((NOT $3) OR (releases.build_status = FALSE AND releases.is_library = TRUE))
90+
AND ((NOT $4) OR crates.latest_version_id = releases.id)
8391
AND {0} IS NOT NULL
8492
8593
ORDER BY {0} DESC
8694
LIMIT $1 OFFSET $2",
8795
ordering,
8896
);
8997

90-
conn.query(query.as_str(), &[&limit, &offset, &filter_failed])
91-
.unwrap()
92-
.into_iter()
93-
.map(|row| Release {
94-
name: row.get(0),
95-
version: row.get(1),
96-
description: row.get(2),
97-
target_name: row.get(3),
98-
rustdoc_status: row.get(4),
99-
build_time: row.get(5),
100-
stars: row.get::<_, Option<i32>>(6).unwrap_or(0),
101-
})
102-
.collect()
98+
conn.query(
99+
query.as_str(),
100+
&[&limit, &offset, &filter_failed, &latest_only],
101+
)
102+
.unwrap()
103+
.into_iter()
104+
.map(|row| Release {
105+
name: row.get(0),
106+
version: row.get(1),
107+
description: row.get(2),
108+
target_name: row.get(3),
109+
rustdoc_status: row.get(4),
110+
build_time: row.get(5),
111+
stars: row.get::<_, Option<i32>>(6).unwrap_or(0),
112+
})
113+
.collect()
103114
}
104115

105116
fn get_releases_by_owner(
@@ -299,7 +310,7 @@ impl_webpage! {
299310

300311
pub fn home_page(req: &mut Request) -> IronResult<Response> {
301312
let mut conn = extension!(req, Pool).get()?;
302-
let recent_releases = get_releases(&mut conn, 1, RELEASES_IN_HOME, Order::ReleaseTime);
313+
let recent_releases = get_releases(&mut conn, 1, RELEASES_IN_HOME, Order::ReleaseTime, true);
303314

304315
HomePage { recent_releases }.into_response(req)
305316
}
@@ -316,7 +327,7 @@ impl_webpage! {
316327

317328
pub fn releases_feed_handler(req: &mut Request) -> IronResult<Response> {
318329
let mut conn = extension!(req, Pool).get()?;
319-
let recent_releases = get_releases(&mut conn, 1, RELEASES_IN_FEED, Order::ReleaseTime);
330+
let recent_releases = get_releases(&mut conn, 1, RELEASES_IN_FEED, Order::ReleaseTime, true);
320331

321332
ReleaseFeed { recent_releases }.into_response(req)
322333
}
@@ -353,13 +364,18 @@ fn releases_handler(req: &mut Request, release_type: ReleaseType) -> IronResult<
353364
.and_then(|page_num| page_num.parse().ok())
354365
.unwrap_or(1);
355366

356-
let (description, release_order) = match release_type {
357-
ReleaseType::Recent => ("Recently uploaded crates", Order::ReleaseTime),
358-
ReleaseType::Stars => ("Crates with most stars", Order::GithubStars),
359-
ReleaseType::RecentFailures => ("Recent crates failed to build", Order::RecentFailures),
367+
let (description, release_order, latest_only) = match release_type {
368+
ReleaseType::Recent => ("Recently uploaded crates", Order::ReleaseTime, false),
369+
ReleaseType::Stars => ("Crates with most stars", Order::GithubStars, true),
370+
ReleaseType::RecentFailures => (
371+
"Recent crates failed to build",
372+
Order::RecentFailures,
373+
false,
374+
),
360375
ReleaseType::Failures => (
361376
"Crates with most stars failed to build",
362377
Order::FailuresByGithubStars,
378+
true,
363379
),
364380

365381
ReleaseType::Owner | ReleaseType::Search => panic!(
@@ -369,7 +385,13 @@ fn releases_handler(req: &mut Request, release_type: ReleaseType) -> IronResult<
369385

370386
let releases = {
371387
let mut conn = extension!(req, Pool).get()?;
372-
get_releases(&mut conn, page_number, RELEASES_IN_RELEASES, release_order)
388+
get_releases(
389+
&mut conn,
390+
page_number,
391+
RELEASES_IN_RELEASES,
392+
release_order,
393+
latest_only,
394+
)
373395
};
374396

375397
// Show next and previous page buttons
@@ -783,7 +805,7 @@ mod tests {
783805
// release without stars will not be shown
784806
env.fake_release().name("baz").version("1.0.0").create()?;
785807

786-
let releases = get_releases(&mut db.conn(), 1, 10, Order::GithubStars);
808+
let releases = get_releases(&mut db.conn(), 1, 10, Order::GithubStars, true);
787809
assert_eq!(
788810
vec![
789811
"bar", // 20 stars
@@ -1265,7 +1287,13 @@ mod tests {
12651287
.github_stats("some/repo", 33, 22, 11)
12661288
.release_time(Utc.ymd(2020, 4, 16).and_hms(4, 33, 50))
12671289
.create()?;
1268-
// make sure that crates get at most one release shown, so they don't crowd the page
1290+
env.fake_release()
1291+
.name("crate_that_succeeded_with_github")
1292+
.version("0.2.0-rc")
1293+
.github_stats("some/repo", 33, 22, 11)
1294+
.release_time(Utc.ymd(2020, 4, 16).and_hms(8, 33, 50))
1295+
.build_result_failed()
1296+
.create()?;
12691297
env.fake_release()
12701298
.name("crate_that_succeeded_with_github")
12711299
.github_stats("some/repo", 33, 22, 11)
@@ -1279,16 +1307,25 @@ mod tests {
12791307
.build_result_failed()
12801308
.create()?;
12811309

1282-
for page in &["/", "/releases"] {
1283-
let links = get_release_links(page, env.frontend())?;
1310+
// make sure that crates get at most one release shown, so they don't crowd the homepage
1311+
assert_eq!(
1312+
get_release_links("/", env.frontend())?,
1313+
[
1314+
"/crate/crate_that_failed/0.1.0",
1315+
"/crate_that_succeeded_with_github/0.2.0/crate_that_succeeded_with_github/",
1316+
]
1317+
);
12841318

1285-
assert_eq!(links.len(), 2);
1286-
assert_eq!(links[0], "/crate/crate_that_failed/0.1.0");
1287-
assert_eq!(
1288-
links[1],
1289-
"/crate_that_succeeded_with_github/0.2.0/crate_that_succeeded_with_github/"
1290-
);
1291-
}
1319+
// but on the main release list they all show, including prerelease
1320+
assert_eq!(
1321+
get_release_links("/releases", env.frontend())?,
1322+
[
1323+
"/crate/crate_that_failed/0.1.0",
1324+
"/crate_that_succeeded_with_github/0.2.0/crate_that_succeeded_with_github/",
1325+
"/crate/crate_that_succeeded_with_github/0.2.0-rc",
1326+
"/crate_that_succeeded_with_github/0.1.0/crate_that_succeeded_with_github/",
1327+
]
1328+
);
12921329

12931330
Ok(())
12941331
})

0 commit comments

Comments
 (0)