@@ -69,26 +69,36 @@ pub(crate) fn get_releases(conn: &mut Client, page: i64, limit: i64, order: Orde
69
69
70
70
// WARNING: it is _crucial_ that this always be hard-coded and NEVER be user input
71
71
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 ) ,
76
76
} ;
77
77
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
92
102
ORDER BY {0} DESC
93
103
LIMIT $1 OFFSET $2" ,
94
104
ordering,
@@ -1327,6 +1337,31 @@ mod tests {
1327
1337
} )
1328
1338
}
1329
1339
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
+
1330
1365
#[ test]
1331
1366
fn release_feed ( ) {
1332
1367
wrapper ( |env| {
0 commit comments