Skip to content

feat(aqua): support registry libc variants#9652

Merged
jdx merged 1 commit intomainfrom
codex/aqua-libc-variants
May 6, 2026
Merged

feat(aqua): support registry libc variants#9652
jdx merged 1 commit intomainfrom
codex/aqua-libc-variants

Conversation

@jdx
Copy link
Copy Markdown
Owner

@jdx jdx commented May 6, 2026

Summary

  • Parse aqua registry overrides[].variants entries using the new { key, value } shape.
  • Support key: libc matching for Linux gnu and musl targets while skipping unknown variant keys.
  • Pass the target libc into aqua package override resolution, including cross-platform lock targets like linux-x64-musl.

Validation

  • cargo fmt --check
  • cargo test -p aqua-registry override_variants
  • cargo check -p mise
  • pre-commit hk checks during commit, including cargo check --all-features

This PR was generated by an AI coding assistant.


Note

Medium Risk
Changes platform override resolution for Aqua packages (including lockfile resolution and remote version listing), which can affect which release assets/URLs are selected on Linux. Risk is mitigated by added unit tests, but incorrect variant matching could cause install/lock mismatches.

Overview
Adds support for aqua registry overrides[].variants and uses it to select Linux gnu vs musl assets when resolving package overrides.

AquaPackage now supports with_version_libc(...) and override matching incorporates runtime variants (currently key: libc, normalized), while unknown variant keys are ignored; backend call sites are updated to pass the target libc (including cross-platform lock targets) and remove the wrapper/registry package_with_version helper. Also hardens scripts/test-standalone.sh network fetches by adding curl retries.

Reviewed by Cursor Bugbot for commit 0a92661. Bugbot is set up for automated code reviews on this repo. Configure here.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 6, 2026

Greptile Summary

This PR adds support for aqua registry overrides[].variants entries, specifically the libc key for selecting GNU vs musl download URLs on Linux. It consistently threads a new target_variant_libc helper through all version/override resolution call sites, replaces the previously duplicated package_with_version fetch in the asset-validation loop, and removes the now-unnecessary package_with_version wrapper methods from both the registry crate and MiseAquaRegistry.

  • Adds AquaVariant / AquaRuntime types and with_version_libc / with_version_runtime in types.rs; the unknown-variant-key and missing-libc fallback behaviours are intentional and covered by new unit tests.
  • All with_version call sites in aqua.rs are updated to use with_version_libc, including the cross-platform lock resolution path which correctly avoids leaking host-specific overrides.
  • scripts/test-standalone.sh gains --retry flags on two curl calls for CI hardening.

Confidence Score: 5/5

Safe to merge; all production call sites thread the new libc context consistently and the prior asset-validation double-fetch is cleanly eliminated.

The change is well-scoped: every with_version call in aqua.rs has been updated to with_version_libc, the fallback to gnu on a standard glibc system is correct and matches the existing target_libc precedence, and the removal of package_with_version eliminates the previously flagged libc-divergence. New unit tests cover gnu match, musl match, unknown-key skip, and no-runtime fallback. No production path is left using the old unaware API.

No files require special attention.

Reviews (5): Last reviewed commit: "feat(aqua): support registry libc varian..." | Re-trigger Greptile

Comment thread src/aqua/aqua_registry_wrapper.rs Outdated
Comment thread crates/aqua-registry/src/types.rs Outdated
Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces support for libc runtime variants (gnu and musl) within the Aqua registry, allowing for more precise version resolution on Linux systems. The changes include new data structures for variants, updated matching logic, and backend integration for libc detection. Feedback highlights several performance improvements, such as avoiding redundant allocations by iterating by reference and moving platform detection logic outside of loops. Additionally, it is recommended to refine the libc detection logic to prioritize tool-specific configurations over global settings to ensure consistency.

