Skip to content

fix(backend): route explicit latest through stable lookup#9228

Merged
jdx merged 1 commit intojdx:mainfrom
risu729:fix/node-latest-stable-path
Apr 18, 2026
Merged

fix(backend): route explicit latest through stable lookup#9228
jdx merged 1 commit intojdx:mainfrom
risu729:fix/node-latest-stable-path

Conversation

@risu729
Copy link
Copy Markdown
Contributor

@risu729 risu729 commented Apr 18, 2026

Summary

  • Treat an explicit latest query the same as no query in the shared backend latest resolver.
  • Route both forms directly through latest_stable_version when no effective install_before / --before cutoff is active.
  • Preserve the date-filtered version-listing path when a cutoff is active, so the behavior from fix(backend): respect install_before in latest lookup #9193 remains intact.
  • Add unit and e2e coverage that verifies tool@latest uses the stable-latest path and does not regress date-filtered latest resolution.

Regression Risk

No expected regressions.

The intentional behavior change is that tool@latest now follows the same backend-specific stable-latest fast path as tool. If a backend's generic version list disagreed with its stable-latest endpoint/script, explicit @latest will now return the same value as the unqualified tool lookup. Date-filtered lookups still bypass that fast path, so install_before / --before behavior continues to use version metadata.

Tests

  • cargo fmt --all -- --check
  • shellcheck e2e/cli/test_latest_explicit_latest
  • shfmt -d -s e2e/cli/test_latest_explicit_latest
  • cargo test --all-features latest_version_tests
  • mise run test:e2e e2e/cli/test_latest_explicit_latest

This PR was generated with assistance from an AI coding assistant.

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 refactors the backend logic for retrieving the latest version of a tool by introducing the latest_stable_version_with_opts method. This change consolidates the handling of explicit "latest" queries and default version requests, ensuring both utilize backend-specific fast paths. The PR also includes a new end-to-end test and comprehensive unit tests to verify that these queries behave as expected and that date-based filtering correctly bypasses fast paths when necessary. I have no feedback to provide.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Apr 18, 2026

Greptile Summary

This PR fixes the inconsistency between mise latest tool (no explicit version) and mise latest tool@latest (explicit @latest). Before, @latest was routed through the full list_remote_versions path instead of latest_stable_version, which could disagree with the backend's native stable-latest fast path (e.g., an ASDF plugin's bin/latest-stable script). Both forms are now unified under latest_stable_version when no install_before / --before cutoff is active; the date-filtered path from #9193 is preserved correctly.

Confidence Score: 5/5

Safe to merge — logic is correct, both code paths are well-tested, and no regressions are introduced.

The change is small and focused: a single pattern match arm in latest_version plus supporting unit and e2e tests. The date-filtered path from #9193 is preserved correctly. All remaining findings are P2 or lower.

No files require special attention.

Important Files Changed

