11use std:: path:: Path ;
22use std:: process:: Command ;
33
4- use rustc_version:: Version ;
4+ use rustc_version:: { Channel , Version } ;
55
66use crate :: errors:: * ;
77use crate :: extensions:: CommandExt ;
@@ -101,7 +101,17 @@ pub fn component_is_installed(component: &str, toolchain: &str, verbose: bool) -
101101 . any ( |l| l. starts_with ( component) && l. contains ( "installed" ) ) )
102102}
103103
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 ) > > {
105115 let path = toolchain_path. join ( "lib/rustlib/multirust-channel-manifest.toml" ) ;
106116 if path. exists ( ) {
107117 let contents = std:: fs:: read ( & path)
@@ -115,12 +125,11 @@ pub fn rustc_version(toolchain_path: &Path) -> Result<Option<(Version, String)>>
115125 {
116126 // Field is `"{version} ({commit} {date})"`
117127 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 ( ) ) ) ) ;
124133 }
125134 }
126135 }
0 commit comments