@@ -36,6 +36,9 @@ use crate::{
36
36
utils:: utils,
37
37
} ;
38
38
39
+ #[ cfg( feature = "test" ) ]
40
+ use crate :: test:: mock:: clitools;
41
+
39
42
#[ derive( Debug , ThisError ) ]
40
43
enum OverrideFileConfigError {
41
44
#[ 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 {
149
152
}
150
153
}
151
154
152
- #[ derive( Default , Debug ) ]
155
+ #[ derive( Default , Debug , PartialEq ) ]
153
156
struct OverrideCfg {
154
157
toolchain : Option < LocalToolchainName > ,
155
158
components : Vec < String > ,
@@ -1005,6 +1008,29 @@ impl Cfg {
1005
1008
}
1006
1009
}
1007
1010
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
+
1008
1034
fn update_override (
1009
1035
override_ : & mut Option < ( OverrideFile , OverrideReason ) > ,
1010
1036
file : OverrideFile ,
@@ -1046,6 +1072,11 @@ enum ParseMode {
1046
1072
mod tests {
1047
1073
use rustup_macros:: unit_test as test;
1048
1074
1075
+ use crate :: {
1076
+ test:: { mock:: clitools:: setup_test_state, test_dist_dir} ,
1077
+ utils:: raw,
1078
+ } ;
1079
+
1049
1080
use super :: * ;
1050
1081
1051
1082
#[ test]
@@ -1248,4 +1279,136 @@ channel = nightly
1248
1279
Ok ( OverrideFileConfigError :: Parsing )
1249
1280
) ) ;
1250
1281
}
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
+ }
1251
1414
}
0 commit comments