@@ -3,13 +3,14 @@ use crate::crates::Crate;
33use crate :: dirs;
44use crate :: docker:: DockerEnv ;
55use crate :: experiments:: Experiment ;
6+ use crate :: logs:: { self , LogStorage } ;
67use crate :: prelude:: * ;
78use crate :: results:: { TestResult , WriteResults } ;
8- use crate :: runner:: prepare:: PrepareCrate ;
9- use crate :: runner:: test;
9+ use crate :: runner:: { prepare:: PrepareCrate , test, RunnerState } ;
1010use crate :: toolchain:: Toolchain ;
1111use crate :: utils;
1212use failure:: AsFail ;
13+ use log:: LevelFilter ;
1314use std:: fmt;
1415
1516pub ( super ) struct TaskCtx < ' ctx , DB : WriteResults + ' ctx > {
@@ -19,17 +20,20 @@ pub(super) struct TaskCtx<'ctx, DB: WriteResults + 'ctx> {
1920 pub ( super ) toolchain : & ' ctx Toolchain ,
2021 pub ( super ) krate : & ' ctx Crate ,
2122 pub ( super ) docker_env : & ' ctx DockerEnv ,
23+ pub ( super ) state : & ' ctx RunnerState ,
2224 pub ( super ) quiet : bool ,
2325}
2426
2527impl < ' ctx , DB : WriteResults + ' ctx > TaskCtx < ' ctx , DB > {
28+ #[ allow( clippy:: too_many_arguments) ]
2629 fn new (
2730 config : & ' ctx Config ,
2831 db : & ' ctx DB ,
2932 experiment : & ' ctx Experiment ,
3033 toolchain : & ' ctx Toolchain ,
3134 krate : & ' ctx Crate ,
3235 docker_env : & ' ctx DockerEnv ,
36+ state : & ' ctx RunnerState ,
3337 quiet : bool ,
3438 ) -> Self {
3539 TaskCtx {
@@ -39,6 +43,7 @@ impl<'ctx, DB: WriteResults + 'ctx> TaskCtx<'ctx, DB> {
3943 toolchain,
4044 krate,
4145 docker_env,
46+ state,
4247 quiet,
4348 }
4449 }
@@ -127,6 +132,7 @@ impl Task {
127132 & self ,
128133 ex : & Experiment ,
129134 db : & DB ,
135+ state : & RunnerState ,
130136 err : & F ,
131137 result : TestResult ,
132138 ) -> Fallible < ( ) > {
@@ -137,7 +143,12 @@ impl Task {
137143 | TaskStep :: CheckOnly { ref tc, .. }
138144 | TaskStep :: Rustdoc { ref tc, .. }
139145 | TaskStep :: UnstableFeatures { ref tc } => {
140- db. record_result ( ex, tc, & self . krate , || {
146+ let log_storage = state
147+ . lock ( )
148+ . prepare_logs
149+ . get ( & self . krate )
150+ . map ( |s| s. duplicate ( ) ) ;
151+ db. record_result ( ex, tc, & self . krate , log_storage, || {
141152 error ! ( "this task or one of its parent failed!" ) ;
142153 utils:: report_failure ( err) ;
143154 Ok ( result)
@@ -154,36 +165,46 @@ impl Task {
154165 ex : & Experiment ,
155166 db : & DB ,
156167 docker_env : & DockerEnv ,
168+ state : & RunnerState ,
157169 ) -> Fallible < ( ) > {
158170 match self . step {
159171 TaskStep :: Cleanup => {
160172 // Ensure source directories are cleaned up
161173 for tc in & ex. toolchains {
162174 let _ = utils:: fs:: remove_dir_all ( & dirs:: crate_source_dir ( ex, tc, & self . krate ) ) ;
163175 }
176+ // Remove stored logs
177+ state. lock ( ) . prepare_logs . remove ( & self . krate ) ;
164178 }
165179 TaskStep :: Prepare => {
166- let prepare = PrepareCrate :: new ( ex, & self . krate , config, db) ;
167- prepare. prepare ( ) ?;
180+ let storage = LogStorage :: new ( LevelFilter :: Info ) ;
181+ state
182+ . lock ( )
183+ . prepare_logs
184+ . insert ( self . krate . clone ( ) , storage. clone ( ) ) ;
185+ logs:: capture ( & storage, || {
186+ let prepare = PrepareCrate :: new ( ex, & self . krate , config, db) ;
187+ prepare. prepare ( )
188+ } ) ?;
168189 }
169190 TaskStep :: BuildAndTest { ref tc, quiet } => {
170- let ctx = TaskCtx :: new ( config, db, ex, tc, & self . krate , docker_env, quiet) ;
191+ let ctx = TaskCtx :: new ( config, db, ex, tc, & self . krate , docker_env, state , quiet) ;
171192 test:: run_test ( "testing" , & ctx, test:: test_build_and_test) ?;
172193 }
173194 TaskStep :: BuildOnly { ref tc, quiet } => {
174- let ctx = TaskCtx :: new ( config, db, ex, tc, & self . krate , docker_env, quiet) ;
195+ let ctx = TaskCtx :: new ( config, db, ex, tc, & self . krate , docker_env, state , quiet) ;
175196 test:: run_test ( "building" , & ctx, test:: test_build_only) ?;
176197 }
177198 TaskStep :: CheckOnly { ref tc, quiet } => {
178- let ctx = TaskCtx :: new ( config, db, ex, tc, & self . krate , docker_env, quiet) ;
199+ let ctx = TaskCtx :: new ( config, db, ex, tc, & self . krate , docker_env, state , quiet) ;
179200 test:: run_test ( "checking" , & ctx, test:: test_check_only) ?;
180201 }
181202 TaskStep :: Rustdoc { ref tc, quiet } => {
182- let ctx = TaskCtx :: new ( config, db, ex, tc, & self . krate , docker_env, quiet) ;
203+ let ctx = TaskCtx :: new ( config, db, ex, tc, & self . krate , docker_env, state , quiet) ;
183204 test:: run_test ( "documenting" , & ctx, test:: test_rustdoc) ?;
184205 }
185206 TaskStep :: UnstableFeatures { ref tc } => {
186- let ctx = TaskCtx :: new ( config, db, ex, tc, & self . krate , docker_env, false ) ;
207+ let ctx = TaskCtx :: new ( config, db, ex, tc, & self . krate , docker_env, state , false ) ;
187208 test:: run_test (
188209 "checking unstable" ,
189210 & ctx,
0 commit comments