@@ -33,6 +33,7 @@ impl OverrideFile {
3333#[ derive( Debug , Default , Deserialize , PartialEq , Eq ) ]
3434struct ToolchainSection {
3535 channel : Option < String > ,
36+ path : Option < String > ,
3637 components : Option < Vec < String > > ,
3738 targets : Option < Vec < String > > ,
3839}
@@ -45,11 +46,21 @@ impl ToolchainSection {
4546
4647impl < T : Into < String > > From < T > for OverrideFile {
4748 fn from ( channel : T ) -> Self {
48- Self {
49- toolchain : ToolchainSection {
50- channel : Some ( channel. into ( ) ) ,
51- ..Default :: default ( )
52- } ,
49+ let channel = channel. into ( ) ;
50+ if channel. contains ( '/' ) || channel. contains ( '\\' ) {
51+ Self {
52+ toolchain : ToolchainSection {
53+ path : Some ( channel) ,
54+ ..Default :: default ( )
55+ } ,
56+ }
57+ } else {
58+ Self {
59+ toolchain : ToolchainSection {
60+ channel : Some ( channel) ,
61+ ..Default :: default ( )
62+ } ,
63+ }
5364 }
5465 }
5566}
@@ -73,7 +84,7 @@ impl Display for OverrideReason {
7384 }
7485}
7586
76- #[ derive( Default ) ]
87+ #[ derive( Default , Debug ) ]
7788struct OverrideCfg < ' a > {
7889 toolchain : Option < Toolchain < ' a > > ,
7990 components : Vec < String > ,
@@ -83,9 +94,13 @@ struct OverrideCfg<'a> {
8394impl < ' a > OverrideCfg < ' a > {
8495 fn from_file ( cfg : & ' a Cfg , file : OverrideFile ) -> Result < Self > {
8596 Ok ( Self {
86- toolchain : match file. toolchain . channel {
87- Some ( name) => Some ( Toolchain :: from ( cfg, & name) ?) ,
88- None => None ,
97+ toolchain : match ( file. toolchain . channel , file. toolchain . path ) {
98+ ( Some ( name) , None ) => Some ( Toolchain :: from ( cfg, & name) ?) ,
99+ ( None , Some ( path) ) => Some ( Toolchain :: from_path ( cfg, & path) ?) ,
100+ ( Some ( channel) , Some ( path) ) => {
101+ return Err ( ErrorKind :: CannotSpecifyChannelAndPath ( channel, path. into ( ) ) . into ( ) )
102+ }
103+ ( None , None ) => None ,
89104 } ,
90105 components : file. toolchain . components . unwrap_or_default ( ) ,
91106 targets : file. toolchain . targets . unwrap_or_default ( ) ,
@@ -521,7 +536,6 @@ impl Cfg {
521536 path. display( )
522537 ) ,
523538 } ;
524-
525539 let override_cfg = OverrideCfg :: from_file ( self , file) ?;
526540 if let Some ( toolchain) = & override_cfg. toolchain {
527541 // Overridden toolchains can be literally any string, but only
@@ -889,6 +903,7 @@ mod tests {
889903 OverrideFile {
890904 toolchain: ToolchainSection {
891905 channel: Some ( contents. into( ) ) ,
906+ path: None ,
892907 components: None ,
893908 targets: None ,
894909 }
@@ -910,6 +925,7 @@ targets = [ "wasm32-unknown-unknown", "thumbv2-none-eabi" ]
910925 OverrideFile {
911926 toolchain: ToolchainSection {
912927 channel: Some ( "nightly-2020-07-10" . into( ) ) ,
928+ path: None ,
913929 components: Some ( vec![ "rustfmt" . into( ) , "rustc-dev" . into( ) ] ) ,
914930 targets: Some ( vec![
915931 "wasm32-unknown-unknown" . into( ) ,
@@ -932,6 +948,7 @@ channel = "nightly-2020-07-10"
932948 OverrideFile {
933949 toolchain: ToolchainSection {
934950 channel: Some ( "nightly-2020-07-10" . into( ) ) ,
951+ path: None ,
935952 components: None ,
936953 targets: None ,
937954 }
@@ -952,6 +969,7 @@ components = []
952969 OverrideFile {
953970 toolchain: ToolchainSection {
954971 channel: Some ( "nightly-2020-07-10" . into( ) ) ,
972+ path: None ,
955973 components: Some ( vec![ ] ) ,
956974 targets: None ,
957975 }
@@ -972,6 +990,7 @@ targets = []
972990 OverrideFile {
973991 toolchain: ToolchainSection {
974992 channel: Some ( "nightly-2020-07-10" . into( ) ) ,
993+ path: None ,
975994 components: None ,
976995 targets: Some ( vec![ ] ) ,
977996 }
@@ -991,6 +1010,7 @@ components = [ "rustfmt" ]
9911010 OverrideFile {
9921011 toolchain: ToolchainSection {
9931012 channel: None ,
1013+ path: None ,
9941014 components: Some ( vec![ "rustfmt" . into( ) ] ) ,
9951015 targets: None ,
9961016 }
0 commit comments