@@ -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+             return  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