8
8
use crate :: core:: builder:: { Builder , RunConfig , ShouldRun , Step } ;
9
9
use crate :: t;
10
10
use crate :: utils:: change_tracker:: CONFIG_CHANGE_HISTORY ;
11
+ use crate :: utils:: exec:: command;
11
12
use crate :: utils:: helpers:: { self , hex_encode} ;
12
13
use crate :: Config ;
13
14
use sha2:: Digest ;
@@ -16,7 +17,6 @@ use std::fmt::Write as _;
16
17
use std:: fs:: File ;
17
18
use std:: io:: Write ;
18
19
use std:: path:: { Path , PathBuf , MAIN_SEPARATOR_STR } ;
19
- use std:: process:: Command ;
20
20
use std:: str:: FromStr ;
21
21
use std:: { fmt, fs, io} ;
22
22
@@ -266,20 +266,16 @@ impl Step for Link {
266
266
}
267
267
let stage_path =
268
268
[ "build" , config. build . rustc_target_arg ( ) , "stage1" ] . join ( MAIN_SEPARATOR_STR ) ;
269
- if !rustup_installed ( ) {
269
+ if !rustup_installed ( builder ) {
270
270
eprintln ! ( "`rustup` is not installed; cannot link `stage1` toolchain" ) ;
271
271
} else if stage_dir_exists ( & stage_path[ ..] ) && !config. dry_run ( ) {
272
- attempt_toolchain_link ( & stage_path[ ..] ) ;
272
+ attempt_toolchain_link ( builder , & stage_path[ ..] ) ;
273
273
}
274
274
}
275
275
}
276
276
277
- fn rustup_installed ( ) -> bool {
278
- Command :: new ( "rustup" )
279
- . arg ( "--version" )
280
- . stdout ( std:: process:: Stdio :: null ( ) )
281
- . output ( )
282
- . map_or ( false , |output| output. status . success ( ) )
277
+ fn rustup_installed ( builder : & Builder < ' _ > ) -> bool {
278
+ command ( "rustup" ) . capture_stdout ( ) . arg ( "--version" ) . run ( builder) . is_success ( )
283
279
}
284
280
285
281
fn stage_dir_exists ( stage_path : & str ) -> bool {
@@ -289,8 +285,8 @@ fn stage_dir_exists(stage_path: &str) -> bool {
289
285
}
290
286
}
291
287
292
- fn attempt_toolchain_link ( stage_path : & str ) {
293
- if toolchain_is_linked ( ) {
288
+ fn attempt_toolchain_link ( builder : & Builder < ' _ > , stage_path : & str ) {
289
+ if toolchain_is_linked ( builder ) {
294
290
return ;
295
291
}
296
292
@@ -301,7 +297,7 @@ fn attempt_toolchain_link(stage_path: &str) {
301
297
return ;
302
298
}
303
299
304
- if try_link_toolchain ( stage_path) {
300
+ if try_link_toolchain ( builder , stage_path) {
305
301
println ! (
306
302
"Added `stage1` rustup toolchain; try `cargo +stage1 build` on a separate rust project to run a newly-built toolchain"
307
303
) ;
@@ -315,22 +311,24 @@ fn attempt_toolchain_link(stage_path: &str) {
315
311
}
316
312
}
317
313
318
- fn toolchain_is_linked ( ) -> bool {
319
- match Command :: new ( "rustup" )
314
+ fn toolchain_is_linked ( builder : & Builder < ' _ > ) -> bool {
315
+ match command ( "rustup" )
316
+ . capture_stdout ( )
317
+ . allow_failure ( )
320
318
. args ( [ "toolchain" , "list" ] )
321
- . stdout ( std :: process :: Stdio :: piped ( ) )
322
- . output ( )
319
+ . run ( builder )
320
+ . stdout_if_ok ( )
323
321
{
324
- Ok ( toolchain_list) => {
325
- if !String :: from_utf8_lossy ( & toolchain_list. stdout ) . contains ( "stage1" ) {
322
+ Some ( toolchain_list) => {
323
+ if !toolchain_list. contains ( "stage1" ) {
326
324
return false ;
327
325
}
328
326
// The toolchain has already been linked.
329
327
println ! (
330
328
"`stage1` toolchain already linked; not attempting to link `stage1` toolchain"
331
329
) ;
332
330
}
333
- Err ( _ ) => {
331
+ None => {
334
332
// In this case, we don't know if the `stage1` toolchain has been linked;
335
333
// but `rustup` failed, so let's not go any further.
336
334
println ! (
@@ -341,12 +339,12 @@ fn toolchain_is_linked() -> bool {
341
339
true
342
340
}
343
341
344
- fn try_link_toolchain ( stage_path : & str ) -> bool {
345
- Command :: new ( "rustup" )
346
- . stdout ( std :: process :: Stdio :: null ( ) )
342
+ fn try_link_toolchain ( builder : & Builder < ' _ > , stage_path : & str ) -> bool {
343
+ command ( "rustup" )
344
+ . capture_stdout ( )
347
345
. args ( [ "toolchain" , "link" , "stage1" , stage_path] )
348
- . output ( )
349
- . map_or ( false , |output| output . status . success ( ) )
346
+ . run ( builder )
347
+ . is_success ( )
350
348
}
351
349
352
350
fn ensure_stage1_toolchain_placeholder_exists ( stage_path : & str ) -> bool {
@@ -476,20 +474,18 @@ impl Step for Hook {
476
474
if config. dry_run ( ) {
477
475
return ;
478
476
}
479
- t ! ( install_git_hook_maybe( config) ) ;
477
+ t ! ( install_git_hook_maybe( builder , config) ) ;
480
478
}
481
479
}
482
480
483
481
// install a git hook to automatically run tidy, if they want
484
- fn install_git_hook_maybe ( config : & Config ) -> io:: Result < ( ) > {
482
+ fn install_git_hook_maybe ( builder : & Builder < ' _ > , config : & Config ) -> io:: Result < ( ) > {
485
483
let git = helpers:: git ( Some ( & config. src ) )
484
+ . capture ( )
486
485
. args ( [ "rev-parse" , "--git-common-dir" ] )
487
- . as_command_mut ( )
488
- . output ( )
489
- . map ( |output| {
490
- assert ! ( output. status. success( ) , "failed to run `git`" ) ;
491
- PathBuf :: from ( t ! ( String :: from_utf8( output. stdout) ) . trim ( ) )
492
- } ) ?;
486
+ . run ( builder)
487
+ . stdout ( ) ;
488
+ let git = PathBuf :: from ( git. trim ( ) ) ;
493
489
let hooks_dir = git. join ( "hooks" ) ;
494
490
let dst = hooks_dir. join ( "pre-push" ) ;
495
491
if dst. exists ( ) {
0 commit comments