fix(backend): apply inline tool option overrides#9306
Conversation
Greptile SummaryThis PR centralizes backend option resolution into a shared
Confidence Score: 5/5The changes are safe to merge. The new four-layer overlay is applied consistently across all backend list/install paths, the cache bypass correctly prevents inline opts from being dropped, and the URL-in-bracket parsing fix is logically sound. The PR centralises a previously fragmented option-resolution pattern into a single well-tested path. The logic of applying registry → alias → config → inline is correct, the cache bypass is narrowly scoped to BackendArgs with explicit opts, and the is_empty / bracket-parsing bug fixes are clearly correct. No wrong-data paths or dropped-state issues were identified. No files require special attention. The test isolation concern in src/config/mod.rs around the env-var test is minor and would only matter if assertions inside that test begin to panic rather than return errors. Reviews (18): Last reviewed commit: "Merge branch 'main' into codex/backend-i..." | Re-trigger Greptile |
There was a problem hiding this comment.
Code Review
This pull request centralizes tool option retrieval and override logic by introducing the get_tool_opts_with_overrides method and updating various backends to utilize it. It also refactors backend argument parsing to handle inline options more robustly and adds merging capabilities to ToolVersionOptions. The review feedback identifies duplicated logic in src/toolset/builder.rs and a bug where configuration options are not applied when the default_to_latest flag is active.
|
Waiting for: #9315 |
|
Might be related to #8902. Will check |
2b9fd08 to
bffd094
Compare
bffd094 to
e3cdcca
Compare
This comment was marked as outdated.
This comment was marked as outdated.
|
CI status update for head All checks have completed. The build, lint, benchmark, unit jobs, Windows e2e, registry checks, Greptile Review, and the passing Linux e2e shards are green. The release packaging jobs shown as skipped are expected for this PR run. The remaining failures are
Greptile Review passed on This comment was generated by an AI coding assistant. |
This ignores settings, we still need to handle them later. ## What - Keep the option-source-based versions-host behavior split out from #9306. - Skip `mise-versions` when a backend declares that a locally overridden tool option affects its remote version listing. Registry defaults still use the hosted list. - Keep locally safe options on the existing path: `minimum_release_age` / `install_before` still use the existing before-date helper, and options that only affect install/download selection are not treated as version-listing inputs. ## Why These Tool Options Affect Remote Version Listing These options change the upstream queried for versions, the way version candidates are extracted, or the release class included in the list: - `github`: `api_url` changes the GitHub-compatible API host queried for releases/tags; `version_prefix` changes which tags are considered versions. - `ubi`: `provider` changes the release provider implementation, `api_url` changes the API host, and `tag_regex` changes which tags are extracted as versions. - `spm`: `provider` changes the git hosting provider used for tags, and `api_url` changes the provider API host. - `http`: `version_list_url` changes the source document for versions, `version_regex` changes extraction from that document, `version_json_path` changes the JSON field read for versions, and `version_expr` changes the expression used to derive versions. - `s3`: `version_list_url` changes the manifest/listing source, `version_regex` changes extraction, `version_json_path` and `version_expr` change manifest parsing, `version_prefix` changes S3 object-list filtering, `url` can change the S3 bucket/key used for listing-based discovery, and `region` / `endpoint` change which S3-compatible service is queried. - `vfox`: backend plugins can define arbitrary option semantics and pass them into plugin version-listing logic, so custom vfox backend plugins use the all-options sentinel. Regular vfox plugins keep the default hosted-list behavior. - `java`: `release_type` switches between GA and EA metadata caches, so it changes which Java releases appear. - `conda`: `channel` changes the Anaconda channel queried for package versions. `dotnet` is intentionally deferred: `prerelease` currently changes the NuGet query, but there are no dotnet backend tools in the registry using the versions host. The code now carries a TODO to revisit this when dotnet can list the prerelease superset and filter at read time like github/aqua. ## Validation - `cargo fmt --check` - `git diff --check` - `cargo test backend::tests::test_remote_version_listing_opts` - `mise run test:e2e e2e/backend/test_github_alias_versions e2e/backend/test_github_ls_remote_inline_opts` *This PR was updated by an AI coding assistant.*
What
[...]options from[tool_alias]/[alias]backend entries.tool[...].minimum_release_agehandling, runtime args, and install request initialization.ls-remote 'github:owner/repo[api_url=...]'do not accidentally use a cached installed backend without those inline options.tool[api_url=https://example/api/v3].Follow-up
The versions-host behavior for locally overridden backend options has been split into #9568. That PR is stacked on this one and should be rebased after this merges.
Relationship to #9315
This PR does not change which config entry is eligible for a tool. That behavior comes from #9315:
[tools.<alias>]config is more specific than[tools."<resolved-backend>"]config.This PR builds on that lookup and changes what happens after config has been selected: registry defaults, backend alias options, config options, and inline options are merged through one resolver, with provenance retained for callers that need to distinguish where an option came from.
Relationship to #8902
#8902 was a narrower
ls-remotefix for inline backend options. This PR covers the same installed-tool cache failure mode generically: when a caller supplies inline backend options, mise builds a backend from that callerBackendArginstead of returning a short-name cache entry that was loaded from install state without the inline options.Example
Given config selected through an alias fallback:
Inline options should still win for this invocation:
mise install 'hw[asset_pattern=hello-world-1.0.0.tar.gz,bin_path=hello-world-1.0.0/bin]@1.0.0'Before this PR, the resolved full-backend config could replace the inline
asset_pattern, and alias[...]options were only visible as part of a resolved string. After this PR, alias options are their own layer and inline options are applied over the selected config options.Why
Backend-level code had several config-or-inline branches. Depending on the path:
[...]options were not represented as a distinct layer.This PR centralizes that overlay so config-aware paths use the same precedence, while preserving source information separately from the effective option values.
Validation
cargo fmt --allgit diff --checkcargo test --all-features tool_optscargo test --all-features opts_with_configcargo test --all-features test_git_provider_from_bamise run test:e2e e2e/backend/test_github_ls_remote_inline_optsThis PR was updated by an AI coding assistant.