@@ -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