Conversation
There was a problem hiding this comment.
Code Review
This pull request introduces support for custom link names and hard links within the aqua registry backend. The AquaFile structure has been updated with link and hard fields, and the AquaBackend was refactored to use a new AquaFileLink struct for managing file operations. Additionally, a utility for calculating relative paths was added to support relative symlinks. Review feedback suggests improving robustness by using recursive removal for existing destinations and identifies a logic conflict where a check for a destination's existence prevents the link creation logic from handling pre-existing files.
Greptile SummaryThis PR adds support for
Confidence Score: 5/5Safe to merge — the changes are well-scoped, well-tested, and all identified edge cases are handled correctly. The logic for hard links, relative symlinks, and the fallback-to-name path are all correct. No files require special attention. Reviews (5): Last reviewed commit: "Merge branch 'main' into fix/aqua-files-..." | Re-trigger Greptile |
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as resolved.
This comment was marked as resolved.
|
Follow-up CI triage: the xonsh/sync This comment was generated by an AI coding assistant. |
fe47bac to
eab26b6
Compare
|
CI completed for head Unrelated failure observed:
All other checks passed or were intentionally skipped, including build, lint, Linux e2e shards, registry, benchmark, autofix, release, Socket, and Greptile. Greptile added no new review comments on this head, and the existing AI review threads are resolved. This comment was generated by an AI coding assistant. |
### 🚀 Features - **(aqua)** support registry libc variants by @jdx in [#9652](#9652) - **(bin-paths)** add executable names output by @risu729 in [#9617](#9617) ### 🐛 Bug Fixes - **(aqua)** preserve configured file extensions by @risu729 in [#9611](#9611) - **(aqua)** support registry file links by @risu729 in [#9610](#9610) - **(backend)** reject bare package backend names by @risu729 in [#9608](#9608) - **(backend)** apply inline tool option overrides by @risu729 in [#9306](#9306) - **(backend)** skip versions host for local tool opts by @risu729 in [#9568](#9568) - **(github)** chmod explicit archive bin by @risu729 in [#9609](#9609) - **(install)** skip remote-versions refresh in prefer-offline mode by @jdx in [#9627](#9627) - **(lock)** scope targets to active project root by @risu729 in [#9319](#9319) - **(lockfile)** respect existing platforms during auto-lock by @jdx in [#9621](#9621) - **(pipx)** filter yanked pypi releases by @risu729 in [#9607](#9607) - **(pipx)** declare python as a backend dependency by @jdx in [#9678](#9678) - **(schema)** update refs to $defs in mise-registry-tool.json by @risu729 in [#9671](#9671) - **(task)** terminate parallel siblings on failure via process groups by @jdx in [#9655](#9655) - **(task)** stable MISE_PROJECT_ROOT for monorepo tasks, add MISE_MONOREPO_ROOT by @jdx in [#9657](#9657) - **(trust)** run enter hooks after trusting config by @risu729 in [#9634](#9634) - **(ui)** stop clearing screen for prompts by @jdx in [#9619](#9619) - use /bin/cp on macos by @pdehlke in [#9656](#9656) ### 🚜 Refactor - **(aqua)** store aqua var defaults as strings by @risu729 in [#9645](#9645) - **(config)** support structured TOML values in registry backend options by @risu729 in [#9584](#9584) - **(deps)** remove serde_derive dependency by @risu729 in [#9670](#9670) - **(deps)** remove anyhow dependency by @risu729 in [#9661](#9661) - **(deps)** use std::sync::LazyLock instead of once_cell::Lazy by @risu729 in [#9668](#9668) - **(schema)** generate task schema from mise schema by @risu729 in [#9581](#9581) - **(schema)** reuse task props with unevaluatedProperties by @risu729 in [#9582](#9582) - **(schema)** reuse registry common types by @risu729 in [#9648](#9648) - **(schema)** reuse plugin script config by @risu729 in [#9647](#9647) - **(schema)** use $defs in schema files by @risu729 in [#9646](#9646) ### 📚 Documentation - **(node)** add tips for enabling node idiomatic by @fu050409 in [#9675](#9675) ### 🧪 Testing - **(cli)** remove nondeterministic tool depends assertion by @risu729 in [#9633](#9633) - **(e2e)** pin uv to 0.11.8 around astral-sh/uv#19278 by @jdx in [#9618](#9618) - **(e2e)** wait for docker env cleanup by @risu729 in [#9631](#9631) - **(zig)** use official zig instead of mach mirror by @jdx in [#9659](#9659) ### 📦️ Dependency Updates - fall through to hash check when providers have no outputs by @jdx in [#9622](#9622) - bump Cargo.lock by @jdx in [#9625](#9625) ### 📦 Registry - remove registry depends by @risu729 in [#9571](#9571) - add code-review-graph (pipx:code-review-graph) by @chautruonglong in [#9673](#9673) ### Chore - **(ci)** split large registry test-tool changes by @risu729 in [#9628](#9628) - **(ci)** make perf script robust to runner noise by @jdx in [#9635](#9635) - **(ci)** skip hyperfine comments without permission by @risu729 in [#9629](#9629) ### New Contributors - @chautruonglong made their first contribution in [#9673](#9673) - @pdehlke made their first contribution in [#9656](#9656) ## 📦 Aqua Registry Updates ### New Packages (5) - [`anthropics/anthropic-cli`](https://github.com/anthropics/anthropic-cli) - [`crates.io/wasmi_cli`](https://github.com/wasmi-labs/wasmi) - [`openclaw/gogcli`](https://github.com/openclaw/gogcli) - `racket-lang.org/racket-minimal` - [`runs-on/cli`](https://github.com/runs-on/cli) ### Updated Packages (13) - [`UpCloudLtd/upcloud-cli`](https://github.com/UpCloudLtd/upcloud-cli) - [`aristocratos/btop`](https://github.com/aristocratos/btop) - [`dprint/dprint`](https://github.com/dprint/dprint) - [`j178/prek`](https://github.com/j178/prek) - [`jdx/hk`](https://github.com/jdx/hk) - [`jdx/mise`](https://github.com/jdx/mise) - [`jdx/usage`](https://github.com/jdx/usage) - [`jreleaser/jreleaser`](https://github.com/jreleaser/jreleaser) - [`jreleaser/jreleaser/standalone`](https://github.com/jreleaser/jreleaser) - [`pnpm/pnpm`](https://github.com/pnpm/pnpm) - [`suzuki-shunsuke/cmdx`](https://github.com/suzuki-shunsuke/cmdx) - [`suzuki-shunsuke/ghir`](https://github.com/suzuki-shunsuke/ghir) - [`twpayne/chezmoi`](https://github.com/twpayne/chezmoi)
Summary
files[].linkandfiles[].hardentries.hard: true, and hard links for explicit file aliases on Windows.filesentries, including linked aliases whensymlink_binsis enabled.Aqua feature background
Aqua added these fields for packages where the executable name used to launch the binary matters:
files[].linkwas added in feat: support changing $0 by symlink aquaproj/aqua#3134 to let a registry entry create an alias link next to the extracted binary. The motivating issue, Change$0when executing tools aquaproj/aqua#3130, usesgranted/assumegoas the example: one binary changes behavior based on$0/argv[0], so invoking it through a different filename selects a different mode.files[].hardwas added in feat: support creating hardlinks aquaproj/aqua#3780 for cases where a symlink is not enough and the installed executable should appear under the requested name as a hard link. The linked issue, pnpm not work with different binary name aquaproj/aqua#3775, coverspnpm, where newer pnpm versions observe the executable path/name and can fail when launched as the platform-specific release asset name instead ofpnpm.Relevant aqua docs and implementation:
Behavior changes
Before this PR, mise parsed
files[].nameandfiles[].src, but ignoredfiles[].linkandfiles[].hard. That meant packages relying on aqua file aliases could install the source binary but miss the alias that users actually execute, or execute a binary under the wrong filename for tools that inspect$0/argv[0].This PR changes native aqua installs as follows:
AquaFilenow modelslinkandhard.files[].linksupports the same aqua template context used forfiles[].src, includingAssetWithoutExtandFileName.linkis present, mise resolves the source path fromsrcwhen provided, or fromnamewhensrcis omitted, then creates the linked destination next to the source file.hard: trueis set.hard: true, mise creates a hard link and replaces an existing file/symlink destination. It refuses to replace a destination directory.complete_windows_extis applied to both the source and linked destination path during file resolution..mise-binscreation now uses the resolved destination paths, so linked aliases are exposed whensymlink_binsis enabled.Tests
cargo test -p aqua-registry test_aqua_file_link_templatecargo test -p mise test_srcscargo test -p mise test_relative_pathcargo test -p mise test_create_file_link_rejects_hard_link_directory_destinationmise run test:e2e e2e/backend/test_aqua_link_hardgit diff --check