Skip to content

fix(backend): include dotnet prereleases from package flags#9551

Merged
jdx merged 1 commit intomainfrom
codex/fix-dotnet-prerelease-ls-remote
May 3, 2026
Merged

fix(backend): include dotnet prereleases from package flags#9551
jdx merged 1 commit intomainfrom
codex/fix-dotnet-prerelease-ls-remote

Conversation

@jdx
Copy link
Copy Markdown
Owner

@jdx jdx commented May 2, 2026

Summary

  • make the dotnet backend decide prerelease NuGet queries from both global prerelease settings and dotnet.package_flags
  • bypass the shared remote-version cache for dotnet package listings because package flags change the NuGet result set
  • keep default ls-remote dotnet:GitVersion.Tool filtering prerelease versions while allowing MISE_DOTNET_PACKAGE_FLAGS=prerelease and --prerelease to show beta versions

Root Cause

The failing release workflow expected MISE_DOTNET_PACKAGE_FLAGS=prerelease mise ls-remote dotnet:GitVersion.Tool to include beta versions. Dotnet was querying NuGet with prerelease=true, but the shared prerelease filter later removed those beta rows because it only considered global/per-tool prerelease opts, not dotnet package flags.

Failed job: https://github.com/jdx/mise/actions/runs/25259568232/job/74066576493

Validation

  • mise run build
  • MISE_EXPERIMENTAL=1 ./target/debug/mise cache clear && MISE_EXPERIMENTAL=1 ./target/debug/mise ls-remote dotnet:GitVersion.Tool | rg -- '-beta' exits 1, confirming default filtering
  • MISE_EXPERIMENTAL=1 MISE_DOTNET_PACKAGE_FLAGS=prerelease ./target/debug/mise ls-remote dotnet:GitVersion.Tool | rg -- '-beta' | head -5
  • MISE_EXPERIMENTAL=1 ./target/debug/mise ls-remote --prerelease dotnet:GitVersion.Tool | rg -- '-beta' | head -5
  • mise run test:e2e e2e/backend/test_dotnet completed locally; backend/test_dotnet skipped because system dotnet was not on PATH, while the matched core/test_dotnet e2e passed
  • commit hook: hk lint suite, including cargo check --all-features

Note

Medium Risk
Changes dotnet remote version discovery and prerelease filtering, which can affect ls-remote output and install-time latest resolution for dotnet tools. Risk is moderate due to potential behavior changes around caching and version selection, but scoped to the experimental dotnet backend.

Overview
Dotnet backend now decides whether to query/show NuGet prereleases based on global prerelease settings, dotnet.package_flags (e.g. prerelease), and per-tool prerelease options, instead of only the generic prerelease filter.

To avoid incorrect results when dotnet package flags change the upstream NuGet result set, it overrides list_remote_versions_with_info_with_refresh to fetch directly and then apply dotnet-specific prerelease marking/filtering, and updates version matching to use the same logic (including before_date filtering via VersionInfo).

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

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 mise to version 2026.5.0, incorporating various features, bug fixes, and dependency updates. Significant changes were made to the dotnet backend to improve prerelease version handling. A review comment identifies an inconsistency in how prerelease settings are applied to NuGet queries compared to remote version listing, suggesting a code change to include tool-specific options and CLI flags.

Comment thread src/backend/dotnet.rs Outdated
.dotnet
.package_flags
.contains(&"prerelease".to_string())
self.dotnet_prereleases_enabled()
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.

high

The NuGet query here uses self.dotnet_prereleases_enabled(), which only accounts for global settings and dotnet.package_flags. It does not include tool-specific prerelease settings (e.g., from mise.toml) or the --prerelease CLI flag, which are captured in the opts from config. Following the project's configuration detection patterns, you should ensure that the prerelease parameter in the URL reflects the same logic used in list_remote_versions_with_info by consulting both backend arguments and tool-specific configurations.

Suggested change
self.dotnet_prereleases_enabled()
{
let opts = config.get_tool_opts(&self.ba).await?.unwrap_or_else(|| self.ba.opts());
self.dotnet_prereleases_enabled() || include_prereleases(&opts)
}
References
  1. When checking for tool-specific options, consult both the backend arguments and the user's tool-specific configuration to ensure custom configurations are correctly detected.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 2, 2026

Greptile Summary

This PR fixes the dotnet backend's prerelease filtering so that MISE_DOTNET_PACKAGE_FLAGS=prerelease and --prerelease both correctly include beta versions in ls-remote and install-time resolution. It overrides list_remote_versions_with_info_with_refresh to bypass the shared remote-versions cache (necessary because package flags change what NuGet returns) and adds dotnet_prereleases_enabled to unify the three prerelease signals — global settings, dotnet.package_flags, and per-tool opts.

Confidence Score: 5/5

Safe to merge; the logic correctly unifies all three prerelease signals and the cache-bypass is properly scoped to the dotnet backend.

