From f45cd9f323e6969d7db30a8519afc82e97a3e300 Mon Sep 17 00:00:00 2001 From: Alexander Koval Date: Fri, 14 Feb 2020 23:27:00 +0200 Subject: [PATCH 1/3] #370 Support for explicit channel argument --- src/cli.rs | 19 ++++++++++++++----- src/errors.rs | 7 +++++++ src/main.rs | 26 ++++++++++++++++++-------- src/rustc.rs | 29 ++++++++++++++++++++++++++++- 4 files changed, 67 insertions(+), 14 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 19bc32652..4546f97f8 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -1,17 +1,23 @@ use std::{env, path::PathBuf}; +use rustc_version::Channel; + use crate::Target; use crate::cargo::Subcommand; -use crate::rustc::TargetList; +use crate::errors::Result; +use crate::rustc::{ChannelExt, TargetList}; +#[derive(Debug)] pub struct Args { pub all: Vec, pub subcommand: Option, + pub channel: Option, pub target: Option, pub target_dir: Option, } -pub fn parse(target_list: &TargetList) -> Args { +pub fn parse(target_list: &TargetList) -> Result { + let mut channel = None; let mut target = None; let mut target_dir = None; let mut sc = None; @@ -20,7 +26,9 @@ pub fn parse(target_list: &TargetList) -> Args { { let mut args = env::args().skip(1); while let Some(arg) = args.next() { - if arg == "--target" { + if arg.starts_with("+") { + channel = Some(Channel::from_str(&arg[1..])?); + } else if arg == "--target" { all.push(arg); if let Some(t) = args.next() { target = Some(Target::from(&t, target_list)); @@ -50,10 +58,11 @@ pub fn parse(target_list: &TargetList) -> Args { } } - Args { + Ok(Args { all, subcommand: sc, + channel, target, target_dir, - } + }) } diff --git a/src/errors.rs b/src/errors.rs index 30d89d9a5..e74d68c94 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -7,4 +7,11 @@ error_chain! { Io(std::io::Error); Which(which::Error); } + + errors { + InvalidChannelName(channel: String) { + description("invalid channel name") + display("invalid channel name: '{}'", channel) + } + } } diff --git a/src/main.rs b/src/main.rs index b6b0da5c5..0a414f500 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,7 +20,7 @@ use toml::{Value, value::Table}; use self::cargo::{Root, Subcommand}; use self::errors::*; -use self::rustc::{TargetList, VersionMetaExt}; +use self::rustc::{ChannelExt, TargetList, VersionMetaExt}; #[allow(non_camel_case_types)] #[derive(Debug, Clone, PartialEq)] @@ -208,7 +208,7 @@ pub fn main() { fn run() -> Result { let target_list = rustc::target_list(false)?; - let args = cli::parse(&target_list); + let args = cli::parse(&target_list)?; if args.all.iter().any(|a| a == "--version" || a == "-V") && args.subcommand.is_none() { @@ -228,9 +228,19 @@ fn run() -> Result { .unwrap_or_else(|| Target::from(host.triple(), &target_list)); let toml = toml(&root)?; - let sysroot = rustc::sysroot(&host, &target, verbose)?; - let toolchain = sysroot.file_name().and_then(|file_name| file_name.to_str()) + let mut sysroot = rustc::sysroot(&host, &target, verbose)?; + let default_toolchain = sysroot.file_name().and_then(|file_name| file_name.to_str()) .ok_or("couldn't get toolchain name")?; + let toolchain = if let Some(channel) = args.channel { + [channel.to_string()].iter().map(|c| c.as_str()).chain( + default_toolchain.splitn(2, '-').skip(1) + ) + .collect::>() + .join("-") + } else { + default_toolchain.to_string() + }; + sysroot.set_file_name(&toolchain); let installed_toolchains = rustup::installed_toolchains(verbose)?; @@ -250,13 +260,13 @@ fn run() -> Result { if !uses_xargo && !available_targets.is_installed(&target) { rustup::install(&target, &toolchain, verbose)?; - } else if !rustup::component_is_installed("rust-src", toolchain, verbose)? { - rustup::install_component("rust-src", toolchain, verbose)?; + } else if !rustup::component_is_installed("rust-src", &toolchain, verbose)? { + rustup::install_component("rust-src", &toolchain, verbose)?; } if args.subcommand.map(|sc| sc == Subcommand::Clippy).unwrap_or(false) && - !rustup::component_is_installed("clippy", toolchain, verbose)? { - rustup::install_component("clippy", toolchain, verbose)?; + !rustup::component_is_installed("clippy", &toolchain, verbose)? { + rustup::install_component("clippy", &toolchain, verbose)?; } let needs_interpreter = args.subcommand.map(|sc| sc.needs_interpreter()).unwrap_or(false); diff --git a/src/rustc.rs b/src/rustc.rs index 20fdc4841..5887b4084 100644 --- a/src/rustc.rs +++ b/src/rustc.rs @@ -1,7 +1,7 @@ use std::path::PathBuf; use std::process::Command; -use rustc_version::{Version, VersionMeta}; +use rustc_version::{Channel, Version, VersionMeta}; use crate::{Host, Target}; use crate::errors::*; @@ -38,6 +38,33 @@ impl VersionMetaExt for VersionMeta { } } +pub(crate) trait ChannelExt { + fn from_str(chan: &str) -> Result; + fn to_string(&self) -> String; +} + +impl ChannelExt for Channel { + fn from_str(chan: &str) -> Result { + Ok(match chan { + "stable" => Channel::Stable, + "nightly" => Channel::Nightly, + "dev" => Channel::Dev, + "beta" => Channel::Beta, + _ => return Err( + ErrorKind::InvalidChannelName(chan.to_string()).into() + ), + }) + } + fn to_string(&self) -> String { + match self { + Channel::Stable => "stable", + Channel::Nightly => "nightly", + Channel::Dev => "dev", + Channel::Beta => "beta", + }.to_string() + } +} + pub fn target_list(verbose: bool) -> Result { Command::new("rustc") .args(&["--print", "target-list"]) From d1b7b46dcf9a19e4fa8186806ed306f748b0b78e Mon Sep 17 00:00:00 2001 From: Alexander Koval Date: Mon, 24 Feb 2020 13:59:10 +0200 Subject: [PATCH 2/3] Pass channel argument to cargo as is --- src/cli.rs | 10 ++++------ src/errors.rs | 7 ------- src/main.rs | 4 ++-- src/rustc.rs | 29 +---------------------------- 4 files changed, 7 insertions(+), 43 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 4546f97f8..1fbb7e63f 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -1,17 +1,15 @@ use std::{env, path::PathBuf}; -use rustc_version::Channel; - use crate::Target; use crate::cargo::Subcommand; use crate::errors::Result; -use crate::rustc::{ChannelExt, TargetList}; +use crate::rustc::TargetList; #[derive(Debug)] pub struct Args { pub all: Vec, pub subcommand: Option, - pub channel: Option, + pub channel: Option, pub target: Option, pub target_dir: Option, } @@ -26,8 +24,8 @@ pub fn parse(target_list: &TargetList) -> Result { { let mut args = env::args().skip(1); while let Some(arg) = args.next() { - if arg.starts_with("+") { - channel = Some(Channel::from_str(&arg[1..])?); + if let ("+", ch) = arg.split_at(1) { + channel = Some(ch.to_string()); } else if arg == "--target" { all.push(arg); if let Some(t) = args.next() { diff --git a/src/errors.rs b/src/errors.rs index e74d68c94..30d89d9a5 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -7,11 +7,4 @@ error_chain! { Io(std::io::Error); Which(which::Error); } - - errors { - InvalidChannelName(channel: String) { - description("invalid channel name") - display("invalid channel name: '{}'", channel) - } - } } diff --git a/src/main.rs b/src/main.rs index 0a414f500..549562929 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,7 +20,7 @@ use toml::{Value, value::Table}; use self::cargo::{Root, Subcommand}; use self::errors::*; -use self::rustc::{ChannelExt, TargetList, VersionMetaExt}; +use self::rustc::{TargetList, VersionMetaExt}; #[allow(non_camel_case_types)] #[derive(Debug, Clone, PartialEq)] @@ -232,7 +232,7 @@ fn run() -> Result { let default_toolchain = sysroot.file_name().and_then(|file_name| file_name.to_str()) .ok_or("couldn't get toolchain name")?; let toolchain = if let Some(channel) = args.channel { - [channel.to_string()].iter().map(|c| c.as_str()).chain( + [channel].iter().map(|c| c.as_str()).chain( default_toolchain.splitn(2, '-').skip(1) ) .collect::>() diff --git a/src/rustc.rs b/src/rustc.rs index 5887b4084..20fdc4841 100644 --- a/src/rustc.rs +++ b/src/rustc.rs @@ -1,7 +1,7 @@ use std::path::PathBuf; use std::process::Command; -use rustc_version::{Channel, Version, VersionMeta}; +use rustc_version::{Version, VersionMeta}; use crate::{Host, Target}; use crate::errors::*; @@ -38,33 +38,6 @@ impl VersionMetaExt for VersionMeta { } } -pub(crate) trait ChannelExt { - fn from_str(chan: &str) -> Result; - fn to_string(&self) -> String; -} - -impl ChannelExt for Channel { - fn from_str(chan: &str) -> Result { - Ok(match chan { - "stable" => Channel::Stable, - "nightly" => Channel::Nightly, - "dev" => Channel::Dev, - "beta" => Channel::Beta, - _ => return Err( - ErrorKind::InvalidChannelName(chan.to_string()).into() - ), - }) - } - fn to_string(&self) -> String { - match self { - Channel::Stable => "stable", - Channel::Nightly => "nightly", - Channel::Dev => "dev", - Channel::Beta => "beta", - }.to_string() - } -} - pub fn target_list(verbose: bool) -> Result { Command::new("rustc") .args(&["--print", "target-list"]) From 0c0e0301e1e8a56df2203633337cc0f7daeb464d Mon Sep 17 00:00:00 2001 From: Alexander Koval Date: Wed, 18 Mar 2020 18:38:58 +0200 Subject: [PATCH 3/3] Cleaned up useless Result --- src/cli.rs | 7 +++---- src/main.rs | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 1fbb7e63f..f501b41bd 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -2,7 +2,6 @@ use std::{env, path::PathBuf}; use crate::Target; use crate::cargo::Subcommand; -use crate::errors::Result; use crate::rustc::TargetList; #[derive(Debug)] @@ -14,7 +13,7 @@ pub struct Args { pub target_dir: Option, } -pub fn parse(target_list: &TargetList) -> Result { +pub fn parse(target_list: &TargetList) -> Args { let mut channel = None; let mut target = None; let mut target_dir = None; @@ -56,11 +55,11 @@ pub fn parse(target_list: &TargetList) -> Result { } } - Ok(Args { + Args { all, subcommand: sc, channel, target, target_dir, - }) + } } diff --git a/src/main.rs b/src/main.rs index 549562929..2f6535792 100644 --- a/src/main.rs +++ b/src/main.rs @@ -208,7 +208,7 @@ pub fn main() { fn run() -> Result { let target_list = rustc::target_list(false)?; - let args = cli::parse(&target_list)?; + let args = cli::parse(&target_list); if args.all.iter().any(|a| a == "--version" || a == "-V") && args.subcommand.is_none() {