Skip to content

Commit

Permalink
run cargo install to check for x installation and version
Browse files Browse the repository at this point in the history
  • Loading branch information
DebugSteven committed Jan 20, 2023
1 parent 38a76f3 commit 540ca2f
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 0 deletions.
1 change: 1 addition & 0 deletions Cargo.lock
Original file line number Diff line number Diff line change
Expand Up @@ -5607,6 +5607,7 @@ dependencies = [
"lazy_static",
"miropt-test-tools",
"regex",
"semver",
"termcolor",
"walkdir",
]
Expand Down
1 change: 1 addition & 0 deletions src/tools/tidy/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ miropt-test-tools = { path = "../miropt-test-tools" }
lazy_static = "1"
walkdir = "2"
ignore = "0.4.18"
semver = "1.0"
termcolor = "1.1.3"

[[bin]]
Expand Down
1 change: 1 addition & 0 deletions src/tools/tidy/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,3 +70,4 @@ pub mod ui_tests;
pub mod unit_tests;
pub mod unstable_book;
pub mod walk;
pub mod x_version;
2 changes: 2 additions & 0 deletions src/tools/tidy/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,8 @@ fn main() {
check!(alphabetical, &compiler_path);
check!(alphabetical, &library_path);

check!(x_version, &root_path, &cargo);

let collected = {
drain_handles(&mut handles);

Expand Down
68 changes: 68 additions & 0 deletions src/tools/tidy/src/x_version.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
use semver::Version;
use std::path::Path;
use std::process::{Command, Stdio};

pub fn check(root: &Path, cargo: &Path, bad: &mut bool) {
let cargo_list = Command::new(cargo).args(["install", "--list"]).stdout(Stdio::piped()).spawn();

let child = match cargo_list {
Ok(child) => child,
Err(e) => return tidy_error!(bad, "failed to run `cargo`: {}", e),
};

let cargo_list = child.wait_with_output().unwrap();

if cargo_list.status.success() {
let exe_list = String::from_utf8_lossy(&cargo_list.stdout);
let exe_list = exe_list.lines();

let mut installed: Option<Version> = None;

for line in exe_list {
let mut iter = line.split_whitespace();
if iter.next() == Some("x") {
if let Some(version) = iter.next() {
// Check this is the rust-lang/rust x tool installation since it should be
// installed at a path containing `src/tools/x`.
if let Some(path) = iter.next() {
if path.contains(&"src/tools/x") {
let version = version.strip_prefix("v").unwrap();
installed = Some(Version::parse(version).unwrap());
break;
}
};
}
} else {
continue;
}
}
// Unwrap the some if x is installed, otherwise return because it's fine if x isn't installed.
let installed = if let Some(i) = installed { i } else { return };

if let Some(expected) = get_x_wrapper_version(root, cargo) {
if installed < expected {
return println!(
"Current version of x is {installed}, but the latest version is {expected}\nConsider updating to the newer version of x by running `cargo install --path src/tools/x`"
);
}
} else {
return tidy_error!(
bad,
"Unable to parse the latest version of `x` at `src/tools/x/Cargo.toml`"
);
}
} else {
return tidy_error!(bad, "failed to check version of `x`: {}", cargo_list.status);
}
}

// Parse latest version out of `x` Cargo.toml
fn get_x_wrapper_version(root: &Path, cargo: &Path) -> Option<Version> {
let mut cmd = cargo_metadata::MetadataCommand::new();
cmd.cargo_path(cargo)
.manifest_path(root.join("src/tools/x/Cargo.toml"))
.no_deps()
.features(cargo_metadata::CargoOpt::AllFeatures);
let mut metadata = t!(cmd.exec());
metadata.packages.pop().map(|x| x.version)
}

0 comments on commit 540ca2f

Please sign in to comment.