@@ -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,25 @@ 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+             !in_progress_builds. iter ( ) . any ( |( name,  version) | { 
831+                 // use `.any` instead of `.contains` to avoid cloning name& version for the match 
832+                 * name == krate. name  && * version == krate. version 
833+             } ) 
834+         } ) 
835+         . map ( |mut  krate| { 
836+             // The priority here is inverted: in the database if a crate has a higher priority it 
837+             // will be built after everything else, which is counter-intuitive for people not 
838+             // familiar with docs.rs's inner workings. 
839+             krate. priority  = -krate. priority ; 
840+ 
841+             krate
842+         } ) 
843+         . collect ( ) ; 
844+ 
834845    Ok ( BuildQueuePage  { 
835846        description :  "crate documentation scheduled to build & deploy" , 
836847        queue, 
@@ -1710,14 +1721,13 @@ mod tests {
17101721                cdn:: queue_crate_invalidation ( & mut  conn,  & env. config ( ) ,  "krate_2" ) . await 
17111722            } ) ?; 
17121723
1713-             let  empty  = kuchikiki:: parse_html ( ) . one ( web. get ( "/releases/queue" ) . send ( ) ?. text ( ) ?) ; 
1714-             assert ! ( empty 
1724+             let  content  = kuchikiki:: parse_html ( ) . one ( web. get ( "/releases/queue" ) . send ( ) ?. text ( ) ?) ; 
1725+             assert ! ( content 
17151726                . select( ".release > div > strong" ) 
17161727                . expect( "missing heading" ) 
17171728                . any( |el| el. text_contents( ) . contains( "active CDN deployments" ) ) ) ; 
17181729
1719-             let  full = kuchikiki:: parse_html ( ) . one ( web. get ( "/releases/queue" ) . send ( ) ?. text ( ) ?) ; 
1720-             let  items = full
1730+             let  items = content
17211731                . select ( ".queue-list > li" ) 
17221732                . expect ( "missing list items" ) 
17231733                . collect :: < Vec < _ > > ( ) ; 
@@ -1780,6 +1790,53 @@ mod tests {
17801790        } ) ; 
17811791    } 
17821792
1793+     #[ test]  
1794+     fn  test_releases_queue_in_progress ( )  { 
1795+         wrapper ( |env| { 
1796+             let  web = env. frontend ( ) ; 
1797+ 
1798+             // we have two queued releases, where the build for one is already in progress 
1799+             let  queue = env. build_queue ( ) ; 
1800+             queue. add_crate ( "foo" ,  "1.0.0" ,  0 ,  None ) ?; 
1801+             queue. add_crate ( "bar" ,  "0.1.0" ,  0 ,  None ) ?; 
1802+ 
1803+             env. fake_release ( ) 
1804+                 . name ( "foo" ) 
1805+                 . version ( "1.0.0" ) 
1806+                 . builds ( vec ! [ FakeBuild :: default ( ) 
1807+                     . build_status( BuildStatus :: InProgress ) 
1808+                     . rustc_version( "rustc (blabla 2022-01-01)" ) 
1809+                     . docsrs_version( "docs.rs 4.0.0" ) ] ) 
1810+                 . create ( ) ?; 
1811+ 
1812+             let  full = kuchikiki:: parse_html ( ) . one ( web. get ( "/releases/queue" ) . send ( ) ?. text ( ) ?) ; 
1813+ 
1814+             let  lists = full
1815+                 . select ( ".queue-list" ) 
1816+                 . expect ( "missing queues" ) 
1817+                 . collect :: < Vec < _ > > ( ) ; 
1818+             assert_eq ! ( lists. len( ) ,  2 ) ; 
1819+ 
1820+             let  in_progress_items:  Vec < _ >  = lists[ 0 ] 
1821+                 . as_node ( ) 
1822+                 . select ( "li > a" ) 
1823+                 . expect ( "missing in progress list items" ) 
1824+                 . map ( |node| node. text_contents ( ) . trim ( ) . to_string ( ) ) 
1825+                 . collect ( ) ; 
1826+             assert_eq ! ( in_progress_items,  vec![ "foo 1.0.0" ] ) ; 
1827+ 
1828+             let  queued_items:  Vec < _ >  = lists[ 1 ] 
1829+                 . as_node ( ) 
1830+                 . select ( "li > a" ) 
1831+                 . expect ( "missing queued list items" ) 
1832+                 . map ( |node| node. text_contents ( ) . trim ( ) . to_string ( ) ) 
1833+                 . collect ( ) ; 
1834+             assert_eq ! ( queued_items,  vec![ "bar 0.1.0" ] ) ; 
1835+ 
1836+             Ok ( ( ) ) 
1837+         } ) ; 
1838+     } 
1839+ 
17831840    #[ test]  
17841841    fn  home_page_links ( )  { 
17851842        wrapper ( |env| { 
0 commit comments