@@ -56,7 +56,13 @@ impl Default for Order {
56
56
}
57
57
}
58
58
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 > {
60
66
let offset = ( page - 1 ) * limit;
61
67
62
68
// 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
66
72
Order :: RecentFailures => ( "builds.build_time" , true ) ,
67
73
Order :: FailuresByGithubStars => ( "repositories.stars" , true ) ,
68
74
} ;
75
+
69
76
let query = format ! (
70
77
"SELECT crates.name,
71
78
releases.version,
@@ -75,31 +82,35 @@ pub(crate) fn get_releases(conn: &mut Client, page: i64, limit: i64, order: Orde
75
82
builds.build_time,
76
83
repositories.stars
77
84
FROM crates
78
- INNER JOIN releases ON crates.latest_version_id = releases.id
85
+ INNER JOIN releases ON crates.id = releases.crate_id
79
86
INNER JOIN builds ON releases.id = builds.rid
80
87
LEFT JOIN repositories ON releases.repository_id = repositories.id
81
88
WHERE
82
89
((NOT $3) OR (releases.build_status = FALSE AND releases.is_library = TRUE))
90
+ AND ((NOT $4) OR crates.latest_version_id = releases.id)
83
91
AND {0} IS NOT NULL
84
92
85
93
ORDER BY {0} DESC
86
94
LIMIT $1 OFFSET $2" ,
87
95
ordering,
88
96
) ;
89
97
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 ( )
103
114
}
104
115
105
116
fn get_releases_by_owner (
@@ -299,7 +310,7 @@ impl_webpage! {
299
310
300
311
pub fn home_page ( req : & mut Request ) -> IronResult < Response > {
301
312
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 ) ;
303
314
304
315
HomePage { recent_releases } . into_response ( req)
305
316
}
@@ -316,7 +327,7 @@ impl_webpage! {
316
327
317
328
pub fn releases_feed_handler ( req : & mut Request ) -> IronResult < Response > {
318
329
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 ) ;
320
331
321
332
ReleaseFeed { recent_releases } . into_response ( req)
322
333
}
@@ -353,13 +364,18 @@ fn releases_handler(req: &mut Request, release_type: ReleaseType) -> IronResult<
353
364
. and_then ( |page_num| page_num. parse ( ) . ok ( ) )
354
365
. unwrap_or ( 1 ) ;
355
366
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
+ ) ,
360
375
ReleaseType :: Failures => (
361
376
"Crates with most stars failed to build" ,
362
377
Order :: FailuresByGithubStars ,
378
+ true ,
363
379
) ,
364
380
365
381
ReleaseType :: Owner | ReleaseType :: Search => panic ! (
@@ -369,7 +385,13 @@ fn releases_handler(req: &mut Request, release_type: ReleaseType) -> IronResult<
369
385
370
386
let releases = {
371
387
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
+ )
373
395
} ;
374
396
375
397
// Show next and previous page buttons
@@ -783,7 +805,7 @@ mod tests {
783
805
// release without stars will not be shown
784
806
env. fake_release ( ) . name ( "baz" ) . version ( "1.0.0" ) . create ( ) ?;
785
807
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 ) ;
787
809
assert_eq ! (
788
810
vec![
789
811
"bar" , // 20 stars
@@ -1265,7 +1287,13 @@ mod tests {
1265
1287
. github_stats ( "some/repo" , 33 , 22 , 11 )
1266
1288
. release_time ( Utc . ymd ( 2020 , 4 , 16 ) . and_hms ( 4 , 33 , 50 ) )
1267
1289
. 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 ( ) ?;
1269
1297
env. fake_release ( )
1270
1298
. name ( "crate_that_succeeded_with_github" )
1271
1299
. github_stats ( "some/repo" , 33 , 22 , 11 )
@@ -1279,16 +1307,25 @@ mod tests {
1279
1307
. build_result_failed ( )
1280
1308
. create ( ) ?;
1281
1309
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
+ ) ;
1284
1318
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
+ ) ;
1292
1329
1293
1330
Ok ( ( ) )
1294
1331
} )
0 commit comments