Comment thread crates/aqua-registry/src/types.rs Outdated
Comment on lines 272 to 279
if let Some(avo) = self
.overrides
.clone()
.into_iter()
.find(|o| o.matches(os, arch, runtime))
{
self = apply_override(self, &avo.pkg)
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The current implementation clones the entire overrides vector and its contents for every version resolution. Since apply_override takes a reference to the package, you can iterate by reference and avoid unnecessary allocations.

        if let Some(avo) = self.overrides.iter().find(|o| o.matches(os, arch, runtime)) {
            self = apply_override(self, &avo.pkg)
        }

Comment thread src/aqua/aqua_registry_wrapper.rs Outdated
Comment on lines +101 to +106
let target = PlatformTarget::from_current();
let libc = if target.os_name() == "linux" {
Some(target.libc().unwrap_or("gnu"))
} else {
None
};
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This libc detection logic should be updated to follow the repository's configuration pattern. Instead of re-deriving the libc setting from a general context like Settings::get(), which can lead to lost configurations, it should consult the backend arguments and tool-specific configuration (e.g., ba.opts() and config.get_tool_opts(&ba)). This is especially important if the method is an override.

        let target = PlatformTarget::from_current();
        let libc = if target.os_name() == "linux" {
            let tool_opts = config.get_tool_opts(&ba);
            Some(target.libc().or(tool_opts.libc).unwrap_or("gnu"))
        } else {
            None
References
  1. When checking for the version_list_url option, consult both the backend arguments (ba.opts()) and the user's tool-specific configuration (config.get_tool_opts(&ba)) to ensure custom configurations from sources like config.toml are correctly detected.
  2. When overriding a method, use the provided parameters instead of re-deriving their values from a more general context. The parameters may have been computed with specific configurations that would be lost if re-derived.

Comment thread src/backend/aqua.rs Outdated
Comment on lines +253 to +255
let target = PlatformTarget::from_current();
let (target_os, target_arch) = Self::to_aqua_platform(&target);
let target_libc = Self::target_variant_libc(&target);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Detecting the platform and libc variant inside the loop for every remote version tag is inefficient. These values are constant for the entire list and should be calculated once before the loop starts.

Comment thread src/backend/aqua.rs Outdated
Comment on lines +1341 to +1343
let target = PlatformTarget::from_current();
let (target_os, target_arch) = Self::to_aqua_platform(&target);
let target_libc = Self::target_variant_libc(&target);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Similar to the remote versions list, platform and libc detection should be moved outside the loop to avoid redundant calculations for every tag.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 6, 2026

Hyperfine Performance

mise x -- echo

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.5.1 x -- echo 64.2 ± 9.2 29.0 85.8 1.01 ± 0.20
mise x -- echo 63.8 ± 8.6 32.6 90.6 1.00

mise env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.5.1 env 65.1 ± 6.0 31.5 79.5 1.00
mise env 65.5 ± 4.3 35.7 91.6 1.01 ± 0.11

mise hook-env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.5.1 hook-env 68.6 ± 2.3 55.7 77.4 1.00 ± 0.06
mise hook-env 68.4 ± 3.1 48.2 90.4 1.00

mise ls

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.5.1 ls 55.1 ± 2.8 31.4 64.7 1.03 ± 0.10
mise ls 53.7 ± 4.4 20.0 78.7 1.00

xtasks/test/perf

Command mise-2026.5.1 mise Variance
install (cached) 284ms 281ms +1%
ls (cached) 182ms 188ms -3%
bin-paths (cached) 205ms 207ms +0%
task-ls (cached) 708ms 678ms +4%

@jdx jdx force-pushed the codex/aqua-libc-variants branch 2 times, most recently from d9c6e9d to 053e1ec Compare May 6, 2026 14:30
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 053e1ec. Configure here.

Comment thread src/backend/aqua.rs Outdated
@jdx jdx force-pushed the codex/aqua-libc-variants branch 2 times, most recently from 16fb895 to 8b84212 Compare May 6, 2026 15:18
@jdx jdx force-pushed the codex/aqua-libc-variants branch from 8b84212 to 0a92661 Compare May 6, 2026 15:37
@jdx jdx merged commit bcb3b15 into main May 6, 2026
34 of 36 checks passed
@jdx jdx deleted the codex/aqua-libc-variants branch May 6, 2026 18:45
mise-en-dev added a commit that referenced this pull request May 7, 2026
### 🚀 Features

- **(aqua)** support registry libc variants by @jdx in
[#9652](#9652)
- **(bin-paths)** add executable names output by @risu729 in
[#9617](#9617)

### 🐛 Bug Fixes

- **(aqua)** preserve configured file extensions by @risu729 in
[#9611](#9611)
- **(aqua)** support registry file links by @risu729 in
[#9610](#9610)
- **(backend)** reject bare package backend names by @risu729 in
[#9608](#9608)
- **(backend)** apply inline tool option overrides by @risu729 in
[#9306](#9306)
- **(backend)** skip versions host for local tool opts by @risu729 in
[#9568](#9568)
- **(github)** chmod explicit archive bin by @risu729 in
[#9609](#9609)
- **(install)** skip remote-versions refresh in prefer-offline mode by
@jdx in [#9627](#9627)
- **(lock)** scope targets to active project root by @risu729 in
[#9319](#9319)
- **(lockfile)** respect existing platforms during auto-lock by @jdx in
[#9621](#9621)
- **(pipx)** filter yanked pypi releases by @risu729 in
[#9607](#9607)
- **(pipx)** declare python as a backend dependency by @jdx in
[#9678](#9678)
- **(schema)** update refs to $defs in mise-registry-tool.json by
@risu729 in [#9671](#9671)
- **(task)** terminate parallel siblings on failure via process groups
by @jdx in [#9655](#9655)
- **(task)** stable MISE_PROJECT_ROOT for monorepo tasks, add
MISE_MONOREPO_ROOT by @jdx in
[#9657](#9657)
- **(trust)** run enter hooks after trusting config by @risu729 in
[#9634](#9634)
- **(ui)** stop clearing screen for prompts by @jdx in
[#9619](#9619)
- use /bin/cp on macos by @pdehlke in
[#9656](#9656)

### 🚜 Refactor

- **(aqua)** store aqua var defaults as strings by @risu729 in
[#9645](#9645)
- **(config)** support structured TOML values in registry backend
options by @risu729 in [#9584](#9584)
- **(deps)** remove serde_derive dependency by @risu729 in
[#9670](#9670)
- **(deps)** remove anyhow dependency by @risu729 in
[#9661](#9661)
- **(deps)** use std::sync::LazyLock instead of once_cell::Lazy by
@risu729 in [#9668](#9668)
- **(schema)** generate task schema from mise schema by @risu729 in
[#9581](#9581)
- **(schema)** reuse task props with unevaluatedProperties by @risu729
in [#9582](#9582)
- **(schema)** reuse registry common types by @risu729 in
[#9648](#9648)
- **(schema)** reuse plugin script config by @risu729 in
[#9647](#9647)
- **(schema)** use $defs in schema files by @risu729 in
[#9646](#9646)

### 📚 Documentation

- **(node)** add tips for enabling node idiomatic by @fu050409 in
[#9675](#9675)

### 🧪 Testing

- **(cli)** remove nondeterministic tool depends assertion by @risu729
in [#9633](#9633)
- **(e2e)** pin uv to 0.11.8 around astral-sh/uv#19278 by @jdx in
[#9618](#9618)
- **(e2e)** wait for docker env cleanup by @risu729 in
[#9631](#9631)
- **(zig)** use official zig instead of mach mirror by @jdx in
[#9659](#9659)

### 📦️ Dependency Updates

- fall through to hash check when providers have no outputs by @jdx in
[#9622](#9622)
- bump Cargo.lock by @jdx in
[#9625](#9625)

### 📦 Registry

- remove registry depends by @risu729 in
[#9571](#9571)
- add code-review-graph (pipx:code-review-graph) by @chautruonglong in
[#9673](#9673)

### Chore

- **(ci)** split large registry test-tool changes by @risu729 in
[#9628](#9628)
- **(ci)** make perf script robust to runner noise by @jdx in
[#9635](#9635)
- **(ci)** skip hyperfine comments without permission by @risu729 in
[#9629](#9629)

### New Contributors

- @chautruonglong made their first contribution in
[#9673](#9673)
- @pdehlke made their first contribution in
[#9656](#9656)

## 📦 Aqua Registry Updates

### New Packages (5)

-
[`anthropics/anthropic-cli`](https://github.com/anthropics/anthropic-cli)
- [`crates.io/wasmi_cli`](https://github.com/wasmi-labs/wasmi)
- [`openclaw/gogcli`](https://github.com/openclaw/gogcli)
- `racket-lang.org/racket-minimal`
- [`runs-on/cli`](https://github.com/runs-on/cli)

### Updated Packages (13)

- [`UpCloudLtd/upcloud-cli`](https://github.com/UpCloudLtd/upcloud-cli)
- [`aristocratos/btop`](https://github.com/aristocratos/btop)
- [`dprint/dprint`](https://github.com/dprint/dprint)
- [`j178/prek`](https://github.com/j178/prek)
- [`jdx/hk`](https://github.com/jdx/hk)
- [`jdx/mise`](https://github.com/jdx/mise)
- [`jdx/usage`](https://github.com/jdx/usage)
- [`jreleaser/jreleaser`](https://github.com/jreleaser/jreleaser)
-
[`jreleaser/jreleaser/standalone`](https://github.com/jreleaser/jreleaser)
- [`pnpm/pnpm`](https://github.com/pnpm/pnpm)
- [`suzuki-shunsuke/cmdx`](https://github.com/suzuki-shunsuke/cmdx)
- [`suzuki-shunsuke/ghir`](https://github.com/suzuki-shunsuke/ghir)
- [`twpayne/chezmoi`](https://github.com/twpayne/chezmoi)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant