@@ -806,14 +806,6 @@ pub(crate) async fn build_queue_handler(
806806 // reverse the list, so the oldest comes first
807807 active_cdn_deployments. reverse ( ) ;
808808
809- let mut queue = spawn_blocking ( move || build_queue. queued_crates ( ) ) . await ?;
810- for krate in queue. iter_mut ( ) {
811- // The priority here is inverted: in the database if a crate has a higher priority it
812- // will be built after everything else, which is counter-intuitive for people not
813- // familiar with docs.rs's inner workings.
814- krate. priority = -krate. priority ;
815- }
816-
817809 let in_progress_builds: Vec < ( String , String ) > = sqlx:: query!(
818810 r#"SELECT
819811 crates.name,
@@ -831,6 +823,28 @@ pub(crate) async fn build_queue_handler(
831823 . map ( |rec| ( rec. name , rec. version ) )
832824 . collect ( ) ;
833825
826+ let queue: Vec < QueuedCrate > = spawn_blocking ( move || build_queue. queued_crates ( ) )
827+ . await ?
828+ . into_iter ( )
829+ . filter ( |krate| {
830+ // use a loop instead of `.contains` to avoid cloning name& version for the match
831+ for ( name, version) in & in_progress_builds {
832+ if * name == krate. name && * version == krate. version {
833+ return false ;
834+ }
835+ }
836+ true
837+ } )
838+ . map ( |mut krate| {
839+ // The priority here is inverted: in the database if a crate has a higher priority it
840+ // will be built after everything else, which is counter-intuitive for people not
841+ // familiar with docs.rs's inner workings.
842+ krate. priority = -krate. priority ;
843+
844+ krate
845+ } )
846+ . collect ( ) ;
847+
834848 Ok ( BuildQueuePage {
835849 description : "crate documentation scheduled to build & deploy" ,
836850 queue,
@@ -1710,14 +1724,13 @@ mod tests {
17101724 cdn:: queue_crate_invalidation ( & mut conn, & env. config ( ) , "krate_2" ) . await
17111725 } ) ?;
17121726
1713- let empty = kuchikiki:: parse_html ( ) . one ( web. get ( "/releases/queue" ) . send ( ) ?. text ( ) ?) ;
1714- assert ! ( empty
1727+ let content = kuchikiki:: parse_html ( ) . one ( web. get ( "/releases/queue" ) . send ( ) ?. text ( ) ?) ;
1728+ assert ! ( content
17151729 . select( ".release > div > strong" )
17161730 . expect( "missing heading" )
17171731 . any( |el| el. text_contents( ) . contains( "active CDN deployments" ) ) ) ;
17181732
1719- let full = kuchikiki:: parse_html ( ) . one ( web. get ( "/releases/queue" ) . send ( ) ?. text ( ) ?) ;
1720- let items = full
1733+ let items = content
17211734 . select ( ".queue-list > li" )
17221735 . expect ( "missing list items" )
17231736 . collect :: < Vec < _ > > ( ) ;
@@ -1780,6 +1793,53 @@ mod tests {
17801793 } ) ;
17811794 }
17821795
1796+ #[ test]
1797+ fn test_releases_queue_in_progress ( ) {
1798+ wrapper ( |env| {
1799+ let web = env. frontend ( ) ;
1800+
1801+ // we have two queued releases, where the build for one is already in progress
1802+ let queue = env. build_queue ( ) ;
1803+ queue. add_crate ( "foo" , "1.0.0" , 0 , None ) ?;
1804+ queue. add_crate ( "bar" , "0.1.0" , 0 , None ) ?;
1805+
1806+ env. fake_release ( )
1807+ . name ( "foo" )
1808+ . version ( "1.0.0" )
1809+ . builds ( vec ! [ FakeBuild :: default ( )
1810+ . build_status( BuildStatus :: InProgress )
1811+ . rustc_version( "rustc (blabla 2022-01-01)" )
1812+ . docsrs_version( "docs.rs 4.0.0" ) ] )
1813+ . create ( ) ?;
1814+
1815+ let full = kuchikiki:: parse_html ( ) . one ( web. get ( "/releases/queue" ) . send ( ) ?. text ( ) ?) ;
1816+
1817+ let lists = full
1818+ . select ( ".queue-list" )
1819+ . expect ( "missing queues" )
1820+ . collect :: < Vec < _ > > ( ) ;
1821+ assert_eq ! ( lists. len( ) , 2 ) ;
1822+
1823+ let in_progress_items: Vec < _ > = lists[ 0 ]
1824+ . as_node ( )
1825+ . select ( "li > a" )
1826+ . expect ( "missing in progress list items" )
1827+ . map ( |node| node. text_contents ( ) . trim ( ) . to_string ( ) )
1828+ . collect ( ) ;
1829+ assert_eq ! ( in_progress_items, vec![ "foo 1.0.0" ] ) ;
1830+
1831+ let queued_items: Vec < _ > = lists[ 1 ]
1832+ . as_node ( )
1833+ . select ( "li > a" )
1834+ . expect ( "missing queued list items" )
1835+ . map ( |node| node. text_contents ( ) . trim ( ) . to_string ( ) )
1836+ . collect ( ) ;
1837+ assert_eq ! ( queued_items, vec![ "bar 0.1.0" ] ) ;
1838+
1839+ Ok ( ( ) )
1840+ } ) ;
1841+ }
1842+
17831843 #[ test]
17841844 fn home_page_links ( ) {
17851845 wrapper ( |env| {
0 commit comments