diff --git a/mise.lock b/mise.lock index bd5b42e575..e4c946fdf2 100644 --- a/mise.lock +++ b/mise.lock @@ -2,193 +2,416 @@ version = "1.7.9" backend = "aqua:rhysd/actionlint" +[tools.actionlint.platforms.linux-arm64] +name = "actionlint_1.7.9_linux_arm64.tar.gz" +url = "https://github.com/rhysd/actionlint/releases/download/v1.7.9/actionlint_1.7.9_linux_arm64.tar.gz" + [tools.actionlint.platforms.linux-x64] -checksum = "sha256:233b280d05e100837f4af1433c7b40a5dcb306e3aa68fb4f17f8a7f45a7df7b4" -size = 2237057 +name = "actionlint_1.7.9_linux_amd64.tar.gz" url = "https://github.com/rhysd/actionlint/releases/download/v1.7.9/actionlint_1.7.9_linux_amd64.tar.gz" [tools.actionlint.platforms.macos-arm64] -checksum = "sha256:855e49e823fc68c6371fd6967e359cde11912d8d44fed343283c8e6e943bd789" -size = 2068001 +name = "actionlint_1.7.9_darwin_arm64.tar.gz" url = "https://github.com/rhysd/actionlint/releases/download/v1.7.9/actionlint_1.7.9_darwin_arm64.tar.gz" +[tools.actionlint.platforms.macos-x64] +name = "actionlint_1.7.9_darwin_amd64.tar.gz" +url = "https://github.com/rhysd/actionlint/releases/download/v1.7.9/actionlint_1.7.9_darwin_amd64.tar.gz" + +[tools.actionlint.platforms.windows-x64] +name = "actionlint_1.7.9_windows_amd64.zip" +url = "https://github.com/rhysd/actionlint/releases/download/v1.7.9/actionlint_1.7.9_windows_amd64.zip" + [[tools.age]] version = "1.2.1" backend = "aqua:FiloSottile/age" +[tools.age.platforms.linux-arm64] +name = "age-v1.2.1-linux-arm64.tar.gz" +url = "https://github.com/FiloSottile/age/releases/download/v1.2.1/age-v1.2.1-linux-arm64.tar.gz" + [tools.age.platforms.linux-x64] -checksum = "blake3:8441277927f75428a6d22897a5cc05e8cdc03562d7a203b2bb9a7c6cd1d0c3bd" -size = 5194720 +name = "age-v1.2.1-linux-amd64.tar.gz" url = "https://github.com/FiloSottile/age/releases/download/v1.2.1/age-v1.2.1-linux-amd64.tar.gz" [tools.age.platforms.macos-arm64] -checksum = "blake3:5c7e92baa305e64738b31e6ed9725d6cecdb8915af6e1b6c59bb4d7890efaaca" -size = 4758557 +name = "age-v1.2.1-darwin-arm64.tar.gz" url = "https://github.com/FiloSottile/age/releases/download/v1.2.1/age-v1.2.1-darwin-arm64.tar.gz" +[tools.age.platforms.macos-x64] +name = "age-v1.2.1-darwin-amd64.tar.gz" +url = "https://github.com/FiloSottile/age/releases/download/v1.2.1/age-v1.2.1-darwin-amd64.tar.gz" + +[tools.age.platforms.windows-x64] +name = "age-v1.2.1-windows-amd64.zip" +url = "https://github.com/FiloSottile/age/releases/download/v1.2.1/age-v1.2.1-windows-amd64.zip" + +[[tools."aqua:jqlang/jq"]] +version = "1.7.1" +backend = "aqua:jqlang/jq" + +[tools."aqua:jqlang/jq".platforms.linux-arm64] +name = "jq-linux-arm64" +url = "https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-arm64" + +[tools."aqua:jqlang/jq".platforms.linux-x64] +name = "jq-linux-amd64" +url = "https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-amd64" + +[tools."aqua:jqlang/jq".platforms.macos-arm64] +name = "jq-macos-arm64" +url = "https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-macos-arm64" + +[tools."aqua:jqlang/jq".platforms.macos-x64] +name = "jq-macos-amd64" +url = "https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-macos-amd64" + +[tools."aqua:jqlang/jq".platforms.windows-x64] +name = "jq-windows-amd64.exe" +url = "https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-windows-amd64.exe" + [[tools.bun]] version = "1.3.3" backend = "core:bun" +[tools.bun.platforms.linux-arm64] +url = "bun-linux-aarch64.zip" + [tools.bun.platforms.linux-x64] -checksum = "blake3:21d78fbc47b9175cc18a79bc228c6b3aa92d102c3f9c006934101c6b588cc900" -size = 39185481 +url = "bun-linux-x64.zip" + +[tools.bun.platforms.macos-arm64] +url = "bun-darwin-aarch64.zip" + +[tools.bun.platforms.macos-x64] +url = "bun-darwin-x64.zip" + +[tools.bun.platforms.windows-x64] +url = "bun-windows-x64.zip" [[tools.cargo-binstall]] version = "1.16.2" backend = "aqua:cargo-bins/cargo-binstall" +[tools.cargo-binstall.platforms.linux-arm64] +name = "cargo-binstall-aarch64-unknown-linux-musl.tgz" +url = "https://github.com/cargo-bins/cargo-binstall/releases/download/v1.16.2/cargo-binstall-aarch64-unknown-linux-musl.tgz" + [tools.cargo-binstall.platforms.linux-x64] -checksum = "sha256:3be2695803f7b9a86b9976f2bdb8568ed6e8df026bacfc39c8546d3c6ea34808" -size = 6779867 +name = "cargo-binstall-x86_64-unknown-linux-musl.tgz" url = "https://github.com/cargo-bins/cargo-binstall/releases/download/v1.16.2/cargo-binstall-x86_64-unknown-linux-musl.tgz" -[[tools."cargo:cargo-edit"]] -version = "0.13.8" -backend = "cargo:cargo-edit" - -[[tools."cargo:cargo-insta"]] -version = "1.44.2" -backend = "cargo:cargo-insta" +[tools.cargo-binstall.platforms.macos-arm64] +name = "cargo-binstall-aarch64-apple-darwin.zip" +url = "https://github.com/cargo-bins/cargo-binstall/releases/download/v1.16.2/cargo-binstall-aarch64-apple-darwin.zip" -[[tools."cargo:cargo-release"]] -version = "0.25.22" -backend = "cargo:cargo-release" +[tools.cargo-binstall.platforms.macos-x64] +name = "cargo-binstall-x86_64-apple-darwin.zip" +url = "https://github.com/cargo-bins/cargo-binstall/releases/download/v1.16.2/cargo-binstall-x86_64-apple-darwin.zip" -[[tools."cargo:git-cliff"]] -version = "2.10.1" -backend = "cargo:git-cliff" - -[[tools."cargo:toml-cli"]] -version = "0.2.3" -backend = "cargo:toml-cli" - -[[tools."cargo:usage-cli"]] -version = "2.8.0" -backend = "cargo:usage-cli" +[tools.cargo-binstall.platforms.windows-x64] +name = "cargo-binstall-x86_64-pc-windows-msvc.zip" +url = "https://github.com/cargo-bins/cargo-binstall/releases/download/v1.16.2/cargo-binstall-x86_64-pc-windows-msvc.zip" [[tools.gh]] version = "2.83.1" backend = "aqua:cli/cli" +[tools.gh.platforms.linux-arm64] +name = "gh_2.83.1_linux_arm64.tar.gz" +url = "https://github.com/cli/cli/releases/download/v2.83.1/gh_2.83.1_linux_arm64.tar.gz" + [tools.gh.platforms.linux-x64] -checksum = "sha256:1c5252d4ce3db07b51c01ff0b909583da6364ff3fdc06d0c2e75e62dc0380a34" -size = 18174787 +name = "gh_2.83.1_linux_amd64.tar.gz" url = "https://github.com/cli/cli/releases/download/v2.83.1/gh_2.83.1_linux_amd64.tar.gz" +[tools.gh.platforms.macos-arm64] +name = "gh_2.83.1_macOS_arm64.zip" +url = "https://github.com/cli/cli/releases/download/v2.83.1/gh_2.83.1_macOS_arm64.zip" + +[tools.gh.platforms.macos-x64] +name = "gh_2.83.1_macOS_amd64.zip" +url = "https://github.com/cli/cli/releases/download/v2.83.1/gh_2.83.1_macOS_amd64.zip" + +[tools.gh.platforms.windows-x64] +name = "gh_2.83.1_windows_amd64.zip" +url = "https://github.com/cli/cli/releases/download/v2.83.1/gh_2.83.1_windows_amd64.zip" + [[tools.hk]] version = "1.25.0" backend = "aqua:jdx/hk" +[tools.hk.platforms.linux-arm64] +name = "hk-aarch64-unknown-linux-gnu.tar.gz" +url = "https://github.com/jdx/hk/releases/download/v1.25.0/hk-aarch64-unknown-linux-gnu.tar.gz" + [tools.hk.platforms.linux-x64] -checksum = "sha256:7021d44c38e34ca2ee46f3536f906de59e5e89d67439d3400e1bd707235ebb4f" -size = 7281217 +name = "hk-x86_64-unknown-linux-gnu.tar.gz" url = "https://github.com/jdx/hk/releases/download/v1.25.0/hk-x86_64-unknown-linux-gnu.tar.gz" +[tools.hk.platforms.macos-arm64] +name = "hk-aarch64-apple-darwin.tar.gz" +url = "https://github.com/jdx/hk/releases/download/v1.25.0/hk-aarch64-apple-darwin.tar.gz" + +[tools.hk.platforms.windows-x64] +name = "hk-x86_64-pc-windows-msvc.zip" +url = "https://github.com/jdx/hk/releases/download/v1.25.0/hk-x86_64-pc-windows-msvc.zip" + [[tools.jq]] version = "1.8.1" backend = "aqua:jqlang/jq" +[tools.jq.platforms.linux-arm64] +name = "jq-linux-arm64" +url = "https://github.com/jqlang/jq/releases/download/jq-1.8.1/jq-linux-arm64" + [tools.jq.platforms.linux-x64] -checksum = "sha256:020468de7539ce70ef1bceaf7cde2e8c4f2ca6c3afb84642aabc5c97d9fc2a0d" -size = 2255816 +name = "jq-linux-amd64" url = "https://github.com/jqlang/jq/releases/download/jq-1.8.1/jq-linux-amd64" [tools.jq.platforms.macos-arm64] -checksum = "sha256:a9fe3ea2f86dfc72f6728417521ec9067b343277152b114f4e98d8cb0e263603" -size = 841408 +name = "jq-macos-arm64" url = "https://github.com/jqlang/jq/releases/download/jq-1.8.1/jq-macos-arm64" +[tools.jq.platforms.macos-x64] +name = "jq-macos-amd64" +url = "https://github.com/jqlang/jq/releases/download/jq-1.8.1/jq-macos-amd64" + +[tools.jq.platforms.windows-x64] +name = "jq-windows-amd64.exe" +url = "https://github.com/jqlang/jq/releases/download/jq-1.8.1/jq-windows-amd64.exe" + [[tools.node]] version = "24.11.1" backend = "core:node" +[tools.node.platforms.linux-arm64] +url = "https://nodejs.org/dist/v24.11.1/node-v24.11.1-linux-arm64.tar.gz" + [tools.node.platforms.linux-x64] -checksum = "sha256:58a5ff5cc8f2200e458bea22e329d5c1994aa1b111d499ca46ec2411d58239ca" -size = 56272770 url = "https://nodejs.org/dist/v24.11.1/node-v24.11.1-linux-x64.tar.gz" -[[tools."npm:ajv-cli"]] -version = "5.0.0" -backend = "npm:ajv-cli" +[tools.node.platforms.macos-arm64] +url = "https://nodejs.org/dist/v24.11.1/node-v24.11.1-darwin-arm64.tar.gz" + +[tools.node.platforms.macos-x64] +url = "https://nodejs.org/dist/v24.11.1/node-v24.11.1-darwin-x64.tar.gz" + +[tools.node.platforms.windows-x64] +url = "https://nodejs.org/dist/v24.11.1/node-v24.11.1-win-x64.zip" + +[[tools.opentofu]] +version = "1.10.7" +backend = "aqua:opentofu/opentofu" + +[tools.opentofu.platforms.linux-arm64] +name = "tofu_1.10.7_linux_arm64.tar.gz" +url = "https://github.com/opentofu/opentofu/releases/download/v1.10.7/tofu_1.10.7_linux_arm64.tar.gz" + +[tools.opentofu.platforms.linux-x64] +name = "tofu_1.10.7_linux_amd64.tar.gz" +url = "https://github.com/opentofu/opentofu/releases/download/v1.10.7/tofu_1.10.7_linux_amd64.tar.gz" -[[tools."npm:markdownlint-cli"]] -version = "0.46.0" -backend = "npm:markdownlint-cli" +[tools.opentofu.platforms.macos-arm64] +name = "tofu_1.10.7_darwin_arm64.tar.gz" +url = "https://github.com/opentofu/opentofu/releases/download/v1.10.7/tofu_1.10.7_darwin_arm64.tar.gz" -[[tools."npm:prettier"]] -version = "3.7.1" -backend = "npm:prettier" +[tools.opentofu.platforms.macos-x64] +name = "tofu_1.10.7_darwin_amd64.tar.gz" +url = "https://github.com/opentofu/opentofu/releases/download/v1.10.7/tofu_1.10.7_darwin_amd64.tar.gz" + +[tools.opentofu.platforms.windows-x64] +name = "tofu_1.10.7_windows_amd64.tar.gz" +url = "https://github.com/opentofu/opentofu/releases/download/v1.10.7/tofu_1.10.7_windows_amd64.tar.gz" [[tools.pkl]] version = "0.30.0" backend = "aqua:apple/pkl" +[tools.pkl.platforms.linux-arm64] +name = "pkl-linux-aarch64" +url = "https://github.com/apple/pkl/releases/download/0.30.0/pkl-linux-aarch64" + [tools.pkl.platforms.linux-x64] -checksum = "sha256:182a50a2c84bb002010ea45c8982c1e63b54e7e6a40e939bb5eb70beaad38cd7" -size = 99355968 +name = "pkl-linux-amd64" url = "https://github.com/apple/pkl/releases/download/0.30.0/pkl-linux-amd64" +[tools.pkl.platforms.macos-arm64] +name = "pkl-macos-aarch64" +url = "https://github.com/apple/pkl/releases/download/0.30.0/pkl-macos-aarch64" + +[tools.pkl.platforms.macos-x64] +name = "pkl-macos-amd64" +url = "https://github.com/apple/pkl/releases/download/0.30.0/pkl-macos-amd64" + +[tools.pkl.platforms.windows-x64] +name = "pkl-windows-amd64.exe" +url = "https://github.com/apple/pkl/releases/download/0.30.0/pkl-windows-amd64.exe" + [[tools.pre-commit]] version = "4.5.0" backend = "aqua:pre-commit/pre-commit" +[tools.pre-commit.platforms.linux-arm64] +name = "pre-commit-4.5.0.pyz" +url = "https://github.com/pre-commit/pre-commit/releases/download/v4.5.0/pre-commit-4.5.0.pyz" + [tools.pre-commit.platforms.linux-x64] -checksum = "sha256:fbbfa47d19b98e03eb11963094ac3644a97cba105a8c660d8dab4c409c89cebe" -size = 8263423 +name = "pre-commit-4.5.0.pyz" +url = "https://github.com/pre-commit/pre-commit/releases/download/v4.5.0/pre-commit-4.5.0.pyz" + +[tools.pre-commit.platforms.macos-arm64] +name = "pre-commit-4.5.0.pyz" +url = "https://github.com/pre-commit/pre-commit/releases/download/v4.5.0/pre-commit-4.5.0.pyz" + +[tools.pre-commit.platforms.macos-x64] +name = "pre-commit-4.5.0.pyz" +url = "https://github.com/pre-commit/pre-commit/releases/download/v4.5.0/pre-commit-4.5.0.pyz" + +[tools.pre-commit.platforms.windows-x64] +name = "pre-commit-4.5.0.pyz" url = "https://github.com/pre-commit/pre-commit/releases/download/v4.5.0/pre-commit-4.5.0.pyz" [[tools.ripgrep]] version = "15.1.0" backend = "aqua:BurntSushi/ripgrep" +[tools.ripgrep.platforms.linux-arm64] +name = "ripgrep-15.1.0-aarch64-unknown-linux-gnu.tar.gz" +url = "https://github.com/BurntSushi/ripgrep/releases/download/15.1.0/ripgrep-15.1.0-aarch64-unknown-linux-gnu.tar.gz" + [tools.ripgrep.platforms.linux-x64] -checksum = "sha256:1c9297be4a084eea7ecaedf93eb03d058d6faae29bbc57ecdaf5063921491599" -size = 2263077 +name = "ripgrep-15.1.0-x86_64-unknown-linux-musl.tar.gz" url = "https://github.com/BurntSushi/ripgrep/releases/download/15.1.0/ripgrep-15.1.0-x86_64-unknown-linux-musl.tar.gz" -[[tools.shellcheck]] -version = "0.11.0" -backend = "aqua:koalaman/shellcheck" +[tools.ripgrep.platforms.macos-arm64] +name = "ripgrep-15.1.0-aarch64-apple-darwin.tar.gz" +url = "https://github.com/BurntSushi/ripgrep/releases/download/15.1.0/ripgrep-15.1.0-aarch64-apple-darwin.tar.gz" -[tools.shellcheck.platforms.linux-x64] -checksum = "blake3:0ad9524f3f16ad030f8350e7b970c62c24aeff3d813f2565665aecc5a8b79644" -size = 2559196 -url = "https://github.com/koalaman/shellcheck/releases/download/v0.11.0/shellcheck-v0.11.0.linux.x86_64.tar.xz" +[tools.ripgrep.platforms.macos-x64] +name = "ripgrep-15.1.0-x86_64-apple-darwin.tar.gz" +url = "https://github.com/BurntSushi/ripgrep/releases/download/15.1.0/ripgrep-15.1.0-x86_64-apple-darwin.tar.gz" + +[tools.ripgrep.platforms.windows-x64] +name = "ripgrep-15.1.0-x86_64-pc-windows-msvc.zip" +url = "https://github.com/BurntSushi/ripgrep/releases/download/15.1.0/ripgrep-15.1.0-x86_64-pc-windows-msvc.zip" [[tools.shfmt]] version = "3.12.0" backend = "aqua:mvdan/sh" +[tools.shfmt.platforms.linux-arm64] +name = "shfmt_v3.12.0_linux_arm64" +url = "https://github.com/mvdan/sh/releases/download/v3.12.0/shfmt_v3.12.0_linux_arm64" + [tools.shfmt.platforms.linux-x64] -checksum = "sha256:d9fbb2a9c33d13f47e7618cf362a914d029d02a6df124064fff04fd688a745ea" -size = 2916536 +name = "shfmt_v3.12.0_linux_amd64" url = "https://github.com/mvdan/sh/releases/download/v3.12.0/shfmt_v3.12.0_linux_amd64" +[tools.shfmt.platforms.macos-arm64] +name = "shfmt_v3.12.0_darwin_arm64" +url = "https://github.com/mvdan/sh/releases/download/v3.12.0/shfmt_v3.12.0_darwin_arm64" + +[tools.shfmt.platforms.macos-x64] +name = "shfmt_v3.12.0_darwin_amd64" +url = "https://github.com/mvdan/sh/releases/download/v3.12.0/shfmt_v3.12.0_darwin_amd64" + +[tools.shfmt.platforms.windows-x64] +name = "shfmt_v3.12.0_windows_amd64.exe" +url = "https://github.com/mvdan/sh/releases/download/v3.12.0/shfmt_v3.12.0_windows_amd64.exe" + [[tools.sops]] version = "3.11.0" backend = "aqua:getsops/sops" +[tools.sops.platforms.linux-arm64] +name = "sops-v3.11.0.linux.arm64" +url = "https://github.com/getsops/sops/releases/download/v3.11.0/sops-v3.11.0.linux.arm64" + [tools.sops.platforms.linux-x64] -checksum = "sha256:775f1384d55decfad228e7196a3f683791914f92a473f78fc47700531c29dfef" -size = 46346424 +name = "sops-v3.11.0.linux.amd64" url = "https://github.com/getsops/sops/releases/download/v3.11.0/sops-v3.11.0.linux.amd64" +[tools.sops.platforms.macos-arm64] +name = "sops-v3.11.0.darwin.arm64" +url = "https://github.com/getsops/sops/releases/download/v3.11.0/sops-v3.11.0.darwin.arm64" + +[tools.sops.platforms.macos-x64] +name = "sops-v3.11.0.darwin.amd64" +url = "https://github.com/getsops/sops/releases/download/v3.11.0/sops-v3.11.0.darwin.amd64" + +[tools.sops.platforms.windows-x64] +name = "sops-v3.11.0.amd64.exe" +url = "https://github.com/getsops/sops/releases/download/v3.11.0/sops-v3.11.0.amd64.exe" + [[tools.taplo]] version = "0.10.0" backend = "aqua:tamasfe/taplo" +[tools.taplo.platforms.linux-arm64] +name = "taplo-linux-aarch64.gz" +url = "https://github.com/tamasfe/taplo/releases/download/0.10.0/taplo-linux-aarch64.gz" + [tools.taplo.platforms.linux-x64] -checksum = "blake3:4871fab0e60275a1eb46e7190726e144f56c9a9527f59b0d1da5a042baead8e2" -size = 5116068 +name = "taplo-linux-x86_64.gz" url = "https://github.com/tamasfe/taplo/releases/download/0.10.0/taplo-linux-x86_64.gz" -[[tools.wait-for-gh-rate-limit]] -version = "1.0.0" -backend = "ubi:jdx/wait-for-gh-rate-limit" +[tools.taplo.platforms.macos-arm64] +name = "taplo-darwin-aarch64.gz" +url = "https://github.com/tamasfe/taplo/releases/download/0.10.0/taplo-darwin-aarch64.gz" + +[tools.taplo.platforms.macos-x64] +name = "taplo-darwin-x86_64.gz" +url = "https://github.com/tamasfe/taplo/releases/download/0.10.0/taplo-darwin-x86_64.gz" + +[tools.taplo.platforms.windows-x64] +name = "taplo-windows-x86_64.zip" +url = "https://github.com/tamasfe/taplo/releases/download/0.10.0/taplo-windows-x86_64.zip" + +[[tools.terraform]] +version = "1.14.0" +backend = "aqua:hashicorp/terraform" + +[tools.terraform.platforms.linux-arm64] +name = "terraform_1.14.0_linux_arm64.zip" +url = "https://releases.hashicorp.com/terraform/1.14.0/terraform_1.14.0_linux_arm64.zip" + +[tools.terraform.platforms.linux-x64] +name = "terraform_1.14.0_linux_amd64.zip" +url = "https://releases.hashicorp.com/terraform/1.14.0/terraform_1.14.0_linux_amd64.zip" + +[tools.terraform.platforms.macos-arm64] +name = "terraform_1.14.0_darwin_arm64.zip" +url = "https://releases.hashicorp.com/terraform/1.14.0/terraform_1.14.0_darwin_arm64.zip" + +[tools.terraform.platforms.macos-x64] +name = "terraform_1.14.0_darwin_amd64.zip" +url = "https://releases.hashicorp.com/terraform/1.14.0/terraform_1.14.0_darwin_amd64.zip" + +[tools.terraform.platforms.windows-x64] +name = "terraform_1.14.0_windows_amd64.zip" +url = "https://releases.hashicorp.com/terraform/1.14.0/terraform_1.14.0_windows_amd64.zip" + +[[tools.watchexec]] +version = "2.3.2" +backend = "aqua:watchexec/watchexec" + +[tools.watchexec.platforms.linux-arm64] +name = "watchexec-2.3.2-aarch64-unknown-linux-gnu.tar.xz" +url = "https://github.com/watchexec/watchexec/releases/download/v2.3.2/watchexec-2.3.2-aarch64-unknown-linux-gnu.tar.xz" + +[tools.watchexec.platforms.linux-x64] +name = "watchexec-2.3.2-x86_64-unknown-linux-gnu.tar.xz" +url = "https://github.com/watchexec/watchexec/releases/download/v2.3.2/watchexec-2.3.2-x86_64-unknown-linux-gnu.tar.xz" + +[tools.watchexec.platforms.macos-arm64] +name = "watchexec-2.3.2-aarch64-apple-darwin.tar.xz" +url = "https://github.com/watchexec/watchexec/releases/download/v2.3.2/watchexec-2.3.2-aarch64-apple-darwin.tar.xz" -[tools.wait-for-gh-rate-limit.platforms.linux-x64-wait-for-gh-rate-limit] -checksum = "blake3:2123971d2eea236d17fb0475c94bef89adf9239df4a8da53261d2eaf8551c622" +[tools.watchexec.platforms.macos-x64] +name = "watchexec-2.3.2-x86_64-apple-darwin.tar.xz" +url = "https://github.com/watchexec/watchexec/releases/download/v2.3.2/watchexec-2.3.2-x86_64-apple-darwin.tar.xz" -[tools.wait-for-gh-rate-limit.platforms.macos-arm64-wait-for-gh-rate-limit] -checksum = "blake3:8feb249767c436b69fd9bcb56901fdc56713c09247e9f6c1ce67f55b613bc082" +[tools.watchexec.platforms.windows-x64] +name = "watchexec-2.3.2-x86_64-pc-windows-msvc.zip" +url = "https://github.com/watchexec/watchexec/releases/download/v2.3.2/watchexec-2.3.2-x86_64-pc-windows-msvc.zip" diff --git a/src/backend/cargo.rs b/src/backend/cargo.rs index cf0a0146a9..9057e74e16 100644 --- a/src/backend/cargo.rs +++ b/src/backend/cargo.rs @@ -1,3 +1,4 @@ +use std::collections::BTreeMap; use std::{fmt::Debug, sync::Arc}; use async_trait::async_trait; @@ -9,6 +10,7 @@ use url::Url; use crate::Result; use crate::backend::Backend; use crate::backend::backend_type::BackendType; +use crate::backend::platform_target::PlatformTarget; use crate::backend::static_helpers::lookup_platform_key; use crate::cli::args::BackendArg; use crate::cmd::CmdLineRunner; @@ -16,7 +18,7 @@ use crate::config::{Config, Settings}; use crate::env::GITHUB_TOKEN; use crate::http::HTTP_FETCH; use crate::install_context::InstallContext; -use crate::toolset::ToolVersion; +use crate::toolset::{ToolRequest, ToolVersion}; use crate::{env, file}; #[derive(Debug)] @@ -145,6 +147,24 @@ impl Backend for CargoBackend { Ok(tv.clone()) } + + fn resolve_lockfile_options( + &self, + request: &ToolRequest, + _target: &PlatformTarget, + ) -> BTreeMap { + let opts = request.options(); + let mut result = BTreeMap::new(); + + // These options affect what gets compiled/installed + for key in ["features", "default-features", "bin"] { + if let Some(value) = opts.get(key) { + result.insert(key.to_string(), value.clone()); + } + } + + result + } } impl CargoBackend { diff --git a/src/backend/github.rs b/src/backend/github.rs index b46fbb73f1..d6614b937b 100644 --- a/src/backend/github.rs +++ b/src/backend/github.rs @@ -1,5 +1,6 @@ use crate::backend::asset_detector; use crate::backend::backend_type::BackendType; +use crate::backend::platform_target::PlatformTarget; use crate::backend::static_helpers::lookup_platform_key; use crate::backend::static_helpers::{ get_filename_from_url, install_artifact, template_string, try_with_v_prefix, verify_artifact, @@ -9,12 +10,13 @@ use crate::config::Config; use crate::config::Settings; use crate::http::HTTP; use crate::install_context::InstallContext; -use crate::toolset::ToolVersion; use crate::toolset::ToolVersionOptions; +use crate::toolset::{ToolRequest, ToolVersion}; use crate::{backend::Backend, github, gitlab}; use async_trait::async_trait; use eyre::Result; use regex::Regex; +use std::collections::BTreeMap; use std::fmt::Debug; use std::sync::Arc; @@ -128,6 +130,24 @@ impl Backend for UnifiedGitBackend { self.discover_bin_paths(tv) } } + + fn resolve_lockfile_options( + &self, + request: &ToolRequest, + _target: &PlatformTarget, + ) -> BTreeMap { + let opts = request.options(); + let mut result = BTreeMap::new(); + + // These options affect which artifact is downloaded + for key in ["asset_pattern", "url", "version_prefix"] { + if let Some(value) = opts.get(key) { + result.insert(key.to_string(), value.clone()); + } + } + + result + } } impl UnifiedGitBackend { diff --git a/src/backend/go.rs b/src/backend/go.rs index 3c79cf6445..daefeffa86 100644 --- a/src/backend/go.rs +++ b/src/backend/go.rs @@ -1,14 +1,16 @@ use crate::backend::Backend; use crate::backend::backend_type::BackendType; +use crate::backend::platform_target::PlatformTarget; use crate::cli::args::BackendArg; use crate::cmd::CmdLineRunner; use crate::config::Config; use crate::config::Settings; use crate::install_context::InstallContext; use crate::timeout; -use crate::toolset::ToolVersion; +use crate::toolset::{ToolRequest, ToolVersion}; use async_trait::async_trait; use itertools::Itertools; +use std::collections::BTreeMap; use std::{fmt::Debug, sync::Arc}; use xx::regex; @@ -146,6 +148,22 @@ impl Backend for GoBackend { Ok(tv) } + + fn resolve_lockfile_options( + &self, + request: &ToolRequest, + _target: &PlatformTarget, + ) -> BTreeMap { + let opts = request.options(); + let mut result = BTreeMap::new(); + + // tags affect compilation + if let Some(value) = opts.get("tags") { + result.insert("tags".to_string(), value.clone()); + } + + result + } } impl GoBackend { diff --git a/src/backend/mod.rs b/src/backend/mod.rs index ce7ea4a73d..f5f0b93cb0 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -215,6 +215,21 @@ pub trait Backend: Debug + Send + Sync { format!("{os}-{arch}") } + /// Resolves the lockfile options for a tool request on a target platform. + /// These options affect artifact identity and must match exactly for lockfile lookup. + /// + /// For the current platform: resolves from Settings and ToolRequest options + /// For other platforms (cross-platform mise lock): uses sensible defaults + /// + /// Backends should override this to return options that affect which artifact is downloaded. + fn resolve_lockfile_options( + &self, + _request: &ToolRequest, + _target: &PlatformTarget, + ) -> BTreeMap { + BTreeMap::new() // Default: no options affect artifact identity + } + async fn description(&self) -> Option { None } diff --git a/src/backend/pipx.rs b/src/backend/pipx.rs index 749a325b7a..754d59b6ef 100644 --- a/src/backend/pipx.rs +++ b/src/backend/pipx.rs @@ -1,4 +1,5 @@ use crate::backend::backend_type::BackendType; +use crate::backend::platform_target::PlatformTarget; use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::cli::args::BackendArg; use crate::cmd::CmdLineRunner; @@ -6,7 +7,7 @@ use crate::config::{Config, Settings}; use crate::github; use crate::http::HTTP_FETCH; use crate::install_context::InstallContext; -use crate::toolset::{ToolVersion, ToolVersionOptions, Toolset, ToolsetBuilder}; +use crate::toolset::{ToolRequest, ToolVersion, ToolVersionOptions, Toolset, ToolsetBuilder}; use crate::ui::multi_progress_report::MultiProgressReport; use crate::ui::progress_report::SingleReport; use crate::{backend::Backend, timeout}; @@ -15,6 +16,7 @@ use eyre::{Result, eyre}; use indexmap::IndexMap; use itertools::Itertools; use regex::Regex; +use std::collections::BTreeMap; use std::str::FromStr; use std::{fmt::Debug, sync::Arc}; use versions::Versioning; @@ -214,6 +216,24 @@ impl Backend for PIPXBackend { } Ok(tv) } + + fn resolve_lockfile_options( + &self, + request: &ToolRequest, + _target: &PlatformTarget, + ) -> BTreeMap { + let opts = request.options(); + let mut result = BTreeMap::new(); + + // These options affect what gets installed + for key in ["extras", "pipx_args", "uvx_args", "uvx"] { + if let Some(value) = opts.get(key) { + result.insert(key.to_string(), value.clone()); + } + } + + result + } } impl PIPXBackend { diff --git a/src/backend/platform_target.rs b/src/backend/platform_target.rs index 8430f0de9b..534ad3d6fc 100644 --- a/src/backend/platform_target.rs +++ b/src/backend/platform_target.rs @@ -30,6 +30,11 @@ impl PlatformTarget { pub fn to_key(&self) -> String { self.platform.to_key() } + + /// Returns true if this target matches the current platform + pub fn is_current(&self) -> bool { + self.platform == Platform::current() + } } #[cfg(test)] diff --git a/src/backend/ubi.rs b/src/backend/ubi.rs index 7bbbfe475c..3866f6256e 100644 --- a/src/backend/ubi.rs +++ b/src/backend/ubi.rs @@ -1,4 +1,5 @@ use crate::backend::backend_type::BackendType; +use crate::backend::platform_target::PlatformTarget; use crate::backend::static_helpers::{lookup_platform_key, try_with_v_prefix}; use crate::cli::args::BackendArg; use crate::config::{Config, Settings}; @@ -7,13 +8,14 @@ use crate::env::{ }; use crate::install_context::InstallContext; use crate::plugins::VERSION_REGEX; -use crate::toolset::ToolVersion; +use crate::toolset::{ToolRequest, ToolVersion}; use crate::{backend::Backend, toolset::ToolVersionOptions}; use crate::{file, github, gitlab, hash}; use async_trait::async_trait; use eyre::bail; use itertools::Itertools; use regex::Regex; +use std::collections::BTreeMap; use std::path::Path; use std::str::FromStr; use std::sync::Arc; @@ -255,6 +257,24 @@ impl Backend for UbiBackend { } } } + + fn resolve_lockfile_options( + &self, + request: &ToolRequest, + _target: &PlatformTarget, + ) -> BTreeMap { + let opts = request.options(); + let mut result = BTreeMap::new(); + + // These options affect which artifact is downloaded + for key in ["exe", "matching", "matching_regex", "provider"] { + if let Some(value) = opts.get(key) { + result.insert(key.to_string(), value.clone()); + } + } + + result + } } impl UbiBackend { diff --git a/src/cli/args/backend_arg.rs b/src/cli/args/backend_arg.rs index 6a8b7e02e0..ff7bb44449 100644 --- a/src/cli/args/backend_arg.rs +++ b/src/cli/args/backend_arg.rs @@ -9,7 +9,7 @@ use crate::{backend, config, dirs, lockfile, registry}; use contracts::requires; use eyre::{Result, bail}; use heck::{ToKebabCase, ToShoutySnakeCase}; -use std::collections::HashSet; +use std::collections::{BTreeMap, HashSet}; use std::env; use std::fmt::{Debug, Display}; use std::hash::Hash; @@ -201,8 +201,10 @@ impl BackendArg { } let config = Config::get_(); - if let Some(lt) = - lockfile::get_locked_version(&config, None, short, "").unwrap_or_default() + // Use empty options for backend discovery - we just want any matching entry + let empty_opts = BTreeMap::new(); + if let Some(lt) = lockfile::get_locked_version(&config, None, short, "", &empty_opts) + .unwrap_or_default() && let Some(backend) = lt.backend { return backend; diff --git a/src/cli/lock.rs b/src/cli/lock.rs index 84191aa18e..6e2588c321 100644 --- a/src/cli/lock.rs +++ b/src/cli/lock.rs @@ -194,8 +194,14 @@ impl Lock { ) -> Result> { let jobs = self.jobs.unwrap_or(settings.jobs); let semaphore = Arc::new(Semaphore::new(jobs)); - let mut jset: JoinSet<(String, String, String, Platform, Option)> = - JoinSet::new(); + let mut jset: JoinSet<( + String, + String, + String, + Platform, + Option, + std::collections::BTreeMap, + )> = JoinSet::new(); let mut results = Vec::new(); let mpr = MultiProgressReport::get(); @@ -216,12 +222,13 @@ impl Lock { let target = PlatformTarget::new(platform.clone()); let backend = crate::backend::get(&ba); - let info = if let Some(backend) = backend { + let (info, options) = if let Some(backend) = backend { + let options = backend.resolve_lockfile_options(&tv.request, &target); match backend.resolve_lock_info(&tv, &target).await { - Ok(info) if info.url.is_some() => Some(info), + Ok(info) if info.url.is_some() => (Some(info), options), Ok(_) => { debug!("No URL found for {} on {}", ba.short, platform.to_key()); - None + (None, options) } Err(e) => { warn!( @@ -230,12 +237,12 @@ impl Lock { platform.to_key(), e ); - None + (None, options) } } } else { warn!("Backend not found for {}", ba.short); - None + (None, std::collections::BTreeMap::new()) }; ( @@ -244,6 +251,7 @@ impl Lock { ba.full(), platform, info, + options, ) }); } @@ -254,7 +262,7 @@ impl Lock { while let Some(result) = jset.join_next().await { completed += 1; match result { - Ok((short, version, backend, platform, info)) => { + Ok((short, version, backend, platform, info, options)) => { let platform_key = platform.to_key(); pr.set_message(format!("{}@{} {}", short, version, platform_key)); pr.set_position(completed); @@ -264,6 +272,7 @@ impl Lock { &short, &version, Some(&backend), + &options, &platform_key, info, ); diff --git a/src/lockfile.rs b/src/lockfile.rs index f901a37a36..11e08a5219 100644 --- a/src/lockfile.rs +++ b/src/lockfile.rs @@ -27,7 +27,9 @@ pub struct Lockfile { pub struct LockfileTool { pub version: String, pub backend: Option, - #[serde(skip_serializing_if = "BTreeMap::is_empty")] + #[serde(skip_serializing_if = "BTreeMap::is_empty", default)] + pub options: BTreeMap, + #[serde(skip_serializing_if = "BTreeMap::is_empty", default)] pub platforms: BTreeMap, } @@ -212,12 +214,16 @@ impl Lockfile { short: &str, version: &str, backend: Option<&str>, + options: &BTreeMap, platform_key: &str, platform_info: PlatformInfo, ) { let tools = self.tools.entry(short.to_string()).or_default(); - // Find existing tool version or create new one - if let Some(tool) = tools.iter_mut().find(|t| t.version == version) { + // Find existing tool version with matching options or create new one + if let Some(tool) = tools + .iter_mut() + .find(|t| t.version == version && &t.options == options) + { tool.platforms .insert(platform_key.to_string(), platform_info); } else { @@ -226,6 +232,7 @@ impl Lockfile { tools.push(LockfileTool { version: version.to_string(), backend: backend.map(|s| s.to_string()), + options: options.clone(), platforms, }); } @@ -336,10 +343,10 @@ pub fn update_lockfiles(config: &Config, ts: &Toolset, new_versions: &[ToolVersi // For each new tool, check if we have an existing entry with platform info for new_tool in new_lockfile_tools { - // Look for existing tool with same version to preserve platform info + // Look for existing tool with same version AND options to preserve platform info if let Some(existing_tool) = existing_tools .iter() - .find(|et| et.version == new_tool.version) + .find(|et| et.version == new_tool.version && et.options == new_tool.options) { // Start with the new tool as base (it may have fresh platform info) let mut merged_tool = new_tool; @@ -354,7 +361,7 @@ pub fn update_lockfiles(config: &Config, ts: &Toolset, new_versions: &[ToolVersi } merged_tools.push(merged_tool); } else { - // No existing version match, use new tool as-is + // No existing version+options match, use new tool as-is merged_tools.push(new_tool); } } @@ -362,10 +369,9 @@ pub fn update_lockfiles(config: &Config, ts: &Toolset, new_versions: &[ToolVersi // Add any existing tools that weren't in the new toolset // BUT only if they still match a request in the current configuration for existing_tool in existing_tools { - if !merged_tools - .iter() - .any(|mt| mt.version == existing_tool.version) - { + if !merged_tools.iter().any(|mt| { + mt.version == existing_tool.version && mt.options == existing_tool.options + }) { // Check if this version still matches any request in the current toolset // This prevents stale versions from persisting after upgrades if let Some(tvl) = tools.get(short) { @@ -435,6 +441,7 @@ pub fn get_locked_version( path: Option<&Path>, short: &str, prefix: &str, + request_options: &BTreeMap, ) -> Result> { if !Settings::get().lockfile || !Settings::get().experimental { return Ok(None); @@ -457,9 +464,19 @@ pub fn get_locked_version( if let Some(tool) = lockfile.tools.get(short) { Ok(tool .iter() - // TODO: this likely won't work right when using `python@latest python@3.12` - .find(|v| prefix == "latest" || v.version.starts_with(prefix)) - .inspect(|v| trace!("[{short}@{prefix}] found {} in lockfile", v.version)) + .find(|v| { + // Version prefix matching + let version_matches = prefix == "latest" || v.version.starts_with(prefix); + // Options must match exactly + let options_match = &v.options == request_options; + version_matches && options_match + }) + .inspect(|v| { + trace!( + "[{short}@{prefix}] found {} in lockfile (options: {:?})", + v.version, v.options + ) + }) .cloned()) } else { Ok(None) @@ -481,6 +498,7 @@ impl TryFrom for LockfileTool { toml::Value::String(v) => LockfileTool { version: v, backend: Default::default(), + options: Default::default(), platforms: Default::default(), }, toml::Value::Table(mut t) => { @@ -491,6 +509,15 @@ impl TryFrom for LockfileTool { platforms.insert(platform, platform_info.try_into()?); } } + let mut options = BTreeMap::new(); + if let Some(opts) = t.remove("options") { + let opts_table: toml::Table = opts.try_into()?; + for (key, value) in opts_table { + if let toml::Value::String(s) = value { + options.insert(key, s); + } + } + } LockfileTool { version: t .remove("version") @@ -502,6 +529,7 @@ impl TryFrom for LockfileTool { .map(|v| v.try_into()) .transpose()? .unwrap_or_default(), + options, platforms, } } @@ -518,6 +546,14 @@ impl LockfileTool { if let Some(backend) = self.backend { table.insert("backend".to_string(), backend.into()); } + if !self.options.is_empty() { + let opts_table: toml::Table = self + .options + .into_iter() + .map(|(k, v)| (k, toml::Value::String(v))) + .collect(); + table.insert("options".to_string(), toml::Value::Table(opts_table)); + } if !self.platforms.is_empty() { table.insert("platforms".to_string(), self.platforms.clone().into()); } @@ -527,6 +563,8 @@ impl LockfileTool { impl From for Vec { fn from(tvl: ToolVersionList) -> Self { + use crate::backend::platform_target::PlatformTarget; + tvl.versions .iter() .map(|tv| { @@ -546,9 +584,18 @@ impl From for Vec { ); } + // Resolve lockfile options from the backend + let options = if let Ok(backend) = tv.request.backend() { + let target = PlatformTarget::from_current(); + backend.resolve_lockfile_options(&tv.request, &target) + } else { + BTreeMap::new() + }; + LockfileTool { version: tv.version.clone(), backend: Some(tv.ba().full()), + options, platforms, } }) @@ -665,6 +712,7 @@ backend = "core:python" let tool = LockfileTool { version: "20.10.0".to_string(), backend: Some("core:node".to_string()), + options: BTreeMap::new(), platforms, }; @@ -687,4 +735,128 @@ backend = "core:python" // Clean up let _ = std::fs::remove_file(&test_lockfile); } + + #[test] + fn test_options_field_parsing_and_serialization() { + // Test parsing lockfile with options + let toml_with_options = r#" +[[tools.ripgrep]] +version = "14.0.0" +backend = "ubi:BurntSushi/ripgrep" +options = { exe = "rg", matching = "musl" } + +[tools.ripgrep.platforms.linux-x64] +checksum = "blake3:abc123" +"#; + + let table: toml::Table = toml::from_str(toml_with_options).unwrap(); + let tools: toml::Table = table.get("tools").unwrap().clone().try_into().unwrap(); + + let mut lockfile = Lockfile::default(); + for (short, value) in tools { + let versions = match value { + toml::Value::Array(arr) => arr + .into_iter() + .map(LockfileTool::try_from) + .collect::>>() + .unwrap(), + _ => vec![LockfileTool::try_from(value).unwrap()], + }; + lockfile.tools.insert(short, versions); + } + + // Verify options were parsed correctly + let ripgrep = &lockfile.tools["ripgrep"][0]; + assert_eq!(ripgrep.options.get("exe"), Some(&"rg".to_string())); + assert_eq!(ripgrep.options.get("matching"), Some(&"musl".to_string())); + } + + #[test] + fn test_options_field_not_serialized_when_empty() { + let mut lockfile = Lockfile::default(); + let tool = LockfileTool { + version: "14.0.0".to_string(), + backend: Some("ubi:BurntSushi/ripgrep".to_string()), + options: BTreeMap::new(), // Empty options + platforms: BTreeMap::new(), + }; + lockfile.tools.insert("ripgrep".to_string(), vec![tool]); + + let temp_dir = std::env::temp_dir(); + let test_lockfile = temp_dir.join("test_lockfile_no_options.lock"); + + lockfile.save(&test_lockfile).unwrap(); + let content = std::fs::read_to_string(&test_lockfile).unwrap(); + + // Should NOT contain "options" when it's empty + assert!(!content.contains("options")); + + let _ = std::fs::remove_file(&test_lockfile); + } + + #[test] + fn test_options_field_serialized_when_present() { + let mut lockfile = Lockfile::default(); + let mut options = BTreeMap::new(); + options.insert("exe".to_string(), "rg".to_string()); + options.insert("matching".to_string(), "musl".to_string()); + + let tool = LockfileTool { + version: "14.0.0".to_string(), + backend: Some("ubi:BurntSushi/ripgrep".to_string()), + options, + platforms: BTreeMap::new(), + }; + lockfile.tools.insert("ripgrep".to_string(), vec![tool]); + + let temp_dir = std::env::temp_dir(); + let test_lockfile = temp_dir.join("test_lockfile_with_options.lock"); + + lockfile.save(&test_lockfile).unwrap(); + let content = std::fs::read_to_string(&test_lockfile).unwrap(); + + // Should contain options + assert!(content.contains("options")); + assert!(content.contains("exe")); + assert!(content.contains("rg")); + + let _ = std::fs::remove_file(&test_lockfile); + } + + #[test] + fn test_options_matching_in_get_locked_version() { + // This tests that get_locked_version requires exact options match + let toml_with_options = r#" +[[tools.ripgrep]] +version = "14.0.0" +backend = "ubi:BurntSushi/ripgrep" +options = { exe = "rg", matching = "musl" } + +[[tools.ripgrep]] +version = "14.0.0" +backend = "ubi:BurntSushi/ripgrep" +options = { exe = "rg" } +"#; + + let table: toml::Table = toml::from_str(toml_with_options).unwrap(); + let tools: toml::Table = table.get("tools").unwrap().clone().try_into().unwrap(); + + let mut lockfile = Lockfile::default(); + for (short, value) in tools { + let versions = match value { + toml::Value::Array(arr) => arr + .into_iter() + .map(LockfileTool::try_from) + .collect::>>() + .unwrap(), + _ => vec![LockfileTool::try_from(value).unwrap()], + }; + lockfile.tools.insert(short, versions); + } + + // Verify we have 2 entries for ripgrep with different options + assert_eq!(lockfile.tools["ripgrep"].len(), 2); + assert_eq!(lockfile.tools["ripgrep"][0].options.len(), 2); + assert_eq!(lockfile.tools["ripgrep"][1].options.len(), 1); + } } diff --git a/src/plugins/core/erlang.rs b/src/plugins/core/erlang.rs index e68b92136c..ef0c68dfd3 100644 --- a/src/plugins/core/erlang.rs +++ b/src/plugins/core/erlang.rs @@ -1,6 +1,8 @@ +use std::collections::BTreeMap; use std::{path::PathBuf, sync::Arc}; use crate::backend::Backend; +use crate::backend::platform_target::PlatformTarget; use crate::cli::args::BackendArg; use crate::config::{Config, Settings}; #[cfg(unix)] @@ -333,6 +335,28 @@ impl Backend for ErlangPlugin { } self.install_via_kerl(ctx, tv).await } + + fn resolve_lockfile_options( + &self, + _request: &ToolRequest, + target: &PlatformTarget, + ) -> BTreeMap { + let mut opts = BTreeMap::new(); + let settings = Settings::get(); + let is_current_platform = target.is_current(); + + // Only include compile option if true (non-default) + let compile = if is_current_platform { + settings.erlang.compile.unwrap_or(false) + } else { + false + }; + if compile { + opts.insert("compile".to_string(), "true".to_string()); + } + + opts + } } #[cfg(all(target_arch = "x86_64", not(target_os = "windows")))] diff --git a/src/plugins/core/node.rs b/src/plugins/core/node.rs index 2ac66c0df1..bcaf952035 100644 --- a/src/plugins/core/node.rs +++ b/src/plugins/core/node.rs @@ -7,7 +7,7 @@ use crate::config::{Config, Settings}; use crate::file::{TarFormat, TarOptions}; use crate::http::{HTTP, HTTP_FETCH}; use crate::install_context::InstallContext; -use crate::toolset::ToolVersion; +use crate::toolset::{ToolRequest, ToolVersion}; use crate::ui::progress_report::SingleReport; use crate::{env, file, gpg, hash, http, plugins}; use async_trait::async_trait; @@ -570,6 +570,35 @@ impl Backend for NodePlugin { Ok(Some(url.to_string())) } + + fn resolve_lockfile_options( + &self, + _request: &ToolRequest, + target: &PlatformTarget, + ) -> BTreeMap { + let mut opts = BTreeMap::new(); + let settings = Settings::get(); + let is_current_platform = target.is_current(); + + // Only include compile option if true (non-default) + let compile = if is_current_platform { + settings.node.compile.unwrap_or(false) + } else { + false + }; + if compile { + opts.insert("compile".to_string(), "true".to_string()); + } + + // Flavor affects which binary variant is downloaded (only if set) + if is_current_platform { + if let Some(flavor) = settings.node.flavor.clone() { + opts.insert("flavor".to_string(), flavor); + } + } + + opts + } } impl NodePlugin { diff --git a/src/plugins/core/python.rs b/src/plugins/core/python.rs index ea38c05b32..35441d40af 100644 --- a/src/plugins/core/python.rs +++ b/src/plugins/core/python.rs @@ -1,3 +1,4 @@ +use crate::backend::platform_target::PlatformTarget; use crate::backend::{Backend, VersionCacheManager}; use crate::build_time::built_info; use crate::cache::{CacheManager, CacheManagerBuilder}; @@ -522,6 +523,41 @@ impl Backend for PythonPlugin { }) .clone() } + + fn resolve_lockfile_options( + &self, + _request: &ToolRequest, + target: &PlatformTarget, + ) -> BTreeMap { + let mut opts = BTreeMap::new(); + let settings = Settings::get(); + let is_current_platform = target.is_current(); + + // Only include compile option if true (non-default) + let compile = if is_current_platform { + settings.python.compile.unwrap_or(false) + } else { + false + }; + if compile { + opts.insert("compile".to_string(), "true".to_string()); + } + + // Only include precompiled options if not compiling and if set + if !compile && is_current_platform { + if let Some(arch) = settings.python.precompiled_arch.clone() { + opts.insert("precompiled_arch".to_string(), arch); + } + if let Some(os) = settings.python.precompiled_os.clone() { + opts.insert("precompiled_os".to_string(), os); + } + if let Some(flavor) = settings.python.precompiled_flavor.clone() { + opts.insert("precompiled_flavor".to_string(), flavor); + } + } + + opts + } } fn python_precompiled_url_path(settings: &Settings) -> String { diff --git a/src/plugins/core/ruby.rs b/src/plugins/core/ruby.rs index 50e2802080..29a59c4412 100644 --- a/src/plugins/core/ruby.rs +++ b/src/plugins/core/ruby.rs @@ -3,6 +3,7 @@ use std::path::{Path, PathBuf}; use std::{collections::BTreeMap, sync::Arc}; use crate::backend::Backend; +use crate::backend::platform_target::PlatformTarget; use crate::cli::args::BackendArg; use crate::cmd::CmdLineRunner; use crate::config::{Config, Settings}; @@ -13,7 +14,7 @@ use crate::github::GithubRelease; use crate::http::{HTTP, HTTP_FETCH}; use crate::install_context::InstallContext; use crate::lock_file::LockFile; -use crate::toolset::{ToolVersion, Toolset}; +use crate::toolset::{ToolRequest, ToolVersion, Toolset}; use crate::ui::progress_report::SingleReport; use crate::{cmd, file, plugins, timeout}; use async_trait::async_trait; @@ -387,6 +388,29 @@ impl Backend for RubyPlugin { // No modification to RUBYLIB Ok(map) } + + fn resolve_lockfile_options( + &self, + _request: &ToolRequest, + target: &PlatformTarget, + ) -> BTreeMap { + let mut opts = BTreeMap::new(); + let settings = Settings::get(); + let is_current_platform = target.is_current(); + + // Ruby uses ruby-install vs ruby-build (ruby compiles from source either way) + // Only include if using non-default ruby-install tool + let ruby_install = if is_current_platform { + settings.ruby.ruby_install + } else { + false + }; + if ruby_install { + opts.insert("ruby_install".to_string(), "true".to_string()); + } + + opts + } } fn parse_gemfile(body: &str) -> String { diff --git a/src/toolset/tool_request.rs b/src/toolset/tool_request.rs index 558cc0d608..80b5fa2dd4 100644 --- a/src/toolset/tool_request.rs +++ b/src/toolset/tool_request.rs @@ -1,3 +1,4 @@ +use std::collections::BTreeMap; use std::path::PathBuf; use std::{ fmt::{Display, Formatter}, @@ -8,6 +9,7 @@ use eyre::{Result, bail}; use versions::{Chunk, Version}; use xx::file; +use crate::backend::platform_target::PlatformTarget; use crate::cli::args::BackendArg; use crate::lockfile::LockfileTool; use crate::runtime_symlinks::is_runtime_symlink; @@ -258,11 +260,29 @@ impl ToolRequest { } pub fn lockfile_resolve(&self, config: &Config) -> Result> { + // Get the resolved lockfile options from the backend + let request_options = if let Ok(backend) = self.backend() { + let target = PlatformTarget::from_current(); + backend.resolve_lockfile_options(self, &target) + } else { + BTreeMap::new() + }; + match self.source() { - ToolSource::MiseToml(path) => { - lockfile::get_locked_version(config, Some(path), &self.ba().short, &self.version()) - } - _ => lockfile::get_locked_version(config, None, &self.ba().short, &self.version()), + ToolSource::MiseToml(path) => lockfile::get_locked_version( + config, + Some(path), + &self.ba().short, + &self.version(), + &request_options, + ), + _ => lockfile::get_locked_version( + config, + None, + &self.ba().short, + &self.version(), + &request_options, + ), } } diff --git a/xtasks/release-plz b/xtasks/release-plz index 49eaf3727b..cf63828781 100755 --- a/xtasks/release-plz +++ b/xtasks/release-plz @@ -156,6 +156,7 @@ changelog="$(git cliff --tag "v$version" --unreleased --strip all)" changelog="$(echo "$changelog" | tail -n +3)" mise up +mise lock git status # cargo update git add \