Filename Overview
src/backend/mod.rs Adds `Some("latest")
e2e/cli/test_latest_explicit_latest New e2e test asserting that dummy@latest returns the same result as dummy and that the debug output path includes latest-stable (the ASDF plugin script) and excludes bin/list-all.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["latest_version(query, before_date)"] --> B["effective_latest_before_date()"]
    B --> C{query}
    C -- "Some('latest') or None" --> D{before_date?}
    C -- "Some(other prefix)" --> E["latest_version_for_query(query, before_date)"]
    D -- None --> F["latest_stable_version()\n(fast path: dist-tag / plugin script)"]
    D -- Some(before) --> G["latest_version_for_query('latest', Some(before))\n(date-filtered list path)"]
    F --> H["Result"]
    G --> H
    E --> H
Loading

Reviews (3): Last reviewed commit: "fix(backend): route explicit latest thro..." | Re-trigger Greptile

Comment thread src/backend/mod.rs Outdated
@risu729 risu729 force-pushed the fix/node-latest-stable-path branch from dc114d3 to fa796d8 Compare April 18, 2026 04:05
@risu729 risu729 force-pushed the fix/node-latest-stable-path branch from fa796d8 to ea9c508 Compare April 18, 2026 04:09
@risu729 risu729 marked this pull request as ready for review April 18, 2026 04:12
@jdx jdx merged commit 6d0bb46 into jdx:main Apr 18, 2026
34 checks passed
@risu729 risu729 deleted the fix/node-latest-stable-path branch April 18, 2026 11:08
jdx pushed a commit that referenced this pull request Apr 18, 2026
### 🐛 Bug Fixes

- **(backend)** respect install_before in latest lookup by @risu729 in
[#9193](#9193)
- **(backend)** route explicit latest through stable lookup by @risu729
in [#9228](#9228)
- **(backends)** deprecate b shorthand by @risu729 in
[#9234](#9234)
- **(config)** warn for deprecated env keys by @risu729 in
[#9205](#9205)
- **(config)** treat enable_tools empty as disable-all by @risu729 in
[#9108](#9108)
- **(github)** avoid auth on release asset downloads by @risu729 in
[#9060](#9060)
- **(gitlab)** warn when glab OAuth2 token is expired by @stanhu in
[#9195](#9195)
- **(npm)** honor install_before without day drift by @risu729 in
[#9157](#9157)
- **(npm)** warn on old bun and pnpm for install_before by @risu729 in
[#9232](#9232)
- **(pipx)** honor install_before for uv and pipx installs by @risu729
in [#9190](#9190)
- **(registry)** allow shfmt on Windows by @zeitlinger in
[#9191](#9191)

### 🚜 Refactor

- **(backend)** remove unused rolling release helper by @risu729 in
[#9175](#9175)
- **(backend)** use file util for removals by @risu729 in
[#9206](#9206)

### 📚 Documentation

- **(config)** clarify always_keep_download behavior by @risu729 in
[#9235](#9235)
- **(configuration)** add rust to idiomatic version files by @jjt in
[#9233](#9233)
- **(contributing)** expand contribution guide introduction by
@marianwolf in [#9208](#9208)
- **(github)** document multiple release assets workaround by @risu729
in [#9236](#9236)

### 📦️ Dependency Updates

- update actions/setup-node action to v6 by @renovate[bot] in
[#9183](#9183)
- update dependency @types/node to v25 by @renovate[bot] in
[#9187](#9187)
- update crazy-max/ghaction-import-gpg action to v7 by @renovate[bot] in
[#9186](#9186)
- update actions/cache action to v5 by @renovate[bot] in
[#9181](#9181)
- update amannn/action-semantic-pull-request action to v6 by
@renovate[bot] in [#9184](#9184)
- update apple-actions/import-codesign-certs action to v6 by
@renovate[bot] in [#9185](#9185)
- update dependency eslint to v10 by @renovate[bot] in
[#9200](#9200)
- update dependency toml to v4 by @renovate[bot] in
[#9201](#9201)
- update rust crate reqwest to 0.13 by @renovate[bot] in
[#9171](#9171)
- update ghcr.io/jdx/mise:deb docker digest to 523d826 by @renovate[bot]
in [#9198](#9198)
- update ghcr.io/jdx/mise:alpine docker digest to 05617e0 by
@renovate[bot] in [#9196](#9196)
- update ghcr.io/jdx/mise:rpm docker digest to c1992f9 by @renovate[bot]
in [#9199](#9199)
- update ghcr.io/jdx/mise:copr docker digest to 90db6cd by
@renovate[bot] in [#9197](#9197)
- update taiki-e/install-action digest to 58e8625 by @renovate[bot] in
[#9209](#9209)
- update fedora docker tag to v45 by @renovate[bot] in
[#9213](#9213)
- update docker/setup-buildx-action action to v4 by @renovate[bot] in
[#9212](#9212)
- update docker/metadata-action action to v6 by @renovate[bot] in
[#9211](#9211)
- update docker/login-action action to v4 by @renovate[bot] in
[#9210](#9210)
- update dependency typescript to v6 by @renovate[bot] in
[#9202](#9202)
- update docker/build-push-action action to v7 by @renovate[bot] in
[#9203](#9203)
- update github artifact actions (major) by @renovate[bot] in
[#9215](#9215)
- update rust crate duct to v1 by @renovate[bot] in
[#9220](#9220)
- update rust crate demand to v2 by @renovate[bot] in
[#9219](#9219)
- update rust crate clx to v2 by @renovate[bot] in
[#9218](#9218)
- update nick-fields/retry action to v4 by @renovate[bot] in
[#9217](#9217)
- update jdx/mise-action action to v4 by @renovate[bot] in
[#9216](#9216)
- update rust crate self_update to 0.44 by @renovate[bot] in
[#9174](#9174)
- migrate eslint config to flat format for v10 compat by @jdx in
[#9222](#9222)
- update actions/checkout action to v6 by @renovate[bot] in
[#9182](#9182)
- update rust crate toml to v1 by @renovate[bot] in
[#9225](#9225)
- update rust crate versions to v7 by @renovate[bot] in
[#9226](#9226)
- update rust crate which to v8 by @renovate[bot] in
[#9227](#9227)
- update rust crate rmcp to v1 by @renovate[bot] in
[#9221](#9221)

### 📦 Registry

- add sheldon by @3w36zj6 in
[#9104](#9104)
- add pocketbase by @ranfdev in
[#9123](#9123)
- add worktrunk ([aqua:max-sixty/worktrunk,
cargo:worktrunk](https://github.com/max-sixty/worktrunk,
cargo:worktrunk))#1 by @edouardr in
[#8796](#8796)
- add dependency-check
([aqua:dependency-check/DependencyCheck](https://github.com/dependency-check/DependencyCheck))
by @kapitoshka438 in [#9204](#9204)
- add janet by @ranfdev in
[#9241](#9241)

### New Contributors

- @ranfdev made their first contribution in
[#9241](#9241)
- @jjt made their first contribution in
[#9233](#9233)
- @marianwolf made their first contribution in
[#9208](#9208)
- @edouardr made their first contribution in
[#8796](#8796)

## 📦 Aqua Registry Updates

#### New Packages (3)

- [`LargeModGames/spotatui`](https://github.com/LargeModGames/spotatui)
-
[`android-sms-gateway/cli`](https://github.com/android-sms-gateway/cli)
- [`velero-io/velero`](https://github.com/velero-io/velero)

#### Updated Packages (1)

- [`skim-rs/skim`](https://github.com/skim-rs/skim)
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.

2 participants