Skip to content

Commit

Permalink
xtask + version pinning
Browse files Browse the repository at this point in the history
  • Loading branch information
zeeshanlakhani committed Jul 10, 2024
1 parent 7a61342 commit 8cd7e16
Show file tree
Hide file tree
Showing 4 changed files with 154 additions and 9 deletions.
12 changes: 8 additions & 4 deletions .github/buildomat/jobs/check-features.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
#: rust_toolchain = true
#: output_rules = []

# Run cargo check on illumos with feature-specifics like `no-default-features`.
# Run cargo check on illumos with feature-specifics like `no-default-features`
# or `feature-powerset`.

set -o errexit
set -o pipefail
Expand All @@ -15,6 +16,10 @@ set -o xtrace
cargo --version
rustc --version

# NOTE: This version should be in sync with the recommended version in
# ./dev-tools/xtask/src/check-features.rs.
CARGO_HACK_VERSION='0.6.28'

#
# Set up our PATH for use with this workspace.
#
Expand All @@ -29,8 +34,7 @@ ptime -m cargo check --workspace --bins --tests --no-default-features
RUSTDOCFLAGS="--document-private-items -D warnings" ptime -m cargo doc --workspace --no-deps --no-default-features

#
# `cargo-hack` check feature-powerset
# Check the feature set with the `cargo xtask check-features` command.
#
banner hack
cargo install cargo-hack --locked
ptime -m timeout 2h cargo hack check --workspace --feature-powerset --no-dev-deps --exclude-features image-trampoline,image-standard
ptime -m timeout 2h cargo xtask check-features --version "$CARGO_HACK_VERSION" --exclude-features image-trampoline,image-standard
13 changes: 8 additions & 5 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ jobs:
runs-on: ubuntu-22.04
env:
CARGO_INCREMENTAL: 0
CARGO_HACK_VERSION: "0.6.28"
steps:
# This repo is unstable and unnecessary: https://github.com/microsoft/linux-package-repositories/issues/34
- name: Disable packages.microsoft.com repo
Expand All @@ -105,13 +106,15 @@ jobs:
run: cat "$GITHUB_ENV"
- name: Install Pre-Requisites
run: ./tools/install_builder_prerequisites.sh -y
- name: Run Cargo Check (No Default Features)
- name: Run `cargo check` for no-default-features
run: cargo check --workspace --bins --tests --no-default-features
- name: Install cargo-hack
uses: taiki-e/install-action@cargo-hack
- name: Run Cargo Hack Check (Feature-Powerset, No-Dev-Deps)
# Uses manifest for install
- uses: taiki-e/install-action@v2
with:
tool: cargo-hack@{{ env.CARGO_HACK_VERSION }}
- name: Run Check on Features (Feature-Powerset, No-Dev-Deps)
timeout-minutes: 120 # 2 hours
run: cargo hack check --workspace --feature-powerset --no-dev-deps --exclude-features image-trampoline,image-standard
run: cargo xtask check-features --no-install --exclude-features image-trampoline,image-standard

# This is just a test build of docs. Publicly available docs are built via
# the separate "rustdocs" repo.
Expand Down
134 changes: 134 additions & 0 deletions dev-tools/xtask/src/check_features.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.

//! Subcommand: cargo xtask check-features

use anyhow::{bail, Context, Result};
use clap::Parser;
use std::process::Command;

/// The default version of `cargo-hack` to install.
/// We use a patch-floating version to avoid breaking the build when a new
/// version is released (locally).
const FLOAT_VERSION: &str = "~0.6.28";

#[derive(Parser)]
pub struct Args {
/// Features to exclude from the check.
#[clap(long)]
exclude_features: Option<Vec<String>>,
/// Depth of the feature powerset to check.
#[clap(long)]
depth: Option<usize>,
/// Error format passed to `cargo hack check`.
#[clap(long, value_name = "FMT")]
message_format: Option<String>,
/// Do not install `cargo-hack` before running the check.
#[clap(long, default_value_t = false)]
no_install: bool,
/// Version of `cargo-hack` to install.
#[clap(long)]
version: Option<String>,
}

/// Run `cargo hack check`.
pub fn run_cmd(args: Args) -> Result<()> {
if !args.no_install {
install_cargo_hack(args.version).unwrap();
}

let cargo =
std::env::var("CARGO").unwrap_or_else(|_| String::from("cargo"));
let mut command = Command::new(&cargo);

command.args(&["hack", "check"]);

if let Some(features) = args.exclude_features {
let ex = format!("--exclude-features={}", features.join(","));
command.arg(ex);
}

if let Some(depth) = args.depth {
let depth = format!("depth={}", depth);
command.arg(depth);
}

// Pass along the `--message-format` flag if it was provided.
if let Some(fmt) = args.message_format {
command.args(["--message-format", &fmt]);
}

command
// Make sure we check everything.
.arg("--workspace")
.arg("--bins")
// We want to check the feature powerset.
.arg("--feature-powerset")
.arg("--no-dev-deps")
.arg("--exclude-no-default-features");

eprintln!(
"running: {:?} {}",
&cargo,
command
.get_args()
.map(|arg| format!("{:?}", arg.to_str().unwrap()))
.collect::<Vec<_>>()
.join(" ")
);

let exit_status = command
.spawn()
.context("failed to spawn child process")?
.wait()
.context("failed to wait for child process")?;

if !exit_status.success() {
bail!("check-features failed: {}", exit_status);
}

Ok(())
}

/// Install `cargo-hack` at the specified version or the default version.
fn install_cargo_hack(version: Option<String>) -> Result<()> {
let cargo =
std::env::var("CARGO").unwrap_or_else(|_| String::from("cargo"));

let mut command = Command::new(&cargo);

if let Some(version) = version {
command.args(&["install", "cargo-hack", "--version", &version]);
} else {
command.args(&[
"install",
"cargo-hack",
"--locked",
"--version",
FLOAT_VERSION,
]);
}

eprintln!(
"running: {:?} {}",
&cargo,
command
.get_args()
.map(|arg| format!("{:?}", arg.to_str().unwrap()))
.collect::<Vec<_>>()
.join(" ")
);

let exit_status = command
.spawn()
.expect("failed to spawn child process")
.wait()
.expect("failed to wait for child process");

if !exit_status.success() {
bail!("cargo-hack install failed: {}", exit_status);
}

Ok(())
}
4 changes: 4 additions & 0 deletions dev-tools/xtask/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use anyhow::{Context, Result};
use cargo_metadata::Metadata;
use clap::{Parser, Subcommand};

mod check_features;
mod check_workspace_deps;
mod clippy;
mod download;
Expand Down Expand Up @@ -38,6 +39,8 @@ enum Cmds {
/// Run Argon2 hash with specific parameters (quick performance check)
Argon2(external::External),

/// Check that all features are flagged correctly
CheckFeatures(check_features::Args),
/// Check that dependencies are not duplicated in any packages in the
/// workspace
CheckWorkspaceDeps,
Expand Down Expand Up @@ -86,6 +89,7 @@ async fn main() -> Result<()> {
external.cargo_args(["--release"]).exec_example("argon2")
}
Cmds::Clippy(args) => clippy::run_cmd(args),
Cmds::CheckFeatures(args) => check_features::run_cmd(args),
Cmds::CheckWorkspaceDeps => check_workspace_deps::run_cmd(),
Cmds::Download(args) => download::run_cmd(args).await,
#[cfg(target_os = "illumos")]
Expand Down

0 comments on commit 8cd7e16

Please sign in to comment.