Skip to content

fix(backend): suppress no-versions warning for unresolved-latest backends#9548

Merged
jdx merged 1 commit intomainfrom
claude/charming-robinson-39ad84
May 2, 2026
Merged

fix(backend): suppress no-versions warning for unresolved-latest backends#9548
jdx merged 1 commit intomainfrom
claude/charming-robinson-39ad84

Conversation

@jdx
Copy link
Copy Markdown
Owner

@jdx jdx commented May 2, 2026

Summary

Backends that opt into installing an unresolved latest selector (today only pipx for git-backed requests) legitimately return an empty remote version list when their source has no discoverable versions — e.g. a GitHub repo with no releases (only tags). The hard-error path was already addressed in #9401 by falling back to the unresolved selector.

What's still left is noise: every command that touches such a tool emits 3–12 repeated mise WARN No versions found for … warnings. The repetition comes from #9444 (don't cache empty version lists) — every separate call site that asks for remote versions in the same process re-fetches and re-warns. Underlying GitHub API calls are still deduplicated by RELEASE_CACHE, so this is purely log noise, not extra HTTP traffic.

This change suppresses the warning when the backend opts into unresolved_latest_version(). For those backends an empty list is the expected steady state, not an error worth flagging. Other backends still warn as before, so the warning continues to catch real problems (typo'd repos, configs pointing at the wrong place).

Refs #9381.

Reproduction

```toml

~/.config/mise/conf.d/tools.toml

[tools]
"pipx:a13xp0p0v/kernel-hardening-checker" = "latest"
```

a13xp0p0v/kernel-hardening-checker has 0 GitHub releases (14 tags). Before this PR:

```
$ mise current
mise WARN No versions found for pipx:a13xp0p0v/kernel-hardening-checker
mise WARN No versions found for pipx:a13xp0p0v/kernel-hardening-checker
mise WARN No versions found for pipx:a13xp0p0v/kernel-hardening-checker
pipx:a13xp0p0v/kernel-hardening-checker latest
```

After:

```
$ mise current
pipx:a13xp0p0v/kernel-hardening-checker latest
```

mise ls, mise outdated, and mise install are similarly quiet now.

Test plan

  • Manual repro with the discussion's tool — all warnings gone for mise ls, mise current, mise outdated, mise install
  • mise run lint
  • cargo build

🤖 Generated with Claude Code


Note

Low Risk
Low risk: only changes warning emission logic when a backend opts into unresolved_latest_version(), with no effect on version fetching or installation behavior.

Overview
Suppresses repeated No versions found warnings when list_remote_versions_with_info returns an empty list for backends that support installing an unresolved latest selector (via unresolved_latest_version()). Other backends still warn on empty remote version lists as before.

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

…ends

Backends that opt into unresolved-latest installation (pipx git tools today)
legitimately return an empty remote version list when their source has no
discoverable releases (e.g. a GitHub repo with only tags). Skip the
"No versions found" warning in that case so commands stay quiet for the
intended steady state. Other backends still warn as before.

Refs #9381
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 2, 2026

Greptile Summary

This PR suppresses the repeated No versions found for … warning when a backend opts into unresolved_latest_version() (currently only pipx for git-backed requests), where an empty remote version list is the expected steady state rather than a real error. The fix is a minimal, well-scoped three-condition guard; other backends continue to warn as before.

Confidence Score: 5/5

Safe to merge — single-line logic change with no behavioral impact on other backends.

The change is minimal (3 added lines), the opt-in is narrowly scoped (only git-backed pipx today), and the pipx unresolved_latest_version() already guards on PipxRequest::Git before returning Some, so PyPI-backed tools are unaffected. No data path, caching, or install logic is changed.

No files require special attention.

Important Files Changed

Filename Overview
src/backend/mod.rs Adds a third guard to the "no versions" warning: suppress it when the backend opts into unresolved_latest_version(), indicating an empty list is the expected steady state for that backend/tool.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[list_remote_versions called] --> B[Fetch from versions host or backend]
    B --> C{versions.is_empty?}
    C -- No --> D[Return versions]
    C -- Yes --> E{backend type == Http?}
    E -- Yes --> F[Skip warning, return empty]
    E -- No --> G{unresolved_latest_version is Some?}
    G -- Yes --> H["Skip warning (expected empty state), return empty"]
    G -- No --> I[warn! No versions found for id]
    I --> J[Return empty]
Loading

Reviews (1): Last reviewed commit: "fix(backend): suppress no-versions warni..." | Re-trigger Greptile

@jdx jdx enabled auto-merge (squash) May 2, 2026 16:56
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 updates the version discovery logic in src/backend/mod.rs to suppress 'No versions found' warnings when an unresolved latest version is present. The review feedback suggests extending this logic to exclude BackendType::S3 from the warning as well, ensuring consistency with how Http backends are handled and reducing log noise.

Comment thread src/backend/mod.rs
Comment on lines +857 to +860
if versions.is_empty()
&& self.get_type() != BackendType::Http
&& self.unresolved_latest_version().is_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

The check for BackendType::Http appears to be missing BackendType::S3, which is typically handled similarly in this module (e.g., line 723). Since S3 backends can also function without a remote version list (e.g., when using direct URLs), they should likely also be excluded from this warning to avoid unnecessary log noise.

Suggested change
if versions.is_empty()
&& self.get_type() != BackendType::Http
&& self.unresolved_latest_version().is_none()
{
if versions.is_empty()
&& !matches!(self.get_type(), BackendType::Http | BackendType::S3)
&& self.unresolved_latest_version().is_none()
{

@jdx jdx merged commit 4b64431 into main May 2, 2026
38 checks passed
@jdx jdx deleted the claude/charming-robinson-39ad84 branch May 2, 2026 17:05
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 2, 2026

Hyperfine Performance

mise x -- echo

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 x -- echo 22.3 ± 0.4 21.5 24.5 1.00
mise x -- echo 22.8 ± 0.7 21.8 29.7 1.02 ± 0.04

mise env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 env 21.9 ± 0.7 21.0 27.3 1.00
mise env 22.4 ± 0.5 21.3 24.9 1.02 ± 0.04

mise hook-env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 hook-env 22.5 ± 0.4 21.7 26.8 1.00
mise hook-env 23.0 ± 0.5 22.0 24.7 1.02 ± 0.03

mise ls

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 ls 19.9 ± 0.5 19.0 22.0 1.00
mise ls 20.4 ± 0.5 19.5 24.3 1.03 ± 0.03

xtasks/test/perf

Command mise-2026.4.28 mise Variance
install (cached) 151ms 157ms -3%
ls (cached) 77ms 79ms -2%
bin-paths (cached) 81ms 84ms -3%
task-ls (cached) 845ms 808ms +4%

mise-en-dev added a commit that referenced this pull request May 3, 2026
### 🚀 Features

- **(conda)** graduate conda backend out of experimental by @jdx in
[#9544](#9544)
- **(deps)** Add dart and flutter providers by @tjarvstrand in
[#9505](#9505)
- **(registry)** add neo4j by @mnm364 in
[#9525](#9525)
- **(registry)** add rustfs by @mnm364 in
[#9530](#9530)
- **(task)** support exclusion patterns in task sources by
@jlarmstrongiv in [#9496](#9496)
- **(vfox)** add stat function to lua file module by @esteve in
[#9497](#9497)

### 🐛 Bug Fixes

- **(backend)** flag regex prerelease versions by @jdx in
[#9500](#9500)
- **(backend)** mark -nightly/-canary/-experimental as prereleases by
@jdx in [#9523](#9523)
- **(backend)** suppress no-versions warning for unresolved-latest
backends by @jdx in [#9548](#9548)
- **(backend)** include dotnet prereleases from package flags by @jdx in
[#9551](#9551)
- **(backend)** scope PEP 440 prerelease detection to Python backends by
@jdx in [#9558](#9558)
- **(cargo)** Apply install_env during cargo install by @c22 in
[#9502](#9502)
- **(copr)** drop epel-9 chroots since rust >= 1.91 is unavailable by
@jdx in [#9484](#9484)
- **(github)** skip attestations on non-default api_url by @jdx in
[#9486](#9486)
- **(github)** retry ip allow list errors without auth by @risu729 in
[#9506](#9506)
- **(http)** update versions host tracking endpoint by @jdx in
[#9527](#9527)
- **(install)** don't warn for configured tools when version is passed
via CLI by @jdx in [#9522](#9522)
- **(install)** refresh latest before installing missing tools by @jdx
in [#9545](#9545)
- **(install)** don't cache nonexistent install paths by @jdx in
[#9553](#9553)
- **(lockfile)** don't propagate ad-hoc CLI overrides into the project
lockfile by @jdx in [#9562](#9562)
- **(plugin)** detect plugin types after cloning by @risu729 in
[#9540](#9540)
- **(release)** pass --no-git-checks to aube publish by @jdx in
[#9483](#9483)
- **(task)** convert PATH to MSYS Unix form when spawning POSIX shells
on Windows by @JamBalaya56562 in
[#9547](#9547)

### 📚 Documentation

- **(contributing)** require popularity check for registry PRs by @jdx
in
[7bbeebe](7bbeebe)
- **(watch)** update pitchfork domain to en.dev by @risu729 in
[#9536](#9536)
- document ghtkn GitHub token setup by @jdx in
[#9546](#9546)
- clarify registry backend acceptance policy by @jdx in
[#9543](#9543)
- Change exec command to use bash for variable echo by @kuboon in
[#9567](#9567)

### 🧪 Testing

- **(e2e)** run test-tool targets in parallel by @jdx in
[#9564](#9564)
- **(e2e)** run tests in parallel by @jdx in
[#9563](#9563)
- **(e2e)** bind-mount /tmp on disk and surface failed tests in CI
summary by @jdx in [#9570](#9570)
- **(tasks)** migrate test_task_help atask to usage field by @jdx in
[#9549](#9549)

### 📦️ Dependency Updates

- update fedora:45 docker digest to 8b838b3 by @renovate[bot] in
[#9507](#9507)
- update ghcr.io/jdx/mise:deb docker digest to f02194c by @renovate[bot]
in [#9509](#9509)
- update taiki-e/install-action digest to 7769b73 by @renovate[bot] in
[#9512](#9512)
- update ghcr.io/jdx/mise:alpine docker digest to 581f8a8 by
@renovate[bot] in [#9508](#9508)
- update rust crate ctor to v0.10.1 by @renovate[bot] in
[#9515](#9515)
- update ghcr.io/jdx/mise:rpm docker digest to a5c9655 by @renovate[bot]
in [#9510](#9510)
- update rust docker digest to a9cfb75 by @renovate[bot] in
[#9511](#9511)
- update rust crate age to v0.11.3 by @renovate[bot] in
[#9514](#9514)
- update rust crate jiff to v0.2.24 by @renovate[bot] in
[#9516](#9516)
- update dependency vitepress-plugin-tabs to ^0.9.0 by @renovate[bot] in
[#9518](#9518)
- update autofix-ci/action action to v1.3.4 by @renovate[bot] in
[#9513](#9513)
- update rust crate usage-lib to v3.2.1 by @renovate[bot] in
[#9517](#9517)
- update apple-actions/import-codesign-certs action to v7 by
@renovate[bot] in [#9519](#9519)
- update taiki-e/install-action digest to 51cd0b8 by @renovate[bot] in
[#9531](#9531)
- exclude taiki-e/install-action from renovate by @jdx in
[#9532](#9532)
- update rust crate blake3 to v1.8.5 by @renovate[bot] in
[#9533](#9533)

### 📦 Registry

- enable shellcheck on windows by @zeitlinger in
[#9487](#9487)
- add google-java-format by @zeitlinger in
[#9488](#9488)
- add expert
([aqua:expert-lsp/expert](https://github.com/expert-lsp/expert)) by
@AlternateRT in [#9498](#9498)
- update entry for checkmake by @eread in
[#9504](#9504)
- add systemctl-tui
([aqua:rgwood/systemctl-tui](https://github.com/rgwood/systemctl-tui))
by @2xdevv in [#9521](#9521)
- add codon by @3w36zj6 in
[#9538](#9538)
- add tool yr (backend:github:VirusTotal/yara-x) by @adam-moss in
[#9542](#9542)
- add tool betterleaks (backend:aqua/betterleaks/betterleaks) by
@adam-moss in [#9541](#9541)
- add `git-filter-repo` by @garysassano in
[#9550](#9550)
- add umoci
([aqua:opencontainers/umoci](https://github.com/opencontainers/umoci))
by @2xdevv in [#9555](#9555)
- add aqua backend for elixir-ls by @AlternateRT in
[#9557](#9557)
- deny inline backend options by @risu729 in
[#9565](#9565)

### Chore

- **(ci)** fail registry tests without summary by @jdx in
[#9559](#9559)
- **(ci)** use !cancelled() instead of always() for test-ci aggregator
by @jdx in [#9569](#9569)
- **(ci)** use namespace runners for ci jobs by @jdx in
[#9561](#9561)
- **(config)** deprecate shorthands_file setting by @risu729 in
[#9534](#9534)
- **(docs)** remove shrill.en.dev analytics script by @jdx in
[#9539](#9539)
- **(release)** replace bc with awk in release-plz star formatting by
@jdx in
[d7f177f](d7f177f)
- bump hk to 1.44.3 by @jdx in
[#9493](#9493)
- invert CLAUDE.md/AGENTS.md so AGENTS.md is canonical by @jdx in
[#9560](#9560)
- set dev profile debug to 1 by @jdx in
[#9572](#9572)

### New Contributors

- @kuboon made their first contribution in
[#9567](#9567)
- @AlternateRT made their first contribution in
[#9557](#9557)
- @2xdevv made their first contribution in
[#9555](#9555)
- @adam-moss made their first contribution in
[#9541](#9541)
- @jlarmstrongiv made their first contribution in
[#9496](#9496)
- @tjarvstrand made their first contribution in
[#9505](#9505)
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