1
1
use std:: path:: Path ;
2
2
use std:: process:: Command ;
3
3
4
- use rustc_version:: Version ;
4
+ use rustc_version:: { Channel , Version } ;
5
5
6
6
use crate :: errors:: * ;
7
7
use crate :: extensions:: CommandExt ;
@@ -101,7 +101,17 @@ pub fn component_is_installed(component: &str, toolchain: &str, verbose: bool) -
101
101
. any ( |l| l. starts_with ( component) && l. contains ( "installed" ) ) )
102
102
}
103
103
104
- pub fn rustc_version ( toolchain_path : & Path ) -> Result < Option < ( Version , String ) > > {
104
+ fn rustc_channel ( version : & Version ) -> Result < Channel > {
105
+ match version. pre . split ( '.' ) . next ( ) . unwrap ( ) {
106
+ "" => Ok ( Channel :: Stable ) ,
107
+ "dev" => Ok ( Channel :: Dev ) ,
108
+ "beta" => Ok ( Channel :: Beta ) ,
109
+ "nightly" => Ok ( Channel :: Nightly ) ,
110
+ x => eyre:: bail!( "unknown prerelease tag {x}" ) ,
111
+ }
112
+ }
113
+
114
+ pub fn rustc_version ( toolchain_path : & Path ) -> Result < Option < ( Version , Channel , String ) > > {
105
115
let path = toolchain_path. join ( "lib/rustlib/multirust-channel-manifest.toml" ) ;
106
116
if path. exists ( ) {
107
117
let contents = std:: fs:: read ( & path)
@@ -115,12 +125,11 @@ pub fn rustc_version(toolchain_path: &Path) -> Result<Option<(Version, String)>>
115
125
{
116
126
// Field is `"{version} ({commit} {date})"`
117
127
if let Some ( ( version, meta) ) = rust_version. split_once ( ' ' ) {
118
- return Ok ( Some ( (
119
- Version :: parse ( version) . wrap_err_with ( || {
120
- format ! ( "invalid rust version found in {}" , path. display( ) )
121
- } ) ?,
122
- meta. to_owned ( ) ,
123
- ) ) ) ;
128
+ let version = Version :: parse ( version) . wrap_err_with ( || {
129
+ format ! ( "invalid rust version found in {}" , path. display( ) )
130
+ } ) ?;
131
+ let channel = rustc_channel ( & version) ?;
132
+ return Ok ( Some ( ( version, channel, meta. to_owned ( ) ) ) ) ;
124
133
}
125
134
}
126
135
}
0 commit comments