@@ -30,11 +30,13 @@ use nextest_runner::{
3030    platform:: BuildPlatforms , 
3131    reporter:: { structured,  FinalStatusLevel ,  StatusLevel ,  TestOutputDisplay ,  TestReporterBuilder } , 
3232    reuse_build:: { archive_to_file,  ArchiveReporter ,  MetadataOrPath ,  PathMapper ,  ReuseBuildInfo } , 
33+     run_store:: RunStore , 
3334    runner:: { configure_handle_inheritance,  RunStatsFailureKind ,  TestRunnerBuilder } , 
3435    show_config:: { ShowNextestVersion ,  ShowTestGroupSettings ,  ShowTestGroups ,  ShowTestGroupsMode } , 
3536    signal:: SignalHandlerKind , 
3637    target_runner:: { PlatformRunner ,  TargetRunner } , 
3738    test_filter:: { RunIgnored ,  TestFilterBuilder } , 
39+     test_output:: CaptureStrategy , 
3840} ; 
3941use  once_cell:: sync:: OnceCell ; 
4042use  owo_colors:: { OwoColorize ,  Stream ,  Style } ; 
@@ -743,10 +745,7 @@ pub struct TestRunnerOpts {
743745} 
744746
745747impl  TestRunnerOpts  { 
746-     fn  to_builder ( 
747-         & self , 
748-         cap_strat :  nextest_runner:: test_output:: CaptureStrategy , 
749-     )  -> Option < TestRunnerBuilder >  { 
748+     fn  to_builder ( & self ,  cap_strat :  CaptureStrategy )  -> Option < TestRunnerBuilder >  { 
750749        if  self . no_run  { 
751750            return  None ; 
752751        } 
@@ -1557,7 +1556,6 @@ impl App {
15571556                structured_reporter. set_libtest ( libtest) ; 
15581557            } 
15591558        } ; 
1560-         use  nextest_runner:: test_output:: CaptureStrategy ; 
15611559
15621560        let  cap_strat = if  no_capture { 
15631561            CaptureStrategy :: None 
@@ -1584,19 +1582,6 @@ impl App {
15841582        let  output = output_writer. reporter_output ( ) ; 
15851583        let  profile = profile. apply_build_platforms ( & build_platforms) ; 
15861584
1587-         let  mut  reporter = reporter_opts
1588-             . to_builder ( no_capture) 
1589-             . set_verbose ( self . base . output . verbose ) 
1590-             . build ( & test_list,  & profile,  output,  structured_reporter) ; 
1591-         if  self 
1592-             . base 
1593-             . output 
1594-             . color 
1595-             . should_colorize ( supports_color:: Stream :: Stderr ) 
1596-         { 
1597-             reporter. colorize ( ) ; 
1598-         } 
1599- 
16001585        let  handler = SignalHandlerKind :: Standard ; 
16011586        let  runner_builder = match  runner_opts. to_builder ( cap_strat)  { 
16021587            Some ( runner_builder)  => runner_builder, 
@@ -1615,11 +1600,51 @@ impl App {
16151600            target_runner. clone ( ) , 
16161601        ) ?; 
16171602
1603+         // Start recording runs if the environment variable is set. 
1604+         { 
1605+             const  EXPERIMENTAL_ENV :  & str  = "NEXTEST_EXPERIMENTAL_RECORD_RUNS" ; 
1606+             if  std:: env:: var ( EXPERIMENTAL_ENV ) . as_deref ( )  == Ok ( "1" )  { 
1607+                 // For the record reporter, use the global store dir to share runs across profiles. 
1608+                 let  store = RunStore :: new ( profile. global_store_dir ( ) ) 
1609+                     . map_err ( |err| ExpectedError :: RunRecordError  {  err } ) ?; 
1610+                 let  locked_store = store
1611+                     . lock_exclusive ( ) 
1612+                     . map_err ( |err| ExpectedError :: RunRecordError  {  err } ) ?; 
1613+                 let  recorder = locked_store
1614+                     . create_run_recorder ( 
1615+                         runner. run_id ( ) , 
1616+                         self . base . current_version . clone ( ) , 
1617+                         runner. started_at ( ) . fixed_offset ( ) , 
1618+                     ) 
1619+                     . map_err ( |err| ExpectedError :: RunRecordError  {  err } ) ?; 
1620+ 
1621+                 let  record = structured:: RecordReporter :: new ( recorder) ; 
1622+                 structured_reporter. set_record ( record) ; 
1623+             } 
1624+         } 
1625+ 
1626+         let  mut  reporter = reporter_opts
1627+             . to_builder ( no_capture) 
1628+             . set_verbose ( self . base . output . verbose ) 
1629+             . build ( & test_list,  & profile,  output,  structured_reporter) ; 
1630+         if  self 
1631+             . base 
1632+             . output 
1633+             . color 
1634+             . should_colorize ( supports_color:: Stream :: Stderr ) 
1635+         { 
1636+             reporter. colorize ( ) ; 
1637+         } 
1638+ 
16181639        configure_handle_inheritance ( no_capture) ?; 
1640+         reporter. report_meta ( & self . base . cargo_metadata_json ,  & test_list) ; 
1641+ 
16191642        let  run_stats = runner. try_execute ( |event| { 
16201643            // Write and flush the event. 
16211644            reporter. report_event ( event) 
16221645        } ) ?; 
1646+         reporter. finish ( ) ?; 
1647+ 
16231648        self . base 
16241649            . check_version_config_final ( version_only_config. nextest_version ( ) ) ?; 
16251650        if  !run_stats. is_success ( )  { 
0 commit comments