fix(install): skip remote-versions refresh in prefer-offline mode#9627
fix(install): skip remote-versions refresh in prefer-offline mode#9627
Conversation
In prefer_offline mode (shims, hook-env, activate, etc.) the versions host is disabled. Refreshing the cache there bypasses the on-disk list populated by an earlier non-prefer-offline command and falls through to a backend listing that often has far fewer versions (e.g. GitHub releases only returns the ~30 most recent), turning a previously- resolvable prefix query into "no versions found for <tool>". Reported on commit aafe53f — terraform = "prefix:1.12" auto-install via shim broke after pre-warming with `mise install terraform`. Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Greptile SummaryAdds a
Confidence Score: 5/5Safe to merge — the change is a one-line guard swap with a confirmed subsumption relationship between the old and new predicate, backed by a new regression test. The fix is minimal: a single predicate replacement in one function. prefer_offline() calls offline() internally, so every previously-guarded code path is still guarded. The new e2e test directly exercises the regression scenario. No other callers or paths are affected. No files require special attention. Reviews (2): Last reviewed commit: "test(install): cover prefer-offline cach..." | Re-trigger Greptile |
There was a problem hiding this comment.
Code Review
This pull request updates the should_refresh_remote_versions function in src/toolset/toolset_install.rs to check for prefer_offline() instead of offline(). This change, accompanied by new documentation, ensures that the on-disk cache is utilized when the versions host is disabled, preventing issues where limited backend listings fail to resolve version prefixes. I have no feedback to provide as there were no review comments.
Hyperfine Performance
|
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2026.5.0 x -- echo |
30.9 ± 11.9 | 20.8 | 77.3 | 1.00 |
mise x -- echo |
34.8 ± 14.0 | 20.6 | 86.0 | 1.12 ± 0.62 |
x -- echo is 12% |
mise env
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2026.5.0 env |
39.8 ± 15.7 | 20.9 | 87.2 | 1.00 |
mise env |
47.2 ± 15.2 | 20.5 | 95.9 | 1.19 ± 0.60 |
env is 19% |
mise hook-env
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2026.5.0 hook-env |
49.7 ± 16.0 | 21.4 | 84.6 | 1.19 ± 0.63 |
mise hook-env |
41.8 ± 17.7 | 20.4 | 93.8 | 1.00 |
✅ Performance improvement for hook-env is 19% |
mise ls
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2026.5.0 ls |
42.8 ± 17.0 | 19.9 | 85.4 | 1.00 |
mise ls |
44.0 ± 12.7 | 17.8 | 76.7 | 1.03 ± 0.51 |
xtasks/test/perf
| Command | mise-2026.5.0 | mise | Variance |
|---|---|---|---|
| install (cached) | 180ms | -12% | |
| ls (cached) | 109ms | ✅ 95ms | +14% |
| bin-paths (cached) | 131ms | ✅ 104ms | +25% |
| task-ls (cached) | 626ms | 620ms | +0% |
✅ Performance improvement: ls cached is 14%
✅ Performance improvement: bin-paths cached is 25%
Pre-warms the dummy plugin's remote_versions cache, then makes list-all fail and runs `mise install` for a `prefix:` request with no installed match under MISE_PREFER_OFFLINE=1. The buggy code path re-runs list-all via refresh_async and aborts; the fix reuses the on-disk cache. Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Summary
should_refresh_remote_versions(added in fix(install): refresh latest before installing missing tools #9545) now bails onprefer_offline()instead of justoffline().prefix:request fails after pre-warming withmise install <tool>.Why
In
prefer_offlinemode (set by shims, hook-env, activate, etc.) the versions host is disabled (versions_host.rs:71). The post-#9545 install path was forcing a cache refresh whenever no installed version matched a prefix request, which:mise install terraform).Nonebecause ofprefer_offline.terraform = \"prefix:1.10\") failed withno versions found for terraform.prefer_offline()already returns true wheneveroffline()is true, so the guard's existing offline behavior is preserved; this just additionally suppresses the cache-busting refresh on the fast paths where it would always make things worse. The original #9545 motivation (mise use <tool>getting a stale cachedlatest) is unaffected —mise usedoesn't run withPREFER_OFFLINEset.Reported on commit aafe53f: aafe53f#commitcomment-184356367
Test plan
mise install terraform(latest), then in a project withterraform = \"prefix:1.10\"invoke a terraform shim — the older prefix should resolve from cache and auto-install rather than erroring.mise use terraform@latestin a fresh shell still refreshes upstream when the cachedlatestis stale (no regression on fix(install): refresh latest before installing missing tools #9545's fix).🤖 Generated with Claude Code
Note
Medium Risk
Changes install-time version resolution behavior for prefix/latest selectors under
prefer_offline, which could affect when remote caches are refreshed and which versions get selected. Scope is small and covered by a new e2e regression test, but it touches core install resolution logic.Overview
Prevents install-time resolution from forcing a remote-versions cache refresh when running in
prefer_offlinemode, so prefix-based requests can resolve from the existing on-disk cache instead of falling back to limited backend listings.Adds an e2e regression test (
test_install_prefer_offline_no_refresh) that pre-warms the remote versions cache, pins aprefix:tool version, forcesMISE_PREFER_OFFLINE=1, and asserts the install succeeds without re-runninglist-all.Reviewed by Cursor Bugbot for commit 741cf17. Bugbot is set up for automated code reviews on this repo. Configure here.