@@ -806,14 +806,6 @@ pub(crate) async fn build_queue_handler(
806
806
// reverse the list, so the oldest comes first
807
807
active_cdn_deployments. reverse ( ) ;
808
808
809
- let mut queue = 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
-
817
809
let in_progress_builds: Vec < ( String , String ) > = sqlx:: query!(
818
810
r#"SELECT
819
811
crates.name,
@@ -831,6 +823,26 @@ pub(crate) async fn build_queue_handler(
831
823
. map ( |rec| ( rec. name , rec. version ) )
832
824
. collect ( ) ;
833
825
826
+ let queue: Vec < QueuedCrate > = build_queue
827
+ . queued_crates ( )
828
+ . await ?
829
+ . into_iter ( )
830
+ . filter ( |krate| {
831
+ !in_progress_builds. iter ( ) . any ( |( name, version) | {
832
+ // use `.any` instead of `.contains` to avoid cloning name& version for the match
833
+ * name == krate. name && * version == krate. version
834
+ } )
835
+ } )
836
+ . map ( |mut krate| {
837
+ // The priority here is inverted: in the database if a crate has a higher priority it
838
+ // will be built after everything else, which is counter-intuitive for people not
839
+ // familiar with docs.rs's inner workings.
840
+ krate. priority = -krate. priority ;
841
+
842
+ krate
843
+ } )
844
+ . collect ( ) ;
845
+
834
846
Ok ( BuildQueuePage {
835
847
description : "crate documentation scheduled to build & deploy" ,
836
848
queue,
@@ -1710,14 +1722,13 @@ mod tests {
1710
1722
cdn:: queue_crate_invalidation ( & mut conn, & env. config ( ) , "krate_2" ) . await
1711
1723
} ) ?;
1712
1724
1713
- let empty = kuchikiki:: parse_html ( ) . one ( web. get ( "/releases/queue" ) . send ( ) ?. text ( ) ?) ;
1714
- assert ! ( empty
1725
+ let content = kuchikiki:: parse_html ( ) . one ( web. get ( "/releases/queue" ) . send ( ) ?. text ( ) ?) ;
1726
+ assert ! ( content
1715
1727
. select( ".release > div > strong" )
1716
1728
. expect( "missing heading" )
1717
1729
. any( |el| el. text_contents( ) . contains( "active CDN deployments" ) ) ) ;
1718
1730
1719
- let full = kuchikiki:: parse_html ( ) . one ( web. get ( "/releases/queue" ) . send ( ) ?. text ( ) ?) ;
1720
- let items = full
1731
+ let items = content
1721
1732
. select ( ".queue-list > li" )
1722
1733
. expect ( "missing list items" )
1723
1734
. collect :: < Vec < _ > > ( ) ;
@@ -1780,6 +1791,53 @@ mod tests {
1780
1791
} ) ;
1781
1792
}
1782
1793
1794
+ #[ test]
1795
+ fn test_releases_queue_in_progress ( ) {
1796
+ wrapper ( |env| {
1797
+ let web = env. frontend ( ) ;
1798
+
1799
+ // we have two queued releases, where the build for one is already in progress
1800
+ let queue = env. build_queue ( ) ;
1801
+ queue. add_crate ( "foo" , "1.0.0" , 0 , None ) ?;
1802
+ queue. add_crate ( "bar" , "0.1.0" , 0 , None ) ?;
1803
+
1804
+ env. fake_release ( )
1805
+ . name ( "foo" )
1806
+ . version ( "1.0.0" )
1807
+ . builds ( vec ! [ FakeBuild :: default ( )
1808
+ . build_status( BuildStatus :: InProgress )
1809
+ . rustc_version( "rustc (blabla 2022-01-01)" )
1810
+ . docsrs_version( "docs.rs 4.0.0" ) ] )
1811
+ . create ( ) ?;
1812
+
1813
+ let full = kuchikiki:: parse_html ( ) . one ( web. get ( "/releases/queue" ) . send ( ) ?. text ( ) ?) ;
1814
+
1815
+ let lists = full
1816
+ . select ( ".queue-list" )
1817
+ . expect ( "missing queues" )
1818
+ . collect :: < Vec < _ > > ( ) ;
1819
+ assert_eq ! ( lists. len( ) , 2 ) ;
1820
+
1821
+ let in_progress_items: Vec < _ > = lists[ 0 ]
1822
+ . as_node ( )
1823
+ . select ( "li > a" )
1824
+ . expect ( "missing in progress list items" )
1825
+ . map ( |node| node. text_contents ( ) . trim ( ) . to_string ( ) )
1826
+ . collect ( ) ;
1827
+ assert_eq ! ( in_progress_items, vec![ "foo 1.0.0" ] ) ;
1828
+
1829
+ let queued_items: Vec < _ > = lists[ 1 ]
1830
+ . as_node ( )
1831
+ . select ( "li > a" )
1832
+ . expect ( "missing queued list items" )
1833
+ . map ( |node| node. text_contents ( ) . trim ( ) . to_string ( ) )
1834
+ . collect ( ) ;
1835
+ assert_eq ! ( queued_items, vec![ "bar 0.1.0" ] ) ;
1836
+
1837
+ Ok ( ( ) )
1838
+ } ) ;
1839
+ }
1840
+
1783
1841
#[ test]
1784
1842
fn home_page_links ( ) {
1785
1843
wrapper ( |env| {
0 commit comments