Repository navigation
feat(install): download pinned versions from mise.jdx.dev with GitHub fallback - #14446
Conversation
… fallback install.sh now fetches every release archive and its SHASUMS256.txt from mise.jdx.dev first and falls back to GitHub Releases when that fails, e.g. because an older release is no longer hosted there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Entire-Checkpoint: 01M4XK7E2W90H2NGGTKWMK00KZ
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Merge Risk: ⚪ Minimal · up to
|
[High impact] The PR appears safe to merge; no new actionable issues remain. SummaryThe installer tries mise.jdx.dev for release archives and falls back to GitHub Releases when the download fails.
Reviews (4) · Last reviewed commit: "fix(install): always verify pinned versi..." · Reviewed by Greptile |
…sset Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Entire-Checkpoint: 01M4XKJ5X2QF3YHKXM62GF6GNN
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit d916142. Configure here.
…ed archive The installer now selects the exact SHA-256 line for the downloaded file and errors out before extracting anything when no host provides one, instead of relying on how shasum/sha256sum -c treat empty input. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Entire-Checkpoint: 01M4XM5CK21YYXCEQKRR8ZYJ46
Archives still download from mise.jdx.dev first with a GitHub fallback, but SHASUMS256.txt for versions other than the built-in one now always comes from GitHub Releases, with no fallback to mise.jdx.dev. A compromise of the mise.jdx.dev bucket alone can no longer serve a matching archive and checksum. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Entire-Checkpoint: 01M4XNYA3SCVV6S333B6GB3N4T
Instruction countsNothing was compared, and so nothing was gated. No series appears on both sides: either the base has no measurements recorded, or the two were measured on different runner classes, which are deliberately not comparable — counts shift between machine types by more than a real regression does. New, nothing to compare against: Only instruction counts gate. Wall clock is shown for context — on identical hardware it moves 4-20% run to run. Measured by tak — instruction-counted CLI benchmarks, stored in this repository's git notes.
|
<!-- entire-trail-link-start --> https://entire.io/gh/jdx/mise/trails/726 <!-- entire-trail-link-end --> ### 🚀 Features - **(bootstrap)** add --upgrade to upgrade packages and tools by @jdx in [#14433](#14433) - **(env)** add --paths to list the PATH entries mise manages by @jdx in [#14429](#14429) - **(install)** download pinned versions from mise.jdx.dev with GitHub fallback by @jdx in [#14446](#14446) ### 🐛 Bug Fixes - **(aqua)** read GitHub-hosted aqua registries from raw.githubusercontent.com by @jdx in [#14470](#14470) - **(backend)** build packslip after versions_host_applies was removed by @jdx in [8bdf9ae](8bdf9ae) - **(backend)** resolve packslip prefixes like `latest` by @jdx in [#14467](#14467) - **(bootstrap)** render incoming direction for ufw interface rules by @jdx in [#14480](#14480) - **(dotfiles)** show planned file actions before the apply prompt by @jdx in [#14430](#14430) - **(dotfiles)** speed up flaky objects_at test by @jdx in [#14439](#14439) - **(dotfiles)** capture changed files of copy-mode groups with dot add --changed by @jdx in [#14436](#14436) - **(exec)** ask mise-versions for GitHub releases when auto-installing from exec and shims by @jdx in [#14458](#14458) - **(github)** stop falling back to api.github.com when mise-versions misses by @jdx in [#14460](#14460) - **(github)** read the checksum-mismatch hint's digest from mise-versions by @jdx in [#14481](#14481) - **(github)** list git tags from mise-versions instead of api.github.com by @jdx in [#14461](#14461) - **(github)** verify attestations from mise-versions without api.github.com fallbacks by @jdx in [#14469](#14469) - **(lock)** ignore the host's implicit compile default for other lock platforms by @jdx in [#14432](#14432) - **(lock)** download artifacts for provenance checks from github.com, not the API by @jdx in [#14465](#14465) - **(oci)** require root for apt bootstrap packages and show dpkg output on failure by @jdx in [#14447](#14447) - **(pipx)** preserve uv graph locking during global upgrades by @wislertt in [#14426](#14426) - **(ruby)** look up the latest ruby-build release through mise-versions by @jdx in [#14471](#14471) - **(self-update)** read mise releases from mise-versions and download from github.com by @jdx in [#14464](#14464) - **(shim)** allow a few repeated fallback handoffs in one process by @jdx in [#14475](#14475) - **(upgrade)** leave lazy tools that are not installed to their first run by @ryanrhughes in [#14422](#14422) - **(upgrade)** skip version lookups for lazy tools a bare upgrade leaves alone by @jdx in [#14444](#14444) - avoid false "stack limit reached" on musl builds by @jdx in [#14450](#14450) ### 📚 Documentation - recommend committing mise.lock so CI and Docker skip version lookups by @jdx in [#14453](#14453) ### ⚡ Performance - **(backend)** take release tags from the versions host instead of listing or guessing them by @jdx in [#14442](#14442) - **(backend)** read the registry tool's version list for an explicit backend arg by @jdx in [#14459](#14459) - **(backend)** stop re-downloading what packslip resolution already verified by @jdx in [#14466](#14466) - **(github)** reuse mirrored attestations and skip mise-versions for asset-less latest releases by @jdx in [#14443](#14443) - **(github)** list releases and tags from mise-versions' whole lists by @jdx in [#14477](#14477) - **(install)** skip refetching version lists a cached copy already answers by @jdx in [#14457](#14457) - **(install)** reuse cached version lists for the tool's release-age window by @jdx in [#14484](#14484) - **(install)** keep the versions index and pipx's latest release for the release-age window by @jdx in [#14485](#14485) - **(outdated)** resolve `latest` without refetching the version list by @jdx in [#14456](#14456) - **(outdated)** resolve many registry tools with one request to the mise-versions index by @jdx in [#14473](#14473) - **(python)** list python versions from mise-versions instead of cloning pyenv by @jdx in [#14455](#14455) - **(versions-host)** send install tracking and python lists to static assets by @jdx in [#14441](#14441) ### 📦️ Dependency Updates - bump jactionlint to 2.2.0 and mbx to 1.24.0 by @jdx in [#14448](#14448) ### 📦 Registry - install native-sdk from npm so the native command works by @jdx in [#14431](#14431) - add gdal (conda:libgdal-core) by @ivan-ivkovic in [#14440](#14440) ### Ci - prune unused release folders from the mise.jdx.dev CDN bucket by @jdx in [#14445](#14445) - check R2 credentials on every prune run by @jdx in [#14451](#14451) - stop aube-lock from re-committing on Cargo-only Renovate PRs by @jdx in [#14482](#14482) ### Security - **(deps)** update rustls to 0.23.46 by @jdx in [#14434](#14434) - **(task)** require trust before rendering a remote task file by @JamBalaya56562 in [#14416](#14416) ### New Contributors - @ivan-ivkovic made their first contribution in [#14440](#14440) ## 📦 Aqua Registry Updates ### New Packages (2) - [`btwld/fvm`](https://github.com/btwld/fvm) - [`tailscale/tailcat`](https://github.com/tailscale/tailcat) ### Updated Packages (1) - [`k1LoW/tbls`](https://github.com/k1LoW/tbls)

