From 8c5739fa951c99e8c1a8aa134230861fd56f2a81 Mon Sep 17 00:00:00 2001 From: amar-laksh Date: Tue, 2 Jan 2018 11:18:55 +0530 Subject: [PATCH 1/3] Add print-only url to rustup doc, fix #1288 --- src/rustup-cli/rustup_mode.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/rustup-cli/rustup_mode.rs b/src/rustup-cli/rustup_mode.rs index 21524e1b5a..3c40c2dc45 100644 --- a/src/rustup-cli/rustup_mode.rs +++ b/src/rustup-cli/rustup_mode.rs @@ -293,6 +293,9 @@ pub fn cli() -> App<'static, 'static> { .alias("docs") .about("Open the documentation for the current toolchain") .after_help(DOC_HELP) + .arg(Arg::with_name("print-only") + .long("print-only") + .help("The URL of the local Rust documentation")) .arg(Arg::with_name("book") .long("book") .help("The Rust Programming Language book")) From 6af1c4013b25c566df215940b4886432ceba1ed7 Mon Sep 17 00:00:00 2001 From: amar-laksh Date: Tue, 2 Jan 2018 11:18:55 +0530 Subject: [PATCH 2/3] Add print-only url to rustup doc, fix #1288 --- 3 | 840 +++++++++++++++++++++++++++++ src/rustup-cli/.rustup_mode.rs.swp | Bin 0 -> 45056 bytes src/rustup-cli/rustup_mode.rs | 12 + 3 files changed, 852 insertions(+) create mode 100644 3 create mode 100644 src/rustup-cli/.rustup_mode.rs.swp diff --git a/3 b/3 new file mode 100644 index 0000000000..45f2c6d472 --- /dev/null +++ b/3 @@ -0,0 +1,840 @@ +use clap::{App, Arg, ArgGroup, AppSettings, SubCommand, ArgMatches, Shell}; +use common; +use rustup::{Cfg, Toolchain, command}; +use rustup::settings::TelemetryMode; +use errors::*; +use rustup_dist::manifest::Component; +use rustup_dist::dist::{TargetTriple, PartialToolchainDesc, PartialTargetTriple}; +use rustup_utils::utils; +use self_update; +use std::path::{Path, PathBuf}; +use std::process::Command; +use std::iter; +use std::error::Error; +use term2; +use std::io::{self, Write}; +use help::*; + +pub fn main() -> Result<()> { + try!(::self_update::cleanup_self_updater()); + + let ref matches = cli().get_matches(); + let verbose = matches.is_present("verbose"); + let ref cfg = try!(common::set_globals(verbose)); + + if try!(maybe_upgrade_data(cfg, matches)) { + return Ok(()) + } + + try!(cfg.check_metadata_version()); + + match matches.subcommand() { + ("show", Some(_)) => try!(show(cfg)), + ("install", Some(m)) => try!(update(cfg, m)), + ("update", Some(m)) => try!(update(cfg, m)), + ("uninstall", Some(m)) => try!(toolchain_remove(cfg, m)), + ("default", Some(m)) => try!(default_(cfg, m)), + ("toolchain", Some(c)) => { + match c.subcommand() { + ("install", Some(m)) => try!(update(cfg, m)), + ("list", Some(_)) => try!(common::list_toolchains(cfg)), + ("link", Some(m)) => try!(toolchain_link(cfg, m)), + ("uninstall", Some(m)) => try!(toolchain_remove(cfg, m)), + (_, _) => unreachable!(), + } + } + ("target", Some(c)) => { + match c.subcommand() { + ("list", Some(m)) => try!(target_list(cfg, m)), + ("add", Some(m)) => try!(target_add(cfg, m)), + ("remove", Some(m)) => try!(target_remove(cfg, m)), + (_, _) => unreachable!(), + } + } + ("component", Some(c)) => { + match c.subcommand() { + ("list", Some(m)) => try!(component_list(cfg, m)), + ("add", Some(m)) => try!(component_add(cfg, m)), + ("remove", Some(m)) => try!(component_remove(cfg, m)), + (_, _) => unreachable!(), + } + } + ("override", Some(c)) => { + match c.subcommand() { + ("list", Some(_)) => try!(common::list_overrides(cfg)), + ("set", Some(m)) => try!(override_add(cfg, m)), + ("unset", Some(m)) => try!(override_remove(cfg, m)), + (_ ,_) => unreachable!(), + } + } + ("run", Some(m)) => try!(run(cfg, m)), + ("which", Some(m)) => try!(which(cfg, m)), + ("doc", Some(m)) => try!(doc(cfg, m)), + ("man", Some(m)) => try!(man(cfg,m)), + ("self", Some(c)) => { + match c.subcommand() { + ("update", Some(_)) => try!(self_update::update()), + ("uninstall", Some(m)) => try!(self_uninstall(m)), + (_ ,_) => unreachable!(), + } + } + ("telemetry", Some(c)) => { + match c.subcommand() { + ("enable", Some(_)) => try!(set_telemetry(&cfg, TelemetryMode::On)), + ("disable", Some(_)) => try!(set_telemetry(&cfg, TelemetryMode::Off)), + ("analyze", Some(_)) => try!(analyze_telemetry(&cfg)), + (_, _) => unreachable!(), + } + } + ("set", Some(c)) => { + match c.subcommand() { + ("default-host", Some(m)) => try!(set_default_host_triple(&cfg, m)), + (_, _) => unreachable!(), + } + } + ("completions", Some(c)) => { + if let Some(shell) = c.value_of("shell") { + cli().gen_completions_to("rustup", shell.parse::().unwrap(), &mut io::stdout()); + } + } + (_, _) => unreachable!(), + } + + Ok(()) +} + +pub fn cli() -> App<'static, 'static> { + let mut app = App::new("rustup") + .version(common::version()) + .about("The Rust toolchain installer") + .after_help(RUSTUP_HELP) + .setting(AppSettings::VersionlessSubcommands) + .setting(AppSettings::DeriveDisplayOrder) + .setting(AppSettings::SubcommandRequiredElseHelp) + .arg(Arg::with_name("verbose") + .help("Enable verbose output") + .short("v") + .long("verbose")) + .subcommand(SubCommand::with_name("show") + .about("Show the active and installed toolchains") + .after_help(SHOW_HELP)) + .subcommand(SubCommand::with_name("install") + .about("Update Rust toolchains") + .after_help(INSTALL_HELP) + .setting(AppSettings::Hidden) // synonym for 'toolchain install' + .arg(Arg::with_name("toolchain") + .help(TOOLCHAIN_ARG_HELP) + .required(true) + .multiple(true))) + .subcommand(SubCommand::with_name("uninstall") + .about("Uninstall Rust toolchains") + .setting(AppSettings::Hidden) // synonym for 'toolchain uninstall' + .arg(Arg::with_name("toolchain") + .help(TOOLCHAIN_ARG_HELP) + .required(true) + .multiple(true))) + .subcommand(SubCommand::with_name("update") + .about("Update Rust toolchains and rustup") + .after_help(UPDATE_HELP) + .arg(Arg::with_name("toolchain") + .help(TOOLCHAIN_ARG_HELP) + .required(false) + .multiple(true)) + .arg(Arg::with_name("no-self-update") + .help("Don't perform self update when running the `rustup` command") + .long("no-self-update") + .takes_value(false) + .hidden(true))) + .subcommand(SubCommand::with_name("default") + .about("Set the default toolchain") + .after_help(DEFAULT_HELP) + .arg(Arg::with_name("toolchain") + .help(TOOLCHAIN_ARG_HELP) + .required(true))) + .subcommand(SubCommand::with_name("toolchain") + .about("Modify or query the installed toolchains") + .after_help(TOOLCHAIN_HELP) + .setting(AppSettings::VersionlessSubcommands) + .setting(AppSettings::DeriveDisplayOrder) + .setting(AppSettings::SubcommandRequiredElseHelp) + .subcommand(SubCommand::with_name("list") + .about("List installed toolchains")) + .subcommand(SubCommand::with_name("install") + .about("Install or update a given toolchain") + .aliases(&["update", "add"]) + .arg(Arg::with_name("toolchain") + .help(TOOLCHAIN_ARG_HELP) + .required(true) + .multiple(true))) + .subcommand(SubCommand::with_name("uninstall") + .about("Uninstall a toolchain") + .alias("remove") + .arg(Arg::with_name("toolchain") + .help(TOOLCHAIN_ARG_HELP) + .required(true) + .multiple(true))) + .subcommand(SubCommand::with_name("link") + .about("Create a custom toolchain by symlinking to a directory") + .after_help(TOOLCHAIN_LINK_HELP) + .arg(Arg::with_name("toolchain") + .help(TOOLCHAIN_ARG_HELP) + .required(true)) + .arg(Arg::with_name("path") + .required(true)))) + .subcommand(SubCommand::with_name("target") + .about("Modify a toolchain's supported targets") + .setting(AppSettings::VersionlessSubcommands) + .setting(AppSettings::DeriveDisplayOrder) + .setting(AppSettings::SubcommandRequiredElseHelp) + .subcommand(SubCommand::with_name("list") + .about("List installed and available targets") + .arg(Arg::with_name("toolchain") + .help(TOOLCHAIN_ARG_HELP) + .long("toolchain") + .takes_value(true))) + .subcommand(SubCommand::with_name("add") + .about("Add a target to a Rust toolchain") + .alias("install") + .arg(Arg::with_name("target") + .required(true) + .multiple(true)) + .arg(Arg::with_name("toolchain") + .help(TOOLCHAIN_ARG_HELP) + .long("toolchain") + .takes_value(true))) + .subcommand(SubCommand::with_name("remove") + .about("Remove a target from a Rust toolchain") + .alias("uninstall") + .arg(Arg::with_name("target") + .required(true) + .multiple(true)) + .arg(Arg::with_name("toolchain") + .help(TOOLCHAIN_ARG_HELP) + .long("toolchain") + .takes_value(true)))) + .subcommand(SubCommand::with_name("component") + .about("Modify a toolchain's installed components") + .setting(AppSettings::VersionlessSubcommands) + .setting(AppSettings::DeriveDisplayOrder) + .setting(AppSettings::SubcommandRequiredElseHelp) + .subcommand(SubCommand::with_name("list") + .about("List installed and available components") + .arg(Arg::with_name("toolchain") + .help(TOOLCHAIN_ARG_HELP) + .long("toolchain") + .takes_value(true))) + .subcommand(SubCommand::with_name("add") + .about("Add a component to a Rust toolchain") + .arg(Arg::with_name("component") + .required(true) + .multiple(true)) + .arg(Arg::with_name("toolchain") + .help(TOOLCHAIN_ARG_HELP) + .long("toolchain") + .takes_value(true)) + .arg(Arg::with_name("target") + .long("target") + .takes_value(true))) + .subcommand(SubCommand::with_name("remove") + .about("Remove a component from a Rust toolchain") + .arg(Arg::with_name("component") + .required(true) + .multiple(true)) + .arg(Arg::with_name("toolchain") + .help(TOOLCHAIN_ARG_HELP) + .long("toolchain") + .takes_value(true)) + .arg(Arg::with_name("target") + .long("target") + .takes_value(true)))) + .subcommand(SubCommand::with_name("override") + .about("Modify directory toolchain overrides") + .after_help(OVERRIDE_HELP) + .setting(AppSettings::VersionlessSubcommands) + .setting(AppSettings::DeriveDisplayOrder) + .setting(AppSettings::SubcommandRequiredElseHelp) + .subcommand(SubCommand::with_name("list") + .about("List directory toolchain overrides")) + .subcommand(SubCommand::with_name("set") + .about("Set the override toolchain for a directory") + .alias("add") + .arg(Arg::with_name("toolchain") + .help(TOOLCHAIN_ARG_HELP) + .required(true))) + .subcommand(SubCommand::with_name("unset") + .about("Remove the override toolchain for a directory") + .after_help(OVERRIDE_UNSET_HELP) + .alias("remove") + .arg(Arg::with_name("path") + .long("path") + .takes_value(true) + .help("Path to the directory")) + .arg(Arg::with_name("nonexistent") + .long("nonexistent") + .takes_value(false) + .help("Remove override toolchain for all nonexistent directories")))) + .subcommand(SubCommand::with_name("run") + .about("Run a command with an environment configured for a given toolchain") + .after_help(RUN_HELP) + .setting(AppSettings::TrailingVarArg) + .arg(Arg::with_name("install") + .help("Install the requested toolchain if needed") + .long("install")) + .arg(Arg::with_name("toolchain") + .help(TOOLCHAIN_ARG_HELP) + .required(true)) + .arg(Arg::with_name("command") + .required(true).multiple(true).use_delimiter(false))) + .subcommand(SubCommand::with_name("which") + .about("Display which binary will be run for a given command") + .arg(Arg::with_name("command") + .required(true))) + .subcommand(SubCommand::with_name("doc") + .alias("docs") + .about("Open the documentation for the current toolchain") + .after_help(DOC_HELP) + .arg(Arg::with_name("print-only") + .long("print-only") + .help("The URL of the local Rust documentation")) + .arg(Arg::with_name("book") + .long("book") + .help("The Rust Programming Language book")) + .arg(Arg::with_name("std") + .long("std") + .help("Standard library API documentation")) + .group(ArgGroup::with_name("page") + .args(&["book", "std"]))); + + if cfg!(not(target_os = "windows")) { + app = app + .subcommand(SubCommand::with_name("man") + .about("View the man page for a given command") + .arg(Arg::with_name("command") + .required(true)) + .arg(Arg::with_name("toolchain") + .help(TOOLCHAIN_ARG_HELP) + .long("toolchain") + .takes_value(true))); + } + + app.subcommand(SubCommand::with_name("self") + .about("Modify the rustup installation") + .setting(AppSettings::VersionlessSubcommands) + .setting(AppSettings::DeriveDisplayOrder) + .setting(AppSettings::SubcommandRequiredElseHelp) + .subcommand(SubCommand::with_name("update") + .about("Download and install updates to rustup")) + .subcommand(SubCommand::with_name("uninstall") + .about("Uninstall rustup.") + .arg(Arg::with_name("no-prompt") + .short("y"))) + .subcommand(SubCommand::with_name("upgrade-data") + .about("Upgrade the internal data format."))) + .subcommand(SubCommand::with_name("telemetry") + .about("rustup telemetry commands") + .setting(AppSettings::Hidden) + .setting(AppSettings::VersionlessSubcommands) + .setting(AppSettings::DeriveDisplayOrder) + .setting(AppSettings::SubcommandRequiredElseHelp) + .subcommand(SubCommand::with_name("enable") + .about("Enable rustup telemetry")) + .subcommand(SubCommand::with_name("disable") + .about("Disable rustup telemetry")) + .subcommand(SubCommand::with_name("analyze") + .about("Analyze stored telemetry"))) + .subcommand(SubCommand::with_name("set") + .about("Alter rustup settings") + .setting(AppSettings::SubcommandRequiredElseHelp) + .subcommand(SubCommand::with_name("default-host") + .about("The triple used to identify toolchains when not specified") + .arg(Arg::with_name("host_triple") + .required(true)))) + .subcommand(SubCommand::with_name("completions") + .about("Generate completion scripts for your shell") + .after_help(COMPLETIONS_HELP) + .setting(AppSettings::ArgRequiredElseHelp) + .arg(Arg::with_name("shell") + .possible_values(&Shell::variants()))) +} + +fn maybe_upgrade_data(cfg: &Cfg, m: &ArgMatches) -> Result { + match m.subcommand() { + ("self", Some(c)) => { + match c.subcommand() { + ("upgrade-data", Some(_)) => { + try!(cfg.upgrade_data()); + Ok(true) + } + _ => Ok(false), + } + } + _ => Ok(false) + } +} + +fn update_bare_triple_check(cfg: &Cfg, name: &str) -> Result<()> { + if let Some(triple) = PartialTargetTriple::from_str(name) { + warn!("(partial) target triple specified instead of toolchain name"); + let installed_toolchains = try!(cfg.list_toolchains()); + let default = try!(cfg.find_default()); + let default_name = default.map(|t| t.name().to_string()) + .unwrap_or("".into()); + let mut candidates = vec![]; + for t in installed_toolchains { + if t == default_name { + continue; + } + if let Ok(desc) = PartialToolchainDesc::from_str(&t) { + fn triple_comp_eq(given: &str, from_desc: Option<&String>) -> bool { + from_desc.map_or(false, |s| *s == *given) + } + + let triple_matches = + triple.arch.as_ref().map_or(true, |s| triple_comp_eq(s, desc.target.arch.as_ref())) + && triple.os.as_ref().map_or(true, |s| triple_comp_eq(s, desc.target.os.as_ref())) + && triple.env.as_ref().map_or(true, |s| triple_comp_eq(s, desc.target.env.as_ref())); + if triple_matches { + candidates.push(t); + } + } + } + match candidates.len() { + 0 => err!("no candidate toolchains found"), + 1 => println!("\nyou may use the following toolchain: {}\n", candidates[0]), + _ => { + println!("\nyou may use one of the following toolchains:"); + for n in &candidates { + println!("{}", n); + } + println!(""); + } + } + return Err(ErrorKind::ToolchainNotInstalled(name.to_string()).into()); + } + Ok(()) +} + +fn default_bare_triple_check(cfg: &Cfg, name: &str) -> Result<()> { + if let Some(triple) = PartialTargetTriple::from_str(name) { + warn!("(partial) target triple specified instead of toolchain name"); + let default = try!(cfg.find_default()); + let default_name = default.map(|t| t.name().to_string()) + .unwrap_or("".into()); + if let Ok(mut desc) = PartialToolchainDesc::from_str(&default_name) { + desc.target = triple; + let maybe_toolchain = format!("{}", desc); + let ref toolchain = try!(cfg.get_toolchain(maybe_toolchain.as_ref(), false)); + if toolchain.name() == default_name { + warn!("(partial) triple '{}' resolves to a toolchain that is already default", name); + } else { + println!("\nyou may use the following toolchain: {}\n", toolchain.name()); + } + return Err(ErrorKind::ToolchainNotInstalled(name.to_string()).into()); + } + } + Ok(()) +} + +fn default_(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + let ref toolchain = m.value_of("toolchain").expect(""); + try!(default_bare_triple_check(cfg, toolchain)); + let ref toolchain = try!(cfg.get_toolchain(toolchain, false)); + + let status = if !toolchain.is_custom() { + Some(try!(toolchain.install_from_dist_if_not_installed())) + } else if !toolchain.exists() { + return Err(ErrorKind::ToolchainNotInstalled(toolchain.name().to_string()).into()); + } else { + None + }; + + try!(toolchain.make_default()); + + if let Some(status) = status { + println!(""); + try!(common::show_channel_update(cfg, toolchain.name(), Ok(status))); + } + + Ok(()) +} + +fn update(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + if let Some(names) = m.values_of("toolchain") { + for name in names { + try!(update_bare_triple_check(cfg, name)); + let toolchain = try!(cfg.get_toolchain(name, false)); + + let status = if !toolchain.is_custom() { + Some(try!(toolchain.install_from_dist())) + } else if !toolchain.exists() { + return Err(ErrorKind::ToolchainNotInstalled(toolchain.name().to_string()).into()); + } else { + None + }; + + if let Some(status) = status { + println!(""); + try!(common::show_channel_update(cfg, toolchain.name(), Ok(status))); + } + } + } else { + try!(common::update_all_channels(cfg, !m.is_present("no-self-update") && !self_update::NEVER_SELF_UPDATE)); + } + + Ok(()) +} + +fn run(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + let ref toolchain = m.value_of("toolchain").expect(""); + let args = m.values_of("command").unwrap(); + let args: Vec<_> = args.collect(); + let cmd = try!(cfg.create_command_for_toolchain(toolchain, m.is_present("install"), args[0])); + + Ok(try!(command::run_command_for_dir(cmd, args[0], &args[1..], &cfg))) +} + +fn which(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + let binary = m.value_of("command").expect(""); + + let binary_path = try!(cfg.which_binary(&try!(utils::current_dir()), binary)) + .expect("binary not found"); + + try!(utils::assert_is_file(&binary_path)); + + println!("{}", binary_path.display()); + + Ok(()) +} + +fn show(cfg: &Cfg) -> Result<()> { + // Print host triple + { + let mut t = term2::stdout(); + let _ = t.attr(term2::Attr::Bold); + let _ = write!(t, "Default host: "); + let _ = t.reset(); + println!("{}", try!(cfg.get_default_host_triple())); + println!(""); + } + + let ref cwd = try!(utils::current_dir()); + let installed_toolchains = try!(cfg.list_toolchains()); + let active_toolchain = cfg.find_override_toolchain_or_default(cwd); + + // active_toolchain will carry the reason we don't have one in its detail. + let active_targets = if let Ok(ref at) = active_toolchain { + if let Some((ref t, _)) = *at { + match t.list_components() { + Ok(cs_vec) => cs_vec + .into_iter() + .filter(|c| c.component.pkg == "rust-std") + .filter(|c| c.installed) + .collect(), + Err(_) => vec![] + } + } else { + vec![] + } + } else { + vec![] + }; + + let show_installed_toolchains = installed_toolchains.len() > 1; + let show_active_targets = active_targets.len() > 1; + let show_active_toolchain = true; + + // Only need to display headers if we have multiple sections + let show_headers = [ + show_installed_toolchains, + show_active_targets, + show_active_toolchain + ].iter().filter(|x| **x).count() > 1; + + if show_installed_toolchains { + if show_headers { print_header("installed toolchains") } + let default_name = try!(cfg.get_default()); + for t in installed_toolchains { + if default_name == t { + println!("{} (default)", t); + } else { + println!("{}", t); + } + } + if show_headers { println!("") }; + } + + if show_active_targets { + if show_headers { + print_header("installed targets for active toolchain"); + } + for t in active_targets { + println!("{}", t.component.target.as_ref().expect("rust-std should have a target")); + } + if show_headers { println!("") }; + } + + if show_active_toolchain { + if show_headers { print_header("active toolchain") } + + match active_toolchain { + Ok(atc) => { + match atc { + Some((ref toolchain, Some(ref reason))) => { + println!("{} ({})", toolchain.name(), reason); + println!("{}", common::rustc_version(toolchain)); + } + Some((ref toolchain, None)) => { + println!("{} (default)", toolchain.name()); + println!("{}", common::rustc_version(toolchain)); + } + None => { + println!("no active toolchain"); + } + } + } + Err(err) => { + if let Some(cause) = err.cause() { + println!("(error: {}, {})", err, cause); + } else { + println!("(error: {})", err); + } + } + } + + if show_headers { println!("") }; + } + + fn print_header(s: &str) { + let mut t = term2::stdout(); + let _ = t.attr(term2::Attr::Bold); + let _ = writeln!(t, "{}", s); + let _ = writeln!(t, "{}", iter::repeat("-").take(s.len()).collect::()); + let _ = writeln!(t, ""); + let _ = t.reset(); + } + + Ok(()) +} + +fn target_list(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + let toolchain = try!(explicit_or_dir_toolchain(cfg, m)); + + common::list_targets(&toolchain) +} + +fn target_add(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + let toolchain = try!(explicit_or_dir_toolchain(cfg, m)); + + for target in m.values_of("target").expect("") { + let new_component = Component { + pkg: "rust-std".to_string(), + target: Some(TargetTriple::from_str(target)), + }; + + try!(toolchain.add_component(new_component)); + } + + Ok(()) +} + +fn target_remove(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + let toolchain = try!(explicit_or_dir_toolchain(cfg, m)); + + for target in m.values_of("target").expect("") { + let new_component = Component { + pkg: "rust-std".to_string(), + target: Some(TargetTriple::from_str(target)), + }; + + try!(toolchain.remove_component(new_component)); + } + + Ok(()) +} + +fn component_list(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + let toolchain = try!(explicit_or_dir_toolchain(cfg, m)); + + common::list_components(&toolchain) +} + +fn component_add(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + let toolchain = try!(explicit_or_dir_toolchain(cfg, m)); + let target = m.value_of("target").map(TargetTriple::from_str).or_else(|| { + toolchain.desc().as_ref().ok().map(|desc| desc.target.clone()) + }); + + for component in m.values_of("component").expect("") { + let new_component = Component { + pkg: component.to_string(), + target: target.clone(), + }; + + try!(toolchain.add_component(new_component)); + } + + Ok(()) +} + +fn component_remove(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + let toolchain = try!(explicit_or_dir_toolchain(cfg, m)); + let target = m.value_of("target").map(TargetTriple::from_str).or_else(|| { + toolchain.desc().as_ref().ok().map(|desc| desc.target.clone()) + }); + + for component in m.values_of("component").expect("") { + let new_component = Component { + pkg: component.to_string(), + target: target.clone(), + }; + + try!(toolchain.remove_component(new_component)); + } + + Ok(()) +} + +fn explicit_or_dir_toolchain<'a>(cfg: &'a Cfg, m: &ArgMatches) -> Result> { + let toolchain = m.value_of("toolchain"); + if let Some(toolchain) = toolchain { + let toolchain = try!(cfg.get_toolchain(toolchain, false)); + return Ok(toolchain); + } + + let ref cwd = try!(utils::current_dir()); + let (toolchain, _) = try!(cfg.toolchain_for_dir(cwd)); + + Ok(toolchain) +} + +fn toolchain_link(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + let ref toolchain = m.value_of("toolchain").expect(""); + let ref path = m.value_of("path").expect(""); + let toolchain = try!(cfg.get_toolchain(toolchain, true)); + + Ok(try!(toolchain.install_from_dir(Path::new(path), true))) +} + +fn toolchain_remove(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + for toolchain in m.values_of("toolchain").expect("") { + let toolchain = try!(cfg.get_toolchain(toolchain, false)); + try!(toolchain.remove()); + } + Ok(()) +} + +fn override_add(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + let ref toolchain = m.value_of("toolchain").expect(""); + let toolchain = try!(cfg.get_toolchain(toolchain, false)); + + let status = if !toolchain.is_custom() { + Some(try!(toolchain.install_from_dist_if_not_installed())) + } else if !toolchain.exists() { + return Err(ErrorKind::ToolchainNotInstalled(toolchain.name().to_string()).into()); + } else { + None + }; + + try!(toolchain.make_override(&try!(utils::current_dir()))); + + if let Some(status) = status { + println!(""); + try!(common::show_channel_update(cfg, toolchain.name(), Ok(status))); + } + + Ok(()) +} + +fn override_remove(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + let paths = if m.is_present("nonexistent") { + let list: Vec<_> = try!(cfg.settings_file.with(|s| Ok(s.overrides.iter().filter_map(|(k, _)| + if Path::new(k).is_dir() { + None + } else { + Some(k.clone()) + } + ).collect()))); + if list.is_empty() { + info!("no nonexistent paths detected"); + } + list + } else { + if m.is_present("path") { + vec![m.value_of("path").unwrap().to_string()] + } else { + vec![try!(utils::current_dir()).to_str().unwrap().to_string()] + } + }; + + for path in paths { + if try!(cfg.settings_file.with_mut(|s| { + Ok(s.remove_override(&Path::new(&path), cfg.notify_handler.as_ref())) + })) { + info!("override toolchain for '{}' removed", path); + } else { + info!("no override toolchain for '{}'", path); + if !m.is_present("path") && !m.is_present("nonexistent") { + info!("you may use `--path ` option to remove override toolchain \ + for a specific path"); + } + } + } + Ok(()) +} + +fn doc(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + let toolchain = try!(explicit_or_dir_toolchain(cfg, m)); + let doc_url = if m.is_present("book") { + "book/index.html" + } else if m.is_present("std") { + "std/index.html" + } else { + "index.html" + }; + + if m.is_present("print-only") { + println!("{:?}", toolchain.doc_path(doc_url)); + Ok("ok"); + } + + Ok(try!(cfg.open_docs_for_dir(&try!(utils::current_dir()), doc_url))) +} + +fn man(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + let manpage = m.value_of("command").expect(""); + let toolchain = try!(explicit_or_dir_toolchain(cfg, m)); + let mut man_path = toolchain.path().to_path_buf(); + man_path.push("share"); + man_path.push("man"); + man_path.push("man1"); + man_path.push(manpage.to_owned() + ".1"); + try!(utils::assert_is_file(&man_path)); + Command::new("man") + .arg(man_path) + .status() + .expect("failed to open man page"); + Ok(()) +} + +fn self_uninstall(m: &ArgMatches) -> Result<()> { + let no_prompt = m.is_present("no-prompt"); + + self_update::uninstall(no_prompt) +} + +fn set_telemetry(cfg: &Cfg, t: TelemetryMode) -> Result<()> { + match t { + TelemetryMode::On => Ok(try!(cfg.set_telemetry(true))), + TelemetryMode::Off => Ok(try!(cfg.set_telemetry(false))), + } +} + +fn analyze_telemetry(cfg: &Cfg) -> Result<()> { + let analysis = try!(cfg.analyze_telemetry()); + common::show_telemetry(analysis) +} + +fn set_default_host_triple(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + try!(cfg.set_default_host_triple(m.value_of("host_triple").expect(""))); + Ok(()) +} diff --git a/src/rustup-cli/.rustup_mode.rs.swp b/src/rustup-cli/.rustup_mode.rs.swp new file mode 100644 index 0000000000000000000000000000000000000000..47b02e2de62090e06ea494e4bcbcb1c0a09eea95 GIT binary patch literal 45056 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 KMn61ri~kGz+M-MV literal 0 HcmV?d00001 diff --git a/src/rustup-cli/rustup_mode.rs b/src/rustup-cli/rustup_mode.rs index 21524e1b5a..de569bc48e 100644 --- a/src/rustup-cli/rustup_mode.rs +++ b/src/rustup-cli/rustup_mode.rs @@ -293,6 +293,9 @@ pub fn cli() -> App<'static, 'static> { .alias("docs") .about("Open the documentation for the current toolchain") .after_help(DOC_HELP) + .arg(Arg::with_name("print-only") + .long("print-only") + .help("The URL of the local Rust documentation")) .arg(Arg::with_name("book") .long("book") .help("The Rust Programming Language book")) @@ -780,6 +783,7 @@ fn override_remove(cfg: &Cfg, m: &ArgMatches) -> Result<()> { } fn doc(cfg: &Cfg, m: &ArgMatches) -> Result<()> { + let toolchain = try!(explicit_or_dir_toolchain(cfg, m)); let doc_url = if m.is_present("book") { "book/index.html" } else if m.is_present("std") { @@ -788,6 +792,14 @@ fn doc(cfg: &Cfg, m: &ArgMatches) -> Result<()> { "index.html" }; + if m.is_present("print-only") { + let path = toolchain.doc_path(doc_url); + match path { + Ok(v) => return Ok(println!("file:/{}", v.to_str().unwrap())), + Err(e) => return Err(From::from(e)) + } + } + Ok(try!(cfg.open_docs_for_dir(&try!(utils::current_dir()), doc_url))) } From b2b16452fb46e0f8a1d12847de2ab757f4a71f96 Mon Sep 17 00:00:00 2001 From: amar-laksh Date: Sat, 27 Jan 2018 12:28:47 +0530 Subject: [PATCH 3/3] REMOVED: EXTRA FILES --- 3 | 840 ----------------------------- src/rustup-cli/.rustup_mode.rs.swp | Bin 45056 -> 0 bytes 2 files changed, 840 deletions(-) delete mode 100644 3 delete mode 100644 src/rustup-cli/.rustup_mode.rs.swp diff --git a/3 b/3 deleted file mode 100644 index 45f2c6d472..0000000000 --- a/3 +++ /dev/null @@ -1,840 +0,0 @@ -use clap::{App, Arg, ArgGroup, AppSettings, SubCommand, ArgMatches, Shell}; -use common; -use rustup::{Cfg, Toolchain, command}; -use rustup::settings::TelemetryMode; -use errors::*; -use rustup_dist::manifest::Component; -use rustup_dist::dist::{TargetTriple, PartialToolchainDesc, PartialTargetTriple}; -use rustup_utils::utils; -use self_update; -use std::path::{Path, PathBuf}; -use std::process::Command; -use std::iter; -use std::error::Error; -use term2; -use std::io::{self, Write}; -use help::*; - -pub fn main() -> Result<()> { - try!(::self_update::cleanup_self_updater()); - - let ref matches = cli().get_matches(); - let verbose = matches.is_present("verbose"); - let ref cfg = try!(common::set_globals(verbose)); - - if try!(maybe_upgrade_data(cfg, matches)) { - return Ok(()) - } - - try!(cfg.check_metadata_version()); - - match matches.subcommand() { - ("show", Some(_)) => try!(show(cfg)), - ("install", Some(m)) => try!(update(cfg, m)), - ("update", Some(m)) => try!(update(cfg, m)), - ("uninstall", Some(m)) => try!(toolchain_remove(cfg, m)), - ("default", Some(m)) => try!(default_(cfg, m)), - ("toolchain", Some(c)) => { - match c.subcommand() { - ("install", Some(m)) => try!(update(cfg, m)), - ("list", Some(_)) => try!(common::list_toolchains(cfg)), - ("link", Some(m)) => try!(toolchain_link(cfg, m)), - ("uninstall", Some(m)) => try!(toolchain_remove(cfg, m)), - (_, _) => unreachable!(), - } - } - ("target", Some(c)) => { - match c.subcommand() { - ("list", Some(m)) => try!(target_list(cfg, m)), - ("add", Some(m)) => try!(target_add(cfg, m)), - ("remove", Some(m)) => try!(target_remove(cfg, m)), - (_, _) => unreachable!(), - } - } - ("component", Some(c)) => { - match c.subcommand() { - ("list", Some(m)) => try!(component_list(cfg, m)), - ("add", Some(m)) => try!(component_add(cfg, m)), - ("remove", Some(m)) => try!(component_remove(cfg, m)), - (_, _) => unreachable!(), - } - } - ("override", Some(c)) => { - match c.subcommand() { - ("list", Some(_)) => try!(common::list_overrides(cfg)), - ("set", Some(m)) => try!(override_add(cfg, m)), - ("unset", Some(m)) => try!(override_remove(cfg, m)), - (_ ,_) => unreachable!(), - } - } - ("run", Some(m)) => try!(run(cfg, m)), - ("which", Some(m)) => try!(which(cfg, m)), - ("doc", Some(m)) => try!(doc(cfg, m)), - ("man", Some(m)) => try!(man(cfg,m)), - ("self", Some(c)) => { - match c.subcommand() { - ("update", Some(_)) => try!(self_update::update()), - ("uninstall", Some(m)) => try!(self_uninstall(m)), - (_ ,_) => unreachable!(), - } - } - ("telemetry", Some(c)) => { - match c.subcommand() { - ("enable", Some(_)) => try!(set_telemetry(&cfg, TelemetryMode::On)), - ("disable", Some(_)) => try!(set_telemetry(&cfg, TelemetryMode::Off)), - ("analyze", Some(_)) => try!(analyze_telemetry(&cfg)), - (_, _) => unreachable!(), - } - } - ("set", Some(c)) => { - match c.subcommand() { - ("default-host", Some(m)) => try!(set_default_host_triple(&cfg, m)), - (_, _) => unreachable!(), - } - } - ("completions", Some(c)) => { - if let Some(shell) = c.value_of("shell") { - cli().gen_completions_to("rustup", shell.parse::().unwrap(), &mut io::stdout()); - } - } - (_, _) => unreachable!(), - } - - Ok(()) -} - -pub fn cli() -> App<'static, 'static> { - let mut app = App::new("rustup") - .version(common::version()) - .about("The Rust toolchain installer") - .after_help(RUSTUP_HELP) - .setting(AppSettings::VersionlessSubcommands) - .setting(AppSettings::DeriveDisplayOrder) - .setting(AppSettings::SubcommandRequiredElseHelp) - .arg(Arg::with_name("verbose") - .help("Enable verbose output") - .short("v") - .long("verbose")) - .subcommand(SubCommand::with_name("show") - .about("Show the active and installed toolchains") - .after_help(SHOW_HELP)) - .subcommand(SubCommand::with_name("install") - .about("Update Rust toolchains") - .after_help(INSTALL_HELP) - .setting(AppSettings::Hidden) // synonym for 'toolchain install' - .arg(Arg::with_name("toolchain") - .help(TOOLCHAIN_ARG_HELP) - .required(true) - .multiple(true))) - .subcommand(SubCommand::with_name("uninstall") - .about("Uninstall Rust toolchains") - .setting(AppSettings::Hidden) // synonym for 'toolchain uninstall' - .arg(Arg::with_name("toolchain") - .help(TOOLCHAIN_ARG_HELP) - .required(true) - .multiple(true))) - .subcommand(SubCommand::with_name("update") - .about("Update Rust toolchains and rustup") - .after_help(UPDATE_HELP) - .arg(Arg::with_name("toolchain") - .help(TOOLCHAIN_ARG_HELP) - .required(false) - .multiple(true)) - .arg(Arg::with_name("no-self-update") - .help("Don't perform self update when running the `rustup` command") - .long("no-self-update") - .takes_value(false) - .hidden(true))) - .subcommand(SubCommand::with_name("default") - .about("Set the default toolchain") - .after_help(DEFAULT_HELP) - .arg(Arg::with_name("toolchain") - .help(TOOLCHAIN_ARG_HELP) - .required(true))) - .subcommand(SubCommand::with_name("toolchain") - .about("Modify or query the installed toolchains") - .after_help(TOOLCHAIN_HELP) - .setting(AppSettings::VersionlessSubcommands) - .setting(AppSettings::DeriveDisplayOrder) - .setting(AppSettings::SubcommandRequiredElseHelp) - .subcommand(SubCommand::with_name("list") - .about("List installed toolchains")) - .subcommand(SubCommand::with_name("install") - .about("Install or update a given toolchain") - .aliases(&["update", "add"]) - .arg(Arg::with_name("toolchain") - .help(TOOLCHAIN_ARG_HELP) - .required(true) - .multiple(true))) - .subcommand(SubCommand::with_name("uninstall") - .about("Uninstall a toolchain") - .alias("remove") - .arg(Arg::with_name("toolchain") - .help(TOOLCHAIN_ARG_HELP) - .required(true) - .multiple(true))) - .subcommand(SubCommand::with_name("link") - .about("Create a custom toolchain by symlinking to a directory") - .after_help(TOOLCHAIN_LINK_HELP) - .arg(Arg::with_name("toolchain") - .help(TOOLCHAIN_ARG_HELP) - .required(true)) - .arg(Arg::with_name("path") - .required(true)))) - .subcommand(SubCommand::with_name("target") - .about("Modify a toolchain's supported targets") - .setting(AppSettings::VersionlessSubcommands) - .setting(AppSettings::DeriveDisplayOrder) - .setting(AppSettings::SubcommandRequiredElseHelp) - .subcommand(SubCommand::with_name("list") - .about("List installed and available targets") - .arg(Arg::with_name("toolchain") - .help(TOOLCHAIN_ARG_HELP) - .long("toolchain") - .takes_value(true))) - .subcommand(SubCommand::with_name("add") - .about("Add a target to a Rust toolchain") - .alias("install") - .arg(Arg::with_name("target") - .required(true) - .multiple(true)) - .arg(Arg::with_name("toolchain") - .help(TOOLCHAIN_ARG_HELP) - .long("toolchain") - .takes_value(true))) - .subcommand(SubCommand::with_name("remove") - .about("Remove a target from a Rust toolchain") - .alias("uninstall") - .arg(Arg::with_name("target") - .required(true) - .multiple(true)) - .arg(Arg::with_name("toolchain") - .help(TOOLCHAIN_ARG_HELP) - .long("toolchain") - .takes_value(true)))) - .subcommand(SubCommand::with_name("component") - .about("Modify a toolchain's installed components") - .setting(AppSettings::VersionlessSubcommands) - .setting(AppSettings::DeriveDisplayOrder) - .setting(AppSettings::SubcommandRequiredElseHelp) - .subcommand(SubCommand::with_name("list") - .about("List installed and available components") - .arg(Arg::with_name("toolchain") - .help(TOOLCHAIN_ARG_HELP) - .long("toolchain") - .takes_value(true))) - .subcommand(SubCommand::with_name("add") - .about("Add a component to a Rust toolchain") - .arg(Arg::with_name("component") - .required(true) - .multiple(true)) - .arg(Arg::with_name("toolchain") - .help(TOOLCHAIN_ARG_HELP) - .long("toolchain") - .takes_value(true)) - .arg(Arg::with_name("target") - .long("target") - .takes_value(true))) - .subcommand(SubCommand::with_name("remove") - .about("Remove a component from a Rust toolchain") - .arg(Arg::with_name("component") - .required(true) - .multiple(true)) - .arg(Arg::with_name("toolchain") - .help(TOOLCHAIN_ARG_HELP) - .long("toolchain") - .takes_value(true)) - .arg(Arg::with_name("target") - .long("target") - .takes_value(true)))) - .subcommand(SubCommand::with_name("override") - .about("Modify directory toolchain overrides") - .after_help(OVERRIDE_HELP) - .setting(AppSettings::VersionlessSubcommands) - .setting(AppSettings::DeriveDisplayOrder) - .setting(AppSettings::SubcommandRequiredElseHelp) - .subcommand(SubCommand::with_name("list") - .about("List directory toolchain overrides")) - .subcommand(SubCommand::with_name("set") - .about("Set the override toolchain for a directory") - .alias("add") - .arg(Arg::with_name("toolchain") - .help(TOOLCHAIN_ARG_HELP) - .required(true))) - .subcommand(SubCommand::with_name("unset") - .about("Remove the override toolchain for a directory") - .after_help(OVERRIDE_UNSET_HELP) - .alias("remove") - .arg(Arg::with_name("path") - .long("path") - .takes_value(true) - .help("Path to the directory")) - .arg(Arg::with_name("nonexistent") - .long("nonexistent") - .takes_value(false) - .help("Remove override toolchain for all nonexistent directories")))) - .subcommand(SubCommand::with_name("run") - .about("Run a command with an environment configured for a given toolchain") - .after_help(RUN_HELP) - .setting(AppSettings::TrailingVarArg) - .arg(Arg::with_name("install") - .help("Install the requested toolchain if needed") - .long("install")) - .arg(Arg::with_name("toolchain") - .help(TOOLCHAIN_ARG_HELP) - .required(true)) - .arg(Arg::with_name("command") - .required(true).multiple(true).use_delimiter(false))) - .subcommand(SubCommand::with_name("which") - .about("Display which binary will be run for a given command") - .arg(Arg::with_name("command") - .required(true))) - .subcommand(SubCommand::with_name("doc") - .alias("docs") - .about("Open the documentation for the current toolchain") - .after_help(DOC_HELP) - .arg(Arg::with_name("print-only") - .long("print-only") - .help("The URL of the local Rust documentation")) - .arg(Arg::with_name("book") - .long("book") - .help("The Rust Programming Language book")) - .arg(Arg::with_name("std") - .long("std") - .help("Standard library API documentation")) - .group(ArgGroup::with_name("page") - .args(&["book", "std"]))); - - if cfg!(not(target_os = "windows")) { - app = app - .subcommand(SubCommand::with_name("man") - .about("View the man page for a given command") - .arg(Arg::with_name("command") - .required(true)) - .arg(Arg::with_name("toolchain") - .help(TOOLCHAIN_ARG_HELP) - .long("toolchain") - .takes_value(true))); - } - - app.subcommand(SubCommand::with_name("self") - .about("Modify the rustup installation") - .setting(AppSettings::VersionlessSubcommands) - .setting(AppSettings::DeriveDisplayOrder) - .setting(AppSettings::SubcommandRequiredElseHelp) - .subcommand(SubCommand::with_name("update") - .about("Download and install updates to rustup")) - .subcommand(SubCommand::with_name("uninstall") - .about("Uninstall rustup.") - .arg(Arg::with_name("no-prompt") - .short("y"))) - .subcommand(SubCommand::with_name("upgrade-data") - .about("Upgrade the internal data format."))) - .subcommand(SubCommand::with_name("telemetry") - .about("rustup telemetry commands") - .setting(AppSettings::Hidden) - .setting(AppSettings::VersionlessSubcommands) - .setting(AppSettings::DeriveDisplayOrder) - .setting(AppSettings::SubcommandRequiredElseHelp) - .subcommand(SubCommand::with_name("enable") - .about("Enable rustup telemetry")) - .subcommand(SubCommand::with_name("disable") - .about("Disable rustup telemetry")) - .subcommand(SubCommand::with_name("analyze") - .about("Analyze stored telemetry"))) - .subcommand(SubCommand::with_name("set") - .about("Alter rustup settings") - .setting(AppSettings::SubcommandRequiredElseHelp) - .subcommand(SubCommand::with_name("default-host") - .about("The triple used to identify toolchains when not specified") - .arg(Arg::with_name("host_triple") - .required(true)))) - .subcommand(SubCommand::with_name("completions") - .about("Generate completion scripts for your shell") - .after_help(COMPLETIONS_HELP) - .setting(AppSettings::ArgRequiredElseHelp) - .arg(Arg::with_name("shell") - .possible_values(&Shell::variants()))) -} - -fn maybe_upgrade_data(cfg: &Cfg, m: &ArgMatches) -> Result { - match m.subcommand() { - ("self", Some(c)) => { - match c.subcommand() { - ("upgrade-data", Some(_)) => { - try!(cfg.upgrade_data()); - Ok(true) - } - _ => Ok(false), - } - } - _ => Ok(false) - } -} - -fn update_bare_triple_check(cfg: &Cfg, name: &str) -> Result<()> { - if let Some(triple) = PartialTargetTriple::from_str(name) { - warn!("(partial) target triple specified instead of toolchain name"); - let installed_toolchains = try!(cfg.list_toolchains()); - let default = try!(cfg.find_default()); - let default_name = default.map(|t| t.name().to_string()) - .unwrap_or("".into()); - let mut candidates = vec![]; - for t in installed_toolchains { - if t == default_name { - continue; - } - if let Ok(desc) = PartialToolchainDesc::from_str(&t) { - fn triple_comp_eq(given: &str, from_desc: Option<&String>) -> bool { - from_desc.map_or(false, |s| *s == *given) - } - - let triple_matches = - triple.arch.as_ref().map_or(true, |s| triple_comp_eq(s, desc.target.arch.as_ref())) - && triple.os.as_ref().map_or(true, |s| triple_comp_eq(s, desc.target.os.as_ref())) - && triple.env.as_ref().map_or(true, |s| triple_comp_eq(s, desc.target.env.as_ref())); - if triple_matches { - candidates.push(t); - } - } - } - match candidates.len() { - 0 => err!("no candidate toolchains found"), - 1 => println!("\nyou may use the following toolchain: {}\n", candidates[0]), - _ => { - println!("\nyou may use one of the following toolchains:"); - for n in &candidates { - println!("{}", n); - } - println!(""); - } - } - return Err(ErrorKind::ToolchainNotInstalled(name.to_string()).into()); - } - Ok(()) -} - -fn default_bare_triple_check(cfg: &Cfg, name: &str) -> Result<()> { - if let Some(triple) = PartialTargetTriple::from_str(name) { - warn!("(partial) target triple specified instead of toolchain name"); - let default = try!(cfg.find_default()); - let default_name = default.map(|t| t.name().to_string()) - .unwrap_or("".into()); - if let Ok(mut desc) = PartialToolchainDesc::from_str(&default_name) { - desc.target = triple; - let maybe_toolchain = format!("{}", desc); - let ref toolchain = try!(cfg.get_toolchain(maybe_toolchain.as_ref(), false)); - if toolchain.name() == default_name { - warn!("(partial) triple '{}' resolves to a toolchain that is already default", name); - } else { - println!("\nyou may use the following toolchain: {}\n", toolchain.name()); - } - return Err(ErrorKind::ToolchainNotInstalled(name.to_string()).into()); - } - } - Ok(()) -} - -fn default_(cfg: &Cfg, m: &ArgMatches) -> Result<()> { - let ref toolchain = m.value_of("toolchain").expect(""); - try!(default_bare_triple_check(cfg, toolchain)); - let ref toolchain = try!(cfg.get_toolchain(toolchain, false)); - - let status = if !toolchain.is_custom() { - Some(try!(toolchain.install_from_dist_if_not_installed())) - } else if !toolchain.exists() { - return Err(ErrorKind::ToolchainNotInstalled(toolchain.name().to_string()).into()); - } else { - None - }; - - try!(toolchain.make_default()); - - if let Some(status) = status { - println!(""); - try!(common::show_channel_update(cfg, toolchain.name(), Ok(status))); - } - - Ok(()) -} - -fn update(cfg: &Cfg, m: &ArgMatches) -> Result<()> { - if let Some(names) = m.values_of("toolchain") { - for name in names { - try!(update_bare_triple_check(cfg, name)); - let toolchain = try!(cfg.get_toolchain(name, false)); - - let status = if !toolchain.is_custom() { - Some(try!(toolchain.install_from_dist())) - } else if !toolchain.exists() { - return Err(ErrorKind::ToolchainNotInstalled(toolchain.name().to_string()).into()); - } else { - None - }; - - if let Some(status) = status { - println!(""); - try!(common::show_channel_update(cfg, toolchain.name(), Ok(status))); - } - } - } else { - try!(common::update_all_channels(cfg, !m.is_present("no-self-update") && !self_update::NEVER_SELF_UPDATE)); - } - - Ok(()) -} - -fn run(cfg: &Cfg, m: &ArgMatches) -> Result<()> { - let ref toolchain = m.value_of("toolchain").expect(""); - let args = m.values_of("command").unwrap(); - let args: Vec<_> = args.collect(); - let cmd = try!(cfg.create_command_for_toolchain(toolchain, m.is_present("install"), args[0])); - - Ok(try!(command::run_command_for_dir(cmd, args[0], &args[1..], &cfg))) -} - -fn which(cfg: &Cfg, m: &ArgMatches) -> Result<()> { - let binary = m.value_of("command").expect(""); - - let binary_path = try!(cfg.which_binary(&try!(utils::current_dir()), binary)) - .expect("binary not found"); - - try!(utils::assert_is_file(&binary_path)); - - println!("{}", binary_path.display()); - - Ok(()) -} - -fn show(cfg: &Cfg) -> Result<()> { - // Print host triple - { - let mut t = term2::stdout(); - let _ = t.attr(term2::Attr::Bold); - let _ = write!(t, "Default host: "); - let _ = t.reset(); - println!("{}", try!(cfg.get_default_host_triple())); - println!(""); - } - - let ref cwd = try!(utils::current_dir()); - let installed_toolchains = try!(cfg.list_toolchains()); - let active_toolchain = cfg.find_override_toolchain_or_default(cwd); - - // active_toolchain will carry the reason we don't have one in its detail. - let active_targets = if let Ok(ref at) = active_toolchain { - if let Some((ref t, _)) = *at { - match t.list_components() { - Ok(cs_vec) => cs_vec - .into_iter() - .filter(|c| c.component.pkg == "rust-std") - .filter(|c| c.installed) - .collect(), - Err(_) => vec![] - } - } else { - vec![] - } - } else { - vec![] - }; - - let show_installed_toolchains = installed_toolchains.len() > 1; - let show_active_targets = active_targets.len() > 1; - let show_active_toolchain = true; - - // Only need to display headers if we have multiple sections - let show_headers = [ - show_installed_toolchains, - show_active_targets, - show_active_toolchain - ].iter().filter(|x| **x).count() > 1; - - if show_installed_toolchains { - if show_headers { print_header("installed toolchains") } - let default_name = try!(cfg.get_default()); - for t in installed_toolchains { - if default_name == t { - println!("{} (default)", t); - } else { - println!("{}", t); - } - } - if show_headers { println!("") }; - } - - if show_active_targets { - if show_headers { - print_header("installed targets for active toolchain"); - } - for t in active_targets { - println!("{}", t.component.target.as_ref().expect("rust-std should have a target")); - } - if show_headers { println!("") }; - } - - if show_active_toolchain { - if show_headers { print_header("active toolchain") } - - match active_toolchain { - Ok(atc) => { - match atc { - Some((ref toolchain, Some(ref reason))) => { - println!("{} ({})", toolchain.name(), reason); - println!("{}", common::rustc_version(toolchain)); - } - Some((ref toolchain, None)) => { - println!("{} (default)", toolchain.name()); - println!("{}", common::rustc_version(toolchain)); - } - None => { - println!("no active toolchain"); - } - } - } - Err(err) => { - if let Some(cause) = err.cause() { - println!("(error: {}, {})", err, cause); - } else { - println!("(error: {})", err); - } - } - } - - if show_headers { println!("") }; - } - - fn print_header(s: &str) { - let mut t = term2::stdout(); - let _ = t.attr(term2::Attr::Bold); - let _ = writeln!(t, "{}", s); - let _ = writeln!(t, "{}", iter::repeat("-").take(s.len()).collect::()); - let _ = writeln!(t, ""); - let _ = t.reset(); - } - - Ok(()) -} - -fn target_list(cfg: &Cfg, m: &ArgMatches) -> Result<()> { - let toolchain = try!(explicit_or_dir_toolchain(cfg, m)); - - common::list_targets(&toolchain) -} - -fn target_add(cfg: &Cfg, m: &ArgMatches) -> Result<()> { - let toolchain = try!(explicit_or_dir_toolchain(cfg, m)); - - for target in m.values_of("target").expect("") { - let new_component = Component { - pkg: "rust-std".to_string(), - target: Some(TargetTriple::from_str(target)), - }; - - try!(toolchain.add_component(new_component)); - } - - Ok(()) -} - -fn target_remove(cfg: &Cfg, m: &ArgMatches) -> Result<()> { - let toolchain = try!(explicit_or_dir_toolchain(cfg, m)); - - for target in m.values_of("target").expect("") { - let new_component = Component { - pkg: "rust-std".to_string(), - target: Some(TargetTriple::from_str(target)), - }; - - try!(toolchain.remove_component(new_component)); - } - - Ok(()) -} - -fn component_list(cfg: &Cfg, m: &ArgMatches) -> Result<()> { - let toolchain = try!(explicit_or_dir_toolchain(cfg, m)); - - common::list_components(&toolchain) -} - -fn component_add(cfg: &Cfg, m: &ArgMatches) -> Result<()> { - let toolchain = try!(explicit_or_dir_toolchain(cfg, m)); - let target = m.value_of("target").map(TargetTriple::from_str).or_else(|| { - toolchain.desc().as_ref().ok().map(|desc| desc.target.clone()) - }); - - for component in m.values_of("component").expect("") { - let new_component = Component { - pkg: component.to_string(), - target: target.clone(), - }; - - try!(toolchain.add_component(new_component)); - } - - Ok(()) -} - -fn component_remove(cfg: &Cfg, m: &ArgMatches) -> Result<()> { - let toolchain = try!(explicit_or_dir_toolchain(cfg, m)); - let target = m.value_of("target").map(TargetTriple::from_str).or_else(|| { - toolchain.desc().as_ref().ok().map(|desc| desc.target.clone()) - }); - - for component in m.values_of("component").expect("") { - let new_component = Component { - pkg: component.to_string(), - target: target.clone(), - }; - - try!(toolchain.remove_component(new_component)); - } - - Ok(()) -} - -fn explicit_or_dir_toolchain<'a>(cfg: &'a Cfg, m: &ArgMatches) -> Result> { - let toolchain = m.value_of("toolchain"); - if let Some(toolchain) = toolchain { - let toolchain = try!(cfg.get_toolchain(toolchain, false)); - return Ok(toolchain); - } - - let ref cwd = try!(utils::current_dir()); - let (toolchain, _) = try!(cfg.toolchain_for_dir(cwd)); - - Ok(toolchain) -} - -fn toolchain_link(cfg: &Cfg, m: &ArgMatches) -> Result<()> { - let ref toolchain = m.value_of("toolchain").expect(""); - let ref path = m.value_of("path").expect(""); - let toolchain = try!(cfg.get_toolchain(toolchain, true)); - - Ok(try!(toolchain.install_from_dir(Path::new(path), true))) -} - -fn toolchain_remove(cfg: &Cfg, m: &ArgMatches) -> Result<()> { - for toolchain in m.values_of("toolchain").expect("") { - let toolchain = try!(cfg.get_toolchain(toolchain, false)); - try!(toolchain.remove()); - } - Ok(()) -} - -fn override_add(cfg: &Cfg, m: &ArgMatches) -> Result<()> { - let ref toolchain = m.value_of("toolchain").expect(""); - let toolchain = try!(cfg.get_toolchain(toolchain, false)); - - let status = if !toolchain.is_custom() { - Some(try!(toolchain.install_from_dist_if_not_installed())) - } else if !toolchain.exists() { - return Err(ErrorKind::ToolchainNotInstalled(toolchain.name().to_string()).into()); - } else { - None - }; - - try!(toolchain.make_override(&try!(utils::current_dir()))); - - if let Some(status) = status { - println!(""); - try!(common::show_channel_update(cfg, toolchain.name(), Ok(status))); - } - - Ok(()) -} - -fn override_remove(cfg: &Cfg, m: &ArgMatches) -> Result<()> { - let paths = if m.is_present("nonexistent") { - let list: Vec<_> = try!(cfg.settings_file.with(|s| Ok(s.overrides.iter().filter_map(|(k, _)| - if Path::new(k).is_dir() { - None - } else { - Some(k.clone()) - } - ).collect()))); - if list.is_empty() { - info!("no nonexistent paths detected"); - } - list - } else { - if m.is_present("path") { - vec![m.value_of("path").unwrap().to_string()] - } else { - vec![try!(utils::current_dir()).to_str().unwrap().to_string()] - } - }; - - for path in paths { - if try!(cfg.settings_file.with_mut(|s| { - Ok(s.remove_override(&Path::new(&path), cfg.notify_handler.as_ref())) - })) { - info!("override toolchain for '{}' removed", path); - } else { - info!("no override toolchain for '{}'", path); - if !m.is_present("path") && !m.is_present("nonexistent") { - info!("you may use `--path ` option to remove override toolchain \ - for a specific path"); - } - } - } - Ok(()) -} - -fn doc(cfg: &Cfg, m: &ArgMatches) -> Result<()> { - let toolchain = try!(explicit_or_dir_toolchain(cfg, m)); - let doc_url = if m.is_present("book") { - "book/index.html" - } else if m.is_present("std") { - "std/index.html" - } else { - "index.html" - }; - - if m.is_present("print-only") { - println!("{:?}", toolchain.doc_path(doc_url)); - Ok("ok"); - } - - Ok(try!(cfg.open_docs_for_dir(&try!(utils::current_dir()), doc_url))) -} - -fn man(cfg: &Cfg, m: &ArgMatches) -> Result<()> { - let manpage = m.value_of("command").expect(""); - let toolchain = try!(explicit_or_dir_toolchain(cfg, m)); - let mut man_path = toolchain.path().to_path_buf(); - man_path.push("share"); - man_path.push("man"); - man_path.push("man1"); - man_path.push(manpage.to_owned() + ".1"); - try!(utils::assert_is_file(&man_path)); - Command::new("man") - .arg(man_path) - .status() - .expect("failed to open man page"); - Ok(()) -} - -fn self_uninstall(m: &ArgMatches) -> Result<()> { - let no_prompt = m.is_present("no-prompt"); - - self_update::uninstall(no_prompt) -} - -fn set_telemetry(cfg: &Cfg, t: TelemetryMode) -> Result<()> { - match t { - TelemetryMode::On => Ok(try!(cfg.set_telemetry(true))), - TelemetryMode::Off => Ok(try!(cfg.set_telemetry(false))), - } -} - -fn analyze_telemetry(cfg: &Cfg) -> Result<()> { - let analysis = try!(cfg.analyze_telemetry()); - common::show_telemetry(analysis) -} - -fn set_default_host_triple(cfg: &Cfg, m: &ArgMatches) -> Result<()> { - try!(cfg.set_default_host_triple(m.value_of("host_triple").expect(""))); - Ok(()) -} diff --git a/src/rustup-cli/.rustup_mode.rs.swp b/src/rustup-cli/.rustup_mode.rs.swp deleted file mode 100644 index 47b02e2de62090e06ea494e4bcbcb1c0a09eea95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45056 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 KMn61ri~kGz+M-MV