Only P2 findings present. The core prerelease-filtering logic is correct: dotnet_prereleases_enabled is used consistently for both the NuGet query and the filter step, and the overridden list_remote_versions_with_info_with_refresh correctly routes all callers through the same path. The _refresh flag being ignored is intentional and safe since the override always hits NuGet directly with no in-process cache.

No files require special attention.

Important Files Changed

Filename Overview
src/backend/dotnet.rs Adds dotnet_prereleases_enabled, overrides list_remote_versions_with_info_with_refresh to bypass shared cache, and overrides list_versions_matching_with_opts to apply dotnet-specific prerelease filtering; logic is sound but tool_opts is fetched twice per call in some paths

Sequence Diagram

sequenceDiagram
    participant User
    participant DotnetBackend
    participant mod.rs (base)
    participant NuGet API

    User->>DotnetBackend: ls-remote / install dotnet:Tool
    DotnetBackend->>DotnetBackend: list_remote_versions_with_info_with_refresh (override)
    DotnetBackend->>DotnetBackend: tool_opts(config)
    DotnetBackend->>DotnetBackend: dotnet_prereleases_enabled(opts)
    note over DotnetBackend: checks: Settings.prereleases<br/>|| package_flags contains prerelease<br/>|| include_prereleases(opts)
    DotnetBackend->>DotnetBackend: _list_remote_versions(config)
    DotnetBackend->>NuGet API: GET ?q=Tool&prerelease={want_prereleases}
    NuGet API-->>DotnetBackend: versions list
    DotnetBackend->>DotnetBackend: mark_prerelease + filter_cached_prereleases
    DotnetBackend-->>User: filtered VersionInfo list

    User->>DotnetBackend: list_versions_matching_with_opts (override)
    alt before_date is Some
        DotnetBackend->>DotnetBackend: list_remote_versions_with_info_with_refresh
        DotnetBackend->>DotnetBackend: VersionInfo::filter_by_date
    else before_date is None
        DotnetBackend->>mod.rs (base): list_remote_versions_with_refresh
        mod.rs (base)->>DotnetBackend: list_remote_versions_with_info_with_refresh (override)
    end
    DotnetBackend->>DotnetBackend: tool_opts(config) [2nd fetch]
    DotnetBackend->>DotnetBackend: fuzzy_match_filter(versions, query, !dotnet_prereleases_enabled)
    DotnetBackend-->>User: matched version strings
Loading

Fix All in Claude Code

Reviews (5): Last reviewed commit: "fix(backend): include dotnet prereleases..." | Re-trigger Greptile

Comment thread src/backend/dotnet.rs Outdated
Comment thread src/backend/dotnet.rs
@jdx jdx force-pushed the codex/fix-dotnet-prerelease-ls-remote branch 2 times, most recently from cfc15d8 to ffba39c Compare May 2, 2026 21:36
Comment thread src/backend/dotnet.rs Outdated
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 ffba39c. Configure here.

Comment thread src/backend/dotnet.rs
@jdx jdx force-pushed the codex/fix-dotnet-prerelease-ls-remote branch from ffba39c to 2521a1d Compare May 2, 2026 22:19
@mise-en-dev mise-en-dev force-pushed the release branch 2 times, most recently from 27274af to 0835ed1 Compare May 2, 2026 22:29
@jdx jdx force-pushed the codex/fix-dotnet-prerelease-ls-remote branch from 2521a1d to 4439721 Compare May 3, 2026 00:23
@jdx jdx changed the base branch from release to main May 3, 2026 00:32
@jdx jdx force-pushed the codex/fix-dotnet-prerelease-ls-remote branch from 4439721 to e472410 Compare May 3, 2026 00:32
@jdx jdx enabled auto-merge (squash) May 3, 2026 00:39
@jdx jdx merged commit cf81e64 into main May 3, 2026
37 checks passed
@jdx jdx deleted the codex/fix-dotnet-prerelease-ls-remote branch May 3, 2026 00:46
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 3, 2026

Hyperfine Performance

mise x -- echo

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 x -- echo 24.8 ± 0.5 23.5 26.9 1.00
mise x -- echo 25.2 ± 0.7 23.9 30.5 1.01 ± 0.03

mise env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 env 23.9 ± 0.8 22.8 35.9 1.00
mise env 24.3 ± 0.4 23.3 26.6 1.02 ± 0.04

mise hook-env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 hook-env 24.7 ± 0.4 23.7 26.4 1.00 ± 0.02
mise hook-env 24.6 ± 0.5 23.4 26.0 1.00

mise ls

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 ls 21.3 ± 0.8 20.1 32.3 1.00
mise ls 22.1 ± 0.5 20.7 24.8 1.04 ± 0.04

xtasks/test/perf

Command mise-2026.4.28 mise Variance
install (cached) 157ms 161ms -2%
ls (cached) 80ms 82ms -2%
bin-paths (cached) 86ms 87ms -1%
task-ls (cached) 842ms 826ms +1%

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