https://entire.io/gh/jdx/mise/trails/733
The install script (
curl https://mise.run | sh, https://mise.jdx.dev/install.sh) used mise.jdx.dev only when installing the release built into the script. Any pinnedMISE_VERSIONcame from GitHub Releases, which responds more slowly and adds a redirect before the download starts.Now the release archive for every version comes from mise.jdx.dev first, and the script falls back to GitHub Releases when that download fails. Pinned versions are still always checked against checksums from GitHub Releases:
The fallback is needed because older release folders are being pruned from mise.jdx.dev (#14445).
Behavior
https://mise.jdx.dev/v<version>/<asset>. Any failure, including a 404 or a network error, retries the same asset from GitHub Releases.SHASUMS256.txtfrom GitHub Releases, wherever the archive came from, as it was before this PR. Because the checksum comes from a separate host, someone who compromised mise.jdx.dev could not serve a tampered archive together with a matching checksum.SHASUMS256.txtcannot be fetched or has no such line, the script exits withno checksum found for <file>, refusing to install it unverifiedbefore extracting anything. There is no fallback to mise.jdx.dev's checksums. A failed check exits withchecksum mismatch.MISE_INSTALL_FROM_GITHUB=1: still downloads only from GitHub.MISE_TARBALL_URL: unchanged. It applies only to the built-in version, uses the embedded checksums, and has no fallback.installing-mise.mdnow says where the script downloads archives from and where it gets checksums.Effect on download stats
Pinned installs will download their archives from mise.jdx.dev, so the per-platform GitHub release-asset counts behind mise-versions.jdx.dev/stats will drop unless jdx/mise-versions starts counting mise.jdx.dev (R2) downloads. Only
SHASUMS256.txtwill still come from GitHub. That mise-versions change is a separate PR that is still in progress. I recommend merging this after that one lands.Validation
scripts/test-install-release-age.py(run byscripts/test-standalone.shin CI) gains offline tests. They runinstall_miseagainst a stubbedcurlthat serves real tarballs, and they cover:SHASUMS256.txtSHASUMS256.txtis never requestedSHASUMS256.txtunreachable or missing the asset: the install fails without falling back to mise.jdx.devMISE_INSTALL_FROM_GITHUBMISE_TARBALL_URLAll tests pass under bash's
shand dash. The download tests also pass under BusyBox ash with BusyBoxawk,sha256sumandtar(python:3.12-alpine).I rendered the script with
scripts/render-install.sh, passed it through shellcheck, and ran it against the real hosts on macOS arm64:v2026.1.0came from mise.jdx.dev and was verified against GitHub's checksums.v2025.1.0(tar.gz, missing from mise.jdx.dev) andv2024.12.0(no folder on mise.jdx.dev) fell back to GitHub.MISE_INSTALL_FROM_GITHUB=1used only GitHub.All of these installs worked.
The
wgetfallback path is not exercised by these tests.AI-assisted — Tool: Claude Code; model: anthropic/claude-opus-5-5; version: unavailable.
🤖 Generated with Claude Code
Summary by CodeRabbit
MISE_INSTALL_FROM_GITHUB=1to use GitHub Releases only.