From 462823540398e05218514a437995c3d0be70189a Mon Sep 17 00:00:00 2001 From: Remo Senekowitsch Date: Fri, 20 Jun 2025 13:02:21 +0200 Subject: [PATCH] fix: Skip binaries user didn't requst (#2199) * fix: Skip binaries user didn't requst Users may request only a subset of binaries via the --bin flag. In that case, do not fail if binaries other than the ones requested are missing from the downloaded archive. * fix resolve.rs Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com> * fix resolve.rs Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com> * fix resolve.rs --------- Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com> Co-authored-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com> --- crates/binstalk/src/ops/resolve.rs | 10 +++++++ .../skipping-required-bin-Cargo.toml | 17 ++++++++++++ e2e-tests/skipping-required-bin.sh | 27 +++++++++++++++++++ justfile | 3 ++- 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 e2e-tests/manifests/skipping-required-bin-Cargo.toml create mode 100755 e2e-tests/skipping-required-bin.sh diff --git a/crates/binstalk/src/ops/resolve.rs b/crates/binstalk/src/ops/resolve.rs index dd5d0bc1..a41b4fdb 100644 --- a/crates/binstalk/src/ops/resolve.rs +++ b/crates/binstalk/src/ops/resolve.rs @@ -193,6 +193,7 @@ async fn resolve_inner( &package_info, &opts.install_path, opts.no_symlinks, + &opts.bins, ) .await { @@ -289,6 +290,7 @@ async fn download_extract_and_verify( package_info: &PackageInfo, install_path: &Path, no_symlinks: bool, + bins: &Option>, ) -> Result, BinstallError> { // Download and extract it. // If that fails, then ignore this fetcher. @@ -316,6 +318,14 @@ async fn download_extract_and_verify( .iter() .zip(bin_files) .filter_map(|(bin, bin_file)| { + // skip binaries that were not requested by user + if bins + .as_ref() + .is_some_and(|bins| !bins.iter().any(|b| b == bin.name)) + { + return None; + } + match bin_file.check_source_exists(&mut |p| extracted_files.has_file(p)) { Ok(()) => Some(Ok(bin_file)), diff --git a/e2e-tests/manifests/skipping-required-bin-Cargo.toml b/e2e-tests/manifests/skipping-required-bin-Cargo.toml new file mode 100644 index 00000000..78de9a2e --- /dev/null +++ b/e2e-tests/manifests/skipping-required-bin-Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "cargo-binstall" +description = "Rust binary package installer for CI integration" +repository = "https://github.com/cargo-bins/cargo-binstall" +version = "0.12.0" +rust-version = "1.61.0" +authors = ["ryan "] +edition = "2021" +license = "GPL-3.0" + +[[bin]] +name = "cargo-binstall" +path = "src/main.rs" + +[[bin]] +name = "test" +path = "src/te.rs" diff --git a/e2e-tests/skipping-required-bin.sh b/e2e-tests/skipping-required-bin.sh new file mode 100755 index 00000000..1f182df4 --- /dev/null +++ b/e2e-tests/skipping-required-bin.sh @@ -0,0 +1,27 @@ +#!/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 binaries using `--manifest-path` +# Also test default github template +"./$1" binstall \ + --force \ + --manifest-path "manifests/skipping-required-bin-Cargo.toml" \ + --no-confirm \ + cargo-binstall \ + --strategies crate-meta-data \ + --bin cargo-binstall + +# Test that the installed binaries can be run +cargo binstall --help >/dev/null + +cargo_binstall_version="$(cargo binstall -V)" +echo "$cargo_binstall_version" + +[ "$cargo_binstall_version" = "cargo-binstall 0.12.0" ] diff --git a/justfile b/justfile index b63c682c..b713570e 100644 --- a/justfile +++ b/justfile @@ -225,6 +225,7 @@ 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") +e2e-test-skipping-required-bin: (e2e-test "skipping-required-bin") # WinTLS (Windows in CI) does not have TLS 1.3 support [windows] @@ -234,7 +235,7 @@ e2e-test-tls: (e2e-test "tls" "1.2") e2e-test-tls: (e2e-test "tls" "1.2") (e2e-test "tls" "1.3") # e2e-test-self-install needs to be the last task to run, as it would consume the cargo-binstall binary -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-specific-binaries 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-specific-binaries e2e-test-skipping-required-bin e2e-test-self-install unit-tests: print-env cargo test --no-run --target {{target}}