@@ -3,7 +3,7 @@ use itertools::Itertools;
33use shell_escape:: escape;
44use std:: ffi:: { OsStr , OsString } ;
55use std:: path:: Path ;
6- use std:: process:: { self , Command } ;
6+ use std:: process:: { self , Command , Stdio } ;
77use std:: { fs, io} ;
88use walkdir:: WalkDir ;
99
@@ -31,6 +31,7 @@ impl From<walkdir::Error> for CliError {
3131struct FmtContext {
3232 check : bool ,
3333 verbose : bool ,
34+ rustfmt_path : String ,
3435}
3536
3637// the "main" function of cargo dev fmt
@@ -102,7 +103,23 @@ Please revert the changes to Cargo.tomls first."
102103 }
103104 }
104105
105- let context = FmtContext { check, verbose } ;
106+ let output = Command :: new ( "rustup" )
107+ . args ( [ "which" , "rustfmt" ] )
108+ . stderr ( Stdio :: inherit ( ) )
109+ . output ( )
110+ . expect ( "error running `rustup which rustfmt`" ) ;
111+ if !output. status . success ( ) {
112+ eprintln ! ( "`rustup which rustfmt` did not execute successfully" ) ;
113+ process:: exit ( 1 ) ;
114+ }
115+ let mut rustfmt_path = String :: from_utf8 ( output. stdout ) . expect ( "invalid rustfmt path" ) ;
116+ rustfmt_path. truncate ( rustfmt_path. trim_end ( ) . len ( ) ) ;
117+
118+ let context = FmtContext {
119+ check,
120+ verbose,
121+ rustfmt_path,
122+ } ;
106123 let result = try_run ( & context) ;
107124 let code = match result {
108125 Ok ( true ) => 0 ,
@@ -141,8 +158,12 @@ fn exec(
141158 println ! ( "{}" , format_command( & program, & dir, args) ) ;
142159 }
143160
144- let child = Command :: new ( & program) . current_dir ( & dir) . args ( args. iter ( ) ) . spawn ( ) ?;
145- let output = child. wait_with_output ( ) ?;
161+ let output = Command :: new ( & program)
162+ . env ( "RUSTFMT" , & context. rustfmt_path )
163+ . current_dir ( & dir)
164+ . args ( args. iter ( ) )
165+ . output ( )
166+ . unwrap ( ) ;
146167 let success = output. status . success ( ) ;
147168
148169 if !context. check && !success {
@@ -159,7 +180,6 @@ fn exec(
159180fn cargo_fmt ( context : & FmtContext , path : & Path ) -> Result < bool , CliError > {
160181 let mut args = vec ! [ "fmt" , "--all" ] ;
161182 if context. check {
162- args. push ( "--" ) ;
163183 args. push ( "--check" ) ;
164184 }
165185 let success = exec ( context, "cargo" , path, & args) ?;
@@ -200,7 +220,7 @@ fn rustfmt(context: &FmtContext, paths: impl Iterator<Item = OsString>) -> Resul
200220 }
201221 args. extend ( paths) ;
202222
203- let success = exec ( context, "rustfmt" , std:: env:: current_dir ( ) ?, & args) ?;
223+ let success = exec ( context, & context . rustfmt_path , std:: env:: current_dir ( ) ?, & args) ?;
204224
205225 Ok ( success)
206226}
0 commit comments