Skip to content

fix(backend): reuse cached conda downloads in locked installs - #14866

Merged
jdx merged 2 commits into
jdx:mainfrom
zeitlinger:fix/conda-pinned-download-cache
Oct 23, 2026
Merged

jdx merged 2 commits into
jdx:mainfrom
zeitlinger:fix/conda-pinned-download-cache

Conversation

@zeitlinger

@zeitlinger zeitlinger commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Locked Conda installs bypass the checksum-pinned download cache even when the package SHA256 is already known. I pass that checksum to the shared downloader so locked installs can reuse cached archives while retaining Conda's checksum verification.

The regression clears the Conda archive store and makes the mirror unavailable; it fails with the old call and passes with this change. Workspace Clippy, formatting, ShellCheck, and the focused e2e pass.

AI-assisted — Tool: Codex; model: openai/gpt-6-luna; version: unavailable.

Summary by CodeRabbit

  • Bug Fixes
    • Improved Conda package download handling with checksum verification and support for configured download caching and mirrors.
    • Locked installations can continue using an already-installed package when the mirror is unavailable.
  • Tests
    • Expanded coverage for cached downloads, mirror usage, and running installed commands during mirror outages.

Signed-off-by: Gregor Zeitlinger <gregor.zeitlinger@grafana.com>
@coderabbitai

coderabbitai Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Source mode: Auto
  • Repository: jdx/mise
  • Branch: main
  • File: .coderabbit.yaml
  • Commit: b04161a
  • Layers: Repository YAML (base), Central YAML (inherited), Organization UI (inherited)
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 5e91235b-34a3-4304-93c3-e53eccee3ffd
📥 Commits

Reviewing files that changed from the base of the PR and between b04161a and 7cccfdb.

📒 Files selected for processing: 2
  • e2e/backend/test_conda_url_replacements
  • src/backend/conda.rs

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.

📝 Walkthrough

The Conda backend now downloads package archives with a pinned HTTP call. The URL replacement end-to-end test enables download caching and checks mirror downloads and an install when the mirror is unavailable.

Changes: Conda download caching

Layer / File(s) Summary
Pinned Conda download
src/backend/conda.rs
download_to now calls HTTP.download_file_pinned with the expected checksum and no additional pin. Existing checksum verification and error handling remain unchanged.
Download cache checks
e2e/backend/test_conda_url_replacements
The test enables download caching, checks a locked install with caching disabled and a mirror request, then clears the Conda package store and checks that the installed command runs with the mirror unavailable.

Priority: ➖ Normal

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix

Suggested reviewers: marukome0743

Merge Risk: ⚪ Minimal · up to 20df9

Merge Risk: ⚪ Minimal · up to 20df9

The cache reuse change is contract-compatible and the supplied test covers the unavailable-mirror scenario. No merge-blocking risk is established.

Pre-merge checks: Passed 5
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title clearly and concisely describes the main change: reusing cached Conda downloads during locked installs.
Docstring Coverage Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 1 files. (1 skipped: 1 …
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 1 files. (1 skipped: 1 unsupported.)

✨ Finishing Touches: 💡 1
🛠️ Fix failing CI checks: 💡
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] The PR appears safe to merge; no actionable issues were found.

Summary

Conda downloads now pass the known checksum to the shared downloader so locked installs can reuse cached archives.

  • Locked Conda installs can reuse checksum-pinned cached archives.

Reviews (2) · Last reviewed commit: "chore: retry CI for conda cache fix" · Reviewed by Greptile

@zeitlinger
zeitlinger marked this pull request as ready for review October 22, 2026 20:17
Signed-off-by: Gregor Zeitlinger <gregor.zeitlinger@grafana.com>
@jdx
jdx enabled auto-merge (squash) October 23, 2026 00:43
@jdx
jdx merged commit 94ba604 into jdx:main Oct 23, 2026
71 of 75 checks passed
@zeitlinger
zeitlinger deleted the fix/conda-pinned-download-cache branch October 23, 2026 06:41
mise-en-dev added a commit that referenced this pull request Oct 23, 2026
<!-- entire-trail-link-start -->
https://entire.com/gh/jdx/mise/trails/949
<!-- entire-trail-link-end -->

### 🚀 Features

