@@ -4,11 +4,11 @@ use std::process::Command;
44use  rustc_version:: { Version ,  VersionMeta } ; 
55use  serde:: Deserialize ; 
66
7- use  crate :: docker:: ImagePlatform ; 
87use  crate :: errors:: * ; 
98use  crate :: extensions:: { env_program,  CommandExt } ; 
109use  crate :: shell:: MessageInfo ; 
1110use  crate :: TargetTriple ; 
11+ use  crate :: { docker:: ImagePlatform ,  rustup:: ToolchainMode } ; 
1212
1313#[ derive( Debug ) ]  
1414pub  struct  TargetList  { 
@@ -196,19 +196,30 @@ impl QualifiedToolchain {
196196    } 
197197
198198    /// Grab the current default toolchain 
199-      pub  fn  default ( config :  & crate :: config:: Config ,  msg_info :  & mut  MessageInfo )  -> Result < Self >  { 
200-         let  sysroot = sysroot ( msg_info) ?; 
201- 
202-         let  default_toolchain_name = sysroot
203-             . file_name ( ) 
204-             . ok_or_else ( || eyre:: eyre!( "couldn't get name of active toolchain" ) ) ?
205-             . to_str ( ) 
206-             . ok_or_else ( || eyre:: eyre!( "toolchain was not utf-8" ) ) ?; 
199+      pub  fn  default ( 
200+         config :  & crate :: config:: Config , 
201+         installed_toolchains :  & [ ( String ,  ToolchainMode ,  PathBuf ) ] , 
202+         msg_info :  & mut  MessageInfo , 
203+     )  -> Result < Self >  { 
204+         let  ( toolchain_name,  sysroot)  = if  let  Some ( ( toolchain_name,  _,  sysroot) )  =
205+             installed_toolchains
206+                 . iter ( ) 
207+                 . find ( |( _,  mode,  _) | mode. is_overriden ( ) ) 
208+         { 
209+             ( toolchain_name,  sysroot) 
210+         }  else  if  let  Some ( ( toolchain_name,  _,  sysroot) )  = installed_toolchains
211+             . iter ( ) 
212+             . find ( |( _,  mode,  _) | mode. is_defaulted ( ) ) 
213+         { 
214+             ( toolchain_name,  sysroot) 
215+         }  else  { 
216+             eyre:: bail!( "no default toolchain found" ) ; 
217+         } ; 
207218
208219        if  !config. custom_toolchain ( )  { 
209-             QualifiedToolchain :: parse ( sysroot. clone ( ) ,  default_toolchain_name ,  config,  msg_info) 
220+             QualifiedToolchain :: parse ( sysroot. clone ( ) ,  toolchain_name ,  config,  msg_info) 
210221        }  else  { 
211-             QualifiedToolchain :: custom ( default_toolchain_name ,   & sysroot,  config,  msg_info) 
222+             QualifiedToolchain :: custom ( toolchain_name ,   sysroot,  config,  msg_info) 
212223        } 
213224    } 
214225
@@ -232,6 +243,26 @@ impl QualifiedToolchain {
232243    pub  fn  set_sysroot ( & mut  self ,  convert :  impl  Fn ( & Path )  -> PathBuf )  { 
233244        self . sysroot  = convert ( & self . sysroot ) ; 
234245    } 
246+ 
247+     pub  fn  ensure_sysroot ( 
248+         & mut  self , 
249+         installed_toolchains :  Vec < ( String ,  ToolchainMode ,  std:: path:: PathBuf ) > , 
250+         msg_info :  & mut  MessageInfo , 
251+     )  -> Result < ( ) >  { 
252+         self . sysroot  = if  let  Some ( ( _,  _,  sysroot) )  = installed_toolchains
253+             . iter ( ) 
254+             . find ( |( name,  _,  _) | & self . full  == name) 
255+         { 
256+             sysroot. clone ( ) 
257+         }  else  { 
258+             let  ( _,  _,  sysroot)  = crate :: rustup:: installed_toolchains ( msg_info) ?
259+                 . into_iter ( ) 
260+                 . find ( |( name,  _,  _) | & self . full  == name) 
261+                 . ok_or_else ( || eyre:: eyre!( "toolchain not found" ) ) ?; 
262+             sysroot
263+         } ; 
264+         Ok ( ( ) ) 
265+     } 
235266} 
236267
237268impl  std:: fmt:: Display  for  QualifiedToolchain  { 
@@ -364,15 +395,6 @@ pub fn target_list(msg_info: &mut MessageInfo) -> Result<TargetList> {
364395        } ) 
365396} 
366397
367- pub  fn  sysroot ( msg_info :  & mut  MessageInfo )  -> Result < PathBuf >  { 
368-     let  stdout = rustc_command ( ) 
369-         . args ( [ "--print" ,  "sysroot" ] ) 
370-         . run_and_get_stdout ( msg_info) ?
371-         . trim ( ) 
372-         . to_owned ( ) ; 
373-     Ok ( PathBuf :: from ( stdout) ) 
374- } 
375- 
376398pub  fn  version_meta ( )  -> Result < rustc_version:: VersionMeta >  { 
377399    rustc_version:: version_meta ( ) . wrap_err ( "couldn't fetch the `rustc` version" ) 
378400} 
0 commit comments