Skip to content

Commit

Permalink
When using rustup, override RUSTUP_TOOLCHAIN
Browse files Browse the repository at this point in the history
  • Loading branch information
joshlf committed Feb 21, 2024
1 parent 40f5ae0 commit 64b2c16
Showing 1 changed file with 21 additions and 15 deletions.
36 changes: 21 additions & 15 deletions tools/cargos/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
use std::{
env, fmt,
io::{self, Read as _},
process::{self, Command},
process::{self, Command, Output},
};

use serde_json::{Map, Value};
Expand Down Expand Up @@ -92,11 +92,10 @@ fn get_toolchain_versions() -> Versions {
// use Cargo with that toolchain, `pkg-meta` would return `null` when asked
// to retrieve the `rust-version` field. This also requires `RUSTFLAGS=''`
// to override any unstable `RUSTFLAGS` set by the caller.
let output = Command::new("rustup")
.args(["run", "stable", "cargo", "metadata", "--format-version", "1"])
.env("CARGO_TARGET_DIR", "target/cargos")
.output()
.unwrap();
let output = rustup(
["run", "stable", "cargo", "metadata", "--format-version", "1"],
Some(("CARGO_TARGET_DIR", "target/cargos")),
);

let json = serde_json::from_slice::<Value>(&output.stdout).unwrap();
let packages = json.as_object().unwrap().get("packages").unwrap();
Expand Down Expand Up @@ -124,14 +123,10 @@ fn get_toolchain_versions() -> Versions {
}

fn is_toolchain_installed(versions: &Versions, name: &str) -> Result<bool, Error> {
let output = Command::new("rustup")
.args(["run", versions.get(name)?, "cargo", "version"])
.output()
.unwrap();

let version = versions.get(name)?;
let output = rustup(["run", version, "cargo", "version"], None);
if output.status.success() {
let output = Command::new("rustup").args(["component", "list"]).output().unwrap();

let output = rustup([&format!("+{version}"), "component", "list"], None);
let stdout = String::from_utf8(output.stdout).unwrap();
Ok(stdout.contains("rust-src (installed)"))
} else {
Expand All @@ -147,9 +142,8 @@ fn install_toolchain_or_exit(versions: &Versions, name: &str) -> Result<(), Erro
process::exit(1);
}

eprintln!("[cargos] would you like to install toolchain '{name}' and component 'rust-src' via 'rustup'? yn");

loop {
eprint!("[cargos] would you like to install toolchain '{name}' and component 'rust-src' via 'rustup' (y/n)? ");
let mut input = [0];
io::stdin().read_exact(&mut input).unwrap();
match input[0] as char {
Expand All @@ -176,6 +170,18 @@ fn get_rustflags(name: &str) -> &'static str {
}
}

fn rustup<'a>(args: impl IntoIterator<Item = &'a str>, env: Option<(&str, &str)>) -> Output {
let mut cmd = Command::new("rustup");
// It's important to set `RUSTUP_TOOLCHAIN` to override any value set while
// running this program. That variable overrides any `+<version>` CLI
// argument.
cmd.args(args).env("RUSTUP_TOOLCHAIN", "");
if let Some((name, val)) = env {
cmd.env(name, val);
}
cmd.output().unwrap()
}

fn delegate_cargo() -> Result<(), Error> {
let mut args = env::args();
let this = args.next().unwrap();
Expand Down

0 comments on commit 64b2c16

Please sign in to comment.