- **(bootstrap)** add run_windows to bootstrap hook tables by @jdx in
[#14851](#14851)
- **(doctor)** let a project check depend on another check by @jdx in
[#14773](#14773)
- **(dotfiles)** erase a tracked path from history with `mise dot
history purge` by @jdx in
[#14831](#14831)
- **(dotfiles)** render templates in a variant's target by @jdx in
[#14856](#14856)
- **(lsp)** add mise lsp, a language server for mise.toml by @jdx in
[#14744](#14744)
- **(lsp)** complete, define, and rename tasks by @jdx in
[#14808](#14808)
- **(lsp)** flag unknown task references and rewrite deprecated keys by
@jdx in [#14811](#14811)
- **(lsp)** complete and describe tools by @jdx in
[#14812](#14812)
- **(upgrade)** write resolved versions on bare --bump when pin is set
by @jdx in [#14791](#14791)

### 🐛 Bug Fixes

- **(aqua)** make the baked registry encoding deterministic by @jdx in
[#14809](#14809)
- **(backend)** reuse cached conda downloads in locked installs by
@zeitlinger in [#14866](#14866)
- **(bootstrap)** match only an exact bootstrap task by @jdx in
[#14858](#14858)
- **(brew)** tolerate custom Requirement classes in tap formulae by @jdx
in [#14807](#14807)
- **(config)** keep tracked .tool-versions recognized under a filename
override by @jdx in [#14779](#14779)
- **(dotfiles)** keep entries declared in an unselected env config
tracked by @jdx in [#14815](#14815)
- **(dotfiles)** report a saved enrollment under a symlinked parent
instead of failing capture by @jdx in
[#14871](#14871)
- **(e2e)** reap background watch process and retry isolated dir cleanup
by @jdx in [#14824](#14824)
- **(generate)** end install-script and task-stubs files with a newline
by @itochan in [#14819](#14819)
- **(github)** skip .netrc credentials on the asset reachability HEAD by
@jdx in [#14786](#14786)
- **(github)** page when mise-versions lists no releases for a repo by
@jdx in [#14877](#14877)
- **(gitlab)** ignore expired glab OAuth2 tokens instead of sending them
by @jdx in [#14873](#14873)
- **(http)** fall back to bundled root certificates when the system
store is empty by @jdx in
[#14817](#14817)
- **(http)** extract zip archives that contain read-only files on
Windows by @jdx in [#14869](#14869)
- **(install)** ignore curlrc write-out when downloading in install.sh
by @jdx in [#14830](#14830)
- **(install)** run [hooks].postinstall against the just-installed
version by @jdx in [#14853](#14853)
- **(java)** pick the newest build when installed versions differ only
after `+` by @jdx in [#14876](#14876)
- **(lock)** prefer the nearest lockfile when an unowned request is
ambiguous by @jdx in [#14818](#14818)
- **(lock)** accept PEP 691 +html content types from PyPI simple indexes
by @jdx in [#14852](#14852)
- **(lock)** keep a .config root's monorepo lockfile next to its config
by @jdx in [#14860](#14860)
- **(lockfile)** keep the Python a pipx tool selects by @jdx in
[#14794](#14794)
- **(oci)** package the rust toolchain in mise oci build by @jdx in
[#14854](#14854)
- **(packslip)** stay quiet about an installed version past the
release-age cutoff by @jdx in
[#14835](#14835)
- **(pipx)** find uv's Windows launcher for console scripts ending in
.py by @jdx in [#14825](#14825)
- **(prune)** resolve symlinked Python path in pypi receipts by @jdx in
[#14857](#14857)
- **(prune)** keep a selected Python reached through a minor-version
link by @jdx in [#14874](#14874)
- **(ruby)** don't fail gem installs when mise is not on PATH by @jdx in
[#14850](#14850)
- **(schema)** declare dotfile_groups entry keys and lint the schema
with Tombi by @jdx in [#14810](#14810)
- **(task)** let an empty run_windows skip the task on Windows by @jdx
in [#14859](#14859)
- **(task)** accept mise tasks list as an alias for ls by @jdx in
[#14878](#14878)
- **(unuse)** prune only the named version and say why one is kept by
@jdx in [#14863](#14863)

### 📚 Documentation

- **(dotfiles)** explain repo-only files, existing repos, and undoing an
accidental track by @jdx in
[#14829](#14829)
- **(dotfiles)** explain what add --no-apply, dot diff, and exclude do
by @jdx in [#14862](#14862)

### ⚡ Performance

- **(config)** check trusted_config_paths after cheaper trust rules by
@jdx in [#14875](#14875)

### 📦️ Dependency Updates

- update communique, hk, mr-boxington in mise.lock by @jdx in
[#14789](#14789)
- update jdx/workflows action to v1.1.2 by @renovate[bot] in
[#14792](#14792)
- update mise tools to latest by @renovate[bot] in
[#14793](#14793)
- update aube to v2.8.1 by @renovate[bot] in
[#14605](#14605)
- update rust crate sigstore-verify to 0.15 by @renovate[bot] in
[#14783](#14783)
- lock file maintenance by @renovate[bot] in
[#14777](#14777)
- update github actions by @renovate[bot] in
[#14796](#14796)
- lock file maintenance by @renovate[bot] in
[#14797](#14797)
- update rust crate serde-saphyr to v2 by @renovate[bot] in
[#14774](#14774)
- update node.js to v24.22.0 by @renovate[bot] in
[#14798](#14798)
- update rust crates by @renovate[bot] in
[#14755](#14755)
- update rust crate tokio to v1.54.1 by @jdx in
[#14849](#14849)
- update jdx crates to v7.1.1 by @renovate[bot] in
[#14861](#14861)

### 📦 Registry

- add goose-agent
([aqua:aaif-goose/goose](https://github.com/aaif-goose/goose)) by
@kwsantiago in [#14822](#14822)

### Ci

- retry windows-lint once and print diagnostics when it fails by @jdx in
[#14820](#14820)
- retry the docker image build in the bootstrap linux host test by @jdx
in [#14821](#14821)
- use jdx/workflows retry and gpg-import actions by @jdx in
[#14828](#14828)

### New Contributors

- @kwsantiago made their first contribution in
[#14822](#14822)
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