From 75b3ef44fed8a08306542df85ba53ba4177b2349 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Mon, 9 Jun 2025 13:30:32 -0700 Subject: [PATCH] Add a --bin argument to mirror cargo install --bin. --- crates/bin/src/args.rs | 14 +++++++++++++ crates/bin/src/entry.rs | 1 + crates/binstalk/src/ops.rs | 1 + crates/binstalk/src/ops/resolve/resolution.rs | 15 ++++++++----- e2e-tests/specific-binaries.sh | 21 +++++++++++++++++++ justfile | 3 ++- 6 files changed, 49 insertions(+), 6 deletions(-) create mode 100755 e2e-tests/specific-binaries.sh diff --git a/crates/bin/src/args.rs b/crates/bin/src/args.rs index b993ed72..17ab2c49 100644 --- a/crates/bin/src/args.rs +++ b/crates/bin/src/args.rs @@ -93,6 +93,20 @@ pub struct Args { )] pub(crate) targets: Option>, + /// Install only the specified binaries. + /// + /// This mirrors the equivalent argument in `cargo install --bin`. + /// + /// If omitted, all binaries are installed. + #[clap( + help_heading = "Package selection", + long, + value_name = "BINARY", + num_args = 1.., + action = clap::ArgAction::Append + )] + pub(crate) bin: Option>, + /// Override Cargo.toml package manifest path. /// /// This skips searching crates.io for a manifest and uses the specified path directly, useful diff --git a/crates/bin/src/entry.rs b/crates/bin/src/entry.rs index 9df479f4..ce165483 100644 --- a/crates/bin/src/entry.rs +++ b/crates/bin/src/entry.rs @@ -157,6 +157,7 @@ pub fn install_crates( desired_targets, resolvers, cargo_install_fallback, + bins: args.bin, temp_dir: temp_dir.path().to_owned(), install_path, diff --git a/crates/binstalk/src/ops.rs b/crates/binstalk/src/ops.rs index 8051daaa..3de454a0 100644 --- a/crates/binstalk/src/ops.rs +++ b/crates/binstalk/src/ops.rs @@ -44,6 +44,7 @@ pub struct Options { pub desired_targets: DesiredTargets, pub resolvers: Vec, pub cargo_install_fallback: bool, + pub bins: Option>, pub temp_dir: PathBuf, pub install_path: PathBuf, diff --git a/crates/binstalk/src/ops/resolve/resolution.rs b/crates/binstalk/src/ops/resolve/resolution.rs index 75d4f398..e8b07784 100644 --- a/crates/binstalk/src/ops/resolve/resolution.rs +++ b/crates/binstalk/src/ops/resolve/resolution.rs @@ -87,11 +87,16 @@ impl ResolutionFetch { current_version: self.new_version, source: self.source, target: self.fetcher.target().to_compact_string(), - bins: self - .bin_files - .into_iter() - .map(|bin| bin.base_name) - .collect(), + bins: opts + .bins + .as_ref() + .map(|bins| bins.iter().cloned().map(Into::into).collect()) + .unwrap_or_else(|| { + self.bin_files + .into_iter() + .map(|bin| bin.base_name) + .collect() + }), }) } diff --git a/e2e-tests/specific-binaries.sh b/e2e-tests/specific-binaries.sh new file mode 100755 index 00000000..36e94186 --- /dev/null +++ b/e2e-tests/specific-binaries.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +set -euxo pipefail + +unset CARGO_INSTALL_ROOT + +CARGO_HOME=$(mktemp -d 2>/dev/null || mktemp -d -t 'cargo-home') +export CARGO_HOME +export PATH="$CARGO_HOME/bin:$PATH" + +# Install a specific binary (e.g., ripgrep) +"./$1" binstall --no-confirm ripgrep --bin rg + +# Verify that the binary was installed and is executable +if ! command -v rg >/dev/null 2>&1; then + echo "rg was not installed" + exit 1 +fi + +# Run the binary to check it works +rg --version diff --git a/justfile b/justfile index e9cb9f53..4499ca66 100644 --- a/justfile +++ b/justfile @@ -224,6 +224,7 @@ e2e-test-signing: (e2e-test "signing") e2e-test-continue-on-failure: (e2e-test "continue-on-failure") e2e-test-private-github-repo: (e2e-test "private-github-repo") e2e-test-self-install: (e2e-test "self-install") +e2e-test-specific-binaries: (e2e-test "specific-binaries") # WinTLS (Windows in CI) does not have TLS 1.3 support [windows] @@ -232,7 +233,7 @@ e2e-test-tls: (e2e-test "tls" "1.2") [macos] e2e-test-tls: (e2e-test "tls" "1.2") (e2e-test "tls" "1.3") -e2e-tests: e2e-test-live e2e-test-manifest-path e2e-test-git e2e-test-other-repos e2e-test-strategies e2e-test-version-syntax e2e-test-upgrade e2e-test-tls e2e-test-self-upgrade-no-symlink e2e-test-uninstall e2e-test-subcrate e2e-test-no-track e2e-test-registries e2e-test-signing e2e-test-continue-on-failure e2e-test-private-github-repo e2e-test-self-install +e2e-tests: e2e-test-live e2e-test-manifest-path e2e-test-git e2e-test-other-repos e2e-test-strategies e2e-test-version-syntax e2e-test-upgrade e2e-test-tls e2e-test-self-upgrade-no-symlink e2e-test-uninstall e2e-test-subcrate e2e-test-no-track e2e-test-registries e2e-test-signing e2e-test-continue-on-failure e2e-test-private-github-repo e2e-test-self-install e2e-test-specific-binaries unit-tests: print-env cargo test --no-run --target {{target}}