Skip to content

Commit 70b5819

Browse files
committed
Show at most one crates from the same repo in /releases search
This avoids showing rustc_ap_* three dozen times in a row. TODO: is it correct to pick the latest published crate? Is there a way to find the "main" crate from a repository?
1 parent 25c9430 commit 70b5819

File tree

1 file changed

+53
-18
lines changed

1 file changed

+53
-18
lines changed

src/web/releases.rs

Lines changed: 53 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -69,26 +69,36 @@ pub(crate) fn get_releases(conn: &mut Client, page: i64, limit: i64, order: Orde
6969

7070
// WARNING: it is _crucial_ that this always be hard-coded and NEVER be user input
7171
let (ordering, filter_failed): (&'static str, _) = match order {
72-
Order::ReleaseTime => ("releases.release_time", false),
73-
Order::GithubStars => ("repositories.stars", false),
74-
Order::RecentFailures => ("releases.release_time", true),
75-
Order::FailuresByGithubStars => ("repositories.stars", true),
72+
Order::ReleaseTime => ("release_time", false),
73+
Order::GithubStars => ("stars", false),
74+
Order::RecentFailures => ("release_time", true),
75+
Order::FailuresByGithubStars => ("stars", true),
7676
};
7777
let query = format!(
78-
"SELECT crates.name,
79-
releases.version,
80-
releases.description,
81-
releases.target_name,
82-
releases.release_time,
83-
releases.rustdoc_status,
84-
repositories.stars
85-
FROM crates
86-
INNER JOIN releases ON crates.latest_version_id = releases.id
87-
LEFT JOIN repositories ON releases.repository_id = repositories.id
88-
WHERE
89-
((NOT $3) OR (releases.build_status = FALSE AND releases.is_library = TRUE))
90-
AND {0} IS NOT NULL
91-
78+
"SELECT name,
79+
version,
80+
description,
81+
target_name,
82+
release_time,
83+
rustdoc_status,
84+
stars
85+
FROM (
86+
SELECT crates.name,
87+
releases.version,
88+
releases.description,
89+
releases.target_name,
90+
releases.release_time,
91+
releases.rustdoc_status,
92+
repositories.stars,
93+
rank() OVER (PARTITION BY repository_id ORDER BY release_time DESC) AS rank
94+
FROM crates
95+
INNER JOIN releases ON crates.latest_version_id = releases.id
96+
LEFT JOIN repositories ON releases.repository_id = repositories.id
97+
WHERE
98+
((NOT $3) OR (releases.build_status = FALSE AND releases.is_library = TRUE))
99+
AND {0} IS NOT NULL
100+
) i
101+
WHERE rank = 1
92102
ORDER BY {0} DESC
93103
LIMIT $1 OFFSET $2",
94104
ordering,
@@ -1327,6 +1337,31 @@ mod tests {
13271337
})
13281338
}
13291339

1340+
#[test]
1341+
fn repos_deduplicated() {
1342+
wrapper(|env| {
1343+
// make sure repositories get at most one release shown
1344+
env.fake_release()
1345+
.name("workspace_crate1")
1346+
.github_stats("some/repo", 33, 22, 11)
1347+
.release_time(Utc.ymd(2020, 5, 15).and_hms(4, 33, 50))
1348+
.version("0.1.0")
1349+
.create()?;
1350+
env.fake_release()
1351+
.name("workspace_crate2")
1352+
.github_stats("some/repo", 34, 22, 11)
1353+
.release_time(Utc.ymd(2020, 5, 16).and_hms(4, 33, 50))
1354+
.version("0.1.0")
1355+
.create()?;
1356+
1357+
let links = get_release_links("/", env.frontend())?;
1358+
1359+
assert_eq!(links.len(), 1, "{:?}", links);
1360+
assert_eq!(links[0], "/workspace_crate2/0.1.0/workspace_crate2/");
1361+
Ok(())
1362+
});
1363+
}
1364+
13301365
#[test]
13311366
fn release_feed() {
13321367
wrapper(|env| {

0 commit comments

Comments
 (0)