@@ -54,7 +54,7 @@ use std::{
5454 env:: VarError ,
5555 fmt,
5656 io:: { Cursor , Write } ,
57- sync:: { Arc , OnceLock , Mutex } ,
57+ sync:: { Arc , Mutex , OnceLock } ,
5858} ;
5959use swrite:: { SWrite , swrite} ;
6060use tracing:: { Level , debug, info, warn} ;
@@ -660,7 +660,12 @@ impl TestBuildFilter {
660660 . map_err ( |err| ExpectedError :: CreateTestListError { err } )
661661 }
662662
663- fn make_test_filter_builder ( & self , filter_exprs : Vec < Filterset > , profile_name : & str , profile : & EarlyProfile < ' _ > ) -> Result < TestFilterBuilder > {
663+ fn make_test_filter_builder (
664+ & self ,
665+ filter_exprs : Vec < Filterset > ,
666+ profile_name : & str ,
667+ profile : & EarlyProfile < ' _ > ,
668+ ) -> Result < TestFilterBuilder > {
664669 // Merge the test binary args into the patterns.
665670 let mut run_ignored = self . run_ignored . map ( Into :: into) ;
666671 let mut patterns = TestFilterPatterns :: new ( self . pre_double_dash_filters . clone ( ) ) ;
@@ -669,22 +674,30 @@ impl TestBuildFilter {
669674 // Handle --last-failed and --failed-last options
670675 if self . last_failed || self . failed_last {
671676 use nextest_runner:: reporter:: last_failed:: FailedTestStore ;
672-
677+
673678 let store = FailedTestStore :: new ( profile. store_dir ( ) , profile_name) ;
674679 match store. load ( ) {
675680 Ok ( Some ( snapshot) ) => {
676681 if snapshot. failed_tests . is_empty ( ) {
677- eprintln ! ( "No failed tests found from previous run for profile '{}'" , profile_name) ;
682+ eprintln ! (
683+ "No failed tests found from previous run for profile '{}'" ,
684+ profile_name
685+ ) ;
678686 if self . last_failed {
679687 // For --last-failed with no failed tests, we should run no tests
680688 // Create a pattern that matches nothing
681689 patterns = TestFilterPatterns :: default ( ) ;
682- patterns. add_exact_pattern ( "__nextest_internal_no_tests_to_run__" . to_string ( ) ) ;
690+ patterns. add_exact_pattern (
691+ "__nextest_internal_no_tests_to_run__" . to_string ( ) ,
692+ ) ;
683693 }
684694 // For --failed-last, we continue with the normal filtering
685695 } else {
686- eprintln ! ( "Found {} failed test(s) from previous run" , snapshot. failed_tests. len( ) ) ;
687-
696+ eprintln ! (
697+ "Found {} failed test(s) from previous run" ,
698+ snapshot. failed_tests. len( )
699+ ) ;
700+
688701 if self . last_failed {
689702 // Only run failed tests - replace all patterns
690703 patterns = TestFilterPatterns :: default ( ) ;
@@ -705,7 +718,8 @@ impl TestBuildFilter {
705718 if self . last_failed {
706719 // For --last-failed with no history, run no tests
707720 patterns = TestFilterPatterns :: default ( ) ;
708- patterns. add_exact_pattern ( "__nextest_internal_no_tests_to_run__" . to_string ( ) ) ;
721+ patterns
722+ . add_exact_pattern ( "__nextest_internal_no_tests_to_run__" . to_string ( ) ) ;
709723 }
710724 }
711725 Err ( err) => {
@@ -1718,7 +1732,9 @@ impl App {
17181732 }
17191733 } ) ;
17201734 let filter_exprs = self . build_filtering_expressions ( & pcx) ?;
1721- let test_filter_builder = self . build_filter . make_test_filter_builder ( filter_exprs, profile_name, & profile) ?;
1735+ let test_filter_builder =
1736+ self . build_filter
1737+ . make_test_filter_builder ( filter_exprs, profile_name, & profile) ?;
17221738
17231739 let binary_list = self . base . build_binary_list ( ) ?;
17241740
@@ -1796,7 +1812,9 @@ impl App {
17961812 let settings = ShowTestGroupSettings { mode, show_default } ;
17971813
17981814 let filter_exprs = self . build_filtering_expressions ( & pcx) ?;
1799- let test_filter_builder = self . build_filter . make_test_filter_builder ( filter_exprs, profile_name, & profile) ?;
1815+ let test_filter_builder =
1816+ self . build_filter
1817+ . make_test_filter_builder ( filter_exprs, profile_name, & profile) ?;
18001818
18011819 let binary_list = self . base . build_binary_list ( ) ?;
18021820 let build_platforms = binary_list. rust_build_meta . build_platforms . clone ( ) ;
@@ -1913,7 +1931,9 @@ impl App {
19131931 reporter_builder. set_verbose ( self . base . output . verbose ) ;
19141932
19151933 let filter_exprs = self . build_filtering_expressions ( & pcx) ?;
1916- let test_filter_builder = self . build_filter . make_test_filter_builder ( filter_exprs, profile_name, & profile) ?;
1934+ let test_filter_builder =
1935+ self . build_filter
1936+ . make_test_filter_builder ( filter_exprs, profile_name, & profile) ?;
19171937
19181938 let binary_list = self . base . build_binary_list ( ) ?;
19191939 let build_platforms = & binary_list. rust_build_meta . build_platforms . clone ( ) ;
@@ -1965,44 +1985,51 @@ impl App {
19651985 ) ;
19661986
19671987 configure_handle_inheritance ( no_capture) ?;
1968-
1988+
19691989 // Track failed tests during the run
1970- use nextest_runner:: reporter:: last_failed:: { FailedTest , FailedTestStore , FailedTestsSnapshot } ;
1990+ use nextest_runner:: reporter:: last_failed:: {
1991+ FailedTest , FailedTestStore , FailedTestsSnapshot ,
1992+ } ;
19711993 let failed_tests = Arc :: new ( Mutex :: new ( Vec :: < FailedTest > :: new ( ) ) ) ;
19721994 let failed_tests_for_callback = Arc :: clone ( & failed_tests) ;
1973-
1995+
19741996 let run_stats = runner. try_execute ( |event| {
19751997 // Track failed tests for persistence
1976- if let TestEventKind :: TestFinished { test_instance, run_statuses, .. } = & event. kind {
1998+ if let TestEventKind :: TestFinished {
1999+ test_instance,
2000+ run_statuses,
2001+ ..
2002+ } = & event. kind
2003+ {
19772004 if !run_statuses. last_status ( ) . result . is_success ( ) {
19782005 let mut failed = failed_tests_for_callback. lock ( ) . unwrap ( ) ;
19792006 failed. push ( FailedTest :: from_test_instance_id ( test_instance. id ( ) ) ) ;
19802007 }
19812008 }
1982-
2009+
19832010 // Write and flush the event.
19842011 reporter. report_event ( event)
19852012 } ) ?;
19862013 reporter. finish ( ) ;
1987-
2014+
19882015 // After the run completes, persist failed tests if we're not in no-run mode
19892016 if !runner_opts. no_run {
19902017 let store = FailedTestStore :: new ( profile. store_dir ( ) , profile_name) ;
1991-
2018+
19922019 let failed = failed_tests. lock ( ) . unwrap ( ) ;
19932020 let snapshot = FailedTestsSnapshot {
19942021 version : 1 ,
19952022 created_at : chrono:: Utc :: now ( ) ,
19962023 profile_name : profile_name. to_owned ( ) ,
19972024 failed_tests : failed. iter ( ) . cloned ( ) . collect ( ) ,
19982025 } ;
1999-
2026+
20002027 if let Err ( err) = store. save ( & snapshot) {
20012028 eprintln ! ( "Warning: Failed to save failed test history: {}" , err) ;
20022029 // Don't fail the entire test run if we can't save the history
20032030 }
20042031 }
2005-
2032+
20062033 self . base
20072034 . check_version_config_final ( version_only_config. nextest_version ( ) ) ?;
20082035
@@ -2864,9 +2891,11 @@ mod tests {
28642891 . unwrap_or_else ( |_| panic ! ( "{cmd} should have successfully parsed" ) ) ;
28652892 // For tests, skip the failed test loading functionality
28662893 let mut run_ignored = app. build_filter . run_ignored . map ( Into :: into) ;
2867- let mut patterns = TestFilterPatterns :: new ( app. build_filter . pre_double_dash_filters . clone ( ) ) ;
2868- app. build_filter . merge_test_binary_args ( & mut run_ignored, & mut patterns) ?;
2869-
2894+ let mut patterns =
2895+ TestFilterPatterns :: new ( app. build_filter . pre_double_dash_filters . clone ( ) ) ;
2896+ app. build_filter
2897+ . merge_test_binary_args ( & mut run_ignored, & mut patterns) ?;
2898+
28702899 Ok ( TestFilterBuilder :: new (
28712900 run_ignored. unwrap_or_default ( ) ,
28722901 app. build_filter . partition . clone ( ) ,
0 commit comments