@@ -20,7 +20,7 @@ use crate::{
20
20
topical_doc,
21
21
} ,
22
22
command,
23
- config:: ActiveReason ,
23
+ config:: { new_toolchain_with_reason , ActiveReason } ,
24
24
currentprocess:: {
25
25
argsource:: ArgSource ,
26
26
filesource:: { StderrSource , StdoutSource } ,
@@ -38,8 +38,9 @@ use crate::{
38
38
names:: {
39
39
custom_toolchain_name_parser, maybe_resolvable_toolchainame_parser,
40
40
partial_toolchain_desc_parser, resolvable_local_toolchainame_parser,
41
- resolvable_toolchainame_parser, CustomToolchainName , MaybeResolvableToolchainName ,
42
- ResolvableLocalToolchainName , ResolvableToolchainName , ToolchainName ,
41
+ resolvable_toolchainame_parser, CustomToolchainName , LocalToolchainName ,
42
+ MaybeResolvableToolchainName , ResolvableLocalToolchainName , ResolvableToolchainName ,
43
+ ToolchainName ,
43
44
} ,
44
45
toolchain:: Toolchain ,
45
46
} ,
@@ -1081,120 +1082,99 @@ fn show(cfg: &Cfg, m: &ArgMatches) -> Result<utils::ExitCode> {
1081
1082
1082
1083
let cwd = utils:: current_dir ( ) ?;
1083
1084
let installed_toolchains = cfg. list_toolchains ( ) ?;
1084
- // XXX: we may want a find_without_install capability for show.
1085
- let active_toolchain = cfg. find_or_install_active_toolchain ( & cwd) ;
1086
-
1087
- // active_toolchain will carry the reason we don't have one in its detail.
1088
- let active_targets = if let Ok ( ref at) = active_toolchain {
1089
- if let Ok ( distributable) = DistributableToolchain :: try_from ( & at. 0 ) {
1090
- match distributable. components ( ) {
1091
- Ok ( cs_vec) => cs_vec
1092
- . into_iter ( )
1093
- . filter ( |c| c. component . short_name_in_manifest ( ) == "rust-std" )
1094
- . filter ( |c| c. installed )
1095
- . collect ( ) ,
1096
- Err ( _) => vec ! [ ] ,
1097
- }
1085
+ let active_toolchain_and_reason: Option < ( ToolchainName , ActiveReason ) > =
1086
+ if let Ok ( Some ( ( LocalToolchainName :: Named ( toolchain_name) , reason) ) ) =
1087
+ cfg. find_active_toolchain ( & cwd)
1088
+ {
1089
+ Some ( ( toolchain_name, reason) )
1098
1090
} else {
1099
- // These three vec![] could perhaps be reduced with and_then on active_toolchain.
1100
- vec ! [ ]
1101
- }
1102
- } else {
1103
- vec ! [ ]
1104
- } ;
1091
+ None
1092
+ } ;
1093
+
1094
+ let ( active_toolchain_name, _active_reason) = active_toolchain_and_reason
1095
+ . as_ref ( )
1096
+ . map ( |atar| ( & atar. 0 , & atar. 1 ) )
1097
+ . unzip ( ) ;
1105
1098
1106
- let show_installed_toolchains = installed_toolchains. len ( ) > 1 ;
1107
- let show_active_targets = active_targets. len ( ) > 1 ;
1108
- let show_active_toolchain = true ;
1109
-
1110
- // Only need to display headers if we have multiple sections
1111
- let show_headers = [
1112
- show_installed_toolchains,
1113
- show_active_targets,
1114
- show_active_toolchain,
1115
- ]
1116
- . iter ( )
1117
- . filter ( |x| * * x)
1118
- . count ( )
1119
- > 1 ;
1120
-
1121
- if show_installed_toolchains {
1099
+ let active_toolchain_targets: Vec < TargetTriple > = active_toolchain_name
1100
+ . and_then ( |atn| match atn {
1101
+ ToolchainName :: Official ( desc) => DistributableToolchain :: new ( cfg, desc. clone ( ) ) . ok ( ) ,
1102
+ // So far, it is not possible to list targets for a custom toolchain.
1103
+ ToolchainName :: Custom ( _) => None ,
1104
+ } )
1105
+ . and_then ( |distributable| distributable. components ( ) . ok ( ) )
1106
+ . map ( |cs_vec| {
1107
+ cs_vec
1108
+ . into_iter ( )
1109
+ . filter ( |c| c. installed && c. component . short_name_in_manifest ( ) == "rust-std" )
1110
+ . map ( |c| c. component . target . expect ( "rust-std should have a target" ) )
1111
+ . collect ( )
1112
+ } )
1113
+ . unwrap_or_default ( ) ;
1114
+
1115
+ // show installed toolchains
1116
+ {
1122
1117
let mut t = process ( ) . stdout ( ) . terminal ( ) ;
1123
1118
1124
- if show_headers {
1125
- print_header :: < Error > ( & mut t, "installed toolchains" ) ?;
1126
- }
1127
- let default_name = cfg
1128
- . get_default ( ) ?
1129
- . ok_or_else ( || anyhow ! ( "no default toolchain configured" ) ) ?;
1130
- for it in installed_toolchains {
1131
- if default_name == it {
1132
- writeln ! ( t. lock( ) , "{it} (default)" ) ?;
1133
- } else {
1134
- writeln ! ( t. lock( ) , "{it}" ) ?;
1135
- }
1119
+ print_header :: < Error > ( & mut t, "installed toolchains" ) ?;
1120
+
1121
+ let default_toolchain_name = cfg. get_default ( ) ?;
1122
+
1123
+ let last_index = installed_toolchains. len ( ) . wrapping_sub ( 1 ) ;
1124
+ for ( n, toolchain_name) in installed_toolchains. into_iter ( ) . enumerate ( ) {
1125
+ let is_default_toolchain = default_toolchain_name. as_ref ( ) == Some ( & toolchain_name) ;
1126
+ let is_active_toolchain = active_toolchain_name == Some ( & toolchain_name) ;
1127
+
1128
+ let status_str = match ( is_active_toolchain, is_default_toolchain) {
1129
+ ( true , true ) => " (active, default)" ,
1130
+ ( true , false ) => " (active)" ,
1131
+ ( false , true ) => " (default)" ,
1132
+ ( false , false ) => "" ,
1133
+ } ;
1134
+
1135
+ writeln ! ( t. lock( ) , "{toolchain_name}{status_str}" ) ?;
1136
+
1136
1137
if verbose {
1137
- let toolchain = Toolchain :: new ( cfg, it. into ( ) ) ?;
1138
- writeln ! ( process( ) . stdout( ) . lock( ) , "{}" , toolchain. rustc_version( ) ) ?;
1139
- // To make it easy to see what rustc that belongs to what
1140
- // toolchain we separate each pair with an extra newline
1141
- writeln ! ( process( ) . stdout( ) . lock( ) ) ?;
1138
+ let toolchain = Toolchain :: new ( cfg, toolchain_name. into ( ) ) ?;
1139
+ writeln ! ( process( ) . stdout( ) . lock( ) , " {}" , toolchain. rustc_version( ) ) ?;
1140
+ // To make it easy to see which rustc belongs to which
1141
+ // toolchain, we separate each pair with an extra newline.
1142
+ if n != last_index {
1143
+ writeln ! ( process( ) . stdout( ) . lock( ) ) ?;
1144
+ }
1142
1145
}
1143
1146
}
1144
- if show_headers {
1145
- writeln ! ( t. lock( ) ) ?
1146
- } ;
1147
1147
}
1148
1148
1149
- if show_active_targets {
1149
+ // show active toolchain
1150
+ {
1150
1151
let mut t = process ( ) . stdout ( ) . terminal ( ) ;
1151
1152
1152
- if show_headers {
1153
- print_header :: < Error > ( & mut t, "installed targets for active toolchain" ) ?;
1154
- }
1155
- for at in active_targets {
1156
- writeln ! (
1157
- t. lock( ) ,
1158
- "{}" ,
1159
- at. component
1160
- . target
1161
- . as_ref( )
1162
- . expect( "rust-std should have a target" )
1163
- ) ?;
1164
- }
1165
- if show_headers {
1166
- writeln ! ( t. lock( ) ) ?;
1167
- } ;
1168
- }
1153
+ writeln ! ( t. lock( ) ) ?;
1169
1154
1170
- if show_active_toolchain {
1171
- let mut t = process ( ) . stdout ( ) . terminal ( ) ;
1155
+ print_header :: < Error > ( & mut t, "active toolchain" ) ?;
1172
1156
1173
- if show_headers {
1174
- print_header :: < Error > ( & mut t, "active toolchain" ) ?;
1175
- }
1157
+ match active_toolchain_and_reason {
1158
+ Some ( ( active_toolchain_name, active_reason) ) => {
1159
+ let active_toolchain = new_toolchain_with_reason (
1160
+ cfg,
1161
+ active_toolchain_name. clone ( ) . into ( ) ,
1162
+ & active_reason,
1163
+ ) ?;
1164
+ writeln ! ( t. lock( ) , "name: {}" , active_toolchain. name( ) ) ?;
1165
+ writeln ! ( t. lock( ) , "compiler: {}" , active_toolchain. rustc_version( ) ) ?;
1166
+ writeln ! ( t. lock( ) , "active because: {}" , active_reason) ?;
1176
1167
1177
- match active_toolchain {
1178
- Ok ( ( ref toolchain, ref reason) ) => {
1179
- writeln ! ( t. lock( ) , "{} ({})" , toolchain. name( ) , reason) ?;
1180
- writeln ! ( t. lock( ) , "{}" , toolchain. rustc_version( ) ) ?;
1181
- }
1182
- Err ( err) => {
1183
- let root_cause = err. root_cause ( ) ;
1184
- if let Some ( RustupError :: ToolchainNotSelected ) =
1185
- root_cause. downcast_ref :: < RustupError > ( )
1186
- {
1187
- writeln ! ( t. lock( ) , "no active toolchain" ) ?;
1188
- } else if let Some ( cause) = err. source ( ) {
1189
- writeln ! ( t. lock( ) , "(error: {err}, {cause})" ) ?;
1190
- } else {
1191
- writeln ! ( t. lock( ) , "(error: {err})" ) ?;
1168
+ // show installed targets for the active toolchain
1169
+ writeln ! ( t. lock( ) , "installed targets:" ) ?;
1170
+
1171
+ for target in active_toolchain_targets {
1172
+ writeln ! ( t. lock( ) , " {}" , target) ?;
1192
1173
}
1193
1174
}
1194
- }
1195
-
1196
- if show_headers {
1197
- writeln ! ( t. lock( ) ) ?
1175
+ None => {
1176
+ writeln ! ( t. lock( ) , "no active toolchain" ) ?;
1177
+ }
1198
1178
}
1199
1179
}
1200
1180
@@ -1203,9 +1183,11 @@ fn show(cfg: &Cfg, m: &ArgMatches) -> Result<utils::ExitCode> {
1203
1183
E : From < std:: io:: Error > ,
1204
1184
{
1205
1185
t. attr ( terminalsource:: Attr :: Bold ) ?;
1206
- writeln ! ( t. lock( ) , "{s}" ) ?;
1207
- writeln ! ( t. lock( ) , "{}" , "-" . repeat( s. len( ) ) ) ?;
1208
- writeln ! ( t. lock( ) ) ?;
1186
+ {
1187
+ let mut term_lock = t. lock ( ) ;
1188
+ writeln ! ( term_lock, "{s}" ) ?;
1189
+ writeln ! ( term_lock, "{}" , "-" . repeat( s. len( ) ) ) ?;
1190
+ } // drop the term_lock
1209
1191
t. reset ( ) ?;
1210
1192
Ok ( ( ) )
1211
1193
}
@@ -1217,27 +1199,24 @@ fn show(cfg: &Cfg, m: &ArgMatches) -> Result<utils::ExitCode> {
1217
1199
fn show_active_toolchain ( cfg : & Cfg , m : & ArgMatches ) -> Result < utils:: ExitCode > {
1218
1200
let verbose = m. get_flag ( "verbose" ) ;
1219
1201
let cwd = utils:: current_dir ( ) ?;
1220
- match cfg. find_or_install_active_toolchain ( & cwd) {
1221
- Err ( e) => {
1222
- let root_cause = e. root_cause ( ) ;
1223
- if let Some ( RustupError :: ToolchainNotSelected ) =
1224
- root_cause. downcast_ref :: < RustupError > ( )
1225
- {
1226
- } else {
1227
- return Err ( e) ;
1228
- }
1229
- }
1230
- Ok ( ( toolchain, reason) ) => {
1202
+ match cfg. find_active_toolchain ( & cwd) ? {
1203
+ Some ( ( toolchain_name, reason) ) => {
1204
+ let toolchain = new_toolchain_with_reason ( cfg, toolchain_name. clone ( ) , & reason) ?;
1231
1205
writeln ! (
1232
1206
process( ) . stdout( ) . lock( ) ,
1233
- "{} ({}) " ,
1207
+ "{}\n active because: {} " ,
1234
1208
toolchain. name( ) ,
1235
1209
reason
1236
1210
) ?;
1237
1211
if verbose {
1238
- writeln ! ( process( ) . stdout( ) . lock( ) , "{}" , toolchain. rustc_version( ) ) ?;
1212
+ writeln ! (
1213
+ process( ) . stdout( ) . lock( ) ,
1214
+ "compiler: {}" ,
1215
+ toolchain. rustc_version( )
1216
+ ) ?;
1239
1217
}
1240
1218
}
1219
+ None => writeln ! ( process( ) . stdout( ) . lock( ) , "There isn't an active toolchain" ) ?,
1241
1220
}
1242
1221
Ok ( utils:: ExitCode ( 0 ) )
1243
1222
}
0 commit comments