@@ -36,6 +36,9 @@ use crate::{
3636 utils:: utils,
3737} ;
3838
39+ #[ cfg( feature = "test" ) ]
40+ use crate :: test:: mock:: clitools;
41+
3942#[ derive( Debug , ThisError ) ]
4043enum OverrideFileConfigError {
4144 #[ error( "empty toolchain override file detected. Please remove it, or else specify the desired toolchain properties in the file" ) ]
@@ -149,7 +152,7 @@ impl Display for OverrideReason {
149152 }
150153}
151154
152- #[ derive( Default , Debug ) ]
155+ #[ derive( Default , Debug , PartialEq ) ]
153156struct OverrideCfg {
154157 toolchain : Option < LocalToolchainName > ,
155158 components : Vec < String > ,
@@ -1005,6 +1008,29 @@ impl Cfg {
10051008 }
10061009}
10071010
1011+ #[ cfg( feature = "test" ) ]
1012+ impl From < clitools:: Config > for Cfg {
1013+ fn from ( cfg : clitools:: Config ) -> Self {
1014+ let rustup_dir = & cfg. rustupdir ;
1015+ let dist_root_server = dist:: DEFAULT_DIST_SERVER ;
1016+
1017+ Self {
1018+ rustup_dir : rustup_dir. rustupdir . clone ( ) ,
1019+ fallback_settings : None ,
1020+ settings_file : SettingsFile :: new ( rustup_dir. join ( "settings.toml" ) ) ,
1021+ toolchains_dir : rustup_dir. join ( "toolchains" ) ,
1022+ update_hash_dir : rustup_dir. join ( "update-hashes" ) ,
1023+ download_dir : rustup_dir. join ( "downloads" ) ,
1024+ dist_root_url : dist_root_server. to_owned ( ) + "/dist" ,
1025+ temp_cfg : temp:: Cfg :: new ( rustup_dir. join ( "tmp" ) , dist_root_server, Box :: new ( |_| { } ) ) ,
1026+ toolchain_override : None ,
1027+ profile_override : None ,
1028+ env_override : None ,
1029+ notify_handler : Arc :: new ( |_| { } ) ,
1030+ }
1031+ }
1032+ }
1033+
10081034fn update_override (
10091035 override_ : & mut Option < ( OverrideFile , OverrideReason ) > ,
10101036 file : OverrideFile ,
@@ -1046,6 +1072,11 @@ enum ParseMode {
10461072mod tests {
10471073 use rustup_macros:: unit_test as test;
10481074
1075+ use crate :: {
1076+ test:: { mock:: clitools:: setup_test_state, test_dist_dir} ,
1077+ utils:: raw,
1078+ } ;
1079+
10491080 use super :: * ;
10501081
10511082 #[ test]
@@ -1248,4 +1279,136 @@ channel = nightly
12481279 Ok ( OverrideFileConfigError :: Parsing )
12491280 ) ) ;
12501281 }
1282+
1283+ /// Ensures that `rust-toolchain.toml` configs can be overridden by `<proxy> +<toolchain>`.
1284+ /// See: <https://github.com/rust-lang/rustup/issues/3483>
1285+ #[ test]
1286+ fn toolchain_override_beats_toml ( ) {
1287+ let test_dist_dir = test_dist_dir ( ) . unwrap ( ) ;
1288+ let ( cwd, config) = setup_test_state ( test_dist_dir) ;
1289+
1290+ let toolchain_file = cwd. path ( ) . join ( "rust-toolchain.toml" ) ;
1291+ raw:: write_file (
1292+ & toolchain_file,
1293+ r#"
1294+ [toolchain]
1295+ channel = "nightly"
1296+ components = [ "rls" ]
1297+ "# ,
1298+ )
1299+ . unwrap ( ) ;
1300+
1301+ let mut cfg = Cfg :: try_from ( config) . unwrap ( ) ;
1302+ let default_host_triple = cfg. get_default_host_triple ( ) . unwrap ( ) ;
1303+ cfg. toolchain_override = Some ( "beta" . try_into ( ) . unwrap ( ) ) ;
1304+
1305+ let found_override = cfg. find_override_config ( cwd. path ( ) ) . unwrap ( ) ;
1306+ let override_cfg = found_override. map ( |it| it. 0 ) ;
1307+
1308+ let expected_override_cfg = OverrideCfg {
1309+ toolchain : Some ( LocalToolchainName :: Named ( ToolchainName :: Official (
1310+ ToolchainDesc {
1311+ channel : "beta" . to_owned ( ) ,
1312+ date : None ,
1313+ target : default_host_triple,
1314+ } ,
1315+ ) ) ) ,
1316+ components : vec ! [ "rls" . to_owned( ) ] ,
1317+ targets : vec ! [ ] ,
1318+ profile : None ,
1319+ } ;
1320+ assert_eq ! ( override_cfg, Some ( expected_override_cfg) ) ;
1321+ }
1322+
1323+ /// Ensures that `rust-toolchain.toml` configs can be overridden by `RUSTUP_TOOLCHAIN`.
1324+ /// See: <https://github.com/rust-lang/rustup/issues/3483>
1325+ #[ test]
1326+ fn env_override_beats_toml ( ) {
1327+ let test_dist_dir = test_dist_dir ( ) . unwrap ( ) ;
1328+ let ( cwd, config) = setup_test_state ( test_dist_dir) ;
1329+
1330+ let toolchain_file = cwd. path ( ) . join ( "rust-toolchain.toml" ) ;
1331+ raw:: write_file (
1332+ & toolchain_file,
1333+ r#"
1334+ [toolchain]
1335+ channel = "nightly"
1336+ components = [ "rls" ]
1337+ "# ,
1338+ )
1339+ . unwrap ( ) ;
1340+
1341+ let mut cfg = Cfg :: try_from ( config) . unwrap ( ) ;
1342+ let default_host_triple = cfg. get_default_host_triple ( ) . unwrap ( ) ;
1343+ cfg. env_override = Some (
1344+ ResolvableLocalToolchainName :: try_from ( "beta" )
1345+ . unwrap ( )
1346+ . resolve ( & default_host_triple)
1347+ . unwrap ( ) ,
1348+ ) ;
1349+
1350+ let found_override = cfg. find_override_config ( cwd. path ( ) ) . unwrap ( ) ;
1351+ let override_cfg = found_override. map ( |it| it. 0 ) ;
1352+
1353+ let expected_override_cfg = OverrideCfg {
1354+ toolchain : Some ( LocalToolchainName :: Named ( ToolchainName :: Official (
1355+ ToolchainDesc {
1356+ channel : "beta" . to_owned ( ) ,
1357+ date : None ,
1358+ target : default_host_triple,
1359+ } ,
1360+ ) ) ) ,
1361+ components : vec ! [ "rls" . to_owned( ) ] ,
1362+ targets : vec ! [ ] ,
1363+ profile : None ,
1364+ } ;
1365+ assert_eq ! ( override_cfg, Some ( expected_override_cfg) ) ;
1366+ }
1367+
1368+ /// Ensures that `rust-toolchain.toml` configs can be overridden by `rustup override set`.
1369+ /// See: <https://github.com/rust-lang/rustup/issues/3483>
1370+ #[ test]
1371+ fn override_set_beats_toml ( ) {
1372+ let test_dist_dir = test_dist_dir ( ) . unwrap ( ) ;
1373+ let ( cwd, config) = setup_test_state ( test_dist_dir) ;
1374+
1375+ let toolchain_file = cwd. path ( ) . join ( "rust-toolchain.toml" ) ;
1376+ raw:: write_file (
1377+ & toolchain_file,
1378+ r#"
1379+ [toolchain]
1380+ channel = "nightly"
1381+ components = [ "rls" ]
1382+ "# ,
1383+ )
1384+ . unwrap ( ) ;
1385+
1386+ let cfg = Cfg :: try_from ( config) . unwrap ( ) ;
1387+ let default_host_triple = cfg. get_default_host_triple ( ) . unwrap ( ) ;
1388+
1389+ cfg. settings_file
1390+ . with_mut ( |settings| {
1391+ // "." -> beta, no rls
1392+ settings. add_override ( cwd. path ( ) , "beta" . to_owned ( ) , & |_| { } ) ;
1393+ Ok ( ( ) )
1394+ } )
1395+ . unwrap ( ) ;
1396+
1397+ let found_override = cfg. find_override_config ( cwd. path ( ) ) . unwrap ( ) ;
1398+ let override_cfg = found_override. map ( |it| it. 0 ) ;
1399+
1400+ let expected_override_cfg = OverrideCfg {
1401+ toolchain : Some ( LocalToolchainName :: Named ( ToolchainName :: Official (
1402+ ToolchainDesc {
1403+ channel : "beta" . to_owned ( ) ,
1404+ date : None ,
1405+ target : default_host_triple,
1406+ } ,
1407+ ) ) ) ,
1408+ components : vec ! [ "rls" . to_owned( ) ] ,
1409+ targets : vec ! [ ] ,
1410+ profile : None ,
1411+ } ;
1412+ assert_eq ! ( override_cfg, Some ( expected_override_cfg) ) ;
1413+ }
12511414}
0 commit comments