diff --git a/.github/scripts/tsconfig.json b/.github/scripts/tsconfig.json deleted file mode 100644 index 89e68fa..0000000 --- a/.github/scripts/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "module": "nodenext", - "moduleResolution": "nodenext", - "target": "es2022", - "types": ["node"] - }, - "include": ["check-all-tests-passed-needs.ts"] -} diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index ca41495..1669920 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -19,6 +19,6 @@ jobs: pull-requests: read steps: - name: 🚀 Run Release Drafter - uses: release-drafter/release-drafter@139054aeaa9adc52ab36ddf67437541f039b88e2 # v7.1.1 + uses: release-drafter/release-drafter@6db134d15f3909ccc9eefd369f02bd1e9cffdf97 # v6.2.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0b876cc..ec00663 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -38,7 +38,7 @@ jobs: npm run all - name: Check all jobs are in all-tests-passed.needs run: | - tsc -p tsconfig.json + tsc --module nodenext --moduleResolution nodenext --target es2022 check-all-tests-passed-needs.ts node check-all-tests-passed-needs.js working-directory: .github/scripts - name: Make sure no changes from linters are detected @@ -164,22 +164,10 @@ jobs: - name: Latest version gets installed run: | LATEST_VERSION=$(gh api -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" /repos/astral-sh/uv/releases/latest | jq -r '.tag_name') - UV_VERSION_OUTPUT=$(uv --version) - - if [[ ! "$UV_VERSION_OUTPUT" =~ ^uv[[:space:]]+([^[:space:]]+) ]]; then - echo "Could not parse uv version from: $UV_VERSION_OUTPUT" - exit 1 - fi - - UV_VERSION="${BASH_REMATCH[1]}" - echo "Latest version is $LATEST_VERSION" - echo "uv --version output is $UV_VERSION_OUTPUT" - echo "Parsed uv version is $UV_VERSION" - - if [ "$UV_VERSION" != "$LATEST_VERSION" ]; then - echo "Wrong uv version: $UV_VERSION_OUTPUT" - exit 1 + if [ "$(uv --version)" != "uv $LATEST_VERSION" ]; then + echo "Wrong uv version: $(uv --version)" + exit 1 fi env: GH_TOKEN: ${{ github.token }} @@ -808,12 +796,12 @@ jobs: - name: Install from custom manifest file uses: ./ with: - manifest-file: "https://raw.githubusercontent.com/astral-sh/setup-uv/${{ github.ref }}/__tests__/download/custom-manifest.ndjson" + manifest-file: "https://raw.githubusercontent.com/astral-sh/setup-uv/${{ github.ref }}/__tests__/download/custom-manifest.json" - run: uv sync working-directory: __tests__/fixtures/uv-project - name: Correct version gets installed run: | - if [ "$(uv --version)" != "uv 0.9.26" ]; then + if [ "$(uv --version)" != "uv 0.7.12-alpha.1" ]; then echo "Wrong uv version: $(uv --version)" exit 1 fi diff --git a/.github/workflows/update-major-minor-tags.yml b/.github/workflows/update-major-minor-tags.yml new file mode 100644 index 0000000..4107fb1 --- /dev/null +++ b/.github/workflows/update-major-minor-tags.yml @@ -0,0 +1,51 @@ +--- +name: Update Major Minor Tags + +on: + push: + branches-ignore: + - "**" + tags: + - "v*.*.*" + +permissions: {} + +jobs: + update_major_minor_tags: + name: Make sure major and minor tags are up to date on a patch release + runs-on: ubuntu-24.04-arm + permissions: + contents: write + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: true # needed for git push below + - name: Update Major Minor Tags + run: | + set -x + + cd "${GITHUB_WORKSPACE}" || exit + + # Set up variables. + TAG="${GITHUB_REF#refs/tags/}" # v1.2.3 + MINOR="${TAG%.*}" # v1.2 + MAJOR="${MINOR%.*}" # v1 + + if [ "${GITHUB_REF}" = "${TAG}" ]; then + echo "This workflow is not triggered by tag push: GITHUB_REF=${GITHUB_REF}" + exit 1 + fi + + MESSAGE="Release ${TAG}" + + # Set up Git. + git config user.name "${GITHUB_ACTOR}" + git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" + + # Update MAJOR/MINOR tag + git tag -fa "${MAJOR}" -m "${MESSAGE}" + git tag -fa "${MINOR}" -m "${MESSAGE}" + + # Push + git push --force origin "${MINOR}" + git push --force origin "${MAJOR}" diff --git a/README.md b/README.md index 30736be..0c307b5 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ Have a look under [Advanced Configuration](#advanced-configuration) for detailed # Custom path to set UV_TOOL_BIN_DIR to tool-bin-dir: "" - # URL to a custom manifest file in the astral-sh/versions format + # URL to a custom manifest file (NDJSON preferred, legacy JSON array is deprecated) manifest-file: "" # Add problem matchers @@ -190,8 +190,8 @@ For more advanced configuration options, see our detailed documentation: ## How it works -By default, this action resolves uv versions from the -[`astral-sh/versions`](https://github.com/astral-sh/versions) manifest and downloads uv from the +By default, this action resolves uv versions from +[`astral-sh/versions`](https://github.com/astral-sh/versions) (NDJSON) and downloads uv from the official [GitHub Releases](https://github.com/astral-sh/uv). It then uses the [GitHub Actions Toolkit](https://github.com/actions/toolkit) to cache uv as a diff --git a/__tests__/download/custom-manifest.json b/__tests__/download/custom-manifest.json new file mode 100644 index 0000000..1c131e4 --- /dev/null +++ b/__tests__/download/custom-manifest.json @@ -0,0 +1,9 @@ +[ + { + "arch": "x86_64", + "artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz", + "downloadUrl": "https://release.pyx.dev/0.7.12-alpha.1/uv-x86_64-unknown-linux-gnu.tar.gz", + "platform": "unknown-linux-gnu", + "version": "0.7.12-alpha.1" + } +] diff --git a/__tests__/download/custom-manifest.ndjson b/__tests__/download/custom-manifest.ndjson deleted file mode 100644 index df6b36c..0000000 --- a/__tests__/download/custom-manifest.ndjson +++ /dev/null @@ -1 +0,0 @@ -{"version":"0.9.26","artifacts":[{"platform":"x86_64-unknown-linux-gnu","variant":"default","url":"https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-unknown-linux-gnu.tar.gz","archive_format":"tar.gz","sha256":"30ccbf0a66dc8727a02b0e245c583ee970bdafecf3a443c1686e1b30ec4939e8"}]} diff --git a/__tests__/download/download-version.test.ts b/__tests__/download/download-version.test.ts index a638636..d796aea 100644 --- a/__tests__/download/download-version.test.ts +++ b/__tests__/download/download-version.test.ts @@ -32,16 +32,29 @@ jest.unstable_mockModule("@actions/tool-cache", () => ({ })); // biome-ignore lint/suspicious/noExplicitAny: Mock requires flexible typing in tests. -const mockGetLatestVersion = jest.fn(); +const mockGetLatestVersionFromNdjson = jest.fn(); // biome-ignore lint/suspicious/noExplicitAny: Mock requires flexible typing in tests. -const mockGetAllVersions = jest.fn(); +const mockGetAllVersionsFromNdjson = jest.fn(); // biome-ignore lint/suspicious/noExplicitAny: Mock requires flexible typing in tests. -const mockGetArtifact = jest.fn(); +const mockGetArtifactFromNdjson = jest.fn(); -jest.unstable_mockModule("../../src/download/manifest", () => ({ - getAllVersions: mockGetAllVersions, - getArtifact: mockGetArtifact, - getLatestVersion: mockGetLatestVersion, +jest.unstable_mockModule("../../src/download/versions-client", () => ({ + getAllVersions: mockGetAllVersionsFromNdjson, + getArtifact: mockGetArtifactFromNdjson, + getLatestVersion: mockGetLatestVersionFromNdjson, +})); + +// biome-ignore lint/suspicious/noExplicitAny: Mock requires flexible typing in tests. +const mockGetAllManifestVersions = jest.fn(); +// biome-ignore lint/suspicious/noExplicitAny: Mock requires flexible typing in tests. +const mockGetLatestVersionInManifest = jest.fn(); +// biome-ignore lint/suspicious/noExplicitAny: Mock requires flexible typing in tests. +const mockGetManifestArtifact = jest.fn(); + +jest.unstable_mockModule("../../src/download/version-manifest", () => ({ + getAllVersions: mockGetAllManifestVersions, + getLatestKnownVersion: mockGetLatestVersionInManifest, + getManifestArtifact: mockGetManifestArtifact, })); // biome-ignore lint/suspicious/noExplicitAny: Mock requires flexible typing in tests. @@ -51,9 +64,12 @@ jest.unstable_mockModule("../../src/download/checksum/checksum", () => ({ validateChecksum: mockValidateChecksum, })); -const { downloadVersion, resolveVersion, rewriteToMirror } = await import( - "../../src/download/download-version" -); +const { + downloadVersionFromManifest, + downloadVersionFromNdjson, + resolveVersion, + rewriteToMirror, +} = await import("../../src/download/download-version"); describe("download-version", () => { beforeEach(() => { @@ -63,9 +79,12 @@ describe("download-version", () => { mockExtractTar.mockReset(); mockExtractZip.mockReset(); mockCacheDir.mockReset(); - mockGetLatestVersion.mockReset(); - mockGetAllVersions.mockReset(); - mockGetArtifact.mockReset(); + mockGetLatestVersionFromNdjson.mockReset(); + mockGetAllVersionsFromNdjson.mockReset(); + mockGetArtifactFromNdjson.mockReset(); + mockGetAllManifestVersions.mockReset(); + mockGetLatestVersionInManifest.mockReset(); + mockGetManifestArtifact.mockReset(); mockValidateChecksum.mockReset(); mockDownloadTool.mockResolvedValue("/tmp/downloaded"); @@ -75,28 +94,36 @@ describe("download-version", () => { }); describe("resolveVersion", () => { - it("uses the default manifest to resolve latest", async () => { - mockGetLatestVersion.mockResolvedValue("0.9.26"); + it("uses astral-sh/versions to resolve latest", async () => { + mockGetLatestVersionFromNdjson.mockResolvedValue("0.9.26"); const version = await resolveVersion("latest", undefined); expect(version).toBe("0.9.26"); - expect(mockGetLatestVersion).toHaveBeenCalledTimes(1); - expect(mockGetLatestVersion).toHaveBeenCalledWith(undefined); + expect(mockGetLatestVersionFromNdjson).toHaveBeenCalledTimes(1); }); - it("uses the default manifest to resolve available versions", async () => { - mockGetAllVersions.mockResolvedValue(["0.9.26", "0.9.25"]); + it("uses astral-sh/versions to resolve available versions", async () => { + mockGetAllVersionsFromNdjson.mockResolvedValue(["0.9.26", "0.9.25"]); const version = await resolveVersion("^0.9.0", undefined); expect(version).toBe("0.9.26"); - expect(mockGetAllVersions).toHaveBeenCalledTimes(1); - expect(mockGetAllVersions).toHaveBeenCalledWith(undefined); + expect(mockGetAllVersionsFromNdjson).toHaveBeenCalledTimes(1); + }); + + it("does not fall back when astral-sh/versions fails", async () => { + mockGetLatestVersionFromNdjson.mockRejectedValue( + new Error("NDJSON unavailable"), + ); + + await expect(resolveVersion("latest", undefined)).rejects.toThrow( + "NDJSON unavailable", + ); }); it("uses manifest-file when provided", async () => { - mockGetAllVersions.mockResolvedValue(["0.9.26", "0.9.25"]); + mockGetAllManifestVersions.mockResolvedValue(["0.9.26", "0.9.25"]); const version = await resolveVersion( "^0.9.0", @@ -104,35 +131,37 @@ describe("download-version", () => { ); expect(version).toBe("0.9.26"); - expect(mockGetAllVersions).toHaveBeenCalledWith( + expect(mockGetAllManifestVersions).toHaveBeenCalledWith( "https://example.com/custom.ndjson", ); }); }); - describe("downloadVersion", () => { - it("fails when manifest lookup fails", async () => { - mockGetArtifact.mockRejectedValue(new Error("manifest unavailable")); + describe("downloadVersionFromNdjson", () => { + it("fails when NDJSON metadata lookup fails", async () => { + mockGetArtifactFromNdjson.mockRejectedValue( + new Error("NDJSON unavailable"), + ); await expect( - downloadVersion( + downloadVersionFromNdjson( "unknown-linux-gnu", "x86_64", "0.9.26", undefined, "token", ), - ).rejects.toThrow("manifest unavailable"); + ).rejects.toThrow("NDJSON unavailable"); expect(mockDownloadTool).not.toHaveBeenCalled(); expect(mockValidateChecksum).not.toHaveBeenCalled(); }); - it("fails when no matching artifact exists in the default manifest", async () => { - mockGetArtifact.mockResolvedValue(undefined); + it("fails when no matching artifact exists in NDJSON metadata", async () => { + mockGetArtifactFromNdjson.mockResolvedValue(undefined); await expect( - downloadVersion( + downloadVersionFromNdjson( "unknown-linux-gnu", "x86_64", "0.9.26", @@ -147,14 +176,14 @@ describe("download-version", () => { expect(mockValidateChecksum).not.toHaveBeenCalled(); }); - it("uses built-in checksums for default manifest downloads", async () => { - mockGetArtifact.mockResolvedValue({ + it("uses built-in checksums for default NDJSON downloads", async () => { + mockGetArtifactFromNdjson.mockResolvedValue({ archiveFormat: "tar.gz", - checksum: "manifest-checksum-that-should-be-ignored", - downloadUrl: "https://example.com/uv.tar.gz", + sha256: "ndjson-checksum-that-should-be-ignored", + url: "https://example.com/uv.tar.gz", }); - await downloadVersion( + await downloadVersionFromNdjson( "unknown-linux-gnu", "x86_64", "0.9.26", @@ -172,14 +201,13 @@ describe("download-version", () => { }); it("rewrites GitHub Releases URLs to the Astral mirror", async () => { - mockGetArtifact.mockResolvedValue({ + mockGetArtifactFromNdjson.mockResolvedValue({ archiveFormat: "tar.gz", - checksum: "abc123", - downloadUrl: - "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-unknown-linux-gnu.tar.gz", + sha256: "abc123", + url: "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-unknown-linux-gnu.tar.gz", }); - await downloadVersion( + await downloadVersionFromNdjson( "unknown-linux-gnu", "x86_64", "0.9.26", @@ -195,13 +223,13 @@ describe("download-version", () => { }); it("does not rewrite non-GitHub URLs", async () => { - mockGetArtifact.mockResolvedValue({ + mockGetArtifactFromNdjson.mockResolvedValue({ archiveFormat: "tar.gz", - checksum: "abc123", - downloadUrl: "https://example.com/uv.tar.gz", + sha256: "abc123", + url: "https://example.com/uv.tar.gz", }); - await downloadVersion( + await downloadVersionFromNdjson( "unknown-linux-gnu", "x86_64", "0.9.26", @@ -217,18 +245,17 @@ describe("download-version", () => { }); it("falls back to GitHub Releases when the mirror fails", async () => { - mockGetArtifact.mockResolvedValue({ + mockGetArtifactFromNdjson.mockResolvedValue({ archiveFormat: "tar.gz", - checksum: "abc123", - downloadUrl: - "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-unknown-linux-gnu.tar.gz", + sha256: "abc123", + url: "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-unknown-linux-gnu.tar.gz", }); mockDownloadTool .mockRejectedValueOnce(new Error("mirror unavailable")) .mockResolvedValueOnce("/tmp/downloaded"); - await downloadVersion( + await downloadVersionFromNdjson( "unknown-linux-gnu", "x86_64", "0.9.26", @@ -237,12 +264,14 @@ describe("download-version", () => { ); expect(mockDownloadTool).toHaveBeenCalledTimes(2); + // Mirror request: no token expect(mockDownloadTool).toHaveBeenNthCalledWith( 1, "https://releases.astral.sh/github/uv/releases/download/0.9.26/uv-x86_64-unknown-linux-gnu.tar.gz", undefined, undefined, ); + // GitHub fallback: token restored expect(mockDownloadTool).toHaveBeenNthCalledWith( 2, "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-unknown-linux-gnu.tar.gz", @@ -255,16 +284,16 @@ describe("download-version", () => { }); it("does not fall back for non-GitHub URLs", async () => { - mockGetArtifact.mockResolvedValue({ + mockGetArtifactFromNdjson.mockResolvedValue({ archiveFormat: "tar.gz", - checksum: "abc123", - downloadUrl: "https://example.com/uv.tar.gz", + sha256: "abc123", + url: "https://example.com/uv.tar.gz", }); mockDownloadTool.mockRejectedValue(new Error("download failed")); await expect( - downloadVersion( + downloadVersionFromNdjson( "unknown-linux-gnu", "x86_64", "0.9.26", @@ -275,56 +304,6 @@ describe("download-version", () => { expect(mockDownloadTool).toHaveBeenCalledTimes(1); }); - - it("uses manifest-file checksum metadata when checksum input is unset", async () => { - mockGetArtifact.mockResolvedValue({ - archiveFormat: "tar.gz", - checksum: "manifest-checksum", - downloadUrl: "https://example.com/custom-uv.tar.gz", - }); - - await downloadVersion( - "unknown-linux-gnu", - "x86_64", - "0.9.26", - "", - "token", - "https://example.com/custom.ndjson", - ); - - expect(mockValidateChecksum).toHaveBeenCalledWith( - "manifest-checksum", - "/tmp/downloaded", - "x86_64", - "unknown-linux-gnu", - "0.9.26", - ); - }); - - it("prefers checksum input over manifest-file checksum metadata", async () => { - mockGetArtifact.mockResolvedValue({ - archiveFormat: "tar.gz", - checksum: "manifest-checksum", - downloadUrl: "https://example.com/custom-uv.tar.gz", - }); - - await downloadVersion( - "unknown-linux-gnu", - "x86_64", - "0.9.26", - "user-checksum", - "token", - "https://example.com/custom.ndjson", - ); - - expect(mockValidateChecksum).toHaveBeenCalledWith( - "user-checksum", - "/tmp/downloaded", - "x86_64", - "unknown-linux-gnu", - "0.9.26", - ); - }); }); describe("rewriteToMirror", () => { @@ -350,4 +329,56 @@ describe("download-version", () => { ).toBeUndefined(); }); }); + + describe("downloadVersionFromManifest", () => { + it("uses manifest-file checksum metadata when checksum input is unset", async () => { + mockGetManifestArtifact.mockResolvedValue({ + archiveFormat: "tar.gz", + checksum: "manifest-checksum", + downloadUrl: "https://example.com/custom-uv.tar.gz", + }); + + await downloadVersionFromManifest( + "https://example.com/custom.ndjson", + "unknown-linux-gnu", + "x86_64", + "0.9.26", + "", + "token", + ); + + expect(mockValidateChecksum).toHaveBeenCalledWith( + "manifest-checksum", + "/tmp/downloaded", + "x86_64", + "unknown-linux-gnu", + "0.9.26", + ); + }); + + it("prefers checksum input over manifest-file checksum metadata", async () => { + mockGetManifestArtifact.mockResolvedValue({ + archiveFormat: "tar.gz", + checksum: "manifest-checksum", + downloadUrl: "https://example.com/custom-uv.tar.gz", + }); + + await downloadVersionFromManifest( + "https://example.com/custom.ndjson", + "unknown-linux-gnu", + "x86_64", + "0.9.26", + "user-checksum", + "token", + ); + + expect(mockValidateChecksum).toHaveBeenCalledWith( + "user-checksum", + "/tmp/downloaded", + "x86_64", + "unknown-linux-gnu", + "0.9.26", + ); + }); + }); }); diff --git a/__tests__/download/manifest.test.ts b/__tests__/download/manifest.test.ts deleted file mode 100644 index 85d6872..0000000 --- a/__tests__/download/manifest.test.ts +++ /dev/null @@ -1,180 +0,0 @@ -import { beforeEach, describe, expect, it, jest } from "@jest/globals"; - -// biome-ignore lint/suspicious/noExplicitAny: Mock requires flexible typing in tests. -const mockFetch = jest.fn(); - -jest.unstable_mockModule("@actions/core", () => ({ - debug: jest.fn(), - info: jest.fn(), -})); - -jest.unstable_mockModule("../../src/utils/fetch", () => ({ - fetch: mockFetch, -})); - -const { - clearManifestCache, - fetchManifest, - getAllVersions, - getArtifact, - getLatestVersion, - parseManifest, -} = await import("../../src/download/manifest"); - -const sampleManifestResponse = `{"version":"0.9.26","artifacts":[{"platform":"aarch64-apple-darwin","variant":"default","url":"https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-apple-darwin.tar.gz","archive_format":"tar.gz","sha256":"fcf0a9ea6599c6ae28a4c854ac6da76f2c889354d7c36ce136ef071f7ab9721f"},{"platform":"x86_64-pc-windows-msvc","variant":"default","url":"https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-pc-windows-msvc.zip","archive_format":"zip","sha256":"eb02fd95d8e0eed462b4a67ecdd320d865b38c560bffcda9a0b87ec944bdf036"}]} -{"version":"0.9.25","artifacts":[{"platform":"aarch64-apple-darwin","variant":"default","url":"https://github.com/astral-sh/uv/releases/download/0.9.25/uv-aarch64-apple-darwin.tar.gz","archive_format":"tar.gz","sha256":"606b3c6949d971709f2526fa0d9f0fd23ccf60e09f117999b406b424af18a6a6"}]}`; - -const multiVariantManifestResponse = `{"version":"0.9.26","artifacts":[{"platform":"aarch64-apple-darwin","variant":"python-managed","url":"https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-apple-darwin-managed.tar.gz","archive_format":"tar.gz","sha256":"managed-checksum"},{"platform":"aarch64-apple-darwin","variant":"default","url":"https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-apple-darwin.zip","archive_format":"zip","sha256":"default-checksum"}]}`; - -function createMockResponse( - ok: boolean, - status: number, - statusText: string, - data: string, -) { - return { - ok, - status, - statusText, - text: async () => data, - }; -} - -describe("manifest", () => { - beforeEach(() => { - clearManifestCache(); - mockFetch.mockReset(); - }); - - describe("fetchManifest", () => { - it("fetches and parses manifest data", async () => { - mockFetch.mockResolvedValue( - createMockResponse(true, 200, "OK", sampleManifestResponse), - ); - - const versions = await fetchManifest(); - - expect(versions).toHaveLength(2); - expect(versions[0]?.version).toBe("0.9.26"); - expect(versions[1]?.version).toBe("0.9.25"); - }); - - it("throws on a failed fetch", async () => { - mockFetch.mockResolvedValue( - createMockResponse(false, 500, "Internal Server Error", ""), - ); - - await expect(fetchManifest()).rejects.toThrow( - "Failed to fetch manifest data: 500 Internal Server Error", - ); - }); - - it("caches results per URL", async () => { - mockFetch.mockResolvedValue( - createMockResponse(true, 200, "OK", sampleManifestResponse), - ); - - await fetchManifest("https://example.com/custom.ndjson"); - await fetchManifest("https://example.com/custom.ndjson"); - - expect(mockFetch).toHaveBeenCalledTimes(1); - }); - }); - - describe("getAllVersions", () => { - it("returns all version strings", async () => { - mockFetch.mockResolvedValue( - createMockResponse(true, 200, "OK", sampleManifestResponse), - ); - - const versions = await getAllVersions( - "https://example.com/custom.ndjson", - ); - - expect(versions).toEqual(["0.9.26", "0.9.25"]); - }); - }); - - describe("getLatestVersion", () => { - it("returns the first version string", async () => { - mockFetch.mockResolvedValue( - createMockResponse(true, 200, "OK", sampleManifestResponse), - ); - - await expect( - getLatestVersion("https://example.com/custom.ndjson"), - ).resolves.toBe("0.9.26"); - }); - }); - - describe("getArtifact", () => { - beforeEach(() => { - mockFetch.mockResolvedValue( - createMockResponse(true, 200, "OK", sampleManifestResponse), - ); - }); - - it("finds an artifact by version and platform", async () => { - const artifact = await getArtifact("0.9.26", "aarch64", "apple-darwin"); - - expect(artifact).toEqual({ - archiveFormat: "tar.gz", - checksum: - "fcf0a9ea6599c6ae28a4c854ac6da76f2c889354d7c36ce136ef071f7ab9721f", - downloadUrl: - "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-apple-darwin.tar.gz", - }); - }); - - it("finds a windows artifact", async () => { - const artifact = await getArtifact("0.9.26", "x86_64", "pc-windows-msvc"); - - expect(artifact).toEqual({ - archiveFormat: "zip", - checksum: - "eb02fd95d8e0eed462b4a67ecdd320d865b38c560bffcda9a0b87ec944bdf036", - downloadUrl: - "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-pc-windows-msvc.zip", - }); - }); - - it("prefers the default variant when multiple artifacts share a platform", async () => { - mockFetch.mockResolvedValue( - createMockResponse(true, 200, "OK", multiVariantManifestResponse), - ); - - const artifact = await getArtifact("0.9.26", "aarch64", "apple-darwin"); - - expect(artifact).toEqual({ - archiveFormat: "zip", - checksum: "default-checksum", - downloadUrl: - "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-apple-darwin.zip", - }); - }); - - it("returns undefined for an unknown version", async () => { - const artifact = await getArtifact("0.0.1", "aarch64", "apple-darwin"); - - expect(artifact).toBeUndefined(); - }); - - it("returns undefined for an unknown platform", async () => { - const artifact = await getArtifact( - "0.9.26", - "aarch64", - "unknown-linux-musl", - ); - - expect(artifact).toBeUndefined(); - }); - }); - - describe("parseManifest", () => { - it("throws for malformed manifest data", () => { - expect(() => parseManifest('{"version":"0.1.0"', "test-source")).toThrow( - "Failed to parse manifest data from test-source", - ); - }); - }); -}); diff --git a/__tests__/download/version-manifest.test.ts b/__tests__/download/version-manifest.test.ts new file mode 100644 index 0000000..2cd30ed --- /dev/null +++ b/__tests__/download/version-manifest.test.ts @@ -0,0 +1,136 @@ +import { beforeEach, describe, expect, it, jest } from "@jest/globals"; + +const mockWarning = jest.fn(); + +jest.unstable_mockModule("@actions/core", () => ({ + debug: jest.fn(), + info: jest.fn(), + warning: mockWarning, +})); + +// biome-ignore lint/suspicious/noExplicitAny: Mock requires flexible typing in tests. +const mockFetch = jest.fn(); +jest.unstable_mockModule("../../src/utils/fetch", () => ({ + fetch: mockFetch, +})); + +const { + clearManifestCache, + getAllVersions, + getLatestKnownVersion, + getManifestArtifact, +} = await import("../../src/download/version-manifest"); + +const legacyManifestResponse = JSON.stringify([ + { + arch: "x86_64", + artifactName: "uv-x86_64-unknown-linux-gnu.tar.gz", + downloadUrl: + "https://example.com/releases/download/0.7.12-alpha.1/uv-x86_64-unknown-linux-gnu.tar.gz", + platform: "unknown-linux-gnu", + version: "0.7.12-alpha.1", + }, + { + arch: "x86_64", + artifactName: "uv-x86_64-unknown-linux-gnu.tar.gz", + downloadUrl: + "https://example.com/releases/download/0.7.13/uv-x86_64-unknown-linux-gnu.tar.gz", + platform: "unknown-linux-gnu", + version: "0.7.13", + }, +]); + +const ndjsonManifestResponse = `{"version":"0.10.0","artifacts":[{"platform":"x86_64-unknown-linux-gnu","variant":"default","url":"https://example.com/releases/download/0.10.0/uv-x86_64-unknown-linux-gnu.tar.gz","archive_format":"tar.gz","sha256":"checksum-100"}]} +{"version":"0.9.30","artifacts":[{"platform":"x86_64-unknown-linux-gnu","variant":"default","url":"https://example.com/releases/download/0.9.30/uv-x86_64-unknown-linux-gnu.tar.gz","archive_format":"tar.gz","sha256":"checksum-0930"}]}`; + +const multiVariantManifestResponse = `{"version":"0.10.0","artifacts":[{"platform":"x86_64-unknown-linux-gnu","variant":"managed-python","url":"https://example.com/releases/download/0.10.0/uv-x86_64-unknown-linux-gnu-managed-python.tar.gz","archive_format":"tar.gz","sha256":"checksum-managed"},{"platform":"x86_64-unknown-linux-gnu","variant":"default","url":"https://example.com/releases/download/0.10.0/uv-x86_64-unknown-linux-gnu-default.zip","archive_format":"zip","sha256":"checksum-default"}]}`; + +function createMockResponse( + ok: boolean, + status: number, + statusText: string, + data: string, +) { + return { + ok, + status, + statusText, + text: async () => data, + }; +} + +describe("version-manifest", () => { + beforeEach(() => { + clearManifestCache(); + mockFetch.mockReset(); + mockWarning.mockReset(); + }); + + it("supports the legacy JSON manifest format", async () => { + mockFetch.mockResolvedValue( + createMockResponse(true, 200, "OK", legacyManifestResponse), + ); + + const latest = await getLatestKnownVersion( + "https://example.com/legacy.json", + ); + const artifact = await getManifestArtifact( + "https://example.com/legacy.json", + "0.7.13", + "x86_64", + "unknown-linux-gnu", + ); + + expect(latest).toBe("0.7.13"); + expect(artifact).toEqual({ + archiveFormat: undefined, + checksum: undefined, + downloadUrl: + "https://example.com/releases/download/0.7.13/uv-x86_64-unknown-linux-gnu.tar.gz", + }); + expect(mockWarning).toHaveBeenCalledTimes(1); + }); + + it("supports NDJSON manifests", async () => { + mockFetch.mockResolvedValue( + createMockResponse(true, 200, "OK", ndjsonManifestResponse), + ); + + const versions = await getAllVersions("https://example.com/custom.ndjson"); + const artifact = await getManifestArtifact( + "https://example.com/custom.ndjson", + "0.10.0", + "x86_64", + "unknown-linux-gnu", + ); + + expect(versions).toEqual(["0.10.0", "0.9.30"]); + expect(artifact).toEqual({ + archiveFormat: "tar.gz", + checksum: "checksum-100", + downloadUrl: + "https://example.com/releases/download/0.10.0/uv-x86_64-unknown-linux-gnu.tar.gz", + }); + expect(mockWarning).not.toHaveBeenCalled(); + }); + + it("prefers the default variant when a manifest contains multiple variants", async () => { + mockFetch.mockResolvedValue( + createMockResponse(true, 200, "OK", multiVariantManifestResponse), + ); + + const artifact = await getManifestArtifact( + "https://example.com/multi-variant.ndjson", + "0.10.0", + "x86_64", + "unknown-linux-gnu", + ); + + expect(artifact).toEqual({ + archiveFormat: "zip", + checksum: "checksum-default", + downloadUrl: + "https://example.com/releases/download/0.10.0/uv-x86_64-unknown-linux-gnu-default.zip", + }); + }); +}); diff --git a/__tests__/download/versions-client.test.ts b/__tests__/download/versions-client.test.ts new file mode 100644 index 0000000..f963716 --- /dev/null +++ b/__tests__/download/versions-client.test.ts @@ -0,0 +1,170 @@ +import { beforeEach, describe, expect, it, jest } from "@jest/globals"; + +// biome-ignore lint/suspicious/noExplicitAny: Mock requires flexible typing in tests. +const mockFetch = jest.fn(); + +jest.unstable_mockModule("../../src/utils/fetch", () => ({ + fetch: mockFetch, +})); + +const { + clearCache, + fetchVersionData, + getAllVersions, + getArtifact, + getLatestVersion, + parseVersionData, +} = await import("../../src/download/versions-client"); + +const sampleNdjsonResponse = `{"version":"0.9.26","artifacts":[{"platform":"aarch64-apple-darwin","variant":"default","url":"https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-apple-darwin.tar.gz","archive_format":"tar.gz","sha256":"fcf0a9ea6599c6ae28a4c854ac6da76f2c889354d7c36ce136ef071f7ab9721f"},{"platform":"x86_64-pc-windows-msvc","variant":"default","url":"https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-pc-windows-msvc.zip","archive_format":"zip","sha256":"eb02fd95d8e0eed462b4a67ecdd320d865b38c560bffcda9a0b87ec944bdf036"}]} +{"version":"0.9.25","artifacts":[{"platform":"aarch64-apple-darwin","variant":"default","url":"https://github.com/astral-sh/uv/releases/download/0.9.25/uv-aarch64-apple-darwin.tar.gz","archive_format":"tar.gz","sha256":"606b3c6949d971709f2526fa0d9f0fd23ccf60e09f117999b406b424af18a6a6"}]}`; + +const multiVariantNdjsonResponse = `{"version":"0.9.26","artifacts":[{"platform":"aarch64-apple-darwin","variant":"python-managed","url":"https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-apple-darwin-managed.tar.gz","archive_format":"tar.gz","sha256":"managed-checksum"},{"platform":"aarch64-apple-darwin","variant":"default","url":"https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-apple-darwin.zip","archive_format":"zip","sha256":"default-checksum"}]}`; + +function createMockResponse( + ok: boolean, + status: number, + statusText: string, + data: string, +) { + return { + ok, + status, + statusText, + text: async () => data, + }; +} + +describe("versions-client", () => { + beforeEach(() => { + clearCache(); + mockFetch.mockReset(); + }); + + describe("fetchVersionData", () => { + it("should fetch and parse NDJSON data", async () => { + mockFetch.mockResolvedValue( + createMockResponse(true, 200, "OK", sampleNdjsonResponse), + ); + + const versions = await fetchVersionData(); + + expect(versions).toHaveLength(2); + expect(versions[0].version).toBe("0.9.26"); + expect(versions[1].version).toBe("0.9.25"); + }); + + it("should throw error on failed fetch", async () => { + mockFetch.mockResolvedValue( + createMockResponse(false, 500, "Internal Server Error", ""), + ); + + await expect(fetchVersionData()).rejects.toThrow( + "Failed to fetch version data: 500 Internal Server Error", + ); + }); + + it("should cache results", async () => { + mockFetch.mockResolvedValue( + createMockResponse(true, 200, "OK", sampleNdjsonResponse), + ); + + await fetchVersionData(); + await fetchVersionData(); + + expect(mockFetch).toHaveBeenCalledTimes(1); + }); + }); + + describe("getLatestVersion", () => { + it("should return the first version (newest)", async () => { + mockFetch.mockResolvedValue( + createMockResponse(true, 200, "OK", sampleNdjsonResponse), + ); + + const latest = await getLatestVersion(); + + expect(latest).toBe("0.9.26"); + }); + }); + + describe("getAllVersions", () => { + it("should return all version strings", async () => { + mockFetch.mockResolvedValue( + createMockResponse(true, 200, "OK", sampleNdjsonResponse), + ); + + const versions = await getAllVersions(); + + expect(versions).toEqual(["0.9.26", "0.9.25"]); + }); + }); + + describe("getArtifact", () => { + beforeEach(() => { + mockFetch.mockResolvedValue( + createMockResponse(true, 200, "OK", sampleNdjsonResponse), + ); + }); + + it("should find artifact by version and platform", async () => { + const artifact = await getArtifact("0.9.26", "aarch64", "apple-darwin"); + + expect(artifact).toEqual({ + archiveFormat: "tar.gz", + sha256: + "fcf0a9ea6599c6ae28a4c854ac6da76f2c889354d7c36ce136ef071f7ab9721f", + url: "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-apple-darwin.tar.gz", + }); + }); + + it("should find windows artifact", async () => { + const artifact = await getArtifact("0.9.26", "x86_64", "pc-windows-msvc"); + + expect(artifact).toEqual({ + archiveFormat: "zip", + sha256: + "eb02fd95d8e0eed462b4a67ecdd320d865b38c560bffcda9a0b87ec944bdf036", + url: "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-pc-windows-msvc.zip", + }); + }); + + it("should prefer the default variant when multiple artifacts share a platform", async () => { + mockFetch.mockResolvedValue( + createMockResponse(true, 200, "OK", multiVariantNdjsonResponse), + ); + + const artifact = await getArtifact("0.9.26", "aarch64", "apple-darwin"); + + expect(artifact).toEqual({ + archiveFormat: "zip", + sha256: "default-checksum", + url: "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-apple-darwin.zip", + }); + }); + + it("should return undefined for unknown version", async () => { + const artifact = await getArtifact("0.0.1", "aarch64", "apple-darwin"); + + expect(artifact).toBeUndefined(); + }); + + it("should return undefined for unknown platform", async () => { + const artifact = await getArtifact( + "0.9.26", + "aarch64", + "unknown-linux-musl", + ); + + expect(artifact).toBeUndefined(); + }); + }); + + describe("parseVersionData", () => { + it("should throw for malformed NDJSON", () => { + expect(() => + parseVersionData('{"version":"0.1.0"', "test-source"), + ).toThrow("Failed to parse version data from test-source"); + }); + }); +}); diff --git a/__tests__/utils/inputs.test.ts b/__tests__/utils/inputs.test.ts index e16ffa6..a83c7a7 100644 --- a/__tests__/utils/inputs.test.ts +++ b/__tests__/utils/inputs.test.ts @@ -1,6 +1,3 @@ -import fs from "node:fs"; -import os from "node:os"; -import path from "node:path"; import { afterEach, beforeEach, @@ -10,13 +7,9 @@ import { jest, } from "@jest/globals"; +// Will be mutated per test before (re-)importing the module under test let mockInputs: Record = {}; -const tempDirs: string[] = []; const ORIGINAL_HOME = process.env.HOME; -const ORIGINAL_RUNNER_ENVIRONMENT = process.env.RUNNER_ENVIRONMENT; -const ORIGINAL_RUNNER_TEMP = process.env.RUNNER_TEMP; -const ORIGINAL_UV_CACHE_DIR = process.env.UV_CACHE_DIR; -const ORIGINAL_UV_PYTHON_INSTALL_DIR = process.env.UV_PYTHON_INSTALL_DIR; const mockDebug = jest.fn(); const mockGetBooleanInput = jest.fn( @@ -34,220 +27,118 @@ jest.unstable_mockModule("@actions/core", () => ({ warning: mockWarning, })); -const { CacheLocalSource, loadInputs } = await import("../../src/utils/inputs"); - -function createTempProject(files: Record = {}): string { - const dir = fs.mkdtempSync(path.join(os.tmpdir(), "setup-uv-inputs-test-")); - tempDirs.push(dir); - - for (const [relativePath, content] of Object.entries(files)) { - const filePath = path.join(dir, relativePath); - fs.mkdirSync(path.dirname(filePath), { recursive: true }); - fs.writeFileSync(filePath, content); - } - - return dir; +async function importInputsModule() { + return await import("../../src/utils/inputs"); } -function resetEnvironment(): void { - jest.clearAllMocks(); - mockInputs = {}; - process.env.HOME = "/home/testuser"; - delete process.env.RUNNER_ENVIRONMENT; - delete process.env.RUNNER_TEMP; - delete process.env.UV_CACHE_DIR; - delete process.env.UV_PYTHON_INSTALL_DIR; -} - -function restoreEnvironment(): void { - for (const dir of tempDirs.splice(0)) { - fs.rmSync(dir, { force: true, recursive: true }); - } - - process.env.HOME = ORIGINAL_HOME; - process.env.RUNNER_ENVIRONMENT = ORIGINAL_RUNNER_ENVIRONMENT; - process.env.RUNNER_TEMP = ORIGINAL_RUNNER_TEMP; - process.env.UV_CACHE_DIR = ORIGINAL_UV_CACHE_DIR; - process.env.UV_PYTHON_INSTALL_DIR = ORIGINAL_UV_PYTHON_INSTALL_DIR; -} - -beforeEach(resetEnvironment); -afterEach(restoreEnvironment); - -describe("loadInputs", () => { - it("loads defaults for a github-hosted runner", () => { - mockInputs["working-directory"] = "/workspace"; - mockInputs["enable-cache"] = "auto"; - process.env.RUNNER_ENVIRONMENT = "github-hosted"; - process.env.RUNNER_TEMP = "/runner-temp"; - - const inputs = loadInputs(); - - expect(inputs.enableCache).toBe(true); - expect(inputs.cacheLocalPath).toEqual({ - path: "/runner-temp/setup-uv-cache", - source: CacheLocalSource.Default, - }); - expect(inputs.pythonDir).toBe("/runner-temp/uv-python-dir"); - expect(inputs.venvPath).toBe("/workspace/.venv"); - expect(inputs.manifestFile).toBeUndefined(); - expect(inputs.resolutionStrategy).toBe("highest"); - }); - - it("uses cache-dir from pyproject.toml when present", () => { - mockInputs["working-directory"] = createTempProject({ - "pyproject.toml": `[project] -name = "uv-project" -version = "0.1.0" - -[tool.uv] -cache-dir = "/tmp/pyproject-toml-defined-cache-path" -`, - }); - - const inputs = loadInputs(); - - expect(inputs.cacheLocalPath).toEqual({ - path: "/tmp/pyproject-toml-defined-cache-path", - source: CacheLocalSource.Config, - }); - expect(mockInfo).toHaveBeenCalledWith( - expect.stringContaining("Found cache-dir in"), - ); - }); - - it("uses UV_CACHE_DIR from the environment", () => { - mockInputs["working-directory"] = createTempProject(); - process.env.UV_CACHE_DIR = "/env/cache-dir"; - - const inputs = loadInputs(); - - expect(inputs.cacheLocalPath).toEqual({ - path: "/env/cache-dir", - source: CacheLocalSource.Env, - }); - expect(mockInfo).toHaveBeenCalledWith( - "UV_CACHE_DIR is already set to /env/cache-dir", - ); - }); - - it("uses UV_PYTHON_INSTALL_DIR from the environment", () => { - mockInputs["working-directory"] = "/workspace"; - process.env.UV_PYTHON_INSTALL_DIR = "/env/python-dir"; - - const inputs = loadInputs(); - - expect(inputs.pythonDir).toBe("/env/python-dir"); - expect(mockInfo).toHaveBeenCalledWith( - "UV_PYTHON_INSTALL_DIR is already set to /env/python-dir", - ); - }); - - it("warns when parsing a malformed pyproject.toml for cache-dir", () => { - mockInputs["working-directory"] = createTempProject({ - "pyproject.toml": `[project] -name = "malformed-pyproject-toml-project" -version = "0.1.0" - -[malformed-toml -`, - }); - - const inputs = loadInputs(); - - expect(inputs.cacheLocalPath).toBeUndefined(); - expect(mockWarning).toHaveBeenCalledWith( - expect.stringContaining("Error while parsing pyproject.toml:"), - ); - }); - - it("throws for an invalid resolution strategy", () => { - mockInputs["working-directory"] = "/workspace"; - mockInputs["resolution-strategy"] = "middle"; - - expect(() => loadInputs()).toThrow( - "Invalid resolution-strategy: middle. Must be 'highest' or 'lowest'.", - ); - }); -}); - describe("cacheDependencyGlob", () => { - it("returns empty string when input not provided", () => { - mockInputs["working-directory"] = "/workspace"; - - const inputs = loadInputs(); - - expect(inputs.cacheDependencyGlob).toBe(""); + beforeEach(() => { + jest.resetModules(); + jest.clearAllMocks(); + mockInputs = {}; + process.env.HOME = "/home/testuser"; }); - it.each([ - ["requirements.txt", "/workspace/requirements.txt"], - ["./uv.lock", "/workspace/uv.lock"], - ])("resolves %s to %s", (globInput, expected) => { - mockInputs["working-directory"] = "/workspace"; - mockInputs["cache-dependency-glob"] = globInput; - - const inputs = loadInputs(); - - expect(inputs.cacheDependencyGlob).toBe(expected); + afterEach(() => { + process.env.HOME = ORIGINAL_HOME; }); - it("handles multiple lines, trimming whitespace, tilde expansion and absolute paths", () => { + it("returns empty string when input not provided", async () => { + mockInputs["working-directory"] = "/workspace"; + const { cacheDependencyGlob } = await importInputsModule(); + expect(cacheDependencyGlob).toBe(""); + }); + + it("resolves a single relative path", async () => { + mockInputs["working-directory"] = "/workspace"; + mockInputs["cache-dependency-glob"] = "requirements.txt"; + const { cacheDependencyGlob } = await importInputsModule(); + expect(cacheDependencyGlob).toBe("/workspace/requirements.txt"); + }); + + it("strips leading ./ from relative path", async () => { + mockInputs["working-directory"] = "/workspace"; + mockInputs["cache-dependency-glob"] = "./uv.lock"; + const { cacheDependencyGlob } = await importInputsModule(); + expect(cacheDependencyGlob).toBe("/workspace/uv.lock"); + }); + + it("handles multiple lines, trimming whitespace, tilde expansion and absolute paths", async () => { mockInputs["working-directory"] = "/workspace"; mockInputs["cache-dependency-glob"] = " ~/.cache/file1\n ./rel/file2 \nfile3.txt"; - - const inputs = loadInputs(); - - expect(inputs.cacheDependencyGlob).toBe( + const { cacheDependencyGlob } = await importInputsModule(); + expect(cacheDependencyGlob).toBe( [ - "/home/testuser/.cache/file1", - "/workspace/rel/file2", - "/workspace/file3.txt", + "/home/testuser/.cache/file1", // expanded tilde, absolute path unchanged + "/workspace/rel/file2", // ./ stripped and resolved + "/workspace/file3.txt", // relative path resolved ].join("\n"), ); }); - it.each([ - [ - "/abs/path.lock\nrelative.lock", - ["/abs/path.lock", "/workspace/relative.lock"].join("\n"), - ], - [ - "!/abs/path.lock\n!relative.lock", - ["!/abs/path.lock", "!/workspace/relative.lock"].join("\n"), - ], - ])("normalizes multiline glob %s", (globInput, expected) => { + it("keeps absolute path unchanged in multiline input", async () => { mockInputs["working-directory"] = "/workspace"; - mockInputs["cache-dependency-glob"] = globInput; + mockInputs["cache-dependency-glob"] = "/abs/path.lock\nrelative.lock"; + const { cacheDependencyGlob } = await importInputsModule(); + expect(cacheDependencyGlob).toBe( + ["/abs/path.lock", "/workspace/relative.lock"].join("\n"), + ); + }); - const inputs = loadInputs(); - - expect(inputs.cacheDependencyGlob).toBe(expected); + it("handles exclusions in relative paths correct", async () => { + mockInputs["working-directory"] = "/workspace"; + mockInputs["cache-dependency-glob"] = "!/abs/path.lock\n!relative.lock"; + const { cacheDependencyGlob } = await importInputsModule(); + expect(cacheDependencyGlob).toBe( + ["!/abs/path.lock", "!/workspace/relative.lock"].join("\n"), + ); }); }); describe("tool directories", () => { - it("expands tilde for tool-bin-dir and tool-dir", () => { + beforeEach(() => { + jest.resetModules(); + jest.clearAllMocks(); + mockInputs = {}; + process.env.HOME = "/home/testuser"; + }); + + afterEach(() => { + process.env.HOME = ORIGINAL_HOME; + }); + + it("expands tilde for tool-bin-dir and tool-dir", async () => { mockInputs["working-directory"] = "/workspace"; mockInputs["tool-bin-dir"] = "~/tool-bin-dir"; mockInputs["tool-dir"] = "~/tool-dir"; - const inputs = loadInputs(); + const { toolBinDir, toolDir } = await importInputsModule(); - expect(inputs.toolBinDir).toBe("/home/testuser/tool-bin-dir"); - expect(inputs.toolDir).toBe("/home/testuser/tool-dir"); + expect(toolBinDir).toBe("/home/testuser/tool-bin-dir"); + expect(toolDir).toBe("/home/testuser/tool-dir"); }); }); describe("cacheLocalPath", () => { - it("expands tilde in cache-local-path", () => { + beforeEach(() => { + jest.resetModules(); + jest.clearAllMocks(); + mockInputs = {}; + process.env.HOME = "/home/testuser"; + }); + + afterEach(() => { + process.env.HOME = ORIGINAL_HOME; + }); + + it("expands tilde in cache-local-path", async () => { mockInputs["working-directory"] = "/workspace"; mockInputs["cache-local-path"] = "~/uv-cache/cache-local-path"; - const inputs = loadInputs(); + const { CacheLocalSource, cacheLocalPath } = await importInputsModule(); - expect(inputs.cacheLocalPath).toEqual({ + expect(cacheLocalPath).toEqual({ path: "/home/testuser/uv-cache/cache-local-path", source: CacheLocalSource.Input, }); @@ -255,37 +146,63 @@ describe("cacheLocalPath", () => { }); describe("venvPath", () => { - it("defaults to .venv in the working directory", () => { - mockInputs["working-directory"] = "/workspace"; - - const inputs = loadInputs(); - - expect(inputs.venvPath).toBe("/workspace/.venv"); + beforeEach(() => { + jest.resetModules(); + jest.clearAllMocks(); + mockInputs = {}; + process.env.HOME = "/home/testuser"; }); - it.each([ - ["custom-venv", "/workspace/custom-venv"], - ["custom-venv/", "/workspace/custom-venv"], - ["/tmp/custom-venv", "/tmp/custom-venv"], - ["~/.venv", "/home/testuser/.venv"], - ])("resolves venv-path %s to %s", (venvPathInput, expected) => { + afterEach(() => { + process.env.HOME = ORIGINAL_HOME; + }); + + it("defaults to .venv in the working directory", async () => { + mockInputs["working-directory"] = "/workspace"; + const { venvPath } = await importInputsModule(); + expect(venvPath).toBe("/workspace/.venv"); + }); + + it("resolves a relative venv-path", async () => { mockInputs["working-directory"] = "/workspace"; mockInputs["activate-environment"] = "true"; - mockInputs["venv-path"] = venvPathInput; - - const inputs = loadInputs(); - - expect(inputs.venvPath).toBe(expected); + mockInputs["venv-path"] = "custom-venv"; + const { venvPath } = await importInputsModule(); + expect(venvPath).toBe("/workspace/custom-venv"); }); - it("warns when venv-path is set but activate-environment is false", () => { + it("normalizes venv-path with trailing slash", async () => { + mockInputs["working-directory"] = "/workspace"; + mockInputs["activate-environment"] = "true"; + mockInputs["venv-path"] = "custom-venv/"; + const { venvPath } = await importInputsModule(); + expect(venvPath).toBe("/workspace/custom-venv"); + }); + + it("keeps an absolute venv-path unchanged", async () => { + mockInputs["working-directory"] = "/workspace"; + mockInputs["activate-environment"] = "true"; + mockInputs["venv-path"] = "/tmp/custom-venv"; + const { venvPath } = await importInputsModule(); + expect(venvPath).toBe("/tmp/custom-venv"); + }); + + it("expands tilde in venv-path", async () => { + mockInputs["working-directory"] = "/workspace"; + mockInputs["activate-environment"] = "true"; + mockInputs["venv-path"] = "~/.venv"; + const { venvPath } = await importInputsModule(); + expect(venvPath).toBe("/home/testuser/.venv"); + }); + + it("warns when venv-path is set but activate-environment is false", async () => { mockInputs["working-directory"] = "/workspace"; mockInputs["venv-path"] = "custom-venv"; - const inputs = loadInputs(); + const { activateEnvironment, venvPath } = await importInputsModule(); - expect(inputs.activateEnvironment).toBe(false); - expect(inputs.venvPath).toBe("/workspace/custom-venv"); + expect(activateEnvironment).toBe(false); + expect(venvPath).toBe("/workspace/custom-venv"); expect(mockWarning).toHaveBeenCalledWith( "venv-path is only used when activate-environment is true", ); diff --git a/action.yml b/action.yml index 8882beb..2f566fa 100644 --- a/action.yml +++ b/action.yml @@ -75,7 +75,7 @@ inputs: description: "Custom path to set UV_TOOL_BIN_DIR to." required: false manifest-file: - description: "URL to a custom manifest file in the astral-sh/versions format." + description: "URL to a custom manifest file. Supports the astral-sh/versions NDJSON format and the legacy JSON array format (deprecated)." required: false add-problem-matchers: description: "Add problem matchers." diff --git a/dist/save-cache/index.cjs b/dist/save-cache/index.cjs index ecbfbbb..f79c54a 100644 --- a/dist/save-cache/index.cjs +++ b/dist/save-cache/index.cjs @@ -1492,36 +1492,36 @@ var require_diagnostics = __commonJS({ const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog; diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version4, protocol, port, host } } = evt; debuglog( "connecting to %s using %s%s", `${host}${port ? `:${port}` : ""}`, protocol, - version3 + version4 ); }); diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version4, protocol, port, host } } = evt; debuglog( "connected to %s using %s%s", `${host}${port ? `:${port}` : ""}`, protocol, - version3 + version4 ); }); diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host }, + connectParams: { version: version4, protocol, port, host }, error: error2 } = evt; debuglog( "connection to %s using %s%s errored - %s", `${host}${port ? `:${port}` : ""}`, protocol, - version3, + version4, error2.message ); }); @@ -1570,31 +1570,31 @@ var require_diagnostics = __commonJS({ const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog; diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version4, protocol, port, host } } = evt; debuglog( "connecting to %s%s using %s%s", host, port ? `:${port}` : "", protocol, - version3 + version4 ); }); diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version4, protocol, port, host } } = evt; debuglog( "connected to %s%s using %s%s", host, port ? `:${port}` : "", protocol, - version3 + version4 ); }); diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host }, + connectParams: { version: version4, protocol, port, host }, error: error2 } = evt; debuglog( @@ -1602,7 +1602,7 @@ var require_diagnostics = __commonJS({ host, port ? `:${port}` : "", protocol, - version3, + version4, error2.message ); }); @@ -19562,31 +19562,31 @@ var require_semver = __commonJS({ var parseOptions = require_parse_options(); var { compareIdentifiers } = require_identifiers(); var SemVer = class _SemVer { - constructor(version3, options) { + constructor(version4, options) { options = parseOptions(options); - if (version3 instanceof _SemVer) { - if (version3.loose === !!options.loose && version3.includePrerelease === !!options.includePrerelease) { - return version3; + if (version4 instanceof _SemVer) { + if (version4.loose === !!options.loose && version4.includePrerelease === !!options.includePrerelease) { + return version4; } else { - version3 = version3.version; + version4 = version4.version; } - } else if (typeof version3 !== "string") { - throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version3}".`); + } else if (typeof version4 !== "string") { + throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version4}".`); } - if (version3.length > MAX_LENGTH) { + if (version4.length > MAX_LENGTH) { throw new TypeError( `version is longer than ${MAX_LENGTH} characters` ); } - debug2("SemVer", version3, options); + debug2("SemVer", version4, options); this.options = options; this.loose = !!options.loose; this.includePrerelease = !!options.includePrerelease; - const m = version3.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]); + const m = version4.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]); if (!m) { - throw new TypeError(`Invalid Version: ${version3}`); + throw new TypeError(`Invalid Version: ${version4}`); } - this.raw = version3; + this.raw = version4; this.major = +m[1]; this.minor = +m[2]; this.patch = +m[3]; @@ -19836,12 +19836,12 @@ var require_parse2 = __commonJS({ "node_modules/@actions/cache/node_modules/semver/functions/parse.js"(exports2, module2) { "use strict"; var SemVer = require_semver(); - var parse3 = (version3, options, throwErrors = false) => { - if (version3 instanceof SemVer) { - return version3; + var parse3 = (version4, options, throwErrors = false) => { + if (version4 instanceof SemVer) { + return version4; } try { - return new SemVer(version3, options); + return new SemVer(version4, options); } catch (er) { if (!throwErrors) { return null; @@ -19858,8 +19858,8 @@ var require_valid = __commonJS({ "node_modules/@actions/cache/node_modules/semver/functions/valid.js"(exports2, module2) { "use strict"; var parse3 = require_parse2(); - var valid = (version3, options) => { - const v = parse3(version3, options); + var valid = (version4, options) => { + const v = parse3(version4, options); return v ? v.version : null; }; module2.exports = valid; @@ -19871,8 +19871,8 @@ var require_clean = __commonJS({ "node_modules/@actions/cache/node_modules/semver/functions/clean.js"(exports2, module2) { "use strict"; var parse3 = require_parse2(); - var clean2 = (version3, options) => { - const s = parse3(version3.trim().replace(/^[=v]+/, ""), options); + var clean2 = (version4, options) => { + const s = parse3(version4.trim().replace(/^[=v]+/, ""), options); return s ? s.version : null; }; module2.exports = clean2; @@ -19884,7 +19884,7 @@ var require_inc = __commonJS({ "node_modules/@actions/cache/node_modules/semver/functions/inc.js"(exports2, module2) { "use strict"; var SemVer = require_semver(); - var inc = (version3, release, options, identifier, identifierBase) => { + var inc = (version4, release, options, identifier, identifierBase) => { if (typeof options === "string") { identifierBase = identifier; identifier = options; @@ -19892,7 +19892,7 @@ var require_inc = __commonJS({ } try { return new SemVer( - version3 instanceof SemVer ? version3.version : version3, + version4 instanceof SemVer ? version4.version : version4, options ).inc(release, identifier, identifierBase).version; } catch (er) { @@ -19982,8 +19982,8 @@ var require_prerelease = __commonJS({ "node_modules/@actions/cache/node_modules/semver/functions/prerelease.js"(exports2, module2) { "use strict"; var parse3 = require_parse2(); - var prerelease = (version3, options) => { - const parsed = parse3(version3, options); + var prerelease = (version4, options) => { + const parsed = parse3(version4, options); return parsed && parsed.prerelease.length ? parsed.prerelease : null; }; module2.exports = prerelease; @@ -20171,24 +20171,24 @@ var require_coerce = __commonJS({ var SemVer = require_semver(); var parse3 = require_parse2(); var { safeRe: re, t } = require_re(); - var coerce = (version3, options) => { - if (version3 instanceof SemVer) { - return version3; + var coerce = (version4, options) => { + if (version4 instanceof SemVer) { + return version4; } - if (typeof version3 === "number") { - version3 = String(version3); + if (typeof version4 === "number") { + version4 = String(version4); } - if (typeof version3 !== "string") { + if (typeof version4 !== "string") { return null; } options = options || {}; let match2 = null; if (!options.rtl) { - match2 = version3.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]); + match2 = version4.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]); } else { const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]; let next; - while ((next = coerceRtlRegex.exec(version3)) && (!match2 || match2.index + match2[0].length !== version3.length)) { + while ((next = coerceRtlRegex.exec(version4)) && (!match2 || match2.index + match2[0].length !== version4.length)) { if (!match2 || next.index + next[0].length !== match2.index + match2[0].length) { match2 = next; } @@ -20372,19 +20372,19 @@ var require_range = __commonJS({ }); } // if ANY of the sets match ALL of its comparators, then pass - test(version3) { - if (!version3) { + test(version4) { + if (!version4) { return false; } - if (typeof version3 === "string") { + if (typeof version4 === "string") { try { - version3 = new SemVer(version3, this.options); + version4 = new SemVer(version4, this.options); } catch (er) { return false; } } for (let i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version3, this.options)) { + if (testSet(this.set[i], version4, this.options)) { return true; } } @@ -20599,13 +20599,13 @@ var require_range = __commonJS({ } return `${from} ${to}`.trim(); }; - var testSet = (set, version3, options) => { + var testSet = (set, version4, options) => { for (let i = 0; i < set.length; i++) { - if (!set[i].test(version3)) { + if (!set[i].test(version4)) { return false; } } - if (version3.prerelease.length && !options.includePrerelease) { + if (version4.prerelease.length && !options.includePrerelease) { for (let i = 0; i < set.length; i++) { debug2(set[i].semver); if (set[i].semver === Comparator.ANY) { @@ -20613,7 +20613,7 @@ var require_range = __commonJS({ } if (set[i].semver.prerelease.length > 0) { const allowed = set[i].semver; - if (allowed.major === version3.major && allowed.minor === version3.minor && allowed.patch === version3.patch) { + if (allowed.major === version4.major && allowed.minor === version4.minor && allowed.patch === version4.patch) { return true; } } @@ -20674,19 +20674,19 @@ var require_comparator = __commonJS({ toString() { return this.value; } - test(version3) { - debug2("Comparator.test", version3, this.options.loose); - if (this.semver === ANY || version3 === ANY) { + test(version4) { + debug2("Comparator.test", version4, this.options.loose); + if (this.semver === ANY || version4 === ANY) { return true; } - if (typeof version3 === "string") { + if (typeof version4 === "string") { try { - version3 = new SemVer(version3, this.options); + version4 = new SemVer(version4, this.options); } catch (er) { return false; } } - return cmp(version3, this.operator, this.semver, this.options); + return cmp(version4, this.operator, this.semver, this.options); } intersects(comp26, options) { if (!(comp26 instanceof _Comparator)) { @@ -20743,13 +20743,13 @@ var require_satisfies = __commonJS({ "node_modules/@actions/cache/node_modules/semver/functions/satisfies.js"(exports2, module2) { "use strict"; var Range = require_range(); - var satisfies = (version3, range2, options) => { + var satisfies = (version4, range2, options) => { try { range2 = new Range(range2, options); } catch (er) { return false; } - return range2.test(version3); + return range2.test(version4); }; module2.exports = satisfies; } @@ -20911,8 +20911,8 @@ var require_outside = __commonJS({ var lt = require_lt(); var lte = require_lte(); var gte2 = require_gte(); - var outside = (version3, range2, hilo, options) => { - version3 = new SemVer(version3, options); + var outside = (version4, range2, hilo, options) => { + version4 = new SemVer(version4, options); range2 = new Range(range2, options); let gtfn, ltefn, ltfn, comp26, ecomp; switch (hilo) { @@ -20933,7 +20933,7 @@ var require_outside = __commonJS({ default: throw new TypeError('Must provide a hilo val of "<" or ">"'); } - if (satisfies(version3, range2, options)) { + if (satisfies(version4, range2, options)) { return false; } for (let i = 0; i < range2.set.length; ++i) { @@ -20955,9 +20955,9 @@ var require_outside = __commonJS({ if (high.operator === comp26 || high.operator === ecomp) { return false; } - if ((!low.operator || low.operator === comp26) && ltefn(version3, low.semver)) { + if ((!low.operator || low.operator === comp26) && ltefn(version4, low.semver)) { return false; - } else if (low.operator === ecomp && ltfn(version3, low.semver)) { + } else if (low.operator === ecomp && ltfn(version4, low.semver)) { return false; } } @@ -20972,7 +20972,7 @@ var require_gtr = __commonJS({ "node_modules/@actions/cache/node_modules/semver/ranges/gtr.js"(exports2, module2) { "use strict"; var outside = require_outside(); - var gtr = (version3, range2, options) => outside(version3, range2, ">", options); + var gtr = (version4, range2, options) => outside(version4, range2, ">", options); module2.exports = gtr; } }); @@ -20982,7 +20982,7 @@ var require_ltr = __commonJS({ "node_modules/@actions/cache/node_modules/semver/ranges/ltr.js"(exports2, module2) { "use strict"; var outside = require_outside(); - var ltr = (version3, range2, options) => outside(version3, range2, "<", options); + var ltr = (version4, range2, options) => outside(version4, range2, "<", options); module2.exports = ltr; } }); @@ -21012,12 +21012,12 @@ var require_simplify = __commonJS({ let first = null; let prev = null; const v = versions.sort((a, b) => compare(a, b, options)); - for (const version3 of v) { - const included = satisfies(version3, range2, options); + for (const version4 of v) { + const included = satisfies(version4, range2, options); if (included) { - prev = version3; + prev = version4; if (!first) { - first = version3; + first = version4; } } else { if (prev) { @@ -21840,10 +21840,10 @@ var require_supports_color = __commonJS({ return 3; } if ("TERM_PROGRAM" in env) { - const version3 = parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10); + const version4 = parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10); switch (env.TERM_PROGRAM) { case "iTerm.app": - return version3 >= 3 ? 3 : 2; + return version4 >= 3 ? 3 : 2; case "Apple_Terminal": return 2; } @@ -27060,15 +27060,15 @@ var require_version = __commonJS({ stringify: stringify2 }; var validRegex = new RegExp("^" + VERSION_PATTERN + "$", "i"); - function valid(version3) { - return validRegex.test(version3) ? version3 : null; + function valid(version4) { + return validRegex.test(version4) ? version4 : null; } var cleanRegex = new RegExp("^\\s*" + VERSION_PATTERN + "\\s*$", "i"); - function clean2(version3) { - return stringify2(parse3(version3, cleanRegex)); + function clean2(version4) { + return stringify2(parse3(version4, cleanRegex)); } - function parse3(version3, regex) { - const { groups } = (regex || validRegex).exec(version3) || {}; + function parse3(version4, regex) { + const { groups } = (regex || validRegex).exec(version4) || {}; if (!groups) { return null; } @@ -27142,8 +27142,8 @@ var require_version = __commonJS({ } return null; } - function explain(version3) { - const parsed = parse3(version3); + function explain(version4) { + const parsed = parse3(version4); if (!parsed) { return parsed; } @@ -27194,36 +27194,36 @@ var require_operator = __commonJS({ ">": gt, "===": arbitrary }; - function lt(version3, other) { - return compare(version3, other) < 0; + function lt(version4, other) { + return compare(version4, other) < 0; } - function le(version3, other) { - return compare(version3, other) <= 0; + function le(version4, other) { + return compare(version4, other) <= 0; } - function eq(version3, other) { - return compare(version3, other) === 0; + function eq(version4, other) { + return compare(version4, other) === 0; } - function ne(version3, other) { - return compare(version3, other) !== 0; + function ne(version4, other) { + return compare(version4, other) !== 0; } - function ge(version3, other) { - return compare(version3, other) >= 0; + function ge(version4, other) { + return compare(version4, other) >= 0; } - function gt(version3, other) { - return compare(version3, other) > 0; + function gt(version4, other) { + return compare(version4, other) > 0; } - function arbitrary(version3, other) { - return version3.toLowerCase() === other.toLowerCase(); + function arbitrary(version4, other) { + return version4.toLowerCase() === other.toLowerCase(); } - function compare(version3, other) { - const parsedVersion = parse3(version3); + function compare(version4, other) { + const parsedVersion = parse3(version4); const parsedOther = parse3(other); const keyVersion = calculateKey(parsedVersion); const keyOther = calculateKey(parsedOther); return pyCompare(keyVersion, keyOther); } - function rcompare(version3, other) { - return -compare(version3, other); + function rcompare(version4, other) { + return -compare(version4, other); } function pyCompare(elemIn, otherIn) { let elem = elemIn; @@ -27317,9 +27317,9 @@ var require_specifier = __commonJS({ return null; } let { ...spec } = groups; - const { operator, version: version3, prefix: prefix2, legacy } = groups; - if (version3) { - spec = { ...spec, ...explainVersion(version3) }; + const { operator, version: version4, prefix: prefix2, legacy } = groups; + if (version4) { + spec = { ...spec, ...explainVersion(version4) }; if (operator === "~=") { if (spec.release.length < 2) { return null; @@ -27364,8 +27364,8 @@ var require_specifier = __commonJS({ if (!parsed) { return []; } - return versions.filter((version3) => { - const explained = explainVersion(version3); + return versions.filter((version4) => { + const explained = explainVersion(version4); if (!parsed.length) { return explained && !(explained.is_prerelease && !options.prereleases); } @@ -27373,12 +27373,12 @@ var require_specifier = __commonJS({ if (!pass) { return false; } - return contains({ ...spec, ...options }, { version: version3, explained }); + return contains({ ...spec, ...options }, { version: version4, explained }); }, true); }); } - function satisfies(version3, specifier, options = {}) { - const filtered = pick([version3], specifier, options); + function satisfies(version4, specifier, options = {}) { + const filtered = pick([version4], specifier, options); return filtered.length === 1; } function arrayStartsWith(array, prefix2) { @@ -27394,7 +27394,7 @@ var require_specifier = __commonJS({ } function contains(specifier, input) { const { explained } = input; - let { version: version3 } = input; + let { version: version4 } = input; const { ...spec } = specifier; if (spec.prereleases === void 0) { spec.prereleases = spec.is_prerelease; @@ -27407,7 +27407,7 @@ var require_specifier = __commonJS({ if (spec.epoch) { compatiblePrefix = spec.epoch + "!" + compatiblePrefix; } - return satisfies(version3, `>=${spec.version}, ==${compatiblePrefix}`, { + return satisfies(version4, `>=${spec.version}, ==${compatiblePrefix}`, { prereleases: spec.prereleases }); } @@ -27418,7 +27418,7 @@ var require_specifier = __commonJS({ } if (explained) { if (explained.local && spec.version) { - version3 = explained.public; + version4 = explained.public; spec.version = explainVersion(spec.version).public; } } @@ -27428,7 +27428,7 @@ var require_specifier = __commonJS({ } } const op = Operator[spec.operator]; - return op(version3, spec.version || spec.legacy); + return op(version4, spec.version || spec.legacy); } function validRange(specifier) { return Boolean(parse3(specifier)); @@ -27447,36 +27447,36 @@ var require_semantic = __commonJS({ inc }; function major(input) { - const version3 = explain(input); - if (!version3) { + const version4 = explain(input); + if (!version4) { throw new TypeError("Invalid Version: " + input); } - return version3.release[0]; + return version4.release[0]; } function minor(input) { - const version3 = explain(input); - if (!version3) { + const version4 = explain(input); + if (!version4) { throw new TypeError("Invalid Version: " + input); } - if (version3.release.length < 2) { + if (version4.release.length < 2) { return 0; } - return version3.release[1]; + return version4.release[1]; } function patch(input) { - const version3 = explain(input); - if (!version3) { + const version4 = explain(input); + if (!version4) { throw new TypeError("Invalid Version: " + input); } - if (version3.release.length < 3) { + if (version4.release.length < 3) { return 0; } - return version3.release[2]; + return version4.release[2]; } function inc(input, release, preReleaseIdentifier) { let identifier = preReleaseIdentifier || `a`; - const version3 = parse3(input); - if (!version3) { + const version4 = parse3(input); + if (!version4) { return null; } if (!["a", "b", "c", "rc", "alpha", "beta", "pre", "preview"].includes( @@ -27487,103 +27487,103 @@ var require_semantic = __commonJS({ switch (release) { case "premajor": { - const [majorVersion] = version3.release; - version3.release.fill(0); - version3.release[0] = majorVersion + 1; + const [majorVersion] = version4.release; + version4.release.fill(0); + version4.release[0] = majorVersion + 1; } - version3.pre = [identifier, 0]; - delete version3.post; - delete version3.dev; - delete version3.local; + version4.pre = [identifier, 0]; + delete version4.post; + delete version4.dev; + delete version4.local; break; case "preminor": { - const [majorVersion, minorVersion = 0] = version3.release; - version3.release.fill(0); - version3.release[0] = majorVersion; - version3.release[1] = minorVersion + 1; + const [majorVersion, minorVersion = 0] = version4.release; + version4.release.fill(0); + version4.release[0] = majorVersion; + version4.release[1] = minorVersion + 1; } - version3.pre = [identifier, 0]; - delete version3.post; - delete version3.dev; - delete version3.local; + version4.pre = [identifier, 0]; + delete version4.post; + delete version4.dev; + delete version4.local; break; case "prepatch": { - const [majorVersion, minorVersion = 0, patchVersion = 0] = version3.release; - version3.release.fill(0); - version3.release[0] = majorVersion; - version3.release[1] = minorVersion; - version3.release[2] = patchVersion + 1; + const [majorVersion, minorVersion = 0, patchVersion = 0] = version4.release; + version4.release.fill(0); + version4.release[0] = majorVersion; + version4.release[1] = minorVersion; + version4.release[2] = patchVersion + 1; } - version3.pre = [identifier, 0]; - delete version3.post; - delete version3.dev; - delete version3.local; + version4.pre = [identifier, 0]; + delete version4.post; + delete version4.dev; + delete version4.local; break; case "prerelease": - if (version3.pre === null) { - const [majorVersion, minorVersion = 0, patchVersion = 0] = version3.release; - version3.release.fill(0); - version3.release[0] = majorVersion; - version3.release[1] = minorVersion; - version3.release[2] = patchVersion + 1; - version3.pre = [identifier, 0]; + if (version4.pre === null) { + const [majorVersion, minorVersion = 0, patchVersion = 0] = version4.release; + version4.release.fill(0); + version4.release[0] = majorVersion; + version4.release[1] = minorVersion; + version4.release[2] = patchVersion + 1; + version4.pre = [identifier, 0]; } else { - if (preReleaseIdentifier === void 0 && version3.pre !== null) { - [identifier] = version3.pre; + if (preReleaseIdentifier === void 0 && version4.pre !== null) { + [identifier] = version4.pre; } - const [letter, number] = version3.pre; + const [letter, number] = version4.pre; if (letter === identifier) { - version3.pre = [letter, number + 1]; + version4.pre = [letter, number + 1]; } else { - version3.pre = [identifier, 0]; + version4.pre = [identifier, 0]; } } - delete version3.post; - delete version3.dev; - delete version3.local; + delete version4.post; + delete version4.dev; + delete version4.local; break; case "major": - if (version3.release.slice(1).some((value) => value !== 0) || version3.pre === null) { - const [majorVersion] = version3.release; - version3.release.fill(0); - version3.release[0] = majorVersion + 1; + if (version4.release.slice(1).some((value) => value !== 0) || version4.pre === null) { + const [majorVersion] = version4.release; + version4.release.fill(0); + version4.release[0] = majorVersion + 1; } - delete version3.pre; - delete version3.post; - delete version3.dev; - delete version3.local; + delete version4.pre; + delete version4.post; + delete version4.dev; + delete version4.local; break; case "minor": - if (version3.release.slice(2).some((value) => value !== 0) || version3.pre === null) { - const [majorVersion, minorVersion = 0] = version3.release; - version3.release.fill(0); - version3.release[0] = majorVersion; - version3.release[1] = minorVersion + 1; + if (version4.release.slice(2).some((value) => value !== 0) || version4.pre === null) { + const [majorVersion, minorVersion = 0] = version4.release; + version4.release.fill(0); + version4.release[0] = majorVersion; + version4.release[1] = minorVersion + 1; } - delete version3.pre; - delete version3.post; - delete version3.dev; - delete version3.local; + delete version4.pre; + delete version4.post; + delete version4.dev; + delete version4.local; break; case "patch": - if (version3.release.slice(3).some((value) => value !== 0) || version3.pre === null) { - const [majorVersion, minorVersion = 0, patchVersion = 0] = version3.release; - version3.release.fill(0); - version3.release[0] = majorVersion; - version3.release[1] = minorVersion; - version3.release[2] = patchVersion + 1; + if (version4.release.slice(3).some((value) => value !== 0) || version4.pre === null) { + const [majorVersion, minorVersion = 0, patchVersion = 0] = version4.release; + version4.release.fill(0); + version4.release[0] = majorVersion; + version4.release[1] = minorVersion; + version4.release[2] = patchVersion + 1; } - delete version3.pre; - delete version3.post; - delete version3.dev; - delete version3.local; + delete version4.pre; + delete version4.post; + delete version4.dev; + delete version4.local; break; default: return null; } - return stringify2(version3); + return stringify2(version4); } } }); @@ -30412,8 +30412,8 @@ function getVersion(app_1) { function getCompressionMethod() { return __awaiter10(this, void 0, void 0, function* () { const versionOutput = yield getVersion("zstd", ["--quiet"]); - const version3 = semver.clean(versionOutput); - debug(`zstd version: ${version3}`); + const version4 = semver.clean(versionOutput); + debug(`zstd version: ${version4}`); if (versionOutput === "") { return CompressionMethod.Gzip; } else { @@ -54754,8 +54754,8 @@ var SASQueryParameters = class { } return void 0; } - constructor(version3, signature, permissionsOrOptions, services, resourceTypes, protocol, startsOn, expiresOn2, ipRange, identifier, resource, cacheControl, contentDisposition, contentEncoding, contentLanguage, contentType2, userDelegationKey, preauthorizedAgentObjectId, correlationId, encryptionScope2, delegatedUserObjectId) { - this.version = version3; + constructor(version4, signature, permissionsOrOptions, services, resourceTypes, protocol, startsOn, expiresOn2, ipRange, identifier, resource, cacheControl, contentDisposition, contentEncoding, contentLanguage, contentType2, userDelegationKey, preauthorizedAgentObjectId, correlationId, encryptionScope2, delegatedUserObjectId) { + this.version = version4; this.signature = signature; if (permissionsOrOptions !== void 0 && typeof permissionsOrOptions !== "string") { this.permissions = permissionsOrOptions.permissions; @@ -54962,7 +54962,7 @@ function generateBlobSASQueryParameters(blobSASSignatureValues, sharedKeyCredent return generateBlobSASQueryParametersInternal(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName).sasQueryParameters; } function generateBlobSASQueryParametersInternal(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName) { - const version3 = blobSASSignatureValues.version ? blobSASSignatureValues.version : SERVICE_VERSION; + const version4 = blobSASSignatureValues.version ? blobSASSignatureValues.version : SERVICE_VERSION; const sharedKeyCredential = sharedKeyCredentialOrUserDelegationKey instanceof StorageSharedKeyCredential ? sharedKeyCredentialOrUserDelegationKey : void 0; let userDelegationKeyCredential; if (sharedKeyCredential === void 0 && accountName !== void 0) { @@ -54971,29 +54971,29 @@ function generateBlobSASQueryParametersInternal(blobSASSignatureValues, sharedKe if (sharedKeyCredential === void 0 && userDelegationKeyCredential === void 0) { throw TypeError("Invalid sharedKeyCredential, userDelegationKey or accountName."); } - if (version3 >= "2020-12-06") { + if (version4 >= "2020-12-06") { if (sharedKeyCredential !== void 0) { return generateBlobSASQueryParameters20201206(blobSASSignatureValues, sharedKeyCredential); } else { - if (version3 >= "2025-07-05") { + if (version4 >= "2025-07-05") { return generateBlobSASQueryParametersUDK20250705(blobSASSignatureValues, userDelegationKeyCredential); } else { return generateBlobSASQueryParametersUDK20201206(blobSASSignatureValues, userDelegationKeyCredential); } } } - if (version3 >= "2018-11-09") { + if (version4 >= "2018-11-09") { if (sharedKeyCredential !== void 0) { return generateBlobSASQueryParameters20181109(blobSASSignatureValues, sharedKeyCredential); } else { - if (version3 >= "2020-02-10") { + if (version4 >= "2020-02-10") { return generateBlobSASQueryParametersUDK20200210(blobSASSignatureValues, userDelegationKeyCredential); } else { return generateBlobSASQueryParametersUDK20181109(blobSASSignatureValues, userDelegationKeyCredential); } } } - if (version3 >= "2015-04-05") { + if (version4 >= "2015-04-05") { if (sharedKeyCredential !== void 0) { return generateBlobSASQueryParameters20150405(blobSASSignatureValues, sharedKeyCredential); } else { @@ -55368,44 +55368,44 @@ function getCanonicalName(accountName, containerName, blobName) { return elements.join(""); } function SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues) { - const version3 = blobSASSignatureValues.version ? blobSASSignatureValues.version : SERVICE_VERSION; - if (blobSASSignatureValues.snapshotTime && version3 < "2018-11-09") { + const version4 = blobSASSignatureValues.version ? blobSASSignatureValues.version : SERVICE_VERSION; + if (blobSASSignatureValues.snapshotTime && version4 < "2018-11-09") { throw RangeError("'version' must be >= '2018-11-09' when providing 'snapshotTime'."); } if (blobSASSignatureValues.blobName === void 0 && blobSASSignatureValues.snapshotTime) { throw RangeError("Must provide 'blobName' when providing 'snapshotTime'."); } - if (blobSASSignatureValues.versionId && version3 < "2019-10-10") { + if (blobSASSignatureValues.versionId && version4 < "2019-10-10") { throw RangeError("'version' must be >= '2019-10-10' when providing 'versionId'."); } if (blobSASSignatureValues.blobName === void 0 && blobSASSignatureValues.versionId) { throw RangeError("Must provide 'blobName' when providing 'versionId'."); } - if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.setImmutabilityPolicy && version3 < "2020-08-04") { + if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.setImmutabilityPolicy && version4 < "2020-08-04") { throw RangeError("'version' must be >= '2020-08-04' when provided 'i' permission."); } - if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.deleteVersion && version3 < "2019-10-10") { + if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.deleteVersion && version4 < "2019-10-10") { throw RangeError("'version' must be >= '2019-10-10' when providing 'x' permission."); } - if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.permanentDelete && version3 < "2019-10-10") { + if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.permanentDelete && version4 < "2019-10-10") { throw RangeError("'version' must be >= '2019-10-10' when providing 'y' permission."); } - if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.tag && version3 < "2019-12-12") { + if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.tag && version4 < "2019-12-12") { throw RangeError("'version' must be >= '2019-12-12' when providing 't' permission."); } - if (version3 < "2020-02-10" && blobSASSignatureValues.permissions && (blobSASSignatureValues.permissions.move || blobSASSignatureValues.permissions.execute)) { + if (version4 < "2020-02-10" && blobSASSignatureValues.permissions && (blobSASSignatureValues.permissions.move || blobSASSignatureValues.permissions.execute)) { throw RangeError("'version' must be >= '2020-02-10' when providing the 'm' or 'e' permission."); } - if (version3 < "2021-04-10" && blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.filterByTags) { + if (version4 < "2021-04-10" && blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.filterByTags) { throw RangeError("'version' must be >= '2021-04-10' when providing the 'f' permission."); } - if (version3 < "2020-02-10" && (blobSASSignatureValues.preauthorizedAgentObjectId || blobSASSignatureValues.correlationId)) { + if (version4 < "2020-02-10" && (blobSASSignatureValues.preauthorizedAgentObjectId || blobSASSignatureValues.correlationId)) { throw RangeError("'version' must be >= '2020-02-10' when providing 'preauthorizedAgentObjectId' or 'correlationId'."); } - if (blobSASSignatureValues.encryptionScope && version3 < "2020-12-06") { + if (blobSASSignatureValues.encryptionScope && version4 < "2020-12-06") { throw RangeError("'version' must be >= '2020-12-06' when provided 'encryptionScope' in SAS."); } - blobSASSignatureValues.version = version3; + blobSASSignatureValues.version = version4; return blobSASSignatureValues; } @@ -60801,14 +60801,14 @@ function getCacheServiceVersion() { return process.env["ACTIONS_CACHE_SERVICE_V2"] ? "v2" : "v1"; } function getCacheServiceURL() { - const version3 = getCacheServiceVersion(); - switch (version3) { + const version4 = getCacheServiceVersion(); + switch (version4) { case "v1": return process.env["ACTIONS_CACHE_URL"] || process.env["ACTIONS_RESULTS_URL"] || ""; case "v2": return process.env["ACTIONS_RESULTS_URL"] || ""; default: - throw new Error(`Unsupported cache service version: ${version3}`); + throw new Error(`Unsupported cache service version: ${version4}`); } } @@ -60874,10 +60874,10 @@ function createHttpClient() { function reserveCache(key, paths, options) { return __awaiter13(this, void 0, void 0, function* () { const httpClient = createHttpClient(); - const version3 = getCacheVersion(paths, options === null || options === void 0 ? void 0 : options.compressionMethod, options === null || options === void 0 ? void 0 : options.enableCrossOsArchive); + const version4 = getCacheVersion(paths, options === null || options === void 0 ? void 0 : options.compressionMethod, options === null || options === void 0 ? void 0 : options.enableCrossOsArchive); const reserveCacheRequest = { key, - version: version3, + version: version4, cacheSize: options === null || options === void 0 ? void 0 : options.cacheSize }; const response = yield retryTypedResponse("reserveCache", () => __awaiter13(this, void 0, void 0, function* () { @@ -61887,14 +61887,14 @@ function getTarArgs(tarPath_1, compressionMethod_1, type_1) { const args = [`"${tarPath.path}"`]; const cacheFileName = getCacheFileName(compressionMethod); const tarFile = "cache.tar"; - const workingDirectory = getWorkingDirectory(); + const workingDirectory2 = getWorkingDirectory(); const BSD_TAR_ZSTD = tarPath.type === ArchiveToolType.BSD && compressionMethod !== CompressionMethod.Gzip && IS_WINDOWS8; switch (type) { case "create": - args.push("--posix", "-cf", BSD_TAR_ZSTD ? tarFile : cacheFileName.replace(new RegExp(`\\${path9.sep}`, "g"), "/"), "--exclude", BSD_TAR_ZSTD ? tarFile : cacheFileName.replace(new RegExp(`\\${path9.sep}`, "g"), "/"), "-P", "-C", workingDirectory.replace(new RegExp(`\\${path9.sep}`, "g"), "/"), "--files-from", ManifestFilename); + args.push("--posix", "-cf", BSD_TAR_ZSTD ? tarFile : cacheFileName.replace(new RegExp(`\\${path9.sep}`, "g"), "/"), "--exclude", BSD_TAR_ZSTD ? tarFile : cacheFileName.replace(new RegExp(`\\${path9.sep}`, "g"), "/"), "-P", "-C", workingDirectory2.replace(new RegExp(`\\${path9.sep}`, "g"), "/"), "--files-from", ManifestFilename); break; case "extract": - args.push("-xf", BSD_TAR_ZSTD ? tarFile : archivePath.replace(new RegExp(`\\${path9.sep}`, "g"), "/"), "-P", "-C", workingDirectory.replace(new RegExp(`\\${path9.sep}`, "g"), "/")); + args.push("-xf", BSD_TAR_ZSTD ? tarFile : archivePath.replace(new RegExp(`\\${path9.sep}`, "g"), "/"), "-P", "-C", workingDirectory2.replace(new RegExp(`\\${path9.sep}`, "g"), "/")); break; case "list": args.push("-tf", BSD_TAR_ZSTD ? tarFile : archivePath.replace(new RegExp(`\\${path9.sep}`, "g"), "/"), "-P"); @@ -62177,10 +62177,10 @@ function saveCacheV2(paths_1, key_1, options_1) { debug(`File Size: ${archiveFileSize}`); options.archiveSizeBytes = archiveFileSize; debug("Reserving Cache"); - const version3 = getCacheVersion(paths, compressionMethod, enableCrossOsArchive); + const version4 = getCacheVersion(paths, compressionMethod, enableCrossOsArchive); const request = { key, - version: version3 + version: version4 }; let signedUploadUrl; try { @@ -62200,7 +62200,7 @@ function saveCacheV2(paths_1, key_1, options_1) { yield saveCache(cacheId, archivePath, signedUploadUrl, options); const finalizeRequest = { key, - version: version3, + version: version4, sizeBytes: `${archiveFileSize}` }; const finalizeResponse = yield twirpClient.FinalizeCacheEntryUpload(finalizeRequest); @@ -62241,15 +62241,6 @@ function saveCacheV2(paths_1, key_1, options_1) { // src/save-cache.ts var pep440 = __toESM(require_pep440(), 1); -// src/cache/restore-cache.ts -var STATE_CACHE_KEY = "cache-key"; -var STATE_CACHE_MATCHED_KEY = "cache-matched-key"; -var STATE_PYTHON_CACHE_MATCHED_KEY = "python-cache-matched-key"; - -// src/utils/constants.ts -var STATE_UV_PATH = "uv-path"; -var STATE_UV_VERSION = "uv-version"; - // src/utils/inputs.ts var import_node_path = __toESM(require("node:path"), 1); @@ -62956,80 +62947,48 @@ function getConfigValueFromTomlFile(filePath, key) { } // src/utils/inputs.ts -function loadInputs() { - const workingDirectory = getInput("working-directory"); - const version3 = getInput("version"); - const versionFile = getVersionFile(workingDirectory); - const pythonVersion = getInput("python-version"); - const activateEnvironment = getBooleanInput("activate-environment"); - const venvPath = getVenvPath(workingDirectory, activateEnvironment); - const checksum = getInput("checksum"); - const enableCache = getEnableCache(); - const restoreCache2 = getInput("restore-cache") === "true"; - const saveCache4 = getInput("save-cache") === "true"; - const cacheSuffix = getInput("cache-suffix") || ""; - const cacheLocalPath = getCacheLocalPath( - workingDirectory, - versionFile, - enableCache - ); - const cacheDependencyGlob = getCacheDependencyGlob(workingDirectory); - const pruneCache2 = getInput("prune-cache") === "true"; - const cachePython = getInput("cache-python") === "true"; - const ignoreNothingToCache = getInput("ignore-nothing-to-cache") === "true"; - const ignoreEmptyWorkdir = getInput("ignore-empty-workdir") === "true"; - const toolBinDir = getToolBinDir(workingDirectory); - const toolDir = getToolDir(workingDirectory); - const pythonDir = getUvPythonDir(); - const githubToken = getInput("github-token"); - const manifestFile = getManifestFile(); - const addProblemMatchers = getInput("add-problem-matchers") === "true"; - const resolutionStrategy = getResolutionStrategy(); - return { - activateEnvironment, - addProblemMatchers, - cacheDependencyGlob, - cacheLocalPath, - cachePython, - cacheSuffix, - checksum, - enableCache, - githubToken, - ignoreEmptyWorkdir, - ignoreNothingToCache, - manifestFile, - pruneCache: pruneCache2, - pythonDir, - pythonVersion, - resolutionStrategy, - restoreCache: restoreCache2, - saveCache: saveCache4, - toolBinDir, - toolDir, - venvPath, - version: version3, - versionFile, - workingDirectory - }; -} -function getVersionFile(workingDirectory) { +var workingDirectory = getInput("working-directory"); +var version3 = getInput("version"); +var versionFile = getVersionFile(); +var pythonVersion = getInput("python-version"); +var activateEnvironment = getBooleanInput("activate-environment"); +var venvPath = getVenvPath(); +var checkSum = getInput("checksum"); +var enableCache = getEnableCache(); +var restoreCache = getInput("restore-cache") === "true"; +var saveCache3 = getInput("save-cache") === "true"; +var cacheSuffix = getInput("cache-suffix") || ""; +var cacheLocalPath = getCacheLocalPath(); +var cacheDependencyGlob = getCacheDependencyGlob(); +var pruneCache = getInput("prune-cache") === "true"; +var cachePython = getInput("cache-python") === "true"; +var ignoreNothingToCache = getInput("ignore-nothing-to-cache") === "true"; +var ignoreEmptyWorkdir = getInput("ignore-empty-workdir") === "true"; +var toolBinDir = getToolBinDir(); +var toolDir = getToolDir(); +var pythonDir = getUvPythonDir(); +var githubToken = getInput("github-token"); +var manifestFile = getManifestFile(); +var addProblemMatchers = getInput("add-problem-matchers") === "true"; +var resolutionStrategy = getResolutionStrategy(); +function getVersionFile() { const versionFileInput = getInput("version-file"); if (versionFileInput !== "") { const tildeExpanded = expandTilde(versionFileInput); - return resolveRelativePath(workingDirectory, tildeExpanded); + return resolveRelativePath(tildeExpanded); } return versionFileInput; } -function getVenvPath(workingDirectory, activateEnvironment) { +function getVenvPath() { const venvPathInput = getInput("venv-path"); if (venvPathInput !== "") { if (!activateEnvironment) { warning("venv-path is only used when activate-environment is true"); } const tildeExpanded = expandTilde(venvPathInput); - return normalizePath(resolveRelativePath(workingDirectory, tildeExpanded)); + return normalizePath(resolveRelativePath(tildeExpanded)); } - return normalizePath(resolveRelativePath(workingDirectory, ".venv")); + return normalizePath(resolveRelativePath(".venv")); } function getEnableCache() { const enableCacheInput = getInput("enable-cache"); @@ -63038,11 +62997,11 @@ function getEnableCache() { } return enableCacheInput === "true"; } -function getToolBinDir(workingDirectory) { +function getToolBinDir() { const toolBinDirInput = getInput("tool-bin-dir"); if (toolBinDirInput !== "") { const tildeExpanded = expandTilde(toolBinDirInput); - return resolveRelativePath(workingDirectory, tildeExpanded); + return resolveRelativePath(tildeExpanded); } if (process.platform === "win32") { if (process.env.RUNNER_TEMP !== void 0) { @@ -63054,11 +63013,11 @@ function getToolBinDir(workingDirectory) { } return void 0; } -function getToolDir(workingDirectory) { +function getToolDir() { const toolDirInput = getInput("tool-dir"); if (toolDirInput !== "") { const tildeExpanded = expandTilde(toolDirInput); - return resolveRelativePath(workingDirectory, tildeExpanded); + return resolveRelativePath(tildeExpanded); } if (process.platform === "win32") { if (process.env.RUNNER_TEMP !== void 0) { @@ -63070,19 +63029,16 @@ function getToolDir(workingDirectory) { } return void 0; } -function getCacheLocalPath(workingDirectory, versionFile, enableCache) { +function getCacheLocalPath() { const cacheLocalPathInput = getInput("cache-local-path"); if (cacheLocalPathInput !== "") { const tildeExpanded = expandTilde(cacheLocalPathInput); return { - path: resolveRelativePath(workingDirectory, tildeExpanded), + path: resolveRelativePath(tildeExpanded), source: 0 /* Input */ }; } - const cacheDirFromConfig = getCacheDirFromConfig( - workingDirectory, - versionFile - ); + const cacheDirFromConfig = getCacheDirFromConfig(); if (cacheDirFromConfig !== void 0) { return { path: cacheDirFromConfig, source: 1 /* Config */ }; } @@ -63090,7 +63046,7 @@ function getCacheLocalPath(workingDirectory, versionFile, enableCache) { info(`UV_CACHE_DIR is already set to ${process.env.UV_CACHE_DIR}`); return { path: process.env.UV_CACHE_DIR, source: 2 /* Env */ }; } - if (enableCache) { + if (getEnableCache()) { if (process.env.RUNNER_ENVIRONMENT === "github-hosted") { if (process.env.RUNNER_TEMP !== void 0) { return { @@ -63114,9 +63070,9 @@ function getCacheLocalPath(workingDirectory, versionFile, enableCache) { }; } } -function getCacheDirFromConfig(workingDirectory, versionFile) { +function getCacheDirFromConfig() { for (const filePath of [versionFile, "uv.toml", "pyproject.toml"]) { - const resolvedPath = resolveRelativePath(workingDirectory, filePath); + const resolvedPath = resolveRelativePath(filePath); try { const cacheDir = getConfigValueFromTomlFile(resolvedPath, "cache-dir"); if (cacheDir !== void 0) { @@ -63141,8 +63097,9 @@ function getUvPythonDir() { if (process.env.RUNNER_ENVIRONMENT !== "github-hosted") { if (process.platform === "win32") { return `${process.env.APPDATA}${import_node_path.default.sep}uv${import_node_path.default.sep}python`; + } else { + return `${process.env.HOME}${import_node_path.default.sep}.local${import_node_path.default.sep}share${import_node_path.default.sep}uv${import_node_path.default.sep}python`; } - return `${process.env.HOME}${import_node_path.default.sep}.local${import_node_path.default.sep}share${import_node_path.default.sep}uv${import_node_path.default.sep}python`; } if (process.env.RUNNER_TEMP !== void 0) { return `${process.env.RUNNER_TEMP}${import_node_path.default.sep}uv-python-dir`; @@ -63151,10 +63108,10 @@ function getUvPythonDir() { "Could not determine UV_PYTHON_INSTALL_DIR. Please make sure RUNNER_TEMP is set or provide the UV_PYTHON_INSTALL_DIR environment variable" ); } -function getCacheDependencyGlob(workingDirectory) { +function getCacheDependencyGlob() { const cacheDependencyGlobInput = getInput("cache-dependency-glob"); if (cacheDependencyGlobInput !== "") { - return cacheDependencyGlobInput.split("\n").map((part) => part.trim()).map((part) => expandTilde(part)).map((part) => resolveRelativePath(workingDirectory, part)).join("\n"); + return cacheDependencyGlobInput.split("\n").map((part) => part.trim()).map((part) => expandTilde(part)).map((part) => resolveRelativePath(part)).join("\n"); } return cacheDependencyGlobInput; } @@ -63173,7 +63130,7 @@ function normalizePath(inputPath) { } return trimmed; } -function resolveRelativePath(workingDirectory, inputPath) { +function resolveRelativePath(inputPath) { const hasNegation = inputPath.startsWith("!"); const pathWithoutNegation = hasNegation ? inputPath.substring(1) : inputPath; const resolvedPath = import_node_path.default.resolve(workingDirectory, pathWithoutNegation); @@ -63202,13 +63159,21 @@ function getResolutionStrategy() { ); } +// src/cache/restore-cache.ts +var STATE_CACHE_KEY = "cache-key"; +var STATE_CACHE_MATCHED_KEY = "cache-matched-key"; +var STATE_PYTHON_CACHE_MATCHED_KEY = "python-cache-matched-key"; + +// src/utils/constants.ts +var STATE_UV_PATH = "uv-path"; +var STATE_UV_VERSION = "uv-version"; + // src/save-cache.ts async function run() { try { - const inputs = loadInputs(); - if (inputs.enableCache) { - if (inputs.saveCache) { - await saveCache3(inputs); + if (enableCache) { + if (saveCache3) { + await saveCache4(); } else { info("save-cache is false. Skipping save cache step."); } @@ -63220,7 +63185,7 @@ async function run() { setFailed(err.message); } } -async function saveCache3(inputs) { +async function saveCache4() { const cacheKey = getState(STATE_CACHE_KEY); const matchedKey = getState(STATE_CACHE_MATCHED_KEY); if (!cacheKey) { @@ -63230,12 +63195,12 @@ async function saveCache3(inputs) { if (matchedKey === cacheKey) { info(`Cache hit occurred on key ${cacheKey}, not saving cache.`); } else { - if (inputs.pruneCache) { - await pruneCache(); + if (pruneCache) { + await pruneCache2(); } - const actualCachePath = getUvCachePath(inputs); + const actualCachePath = getUvCachePath(); if (!fs7.existsSync(actualCachePath)) { - if (inputs.ignoreNothingToCache) { + if (ignoreNothingToCache) { info( "No cacheable uv cache paths were found. Ignoring because ignore-nothing-to-cache is enabled." ); @@ -63253,23 +63218,23 @@ async function saveCache3(inputs) { ); } } - if (inputs.cachePython) { - if (!fs7.existsSync(inputs.pythonDir)) { + if (cachePython) { + if (!fs7.existsSync(pythonDir)) { warning( - `Python cache path ${inputs.pythonDir} does not exist on disk. Skipping Python cache save because no managed Python installation was found. If you want uv to install managed Python instead of using a system interpreter, set UV_PYTHON_PREFERENCE=only-managed.` + `Python cache path ${pythonDir} does not exist on disk. Skipping Python cache save because no managed Python installation was found. If you want uv to install managed Python instead of using a system interpreter, set UV_PYTHON_PREFERENCE=only-managed.` ); return; } const pythonCacheKey = `${cacheKey}-python`; await saveCacheToKey( pythonCacheKey, - inputs.pythonDir, + pythonDir, STATE_PYTHON_CACHE_MATCHED_KEY, "Python cache" ); } } -async function pruneCache() { +async function pruneCache2() { const forceSupported = pep440.gte(getState(STATE_UV_VERSION), "0.8.24"); const options = { silent: false @@ -63282,19 +63247,19 @@ async function pruneCache() { const uvPath = getState(STATE_UV_PATH); await exec(uvPath, execArgs, options); } -function getUvCachePath(inputs) { - if (inputs.cacheLocalPath === void 0) { +function getUvCachePath() { + if (cacheLocalPath === void 0) { throw new Error( "cache-local-path is not set. Cannot save cache without a valid cache path." ); } - if (process.env.UV_CACHE_DIR && process.env.UV_CACHE_DIR !== inputs.cacheLocalPath.path) { + if (process.env.UV_CACHE_DIR && process.env.UV_CACHE_DIR !== cacheLocalPath.path) { warning( - `The environment variable UV_CACHE_DIR has been changed to "${process.env.UV_CACHE_DIR}", by an action or step running after astral-sh/setup-uv. This can lead to unexpected behavior. If you expected this to happen set the cache-local-path input to "${process.env.UV_CACHE_DIR}" instead of "${inputs.cacheLocalPath.path}".` + `The environment variable UV_CACHE_DIR has been changed to "${process.env.UV_CACHE_DIR}", by an action or step running after astral-sh/setup-uv. This can lead to unexpected behavior. If you expected this to happen set the cache-local-path input to "${process.env.UV_CACHE_DIR}" instead of "${cacheLocalPath.path}".` ); return process.env.UV_CACHE_DIR; } - return inputs.cacheLocalPath.path; + return cacheLocalPath.path; } async function saveCacheToKey(cacheKey, cachePath, stateKey, cacheName) { const matchedKey = getState(stateKey); diff --git a/dist/setup/index.cjs b/dist/setup/index.cjs index 06712a7..4fc9565 100644 --- a/dist/setup/index.cjs +++ b/dist/setup/index.cjs @@ -1491,36 +1491,36 @@ var require_diagnostics = __commonJS({ const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog; diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version4, protocol, port, host } } = evt; debuglog( "connecting to %s using %s%s", `${host}${port ? `:${port}` : ""}`, protocol, - version3 + version4 ); }); diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version4, protocol, port, host } } = evt; debuglog( "connected to %s using %s%s", `${host}${port ? `:${port}` : ""}`, protocol, - version3 + version4 ); }); diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host }, + connectParams: { version: version4, protocol, port, host }, error: error2 } = evt; debuglog( "connection to %s using %s%s errored - %s", `${host}${port ? `:${port}` : ""}`, protocol, - version3, + version4, error2.message ); }); @@ -1569,31 +1569,31 @@ var require_diagnostics = __commonJS({ const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog; diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version4, protocol, port, host } } = evt; debuglog( "connecting to %s%s using %s%s", host, port ? `:${port}` : "", protocol, - version3 + version4 ); }); diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version4, protocol, port, host } } = evt; debuglog( "connected to %s%s using %s%s", host, port ? `:${port}` : "", protocol, - version3 + version4 ); }); diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host }, + connectParams: { version: version4, protocol, port, host }, error: error2 } = evt; debuglog( @@ -1601,7 +1601,7 @@ var require_diagnostics = __commonJS({ host, port ? `:${port}` : "", protocol, - version3, + version4, error2.message ); }); @@ -19561,31 +19561,31 @@ var require_semver = __commonJS({ var parseOptions = require_parse_options(); var { compareIdentifiers } = require_identifiers(); var SemVer = class _SemVer { - constructor(version3, options) { + constructor(version4, options) { options = parseOptions(options); - if (version3 instanceof _SemVer) { - if (version3.loose === !!options.loose && version3.includePrerelease === !!options.includePrerelease) { - return version3; + if (version4 instanceof _SemVer) { + if (version4.loose === !!options.loose && version4.includePrerelease === !!options.includePrerelease) { + return version4; } else { - version3 = version3.version; + version4 = version4.version; } - } else if (typeof version3 !== "string") { - throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version3}".`); + } else if (typeof version4 !== "string") { + throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version4}".`); } - if (version3.length > MAX_LENGTH) { + if (version4.length > MAX_LENGTH) { throw new TypeError( `version is longer than ${MAX_LENGTH} characters` ); } - debug2("SemVer", version3, options); + debug2("SemVer", version4, options); this.options = options; this.loose = !!options.loose; this.includePrerelease = !!options.includePrerelease; - const m = version3.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]); + const m = version4.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]); if (!m) { - throw new TypeError(`Invalid Version: ${version3}`); + throw new TypeError(`Invalid Version: ${version4}`); } - this.raw = version3; + this.raw = version4; this.major = +m[1]; this.minor = +m[2]; this.patch = +m[3]; @@ -19835,12 +19835,12 @@ var require_parse2 = __commonJS({ "node_modules/@actions/cache/node_modules/semver/functions/parse.js"(exports2, module2) { "use strict"; var SemVer = require_semver(); - var parse3 = (version3, options, throwErrors = false) => { - if (version3 instanceof SemVer) { - return version3; + var parse3 = (version4, options, throwErrors = false) => { + if (version4 instanceof SemVer) { + return version4; } try { - return new SemVer(version3, options); + return new SemVer(version4, options); } catch (er) { if (!throwErrors) { return null; @@ -19857,8 +19857,8 @@ var require_valid = __commonJS({ "node_modules/@actions/cache/node_modules/semver/functions/valid.js"(exports2, module2) { "use strict"; var parse3 = require_parse2(); - var valid2 = (version3, options) => { - const v = parse3(version3, options); + var valid2 = (version4, options) => { + const v = parse3(version4, options); return v ? v.version : null; }; module2.exports = valid2; @@ -19870,8 +19870,8 @@ var require_clean = __commonJS({ "node_modules/@actions/cache/node_modules/semver/functions/clean.js"(exports2, module2) { "use strict"; var parse3 = require_parse2(); - var clean3 = (version3, options) => { - const s = parse3(version3.trim().replace(/^[=v]+/, ""), options); + var clean3 = (version4, options) => { + const s = parse3(version4.trim().replace(/^[=v]+/, ""), options); return s ? s.version : null; }; module2.exports = clean3; @@ -19883,7 +19883,7 @@ var require_inc = __commonJS({ "node_modules/@actions/cache/node_modules/semver/functions/inc.js"(exports2, module2) { "use strict"; var SemVer = require_semver(); - var inc = (version3, release, options, identifier, identifierBase) => { + var inc = (version4, release, options, identifier, identifierBase) => { if (typeof options === "string") { identifierBase = identifier; identifier = options; @@ -19891,7 +19891,7 @@ var require_inc = __commonJS({ } try { return new SemVer( - version3 instanceof SemVer ? version3.version : version3, + version4 instanceof SemVer ? version4.version : version4, options ).inc(release, identifier, identifierBase).version; } catch (er) { @@ -19981,8 +19981,8 @@ var require_prerelease = __commonJS({ "node_modules/@actions/cache/node_modules/semver/functions/prerelease.js"(exports2, module2) { "use strict"; var parse3 = require_parse2(); - var prerelease = (version3, options) => { - const parsed = parse3(version3, options); + var prerelease = (version4, options) => { + const parsed = parse3(version4, options); return parsed && parsed.prerelease.length ? parsed.prerelease : null; }; module2.exports = prerelease; @@ -20058,8 +20058,8 @@ var require_gt = __commonJS({ "node_modules/@actions/cache/node_modules/semver/functions/gt.js"(exports2, module2) { "use strict"; var compare = require_compare(); - var gt2 = (a, b, loose) => compare(a, b, loose) > 0; - module2.exports = gt2; + var gt3 = (a, b, loose) => compare(a, b, loose) > 0; + module2.exports = gt3; } }); @@ -20119,7 +20119,7 @@ var require_cmp = __commonJS({ "use strict"; var eq = require_eq(); var neq = require_neq(); - var gt2 = require_gt(); + var gt3 = require_gt(); var gte = require_gte(); var lt = require_lt(); var lte = require_lte(); @@ -20148,7 +20148,7 @@ var require_cmp = __commonJS({ case "!=": return neq(a, b, loose); case ">": - return gt2(a, b, loose); + return gt3(a, b, loose); case ">=": return gte(a, b, loose); case "<": @@ -20170,24 +20170,24 @@ var require_coerce = __commonJS({ var SemVer = require_semver(); var parse3 = require_parse2(); var { safeRe: re, t } = require_re(); - var coerce = (version3, options) => { - if (version3 instanceof SemVer) { - return version3; + var coerce = (version4, options) => { + if (version4 instanceof SemVer) { + return version4; } - if (typeof version3 === "number") { - version3 = String(version3); + if (typeof version4 === "number") { + version4 = String(version4); } - if (typeof version3 !== "string") { + if (typeof version4 !== "string") { return null; } options = options || {}; let match2 = null; if (!options.rtl) { - match2 = version3.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]); + match2 = version4.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]); } else { const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]; let next; - while ((next = coerceRtlRegex.exec(version3)) && (!match2 || match2.index + match2[0].length !== version3.length)) { + while ((next = coerceRtlRegex.exec(version4)) && (!match2 || match2.index + match2[0].length !== version4.length)) { if (!match2 || next.index + next[0].length !== match2.index + match2[0].length) { match2 = next; } @@ -20371,19 +20371,19 @@ var require_range = __commonJS({ }); } // if ANY of the sets match ALL of its comparators, then pass - test(version3) { - if (!version3) { + test(version4) { + if (!version4) { return false; } - if (typeof version3 === "string") { + if (typeof version4 === "string") { try { - version3 = new SemVer(version3, this.options); + version4 = new SemVer(version4, this.options); } catch (er) { return false; } } for (let i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version3, this.options)) { + if (testSet(this.set[i], version4, this.options)) { return true; } } @@ -20598,13 +20598,13 @@ var require_range = __commonJS({ } return `${from} ${to}`.trim(); }; - var testSet = (set, version3, options) => { + var testSet = (set, version4, options) => { for (let i = 0; i < set.length; i++) { - if (!set[i].test(version3)) { + if (!set[i].test(version4)) { return false; } } - if (version3.prerelease.length && !options.includePrerelease) { + if (version4.prerelease.length && !options.includePrerelease) { for (let i = 0; i < set.length; i++) { debug2(set[i].semver); if (set[i].semver === Comparator.ANY) { @@ -20612,7 +20612,7 @@ var require_range = __commonJS({ } if (set[i].semver.prerelease.length > 0) { const allowed = set[i].semver; - if (allowed.major === version3.major && allowed.minor === version3.minor && allowed.patch === version3.patch) { + if (allowed.major === version4.major && allowed.minor === version4.minor && allowed.patch === version4.patch) { return true; } } @@ -20673,19 +20673,19 @@ var require_comparator = __commonJS({ toString() { return this.value; } - test(version3) { - debug2("Comparator.test", version3, this.options.loose); - if (this.semver === ANY || version3 === ANY) { + test(version4) { + debug2("Comparator.test", version4, this.options.loose); + if (this.semver === ANY || version4 === ANY) { return true; } - if (typeof version3 === "string") { + if (typeof version4 === "string") { try { - version3 = new SemVer(version3, this.options); + version4 = new SemVer(version4, this.options); } catch (er) { return false; } } - return cmp(version3, this.operator, this.semver, this.options); + return cmp(version4, this.operator, this.semver, this.options); } intersects(comp26, options) { if (!(comp26 instanceof _Comparator)) { @@ -20742,13 +20742,13 @@ var require_satisfies = __commonJS({ "node_modules/@actions/cache/node_modules/semver/functions/satisfies.js"(exports2, module2) { "use strict"; var Range = require_range(); - var satisfies4 = (version3, range2, options) => { + var satisfies4 = (version4, range2, options) => { try { range2 = new Range(range2, options); } catch (er) { return false; } - return range2.test(version3); + return range2.test(version4); }; module2.exports = satisfies4; } @@ -20828,7 +20828,7 @@ var require_min_version = __commonJS({ "use strict"; var SemVer = require_semver(); var Range = require_range(); - var gt2 = require_gt(); + var gt3 = require_gt(); var minVersion = (range2, loose) => { range2 = new Range(range2, loose); let minver = new SemVer("0.0.0"); @@ -20856,7 +20856,7 @@ var require_min_version = __commonJS({ /* fallthrough */ case "": case ">=": - if (!setMin || gt2(compver, setMin)) { + if (!setMin || gt3(compver, setMin)) { setMin = compver; } break; @@ -20868,7 +20868,7 @@ var require_min_version = __commonJS({ throw new Error(`Unexpected operation: ${comparator.operator}`); } }); - if (setMin && (!minver || gt2(minver, setMin))) { + if (setMin && (!minver || gt3(minver, setMin))) { minver = setMin; } } @@ -20906,17 +20906,17 @@ var require_outside = __commonJS({ var { ANY } = Comparator; var Range = require_range(); var satisfies4 = require_satisfies(); - var gt2 = require_gt(); + var gt3 = require_gt(); var lt = require_lt(); var lte = require_lte(); var gte = require_gte(); - var outside = (version3, range2, hilo, options) => { - version3 = new SemVer(version3, options); + var outside = (version4, range2, hilo, options) => { + version4 = new SemVer(version4, options); range2 = new Range(range2, options); let gtfn, ltefn, ltfn, comp26, ecomp; switch (hilo) { case ">": - gtfn = gt2; + gtfn = gt3; ltefn = lte; ltfn = lt; comp26 = ">"; @@ -20925,14 +20925,14 @@ var require_outside = __commonJS({ case "<": gtfn = lt; ltefn = gte; - ltfn = gt2; + ltfn = gt3; comp26 = "<"; ecomp = "<="; break; default: throw new TypeError('Must provide a hilo val of "<" or ">"'); } - if (satisfies4(version3, range2, options)) { + if (satisfies4(version4, range2, options)) { return false; } for (let i = 0; i < range2.set.length; ++i) { @@ -20954,9 +20954,9 @@ var require_outside = __commonJS({ if (high.operator === comp26 || high.operator === ecomp) { return false; } - if ((!low.operator || low.operator === comp26) && ltefn(version3, low.semver)) { + if ((!low.operator || low.operator === comp26) && ltefn(version4, low.semver)) { return false; - } else if (low.operator === ecomp && ltfn(version3, low.semver)) { + } else if (low.operator === ecomp && ltfn(version4, low.semver)) { return false; } } @@ -20971,7 +20971,7 @@ var require_gtr = __commonJS({ "node_modules/@actions/cache/node_modules/semver/ranges/gtr.js"(exports2, module2) { "use strict"; var outside = require_outside(); - var gtr = (version3, range2, options) => outside(version3, range2, ">", options); + var gtr = (version4, range2, options) => outside(version4, range2, ">", options); module2.exports = gtr; } }); @@ -20981,7 +20981,7 @@ var require_ltr = __commonJS({ "node_modules/@actions/cache/node_modules/semver/ranges/ltr.js"(exports2, module2) { "use strict"; var outside = require_outside(); - var ltr = (version3, range2, options) => outside(version3, range2, "<", options); + var ltr = (version4, range2, options) => outside(version4, range2, "<", options); module2.exports = ltr; } }); @@ -21011,12 +21011,12 @@ var require_simplify = __commonJS({ let first = null; let prev = null; const v = versions.sort((a, b) => compare(a, b, options)); - for (const version3 of v) { - const included = satisfies4(version3, range2, options); + for (const version4 of v) { + const included = satisfies4(version4, range2, options); if (included) { - prev = version3; + prev = version4; if (!first) { - first = version3; + first = version4; } } else { if (prev) { @@ -21103,10 +21103,10 @@ var require_subset = __commonJS({ } } const eqSet = /* @__PURE__ */ new Set(); - let gt2, lt; + let gt3, lt; for (const c of sub) { if (c.operator === ">" || c.operator === ">=") { - gt2 = higherGT(gt2, c, options); + gt3 = higherGT(gt3, c, options); } else if (c.operator === "<" || c.operator === "<=") { lt = lowerLT(lt, c, options); } else { @@ -21117,16 +21117,16 @@ var require_subset = __commonJS({ return null; } let gtltComp; - if (gt2 && lt) { - gtltComp = compare(gt2.semver, lt.semver, options); + if (gt3 && lt) { + gtltComp = compare(gt3.semver, lt.semver, options); if (gtltComp > 0) { return null; - } else if (gtltComp === 0 && (gt2.operator !== ">=" || lt.operator !== "<=")) { + } else if (gtltComp === 0 && (gt3.operator !== ">=" || lt.operator !== "<=")) { return null; } } for (const eq of eqSet) { - if (gt2 && !satisfies4(eq, String(gt2), options)) { + if (gt3 && !satisfies4(eq, String(gt3), options)) { return null; } if (lt && !satisfies4(eq, String(lt), options)) { @@ -21142,25 +21142,25 @@ var require_subset = __commonJS({ let higher, lower; let hasDomLT, hasDomGT; let needDomLTPre = lt && !options.includePrerelease && lt.semver.prerelease.length ? lt.semver : false; - let needDomGTPre = gt2 && !options.includePrerelease && gt2.semver.prerelease.length ? gt2.semver : false; + let needDomGTPre = gt3 && !options.includePrerelease && gt3.semver.prerelease.length ? gt3.semver : false; if (needDomLTPre && needDomLTPre.prerelease.length === 1 && lt.operator === "<" && needDomLTPre.prerelease[0] === 0) { needDomLTPre = false; } for (const c of dom) { hasDomGT = hasDomGT || c.operator === ">" || c.operator === ">="; hasDomLT = hasDomLT || c.operator === "<" || c.operator === "<="; - if (gt2) { + if (gt3) { if (needDomGTPre) { if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomGTPre.major && c.semver.minor === needDomGTPre.minor && c.semver.patch === needDomGTPre.patch) { needDomGTPre = false; } } if (c.operator === ">" || c.operator === ">=") { - higher = higherGT(gt2, c, options); - if (higher === c && higher !== gt2) { + higher = higherGT(gt3, c, options); + if (higher === c && higher !== gt3) { return false; } - } else if (gt2.operator === ">=" && !satisfies4(gt2.semver, String(c), options)) { + } else if (gt3.operator === ">=" && !satisfies4(gt3.semver, String(c), options)) { return false; } } @@ -21179,14 +21179,14 @@ var require_subset = __commonJS({ return false; } } - if (!c.operator && (lt || gt2) && gtltComp !== 0) { + if (!c.operator && (lt || gt3) && gtltComp !== 0) { return false; } } - if (gt2 && hasDomLT && !lt && gtltComp !== 0) { + if (gt3 && hasDomLT && !lt && gtltComp !== 0) { return false; } - if (lt && hasDomGT && !gt2 && gtltComp !== 0) { + if (lt && hasDomGT && !gt3 && gtltComp !== 0) { return false; } if (needDomGTPre || needDomLTPre) { @@ -21235,7 +21235,7 @@ var require_semver2 = __commonJS({ var compareBuild = require_compare_build(); var sort = require_sort(); var rsort = require_rsort(); - var gt2 = require_gt(); + var gt3 = require_gt(); var lt = require_lt(); var eq = require_eq(); var neq = require_neq(); @@ -21273,7 +21273,7 @@ var require_semver2 = __commonJS({ compareBuild, sort, rsort, - gt: gt2, + gt: gt3, lt, eq, neq, @@ -21839,10 +21839,10 @@ var require_supports_color = __commonJS({ return 3; } if ("TERM_PROGRAM" in env) { - const version3 = parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10); + const version4 = parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10); switch (env.TERM_PROGRAM) { case "iTerm.app": - return version3 >= 3 ? 3 : 2; + return version4 >= 3 ? 3 : 2; case "Apple_Terminal": return 2; } @@ -27171,31 +27171,31 @@ var require_semver3 = __commonJS({ var parseOptions = require_parse_options2(); var { compareIdentifiers } = require_identifiers2(); var SemVer = class _SemVer { - constructor(version3, options) { + constructor(version4, options) { options = parseOptions(options); - if (version3 instanceof _SemVer) { - if (version3.loose === !!options.loose && version3.includePrerelease === !!options.includePrerelease) { - return version3; + if (version4 instanceof _SemVer) { + if (version4.loose === !!options.loose && version4.includePrerelease === !!options.includePrerelease) { + return version4; } else { - version3 = version3.version; + version4 = version4.version; } - } else if (typeof version3 !== "string") { - throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version3}".`); + } else if (typeof version4 !== "string") { + throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version4}".`); } - if (version3.length > MAX_LENGTH) { + if (version4.length > MAX_LENGTH) { throw new TypeError( `version is longer than ${MAX_LENGTH} characters` ); } - debug2("SemVer", version3, options); + debug2("SemVer", version4, options); this.options = options; this.loose = !!options.loose; this.includePrerelease = !!options.includePrerelease; - const m = version3.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]); + const m = version4.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]); if (!m) { - throw new TypeError(`Invalid Version: ${version3}`); + throw new TypeError(`Invalid Version: ${version4}`); } - this.raw = version3; + this.raw = version4; this.major = +m[1]; this.minor = +m[2]; this.patch = +m[3]; @@ -27445,12 +27445,12 @@ var require_parse3 = __commonJS({ "node_modules/@actions/tool-cache/node_modules/semver/functions/parse.js"(exports2, module2) { "use strict"; var SemVer = require_semver3(); - var parse3 = (version3, options, throwErrors = false) => { - if (version3 instanceof SemVer) { - return version3; + var parse3 = (version4, options, throwErrors = false) => { + if (version4 instanceof SemVer) { + return version4; } try { - return new SemVer(version3, options); + return new SemVer(version4, options); } catch (er) { if (!throwErrors) { return null; @@ -27467,8 +27467,8 @@ var require_valid3 = __commonJS({ "node_modules/@actions/tool-cache/node_modules/semver/functions/valid.js"(exports2, module2) { "use strict"; var parse3 = require_parse3(); - var valid2 = (version3, options) => { - const v = parse3(version3, options); + var valid2 = (version4, options) => { + const v = parse3(version4, options); return v ? v.version : null; }; module2.exports = valid2; @@ -27480,8 +27480,8 @@ var require_clean2 = __commonJS({ "node_modules/@actions/tool-cache/node_modules/semver/functions/clean.js"(exports2, module2) { "use strict"; var parse3 = require_parse3(); - var clean3 = (version3, options) => { - const s = parse3(version3.trim().replace(/^[=v]+/, ""), options); + var clean3 = (version4, options) => { + const s = parse3(version4.trim().replace(/^[=v]+/, ""), options); return s ? s.version : null; }; module2.exports = clean3; @@ -27493,7 +27493,7 @@ var require_inc2 = __commonJS({ "node_modules/@actions/tool-cache/node_modules/semver/functions/inc.js"(exports2, module2) { "use strict"; var SemVer = require_semver3(); - var inc = (version3, release, options, identifier, identifierBase) => { + var inc = (version4, release, options, identifier, identifierBase) => { if (typeof options === "string") { identifierBase = identifier; identifier = options; @@ -27501,7 +27501,7 @@ var require_inc2 = __commonJS({ } try { return new SemVer( - version3 instanceof SemVer ? version3.version : version3, + version4 instanceof SemVer ? version4.version : version4, options ).inc(release, identifier, identifierBase).version; } catch (er) { @@ -27591,8 +27591,8 @@ var require_prerelease2 = __commonJS({ "node_modules/@actions/tool-cache/node_modules/semver/functions/prerelease.js"(exports2, module2) { "use strict"; var parse3 = require_parse3(); - var prerelease = (version3, options) => { - const parsed = parse3(version3, options); + var prerelease = (version4, options) => { + const parsed = parse3(version4, options); return parsed && parsed.prerelease.length ? parsed.prerelease : null; }; module2.exports = prerelease; @@ -27668,8 +27668,8 @@ var require_gt2 = __commonJS({ "node_modules/@actions/tool-cache/node_modules/semver/functions/gt.js"(exports2, module2) { "use strict"; var compare = require_compare2(); - var gt2 = (a, b, loose) => compare(a, b, loose) > 0; - module2.exports = gt2; + var gt3 = (a, b, loose) => compare(a, b, loose) > 0; + module2.exports = gt3; } }); @@ -27729,7 +27729,7 @@ var require_cmp2 = __commonJS({ "use strict"; var eq = require_eq2(); var neq = require_neq2(); - var gt2 = require_gt2(); + var gt3 = require_gt2(); var gte = require_gte2(); var lt = require_lt2(); var lte = require_lte2(); @@ -27758,7 +27758,7 @@ var require_cmp2 = __commonJS({ case "!=": return neq(a, b, loose); case ">": - return gt2(a, b, loose); + return gt3(a, b, loose); case ">=": return gte(a, b, loose); case "<": @@ -27780,24 +27780,24 @@ var require_coerce2 = __commonJS({ var SemVer = require_semver3(); var parse3 = require_parse3(); var { safeRe: re, t } = require_re2(); - var coerce = (version3, options) => { - if (version3 instanceof SemVer) { - return version3; + var coerce = (version4, options) => { + if (version4 instanceof SemVer) { + return version4; } - if (typeof version3 === "number") { - version3 = String(version3); + if (typeof version4 === "number") { + version4 = String(version4); } - if (typeof version3 !== "string") { + if (typeof version4 !== "string") { return null; } options = options || {}; let match2 = null; if (!options.rtl) { - match2 = version3.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]); + match2 = version4.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]); } else { const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]; let next; - while ((next = coerceRtlRegex.exec(version3)) && (!match2 || match2.index + match2[0].length !== version3.length)) { + while ((next = coerceRtlRegex.exec(version4)) && (!match2 || match2.index + match2[0].length !== version4.length)) { if (!match2 || next.index + next[0].length !== match2.index + match2[0].length) { match2 = next; } @@ -27981,19 +27981,19 @@ var require_range2 = __commonJS({ }); } // if ANY of the sets match ALL of its comparators, then pass - test(version3) { - if (!version3) { + test(version4) { + if (!version4) { return false; } - if (typeof version3 === "string") { + if (typeof version4 === "string") { try { - version3 = new SemVer(version3, this.options); + version4 = new SemVer(version4, this.options); } catch (er) { return false; } } for (let i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version3, this.options)) { + if (testSet(this.set[i], version4, this.options)) { return true; } } @@ -28208,13 +28208,13 @@ var require_range2 = __commonJS({ } return `${from} ${to}`.trim(); }; - var testSet = (set, version3, options) => { + var testSet = (set, version4, options) => { for (let i = 0; i < set.length; i++) { - if (!set[i].test(version3)) { + if (!set[i].test(version4)) { return false; } } - if (version3.prerelease.length && !options.includePrerelease) { + if (version4.prerelease.length && !options.includePrerelease) { for (let i = 0; i < set.length; i++) { debug2(set[i].semver); if (set[i].semver === Comparator.ANY) { @@ -28222,7 +28222,7 @@ var require_range2 = __commonJS({ } if (set[i].semver.prerelease.length > 0) { const allowed = set[i].semver; - if (allowed.major === version3.major && allowed.minor === version3.minor && allowed.patch === version3.patch) { + if (allowed.major === version4.major && allowed.minor === version4.minor && allowed.patch === version4.patch) { return true; } } @@ -28283,19 +28283,19 @@ var require_comparator2 = __commonJS({ toString() { return this.value; } - test(version3) { - debug2("Comparator.test", version3, this.options.loose); - if (this.semver === ANY || version3 === ANY) { + test(version4) { + debug2("Comparator.test", version4, this.options.loose); + if (this.semver === ANY || version4 === ANY) { return true; } - if (typeof version3 === "string") { + if (typeof version4 === "string") { try { - version3 = new SemVer(version3, this.options); + version4 = new SemVer(version4, this.options); } catch (er) { return false; } } - return cmp(version3, this.operator, this.semver, this.options); + return cmp(version4, this.operator, this.semver, this.options); } intersects(comp26, options) { if (!(comp26 instanceof _Comparator)) { @@ -28352,13 +28352,13 @@ var require_satisfies2 = __commonJS({ "node_modules/@actions/tool-cache/node_modules/semver/functions/satisfies.js"(exports2, module2) { "use strict"; var Range = require_range2(); - var satisfies4 = (version3, range2, options) => { + var satisfies4 = (version4, range2, options) => { try { range2 = new Range(range2, options); } catch (er) { return false; } - return range2.test(version3); + return range2.test(version4); }; module2.exports = satisfies4; } @@ -28438,7 +28438,7 @@ var require_min_version2 = __commonJS({ "use strict"; var SemVer = require_semver3(); var Range = require_range2(); - var gt2 = require_gt2(); + var gt3 = require_gt2(); var minVersion = (range2, loose) => { range2 = new Range(range2, loose); let minver = new SemVer("0.0.0"); @@ -28466,7 +28466,7 @@ var require_min_version2 = __commonJS({ /* fallthrough */ case "": case ">=": - if (!setMin || gt2(compver, setMin)) { + if (!setMin || gt3(compver, setMin)) { setMin = compver; } break; @@ -28478,7 +28478,7 @@ var require_min_version2 = __commonJS({ throw new Error(`Unexpected operation: ${comparator.operator}`); } }); - if (setMin && (!minver || gt2(minver, setMin))) { + if (setMin && (!minver || gt3(minver, setMin))) { minver = setMin; } } @@ -28516,17 +28516,17 @@ var require_outside2 = __commonJS({ var { ANY } = Comparator; var Range = require_range2(); var satisfies4 = require_satisfies2(); - var gt2 = require_gt2(); + var gt3 = require_gt2(); var lt = require_lt2(); var lte = require_lte2(); var gte = require_gte2(); - var outside = (version3, range2, hilo, options) => { - version3 = new SemVer(version3, options); + var outside = (version4, range2, hilo, options) => { + version4 = new SemVer(version4, options); range2 = new Range(range2, options); let gtfn, ltefn, ltfn, comp26, ecomp; switch (hilo) { case ">": - gtfn = gt2; + gtfn = gt3; ltefn = lte; ltfn = lt; comp26 = ">"; @@ -28535,14 +28535,14 @@ var require_outside2 = __commonJS({ case "<": gtfn = lt; ltefn = gte; - ltfn = gt2; + ltfn = gt3; comp26 = "<"; ecomp = "<="; break; default: throw new TypeError('Must provide a hilo val of "<" or ">"'); } - if (satisfies4(version3, range2, options)) { + if (satisfies4(version4, range2, options)) { return false; } for (let i = 0; i < range2.set.length; ++i) { @@ -28564,9 +28564,9 @@ var require_outside2 = __commonJS({ if (high.operator === comp26 || high.operator === ecomp) { return false; } - if ((!low.operator || low.operator === comp26) && ltefn(version3, low.semver)) { + if ((!low.operator || low.operator === comp26) && ltefn(version4, low.semver)) { return false; - } else if (low.operator === ecomp && ltfn(version3, low.semver)) { + } else if (low.operator === ecomp && ltfn(version4, low.semver)) { return false; } } @@ -28581,7 +28581,7 @@ var require_gtr2 = __commonJS({ "node_modules/@actions/tool-cache/node_modules/semver/ranges/gtr.js"(exports2, module2) { "use strict"; var outside = require_outside2(); - var gtr = (version3, range2, options) => outside(version3, range2, ">", options); + var gtr = (version4, range2, options) => outside(version4, range2, ">", options); module2.exports = gtr; } }); @@ -28591,7 +28591,7 @@ var require_ltr2 = __commonJS({ "node_modules/@actions/tool-cache/node_modules/semver/ranges/ltr.js"(exports2, module2) { "use strict"; var outside = require_outside2(); - var ltr = (version3, range2, options) => outside(version3, range2, "<", options); + var ltr = (version4, range2, options) => outside(version4, range2, "<", options); module2.exports = ltr; } }); @@ -28621,12 +28621,12 @@ var require_simplify2 = __commonJS({ let first = null; let prev = null; const v = versions.sort((a, b) => compare(a, b, options)); - for (const version3 of v) { - const included = satisfies4(version3, range2, options); + for (const version4 of v) { + const included = satisfies4(version4, range2, options); if (included) { - prev = version3; + prev = version4; if (!first) { - first = version3; + first = version4; } } else { if (prev) { @@ -28713,10 +28713,10 @@ var require_subset2 = __commonJS({ } } const eqSet = /* @__PURE__ */ new Set(); - let gt2, lt; + let gt3, lt; for (const c of sub) { if (c.operator === ">" || c.operator === ">=") { - gt2 = higherGT(gt2, c, options); + gt3 = higherGT(gt3, c, options); } else if (c.operator === "<" || c.operator === "<=") { lt = lowerLT(lt, c, options); } else { @@ -28727,16 +28727,16 @@ var require_subset2 = __commonJS({ return null; } let gtltComp; - if (gt2 && lt) { - gtltComp = compare(gt2.semver, lt.semver, options); + if (gt3 && lt) { + gtltComp = compare(gt3.semver, lt.semver, options); if (gtltComp > 0) { return null; - } else if (gtltComp === 0 && (gt2.operator !== ">=" || lt.operator !== "<=")) { + } else if (gtltComp === 0 && (gt3.operator !== ">=" || lt.operator !== "<=")) { return null; } } for (const eq of eqSet) { - if (gt2 && !satisfies4(eq, String(gt2), options)) { + if (gt3 && !satisfies4(eq, String(gt3), options)) { return null; } if (lt && !satisfies4(eq, String(lt), options)) { @@ -28752,25 +28752,25 @@ var require_subset2 = __commonJS({ let higher, lower; let hasDomLT, hasDomGT; let needDomLTPre = lt && !options.includePrerelease && lt.semver.prerelease.length ? lt.semver : false; - let needDomGTPre = gt2 && !options.includePrerelease && gt2.semver.prerelease.length ? gt2.semver : false; + let needDomGTPre = gt3 && !options.includePrerelease && gt3.semver.prerelease.length ? gt3.semver : false; if (needDomLTPre && needDomLTPre.prerelease.length === 1 && lt.operator === "<" && needDomLTPre.prerelease[0] === 0) { needDomLTPre = false; } for (const c of dom) { hasDomGT = hasDomGT || c.operator === ">" || c.operator === ">="; hasDomLT = hasDomLT || c.operator === "<" || c.operator === "<="; - if (gt2) { + if (gt3) { if (needDomGTPre) { if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomGTPre.major && c.semver.minor === needDomGTPre.minor && c.semver.patch === needDomGTPre.patch) { needDomGTPre = false; } } if (c.operator === ">" || c.operator === ">=") { - higher = higherGT(gt2, c, options); - if (higher === c && higher !== gt2) { + higher = higherGT(gt3, c, options); + if (higher === c && higher !== gt3) { return false; } - } else if (gt2.operator === ">=" && !satisfies4(gt2.semver, String(c), options)) { + } else if (gt3.operator === ">=" && !satisfies4(gt3.semver, String(c), options)) { return false; } } @@ -28789,14 +28789,14 @@ var require_subset2 = __commonJS({ return false; } } - if (!c.operator && (lt || gt2) && gtltComp !== 0) { + if (!c.operator && (lt || gt3) && gtltComp !== 0) { return false; } } - if (gt2 && hasDomLT && !lt && gtltComp !== 0) { + if (gt3 && hasDomLT && !lt && gtltComp !== 0) { return false; } - if (lt && hasDomGT && !gt2 && gtltComp !== 0) { + if (lt && hasDomGT && !gt3 && gtltComp !== 0) { return false; } if (needDomGTPre || needDomLTPre) { @@ -28845,7 +28845,7 @@ var require_semver4 = __commonJS({ var compareBuild = require_compare_build2(); var sort = require_sort2(); var rsort = require_rsort2(); - var gt2 = require_gt2(); + var gt3 = require_gt2(); var lt = require_lt2(); var eq = require_eq2(); var neq = require_neq2(); @@ -28883,7 +28883,7 @@ var require_semver4 = __commonJS({ compareBuild, sort, rsort, - gt: gt2, + gt: gt3, lt, eq, neq, @@ -28989,15 +28989,15 @@ var require_version = __commonJS({ stringify: stringify2 }; var validRegex = new RegExp("^" + VERSION_PATTERN + "$", "i"); - function valid2(version3) { - return validRegex.test(version3) ? version3 : null; + function valid2(version4) { + return validRegex.test(version4) ? version4 : null; } var cleanRegex = new RegExp("^\\s*" + VERSION_PATTERN + "\\s*$", "i"); - function clean3(version3) { - return stringify2(parse3(version3, cleanRegex)); + function clean3(version4) { + return stringify2(parse3(version4, cleanRegex)); } - function parse3(version3, regex) { - const { groups } = (regex || validRegex).exec(version3) || {}; + function parse3(version4, regex) { + const { groups } = (regex || validRegex).exec(version4) || {}; if (!groups) { return null; } @@ -29071,8 +29071,8 @@ var require_version = __commonJS({ } return null; } - function explain(version3) { - const parsed = parse3(version3); + function explain(version4) { + const parsed = parse3(version4); if (!parsed) { return parsed; } @@ -29114,45 +29114,45 @@ var require_operator = __commonJS({ eq, ne, ge, - gt: gt2, + gt: gt3, "<": lt, "<=": le, "==": eq, "!=": ne, ">=": ge, - ">": gt2, + ">": gt3, "===": arbitrary }; - function lt(version3, other) { - return compare(version3, other) < 0; + function lt(version4, other) { + return compare(version4, other) < 0; } - function le(version3, other) { - return compare(version3, other) <= 0; + function le(version4, other) { + return compare(version4, other) <= 0; } - function eq(version3, other) { - return compare(version3, other) === 0; + function eq(version4, other) { + return compare(version4, other) === 0; } - function ne(version3, other) { - return compare(version3, other) !== 0; + function ne(version4, other) { + return compare(version4, other) !== 0; } - function ge(version3, other) { - return compare(version3, other) >= 0; + function ge(version4, other) { + return compare(version4, other) >= 0; } - function gt2(version3, other) { - return compare(version3, other) > 0; + function gt3(version4, other) { + return compare(version4, other) > 0; } - function arbitrary(version3, other) { - return version3.toLowerCase() === other.toLowerCase(); + function arbitrary(version4, other) { + return version4.toLowerCase() === other.toLowerCase(); } - function compare(version3, other) { - const parsedVersion = parse3(version3); + function compare(version4, other) { + const parsedVersion = parse3(version4); const parsedOther = parse3(other); const keyVersion = calculateKey(parsedVersion); const keyOther = calculateKey(parsedOther); return pyCompare(keyVersion, keyOther); } - function rcompare(version3, other) { - return -compare(version3, other); + function rcompare(version4, other) { + return -compare(version4, other); } function pyCompare(elemIn, otherIn) { let elem = elemIn; @@ -29246,9 +29246,9 @@ var require_specifier = __commonJS({ return null; } let { ...spec } = groups; - const { operator, version: version3, prefix: prefix2, legacy } = groups; - if (version3) { - spec = { ...spec, ...explainVersion(version3) }; + const { operator, version: version4, prefix: prefix2, legacy } = groups; + if (version4) { + spec = { ...spec, ...explainVersion(version4) }; if (operator === "~=") { if (spec.release.length < 2) { return null; @@ -29293,8 +29293,8 @@ var require_specifier = __commonJS({ if (!parsed) { return []; } - return versions.filter((version3) => { - const explained = explainVersion(version3); + return versions.filter((version4) => { + const explained = explainVersion(version4); if (!parsed.length) { return explained && !(explained.is_prerelease && !options.prereleases); } @@ -29302,12 +29302,12 @@ var require_specifier = __commonJS({ if (!pass) { return false; } - return contains({ ...spec, ...options }, { version: version3, explained }); + return contains({ ...spec, ...options }, { version: version4, explained }); }, true); }); } - function satisfies4(version3, specifier, options = {}) { - const filtered = pick([version3], specifier, options); + function satisfies4(version4, specifier, options = {}) { + const filtered = pick([version4], specifier, options); return filtered.length === 1; } function arrayStartsWith(array, prefix2) { @@ -29323,7 +29323,7 @@ var require_specifier = __commonJS({ } function contains(specifier, input) { const { explained } = input; - let { version: version3 } = input; + let { version: version4 } = input; const { ...spec } = specifier; if (spec.prereleases === void 0) { spec.prereleases = spec.is_prerelease; @@ -29336,7 +29336,7 @@ var require_specifier = __commonJS({ if (spec.epoch) { compatiblePrefix = spec.epoch + "!" + compatiblePrefix; } - return satisfies4(version3, `>=${spec.version}, ==${compatiblePrefix}`, { + return satisfies4(version4, `>=${spec.version}, ==${compatiblePrefix}`, { prereleases: spec.prereleases }); } @@ -29347,7 +29347,7 @@ var require_specifier = __commonJS({ } if (explained) { if (explained.local && spec.version) { - version3 = explained.public; + version4 = explained.public; spec.version = explainVersion(spec.version).public; } } @@ -29357,7 +29357,7 @@ var require_specifier = __commonJS({ } } const op = Operator[spec.operator]; - return op(version3, spec.version || spec.legacy); + return op(version4, spec.version || spec.legacy); } function validRange(specifier) { return Boolean(parse3(specifier)); @@ -29376,36 +29376,36 @@ var require_semantic = __commonJS({ inc }; function major(input) { - const version3 = explain(input); - if (!version3) { + const version4 = explain(input); + if (!version4) { throw new TypeError("Invalid Version: " + input); } - return version3.release[0]; + return version4.release[0]; } function minor(input) { - const version3 = explain(input); - if (!version3) { + const version4 = explain(input); + if (!version4) { throw new TypeError("Invalid Version: " + input); } - if (version3.release.length < 2) { + if (version4.release.length < 2) { return 0; } - return version3.release[1]; + return version4.release[1]; } function patch(input) { - const version3 = explain(input); - if (!version3) { + const version4 = explain(input); + if (!version4) { throw new TypeError("Invalid Version: " + input); } - if (version3.release.length < 3) { + if (version4.release.length < 3) { return 0; } - return version3.release[2]; + return version4.release[2]; } function inc(input, release, preReleaseIdentifier) { let identifier = preReleaseIdentifier || `a`; - const version3 = parse3(input); - if (!version3) { + const version4 = parse3(input); + if (!version4) { return null; } if (!["a", "b", "c", "rc", "alpha", "beta", "pre", "preview"].includes( @@ -29416,103 +29416,103 @@ var require_semantic = __commonJS({ switch (release) { case "premajor": { - const [majorVersion] = version3.release; - version3.release.fill(0); - version3.release[0] = majorVersion + 1; + const [majorVersion] = version4.release; + version4.release.fill(0); + version4.release[0] = majorVersion + 1; } - version3.pre = [identifier, 0]; - delete version3.post; - delete version3.dev; - delete version3.local; + version4.pre = [identifier, 0]; + delete version4.post; + delete version4.dev; + delete version4.local; break; case "preminor": { - const [majorVersion, minorVersion = 0] = version3.release; - version3.release.fill(0); - version3.release[0] = majorVersion; - version3.release[1] = minorVersion + 1; + const [majorVersion, minorVersion = 0] = version4.release; + version4.release.fill(0); + version4.release[0] = majorVersion; + version4.release[1] = minorVersion + 1; } - version3.pre = [identifier, 0]; - delete version3.post; - delete version3.dev; - delete version3.local; + version4.pre = [identifier, 0]; + delete version4.post; + delete version4.dev; + delete version4.local; break; case "prepatch": { - const [majorVersion, minorVersion = 0, patchVersion = 0] = version3.release; - version3.release.fill(0); - version3.release[0] = majorVersion; - version3.release[1] = minorVersion; - version3.release[2] = patchVersion + 1; + const [majorVersion, minorVersion = 0, patchVersion = 0] = version4.release; + version4.release.fill(0); + version4.release[0] = majorVersion; + version4.release[1] = minorVersion; + version4.release[2] = patchVersion + 1; } - version3.pre = [identifier, 0]; - delete version3.post; - delete version3.dev; - delete version3.local; + version4.pre = [identifier, 0]; + delete version4.post; + delete version4.dev; + delete version4.local; break; case "prerelease": - if (version3.pre === null) { - const [majorVersion, minorVersion = 0, patchVersion = 0] = version3.release; - version3.release.fill(0); - version3.release[0] = majorVersion; - version3.release[1] = minorVersion; - version3.release[2] = patchVersion + 1; - version3.pre = [identifier, 0]; + if (version4.pre === null) { + const [majorVersion, minorVersion = 0, patchVersion = 0] = version4.release; + version4.release.fill(0); + version4.release[0] = majorVersion; + version4.release[1] = minorVersion; + version4.release[2] = patchVersion + 1; + version4.pre = [identifier, 0]; } else { - if (preReleaseIdentifier === void 0 && version3.pre !== null) { - [identifier] = version3.pre; + if (preReleaseIdentifier === void 0 && version4.pre !== null) { + [identifier] = version4.pre; } - const [letter, number] = version3.pre; + const [letter, number] = version4.pre; if (letter === identifier) { - version3.pre = [letter, number + 1]; + version4.pre = [letter, number + 1]; } else { - version3.pre = [identifier, 0]; + version4.pre = [identifier, 0]; } } - delete version3.post; - delete version3.dev; - delete version3.local; + delete version4.post; + delete version4.dev; + delete version4.local; break; case "major": - if (version3.release.slice(1).some((value) => value !== 0) || version3.pre === null) { - const [majorVersion] = version3.release; - version3.release.fill(0); - version3.release[0] = majorVersion + 1; + if (version4.release.slice(1).some((value) => value !== 0) || version4.pre === null) { + const [majorVersion] = version4.release; + version4.release.fill(0); + version4.release[0] = majorVersion + 1; } - delete version3.pre; - delete version3.post; - delete version3.dev; - delete version3.local; + delete version4.pre; + delete version4.post; + delete version4.dev; + delete version4.local; break; case "minor": - if (version3.release.slice(2).some((value) => value !== 0) || version3.pre === null) { - const [majorVersion, minorVersion = 0] = version3.release; - version3.release.fill(0); - version3.release[0] = majorVersion; - version3.release[1] = minorVersion + 1; + if (version4.release.slice(2).some((value) => value !== 0) || version4.pre === null) { + const [majorVersion, minorVersion = 0] = version4.release; + version4.release.fill(0); + version4.release[0] = majorVersion; + version4.release[1] = minorVersion + 1; } - delete version3.pre; - delete version3.post; - delete version3.dev; - delete version3.local; + delete version4.pre; + delete version4.post; + delete version4.dev; + delete version4.local; break; case "patch": - if (version3.release.slice(3).some((value) => value !== 0) || version3.pre === null) { - const [majorVersion, minorVersion = 0, patchVersion = 0] = version3.release; - version3.release.fill(0); - version3.release[0] = majorVersion; - version3.release[1] = minorVersion; - version3.release[2] = patchVersion + 1; + if (version4.release.slice(3).some((value) => value !== 0) || version4.pre === null) { + const [majorVersion, minorVersion = 0, patchVersion = 0] = version4.release; + version4.release.fill(0); + version4.release[0] = majorVersion; + version4.release[1] = minorVersion; + version4.release[2] = patchVersion + 1; } - delete version3.pre; - delete version3.post; - delete version3.dev; - delete version3.local; + delete version4.pre; + delete version4.post; + delete version4.dev; + delete version4.local; break; default: return null; } - return stringify2(version3); + return stringify2(version4); } } }); @@ -29521,7 +29521,7 @@ var require_semantic = __commonJS({ var require_pep440 = __commonJS({ "node_modules/@renovatebot/pep440/index.js"(exports2, module2) { var { valid: valid2, clean: clean3, explain, parse: parse3 } = require_version(); - var { lt, le, eq, ne, ge, gt: gt2, compare, rcompare } = require_operator(); + var { lt, le, eq, ne, ge, gt: gt3, compare, rcompare } = require_operator(); var { filter, maxSatisfying: maxSatisfying3, @@ -29546,7 +29546,7 @@ var require_pep440 = __commonJS({ neq: ne, ge, gte: ge, - gt: gt2, + gt: gt3, compare, rcompare, // range @@ -29703,73 +29703,73 @@ var require_semver5 = __commonJS({ } var i; exports2.parse = parse3; - function parse3(version3, options) { + function parse3(version4, options) { if (!options || typeof options !== "object") { options = { loose: !!options, includePrerelease: false }; } - if (version3 instanceof SemVer) { - return version3; + if (version4 instanceof SemVer) { + return version4; } - if (typeof version3 !== "string") { + if (typeof version4 !== "string") { return null; } - if (version3.length > MAX_LENGTH) { + if (version4.length > MAX_LENGTH) { return null; } var r = options.loose ? safeRe[t.LOOSE] : safeRe[t.FULL]; - if (!r.test(version3)) { + if (!r.test(version4)) { return null; } try { - return new SemVer(version3, options); + return new SemVer(version4, options); } catch (er) { return null; } } exports2.valid = valid2; - function valid2(version3, options) { - var v = parse3(version3, options); + function valid2(version4, options) { + var v = parse3(version4, options); return v ? v.version : null; } exports2.clean = clean3; - function clean3(version3, options) { - var s = parse3(version3.trim().replace(/^[=v]+/, ""), options); + function clean3(version4, options) { + var s = parse3(version4.trim().replace(/^[=v]+/, ""), options); return s ? s.version : null; } exports2.SemVer = SemVer; - function SemVer(version3, options) { + function SemVer(version4, options) { if (!options || typeof options !== "object") { options = { loose: !!options, includePrerelease: false }; } - if (version3 instanceof SemVer) { - if (version3.loose === options.loose) { - return version3; + if (version4 instanceof SemVer) { + if (version4.loose === options.loose) { + return version4; } else { - version3 = version3.version; + version4 = version4.version; } - } else if (typeof version3 !== "string") { - throw new TypeError("Invalid Version: " + version3); + } else if (typeof version4 !== "string") { + throw new TypeError("Invalid Version: " + version4); } - if (version3.length > MAX_LENGTH) { + if (version4.length > MAX_LENGTH) { throw new TypeError("version is longer than " + MAX_LENGTH + " characters"); } if (!(this instanceof SemVer)) { - return new SemVer(version3, options); + return new SemVer(version4, options); } - debug2("SemVer", version3, options); + debug2("SemVer", version4, options); this.options = options; this.loose = !!options.loose; - var m = version3.trim().match(options.loose ? safeRe[t.LOOSE] : safeRe[t.FULL]); + var m = version4.trim().match(options.loose ? safeRe[t.LOOSE] : safeRe[t.FULL]); if (!m) { - throw new TypeError("Invalid Version: " + version3); + throw new TypeError("Invalid Version: " + version4); } - this.raw = version3; + this.raw = version4; this.major = +m[1]; this.minor = +m[2]; this.patch = +m[3]; @@ -29956,13 +29956,13 @@ var require_semver5 = __commonJS({ return this; }; exports2.inc = inc; - function inc(version3, release, loose, identifier) { + function inc(version4, release, loose, identifier) { if (typeof loose === "string") { identifier = loose; loose = void 0; } try { - return new SemVer(version3, loose).inc(release, identifier).version; + return new SemVer(version4, loose).inc(release, identifier).version; } catch (er) { return null; } @@ -30046,8 +30046,8 @@ var require_semver5 = __commonJS({ return exports2.compareBuild(b, a, loose); }); } - exports2.gt = gt2; - function gt2(a, b, loose) { + exports2.gt = gt3; + function gt3(a, b, loose) { return compare(a, b, loose) > 0; } exports2.lt = lt; @@ -30092,7 +30092,7 @@ var require_semver5 = __commonJS({ case "!=": return neq(a, b, loose); case ">": - return gt2(a, b, loose); + return gt3(a, b, loose); case ">=": return gte(a, b, loose); case "<": @@ -30153,19 +30153,19 @@ var require_semver5 = __commonJS({ Comparator.prototype.toString = function() { return this.value; }; - Comparator.prototype.test = function(version3) { - debug2("Comparator.test", version3, this.options.loose); - if (this.semver === ANY || version3 === ANY) { + Comparator.prototype.test = function(version4) { + debug2("Comparator.test", version4, this.options.loose); + if (this.semver === ANY || version4 === ANY) { return true; } - if (typeof version3 === "string") { + if (typeof version4 === "string") { try { - version3 = new SemVer(version3, this.options); + version4 = new SemVer(version4, this.options); } catch (er) { return false; } } - return cmp(version3, this.operator, this.semver, this.options); + return cmp(version4, this.operator, this.semver, this.options); }; Comparator.prototype.intersects = function(comp26, options) { if (!(comp26 instanceof Comparator)) { @@ -30475,31 +30475,31 @@ var require_semver5 = __commonJS({ } return (from + " " + to).trim(); } - Range.prototype.test = function(version3) { - if (!version3) { + Range.prototype.test = function(version4) { + if (!version4) { return false; } - if (typeof version3 === "string") { + if (typeof version4 === "string") { try { - version3 = new SemVer(version3, this.options); + version4 = new SemVer(version4, this.options); } catch (er) { return false; } } for (var i2 = 0; i2 < this.set.length; i2++) { - if (testSet(this.set[i2], version3, this.options)) { + if (testSet(this.set[i2], version4, this.options)) { return true; } } return false; }; - function testSet(set, version3, options) { + function testSet(set, version4, options) { for (var i2 = 0; i2 < set.length; i2++) { - if (!set[i2].test(version3)) { + if (!set[i2].test(version4)) { return false; } } - if (version3.prerelease.length && !options.includePrerelease) { + if (version4.prerelease.length && !options.includePrerelease) { for (i2 = 0; i2 < set.length; i2++) { debug2(set[i2].semver); if (set[i2].semver === ANY) { @@ -30507,7 +30507,7 @@ var require_semver5 = __commonJS({ } if (set[i2].semver.prerelease.length > 0) { var allowed = set[i2].semver; - if (allowed.major === version3.major && allowed.minor === version3.minor && allowed.patch === version3.patch) { + if (allowed.major === version4.major && allowed.minor === version4.minor && allowed.patch === version4.patch) { return true; } } @@ -30517,13 +30517,13 @@ var require_semver5 = __commonJS({ return true; } exports2.satisfies = satisfies4; - function satisfies4(version3, range2, options) { + function satisfies4(version4, range2, options) { try { range2 = new Range(range2, options); } catch (er) { return false; } - return range2.test(version3); + return range2.test(version4); } exports2.maxSatisfying = maxSatisfying3; function maxSatisfying3(versions, range2, options) { @@ -30590,7 +30590,7 @@ var require_semver5 = __commonJS({ /* fallthrough */ case "": case ">=": - if (!minver || gt2(minver, compver)) { + if (!minver || gt3(minver, compver)) { minver = compver; } break; @@ -30617,21 +30617,21 @@ var require_semver5 = __commonJS({ } } exports2.ltr = ltr; - function ltr(version3, range2, options) { - return outside(version3, range2, "<", options); + function ltr(version4, range2, options) { + return outside(version4, range2, "<", options); } exports2.gtr = gtr; - function gtr(version3, range2, options) { - return outside(version3, range2, ">", options); + function gtr(version4, range2, options) { + return outside(version4, range2, ">", options); } exports2.outside = outside; - function outside(version3, range2, hilo, options) { - version3 = new SemVer(version3, options); + function outside(version4, range2, hilo, options) { + version4 = new SemVer(version4, options); range2 = new Range(range2, options); var gtfn, ltefn, ltfn, comp26, ecomp; switch (hilo) { case ">": - gtfn = gt2; + gtfn = gt3; ltefn = lte; ltfn = lt; comp26 = ">"; @@ -30640,14 +30640,14 @@ var require_semver5 = __commonJS({ case "<": gtfn = lt; ltefn = gte; - ltfn = gt2; + ltfn = gt3; comp26 = "<"; ecomp = "<="; break; default: throw new TypeError('Must provide a hilo val of "<" or ">"'); } - if (satisfies4(version3, range2, options)) { + if (satisfies4(version4, range2, options)) { return false; } for (var i2 = 0; i2 < range2.set.length; ++i2) { @@ -30669,17 +30669,17 @@ var require_semver5 = __commonJS({ if (high.operator === comp26 || high.operator === ecomp) { return false; } - if ((!low.operator || low.operator === comp26) && ltefn(version3, low.semver)) { + if ((!low.operator || low.operator === comp26) && ltefn(version4, low.semver)) { return false; - } else if (low.operator === ecomp && ltfn(version3, low.semver)) { + } else if (low.operator === ecomp && ltfn(version4, low.semver)) { return false; } } return true; } exports2.prerelease = prerelease; - function prerelease(version3, options) { - var parsed = parse3(version3, options); + function prerelease(version4, options) { + var parsed = parse3(version4, options); return parsed && parsed.prerelease.length ? parsed.prerelease : null; } exports2.intersects = intersects; @@ -30689,23 +30689,23 @@ var require_semver5 = __commonJS({ return r1.intersects(r2); } exports2.coerce = coerce; - function coerce(version3, options) { - if (version3 instanceof SemVer) { - return version3; + function coerce(version4, options) { + if (version4 instanceof SemVer) { + return version4; } - if (typeof version3 === "number") { - version3 = String(version3); + if (typeof version4 === "number") { + version4 = String(version4); } - if (typeof version3 !== "string") { + if (typeof version4 !== "string") { return null; } options = options || {}; var match2 = null; if (!options.rtl) { - match2 = version3.match(safeRe[t.COERCE]); + match2 = version4.match(safeRe[t.COERCE]); } else { var next; - while ((next = safeRe[t.COERCERTL].exec(version3)) && (!match2 || match2.index + match2[0].length !== version3.length)) { + while ((next = safeRe[t.COERCERTL].exec(version4)) && (!match2 || match2.index + match2[0].length !== version4.length)) { if (!match2 || next.index + next[0].length !== match2.index + match2[0].length) { match2 = next; } @@ -32600,14 +32600,14 @@ var require_diagnostics2 = __commonJS({ "undici:client:beforeConnect", (evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version4, protocol, port, host } } = evt; debugLog( "connecting to %s%s using %s%s", host, port ? `:${port}` : "", protocol, - version3 + version4 ); } ); @@ -32615,14 +32615,14 @@ var require_diagnostics2 = __commonJS({ "undici:client:connected", (evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version4, protocol, port, host } } = evt; debugLog( "connected to %s%s using %s%s", host, port ? `:${port}` : "", protocol, - version3 + version4 ); } ); @@ -32630,7 +32630,7 @@ var require_diagnostics2 = __commonJS({ "undici:client:connectError", (evt) => { const { - connectParams: { version: version3, protocol, port, host }, + connectParams: { version: version4, protocol, port, host }, error: error2 } = evt; debugLog( @@ -32638,7 +32638,7 @@ var require_diagnostics2 = __commonJS({ host, port ? `:${port}` : "", protocol, - version3, + version4, error2.message ); } @@ -40624,10 +40624,10 @@ var require_socks5_client = __commonJS({ if (this.buffer.length < 2) { return; } - const version3 = this.buffer[0]; + const version4 = this.buffer[0]; const method = this.buffer[1]; - if (version3 !== SOCKS_VERSION) { - throw new Socks5ProxyError(`Invalid SOCKS version: ${version3}`, "UND_ERR_SOCKS5_VERSION"); + if (version4 !== SOCKS_VERSION) { + throw new Socks5ProxyError(`Invalid SOCKS version: ${version4}`, "UND_ERR_SOCKS5_VERSION"); } if (method === AUTH_METHODS.NO_ACCEPTABLE) { throw new Socks5ProxyError("No acceptable authentication method", "UND_ERR_SOCKS5_AUTH_REJECTED"); @@ -40672,10 +40672,10 @@ var require_socks5_client = __commonJS({ if (this.buffer.length < 2) { return; } - const version3 = this.buffer[0]; + const version4 = this.buffer[0]; const status = this.buffer[1]; - if (version3 !== 1) { - throw new Socks5ProxyError(`Invalid auth sub-negotiation version: ${version3}`, "UND_ERR_SOCKS5_AUTH_VERSION"); + if (version4 !== 1) { + throw new Socks5ProxyError(`Invalid auth sub-negotiation version: ${version4}`, "UND_ERR_SOCKS5_AUTH_VERSION"); } if (status !== 0) { throw new Socks5ProxyError("Authentication failed", "UND_ERR_SOCKS5_AUTH_FAILED"); @@ -40719,11 +40719,11 @@ var require_socks5_client = __commonJS({ if (this.buffer.length < 4) { return; } - const version3 = this.buffer[0]; + const version4 = this.buffer[0]; const reply = this.buffer[1]; const addressType = this.buffer[3]; - if (version3 !== SOCKS_VERSION) { - throw new Socks5ProxyError(`Invalid SOCKS version in reply: ${version3}`, "UND_ERR_SOCKS5_REPLY_VERSION"); + if (version4 !== SOCKS_VERSION) { + throw new Socks5ProxyError(`Invalid SOCKS version in reply: ${version4}`, "UND_ERR_SOCKS5_REPLY_VERSION"); } let responseLength = 4; if (addressType === ADDRESS_TYPES.IPV4) { @@ -58339,8 +58339,8 @@ function getVersion(app_1) { function getCompressionMethod() { return __awaiter10(this, void 0, void 0, function* () { const versionOutput = yield getVersion("zstd", ["--quiet"]); - const version3 = semver.clean(versionOutput); - debug(`zstd version: ${version3}`); + const version4 = semver.clean(versionOutput); + debug(`zstd version: ${version4}`); if (versionOutput === "") { return CompressionMethod.Gzip; } else { @@ -82675,8 +82675,8 @@ var SASQueryParameters = class { } return void 0; } - constructor(version3, signature, permissionsOrOptions, services, resourceTypes, protocol, startsOn, expiresOn2, ipRange, identifier, resource, cacheControl, contentDisposition, contentEncoding, contentLanguage, contentType2, userDelegationKey, preauthorizedAgentObjectId, correlationId, encryptionScope2, delegatedUserObjectId) { - this.version = version3; + constructor(version4, signature, permissionsOrOptions, services, resourceTypes, protocol, startsOn, expiresOn2, ipRange, identifier, resource, cacheControl, contentDisposition, contentEncoding, contentLanguage, contentType2, userDelegationKey, preauthorizedAgentObjectId, correlationId, encryptionScope2, delegatedUserObjectId) { + this.version = version4; this.signature = signature; if (permissionsOrOptions !== void 0 && typeof permissionsOrOptions !== "string") { this.permissions = permissionsOrOptions.permissions; @@ -82883,7 +82883,7 @@ function generateBlobSASQueryParameters(blobSASSignatureValues, sharedKeyCredent return generateBlobSASQueryParametersInternal(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName).sasQueryParameters; } function generateBlobSASQueryParametersInternal(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName) { - const version3 = blobSASSignatureValues.version ? blobSASSignatureValues.version : SERVICE_VERSION; + const version4 = blobSASSignatureValues.version ? blobSASSignatureValues.version : SERVICE_VERSION; const sharedKeyCredential = sharedKeyCredentialOrUserDelegationKey instanceof StorageSharedKeyCredential ? sharedKeyCredentialOrUserDelegationKey : void 0; let userDelegationKeyCredential; if (sharedKeyCredential === void 0 && accountName !== void 0) { @@ -82892,29 +82892,29 @@ function generateBlobSASQueryParametersInternal(blobSASSignatureValues, sharedKe if (sharedKeyCredential === void 0 && userDelegationKeyCredential === void 0) { throw TypeError("Invalid sharedKeyCredential, userDelegationKey or accountName."); } - if (version3 >= "2020-12-06") { + if (version4 >= "2020-12-06") { if (sharedKeyCredential !== void 0) { return generateBlobSASQueryParameters20201206(blobSASSignatureValues, sharedKeyCredential); } else { - if (version3 >= "2025-07-05") { + if (version4 >= "2025-07-05") { return generateBlobSASQueryParametersUDK20250705(blobSASSignatureValues, userDelegationKeyCredential); } else { return generateBlobSASQueryParametersUDK20201206(blobSASSignatureValues, userDelegationKeyCredential); } } } - if (version3 >= "2018-11-09") { + if (version4 >= "2018-11-09") { if (sharedKeyCredential !== void 0) { return generateBlobSASQueryParameters20181109(blobSASSignatureValues, sharedKeyCredential); } else { - if (version3 >= "2020-02-10") { + if (version4 >= "2020-02-10") { return generateBlobSASQueryParametersUDK20200210(blobSASSignatureValues, userDelegationKeyCredential); } else { return generateBlobSASQueryParametersUDK20181109(blobSASSignatureValues, userDelegationKeyCredential); } } } - if (version3 >= "2015-04-05") { + if (version4 >= "2015-04-05") { if (sharedKeyCredential !== void 0) { return generateBlobSASQueryParameters20150405(blobSASSignatureValues, sharedKeyCredential); } else { @@ -83289,44 +83289,44 @@ function getCanonicalName(accountName, containerName, blobName) { return elements.join(""); } function SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues) { - const version3 = blobSASSignatureValues.version ? blobSASSignatureValues.version : SERVICE_VERSION; - if (blobSASSignatureValues.snapshotTime && version3 < "2018-11-09") { + const version4 = blobSASSignatureValues.version ? blobSASSignatureValues.version : SERVICE_VERSION; + if (blobSASSignatureValues.snapshotTime && version4 < "2018-11-09") { throw RangeError("'version' must be >= '2018-11-09' when providing 'snapshotTime'."); } if (blobSASSignatureValues.blobName === void 0 && blobSASSignatureValues.snapshotTime) { throw RangeError("Must provide 'blobName' when providing 'snapshotTime'."); } - if (blobSASSignatureValues.versionId && version3 < "2019-10-10") { + if (blobSASSignatureValues.versionId && version4 < "2019-10-10") { throw RangeError("'version' must be >= '2019-10-10' when providing 'versionId'."); } if (blobSASSignatureValues.blobName === void 0 && blobSASSignatureValues.versionId) { throw RangeError("Must provide 'blobName' when providing 'versionId'."); } - if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.setImmutabilityPolicy && version3 < "2020-08-04") { + if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.setImmutabilityPolicy && version4 < "2020-08-04") { throw RangeError("'version' must be >= '2020-08-04' when provided 'i' permission."); } - if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.deleteVersion && version3 < "2019-10-10") { + if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.deleteVersion && version4 < "2019-10-10") { throw RangeError("'version' must be >= '2019-10-10' when providing 'x' permission."); } - if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.permanentDelete && version3 < "2019-10-10") { + if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.permanentDelete && version4 < "2019-10-10") { throw RangeError("'version' must be >= '2019-10-10' when providing 'y' permission."); } - if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.tag && version3 < "2019-12-12") { + if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.tag && version4 < "2019-12-12") { throw RangeError("'version' must be >= '2019-12-12' when providing 't' permission."); } - if (version3 < "2020-02-10" && blobSASSignatureValues.permissions && (blobSASSignatureValues.permissions.move || blobSASSignatureValues.permissions.execute)) { + if (version4 < "2020-02-10" && blobSASSignatureValues.permissions && (blobSASSignatureValues.permissions.move || blobSASSignatureValues.permissions.execute)) { throw RangeError("'version' must be >= '2020-02-10' when providing the 'm' or 'e' permission."); } - if (version3 < "2021-04-10" && blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.filterByTags) { + if (version4 < "2021-04-10" && blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.filterByTags) { throw RangeError("'version' must be >= '2021-04-10' when providing the 'f' permission."); } - if (version3 < "2020-02-10" && (blobSASSignatureValues.preauthorizedAgentObjectId || blobSASSignatureValues.correlationId)) { + if (version4 < "2020-02-10" && (blobSASSignatureValues.preauthorizedAgentObjectId || blobSASSignatureValues.correlationId)) { throw RangeError("'version' must be >= '2020-02-10' when providing 'preauthorizedAgentObjectId' or 'correlationId'."); } - if (blobSASSignatureValues.encryptionScope && version3 < "2020-12-06") { + if (blobSASSignatureValues.encryptionScope && version4 < "2020-12-06") { throw RangeError("'version' must be >= '2020-12-06' when provided 'encryptionScope' in SAS."); } - blobSASSignatureValues.version = version3; + blobSASSignatureValues.version = version4; return blobSASSignatureValues; } @@ -88912,14 +88912,14 @@ function getCacheServiceVersion() { return process.env["ACTIONS_CACHE_SERVICE_V2"] ? "v2" : "v1"; } function getCacheServiceURL() { - const version3 = getCacheServiceVersion(); - switch (version3) { + const version4 = getCacheServiceVersion(); + switch (version4) { case "v1": return process.env["ACTIONS_CACHE_URL"] || process.env["ACTIONS_RESULTS_URL"] || ""; case "v2": return process.env["ACTIONS_RESULTS_URL"] || ""; default: - throw new Error(`Unsupported cache service version: ${version3}`); + throw new Error(`Unsupported cache service version: ${version4}`); } } @@ -88985,14 +88985,14 @@ function createHttpClient() { function getCacheEntry(keys, paths, options) { return __awaiter13(this, void 0, void 0, function* () { const httpClient = createHttpClient(); - const version3 = getCacheVersion(paths, options === null || options === void 0 ? void 0 : options.compressionMethod, options === null || options === void 0 ? void 0 : options.enableCrossOsArchive); - const resource = `cache?keys=${encodeURIComponent(keys.join(","))}&version=${version3}`; + const version4 = getCacheVersion(paths, options === null || options === void 0 ? void 0 : options.compressionMethod, options === null || options === void 0 ? void 0 : options.enableCrossOsArchive); + const resource = `cache?keys=${encodeURIComponent(keys.join(","))}&version=${version4}`; const response = yield retryTypedResponse("getCacheEntry", () => __awaiter13(this, void 0, void 0, function* () { return httpClient.getJson(getCacheApiUrl(resource)); })); if (response.statusCode === 204) { if (isDebug()) { - yield printCachesListForDiagnostics(keys[0], httpClient, version3); + yield printCachesListForDiagnostics(keys[0], httpClient, version4); } return null; } @@ -89010,7 +89010,7 @@ function getCacheEntry(keys, paths, options) { return cacheResult; }); } -function printCachesListForDiagnostics(key, httpClient, version3) { +function printCachesListForDiagnostics(key, httpClient, version4) { return __awaiter13(this, void 0, void 0, function* () { const resource = `caches?key=${encodeURIComponent(key)}`; const response = yield retryTypedResponse("listCache", () => __awaiter13(this, void 0, void 0, function* () { @@ -89020,7 +89020,7 @@ function printCachesListForDiagnostics(key, httpClient, version3) { const cacheListResult = response.result; const totalCount = cacheListResult === null || cacheListResult === void 0 ? void 0 : cacheListResult.totalCount; if (totalCount && totalCount > 0) { - debug(`No matching cache found for cache key '${key}', version '${version3} and scope ${process.env["GITHUB_REF"]}. There exist one or more cache(s) with similar key but they have different version or scope. See more info on cache matching here: https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#matching-a-cache-key + debug(`No matching cache found for cache key '${key}', version '${version4} and scope ${process.env["GITHUB_REF"]}. There exist one or more cache(s) with similar key but they have different version or scope. See more info on cache matching here: https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#matching-a-cache-key Other caches with similar key:`); for (const cacheEntry of (cacheListResult === null || cacheListResult === void 0 ? void 0 : cacheListResult.artifactCaches) || []) { debug(`Cache Key: ${cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.cacheKey}, Cache Version: ${cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.cacheVersion}, Cache Scope: ${cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.scope}, Cache Created: ${cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.creationTime}`); @@ -89964,14 +89964,14 @@ function getTarArgs(tarPath_1, compressionMethod_1, type_1) { const args = [`"${tarPath.path}"`]; const cacheFileName = getCacheFileName(compressionMethod); const tarFile = "cache.tar"; - const workingDirectory = getWorkingDirectory(); + const workingDirectory2 = getWorkingDirectory(); const BSD_TAR_ZSTD = tarPath.type === ArchiveToolType.BSD && compressionMethod !== CompressionMethod.Gzip && IS_WINDOWS8; switch (type) { case "create": - args.push("--posix", "-cf", BSD_TAR_ZSTD ? tarFile : cacheFileName.replace(new RegExp(`\\${path10.sep}`, "g"), "/"), "--exclude", BSD_TAR_ZSTD ? tarFile : cacheFileName.replace(new RegExp(`\\${path10.sep}`, "g"), "/"), "-P", "-C", workingDirectory.replace(new RegExp(`\\${path10.sep}`, "g"), "/"), "--files-from", ManifestFilename); + args.push("--posix", "-cf", BSD_TAR_ZSTD ? tarFile : cacheFileName.replace(new RegExp(`\\${path10.sep}`, "g"), "/"), "--exclude", BSD_TAR_ZSTD ? tarFile : cacheFileName.replace(new RegExp(`\\${path10.sep}`, "g"), "/"), "-P", "-C", workingDirectory2.replace(new RegExp(`\\${path10.sep}`, "g"), "/"), "--files-from", ManifestFilename); break; case "extract": - args.push("-xf", BSD_TAR_ZSTD ? tarFile : archivePath.replace(new RegExp(`\\${path10.sep}`, "g"), "/"), "-P", "-C", workingDirectory.replace(new RegExp(`\\${path10.sep}`, "g"), "/")); + args.push("-xf", BSD_TAR_ZSTD ? tarFile : archivePath.replace(new RegExp(`\\${path10.sep}`, "g"), "/"), "-P", "-C", workingDirectory2.replace(new RegExp(`\\${path10.sep}`, "g"), "/")); break; case "list": args.push("-tf", BSD_TAR_ZSTD ? tarFile : archivePath.replace(new RegExp(`\\${path10.sep}`, "g"), "/"), "-P"); @@ -90083,8 +90083,8 @@ function listTar(archivePath, compressionMethod) { } function extractTar(archivePath, compressionMethod) { return __awaiter15(this, void 0, void 0, function* () { - const workingDirectory = getWorkingDirectory(); - yield mkdirP(workingDirectory); + const workingDirectory2 = getWorkingDirectory(); + yield mkdirP(workingDirectory2); const commands = yield getCommands(compressionMethod, "extract", archivePath); yield execCommands(commands); }); @@ -90319,8 +90319,926 @@ async function hashFiles2(pattern, verbose = false) { return ""; } -// src/utils/platforms.ts +// src/utils/inputs.ts +var import_node_path = __toESM(require("node:path"), 1); + +// src/utils/config-file.ts var import_node_fs2 = __toESM(require("node:fs"), 1); + +// node_modules/smol-toml/dist/error.js +function getLineColFromPtr(string, ptr) { + let lines = string.slice(0, ptr).split(/\r\n|\n|\r/g); + return [lines.length, lines.pop().length + 1]; +} +function makeCodeBlock(string, line, column) { + let lines = string.split(/\r\n|\n|\r/g); + let codeblock = ""; + let numberLen = (Math.log10(line + 1) | 0) + 1; + for (let i = line - 1; i <= line + 1; i++) { + let l = lines[i - 1]; + if (!l) + continue; + codeblock += i.toString().padEnd(numberLen, " "); + codeblock += ": "; + codeblock += l; + codeblock += "\n"; + if (i === line) { + codeblock += " ".repeat(numberLen + column + 2); + codeblock += "^\n"; + } + } + return codeblock; +} +var TomlError = class extends Error { + line; + column; + codeblock; + constructor(message, options) { + const [line, column] = getLineColFromPtr(options.toml, options.ptr); + const codeblock = makeCodeBlock(options.toml, line, column); + super(`Invalid TOML document: ${message} + +${codeblock}`, options); + this.line = line; + this.column = column; + this.codeblock = codeblock; + } +}; + +// node_modules/smol-toml/dist/util.js +function isEscaped(str, ptr) { + let i = 0; + while (str[ptr - ++i] === "\\") + ; + return --i && i % 2; +} +function indexOfNewline(str, start = 0, end = str.length) { + let idx = str.indexOf("\n", start); + if (str[idx - 1] === "\r") + idx--; + return idx <= end ? idx : -1; +} +function skipComment(str, ptr) { + for (let i = ptr; i < str.length; i++) { + let c = str[i]; + if (c === "\n") + return i; + if (c === "\r" && str[i + 1] === "\n") + return i + 1; + if (c < " " && c !== " " || c === "\x7F") { + throw new TomlError("control characters are not allowed in comments", { + toml: str, + ptr + }); + } + } + return str.length; +} +function skipVoid(str, ptr, banNewLines, banComments) { + let c; + while ((c = str[ptr]) === " " || c === " " || !banNewLines && (c === "\n" || c === "\r" && str[ptr + 1] === "\n")) + ptr++; + return banComments || c !== "#" ? ptr : skipVoid(str, skipComment(str, ptr), banNewLines); +} +function skipUntil(str, ptr, sep8, end, banNewLines = false) { + if (!end) { + ptr = indexOfNewline(str, ptr); + return ptr < 0 ? str.length : ptr; + } + for (let i = ptr; i < str.length; i++) { + let c = str[i]; + if (c === "#") { + i = indexOfNewline(str, i); + } else if (c === sep8) { + return i + 1; + } else if (c === end || banNewLines && (c === "\n" || c === "\r" && str[i + 1] === "\n")) { + return i; + } + } + throw new TomlError("cannot find end of structure", { + toml: str, + ptr + }); +} +function getStringEnd(str, seek) { + let first = str[seek]; + let target = first === str[seek + 1] && str[seek + 1] === str[seek + 2] ? str.slice(seek, seek + 3) : first; + seek += target.length - 1; + do + seek = str.indexOf(target, ++seek); + while (seek > -1 && first !== "'" && isEscaped(str, seek)); + if (seek > -1) { + seek += target.length; + if (target.length > 1) { + if (str[seek] === first) + seek++; + if (str[seek] === first) + seek++; + } + } + return seek; +} + +// node_modules/smol-toml/dist/date.js +var DATE_TIME_RE = /^(\d{4}-\d{2}-\d{2})?[T ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|[-+]\d{2}:\d{2})?$/i; +var TomlDate = class _TomlDate extends Date { + #hasDate = false; + #hasTime = false; + #offset = null; + constructor(date) { + let hasDate = true; + let hasTime = true; + let offset = "Z"; + if (typeof date === "string") { + let match2 = date.match(DATE_TIME_RE); + if (match2) { + if (!match2[1]) { + hasDate = false; + date = `0000-01-01T${date}`; + } + hasTime = !!match2[2]; + hasTime && date[10] === " " && (date = date.replace(" ", "T")); + if (match2[2] && +match2[2] > 23) { + date = ""; + } else { + offset = match2[3] || null; + date = date.toUpperCase(); + if (!offset && hasTime) + date += "Z"; + } + } else { + date = ""; + } + } + super(date); + if (!isNaN(this.getTime())) { + this.#hasDate = hasDate; + this.#hasTime = hasTime; + this.#offset = offset; + } + } + isDateTime() { + return this.#hasDate && this.#hasTime; + } + isLocal() { + return !this.#hasDate || !this.#hasTime || !this.#offset; + } + isDate() { + return this.#hasDate && !this.#hasTime; + } + isTime() { + return this.#hasTime && !this.#hasDate; + } + isValid() { + return this.#hasDate || this.#hasTime; + } + toISOString() { + let iso = super.toISOString(); + if (this.isDate()) + return iso.slice(0, 10); + if (this.isTime()) + return iso.slice(11, 23); + if (this.#offset === null) + return iso.slice(0, -1); + if (this.#offset === "Z") + return iso; + let offset = +this.#offset.slice(1, 3) * 60 + +this.#offset.slice(4, 6); + offset = this.#offset[0] === "-" ? offset : -offset; + let offsetDate = new Date(this.getTime() - offset * 6e4); + return offsetDate.toISOString().slice(0, -1) + this.#offset; + } + static wrapAsOffsetDateTime(jsDate, offset = "Z") { + let date = new _TomlDate(jsDate); + date.#offset = offset; + return date; + } + static wrapAsLocalDateTime(jsDate) { + let date = new _TomlDate(jsDate); + date.#offset = null; + return date; + } + static wrapAsLocalDate(jsDate) { + let date = new _TomlDate(jsDate); + date.#hasTime = false; + date.#offset = null; + return date; + } + static wrapAsLocalTime(jsDate) { + let date = new _TomlDate(jsDate); + date.#hasDate = false; + date.#offset = null; + return date; + } +}; + +// node_modules/smol-toml/dist/primitive.js +var INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\d(_?\d)*))$/; +var FLOAT_REGEX = /^[+-]?\d(_?\d)*(\.\d(_?\d)*)?([eE][+-]?\d(_?\d)*)?$/; +var LEADING_ZERO = /^[+-]?0[0-9_]/; +var ESCAPE_REGEX = /^[0-9a-f]{2,8}$/i; +var ESC_MAP = { + b: "\b", + t: " ", + n: "\n", + f: "\f", + r: "\r", + e: "\x1B", + '"': '"', + "\\": "\\" +}; +function parseString(str, ptr = 0, endPtr = str.length) { + let isLiteral = str[ptr] === "'"; + let isMultiline = str[ptr++] === str[ptr] && str[ptr] === str[ptr + 1]; + if (isMultiline) { + endPtr -= 2; + if (str[ptr += 2] === "\r") + ptr++; + if (str[ptr] === "\n") + ptr++; + } + let tmp = 0; + let isEscape; + let parsed = ""; + let sliceStart = ptr; + while (ptr < endPtr - 1) { + let c = str[ptr++]; + if (c === "\n" || c === "\r" && str[ptr] === "\n") { + if (!isMultiline) { + throw new TomlError("newlines are not allowed in strings", { + toml: str, + ptr: ptr - 1 + }); + } + } else if (c < " " && c !== " " || c === "\x7F") { + throw new TomlError("control characters are not allowed in strings", { + toml: str, + ptr: ptr - 1 + }); + } + if (isEscape) { + isEscape = false; + if (c === "x" || c === "u" || c === "U") { + let code = str.slice(ptr, ptr += c === "x" ? 2 : c === "u" ? 4 : 8); + if (!ESCAPE_REGEX.test(code)) { + throw new TomlError("invalid unicode escape", { + toml: str, + ptr: tmp + }); + } + try { + parsed += String.fromCodePoint(parseInt(code, 16)); + } catch { + throw new TomlError("invalid unicode escape", { + toml: str, + ptr: tmp + }); + } + } else if (isMultiline && (c === "\n" || c === " " || c === " " || c === "\r")) { + ptr = skipVoid(str, ptr - 1, true); + if (str[ptr] !== "\n" && str[ptr] !== "\r") { + throw new TomlError("invalid escape: only line-ending whitespace may be escaped", { + toml: str, + ptr: tmp + }); + } + ptr = skipVoid(str, ptr); + } else if (c in ESC_MAP) { + parsed += ESC_MAP[c]; + } else { + throw new TomlError("unrecognized escape sequence", { + toml: str, + ptr: tmp + }); + } + sliceStart = ptr; + } else if (!isLiteral && c === "\\") { + tmp = ptr - 1; + isEscape = true; + parsed += str.slice(sliceStart, tmp); + } + } + return parsed + str.slice(sliceStart, endPtr - 1); +} +function parseValue2(value, toml, ptr, integersAsBigInt) { + if (value === "true") + return true; + if (value === "false") + return false; + if (value === "-inf") + return -Infinity; + if (value === "inf" || value === "+inf") + return Infinity; + if (value === "nan" || value === "+nan" || value === "-nan") + return NaN; + if (value === "-0") + return integersAsBigInt ? 0n : 0; + let isInt = INT_REGEX.test(value); + if (isInt || FLOAT_REGEX.test(value)) { + if (LEADING_ZERO.test(value)) { + throw new TomlError("leading zeroes are not allowed", { + toml, + ptr + }); + } + value = value.replace(/_/g, ""); + let numeric = +value; + if (isNaN(numeric)) { + throw new TomlError("invalid number", { + toml, + ptr + }); + } + if (isInt) { + if ((isInt = !Number.isSafeInteger(numeric)) && !integersAsBigInt) { + throw new TomlError("integer value cannot be represented losslessly", { + toml, + ptr + }); + } + if (isInt || integersAsBigInt === true) + numeric = BigInt(value); + } + return numeric; + } + const date = new TomlDate(value); + if (!date.isValid()) { + throw new TomlError("invalid value", { + toml, + ptr + }); + } + return date; +} + +// node_modules/smol-toml/dist/extract.js +function sliceAndTrimEndOf(str, startPtr, endPtr) { + let value = str.slice(startPtr, endPtr); + let commentIdx = value.indexOf("#"); + if (commentIdx > -1) { + skipComment(str, commentIdx); + value = value.slice(0, commentIdx); + } + return [value.trimEnd(), commentIdx]; +} +function extractValue(str, ptr, end, depth, integersAsBigInt) { + if (depth === 0) { + throw new TomlError("document contains excessively nested structures. aborting.", { + toml: str, + ptr + }); + } + let c = str[ptr]; + if (c === "[" || c === "{") { + let [value, endPtr2] = c === "[" ? parseArray(str, ptr, depth, integersAsBigInt) : parseInlineTable(str, ptr, depth, integersAsBigInt); + if (end) { + endPtr2 = skipVoid(str, endPtr2); + if (str[endPtr2] === ",") + endPtr2++; + else if (str[endPtr2] !== end) { + throw new TomlError("expected comma or end of structure", { + toml: str, + ptr: endPtr2 + }); + } + } + return [value, endPtr2]; + } + let endPtr; + if (c === '"' || c === "'") { + endPtr = getStringEnd(str, ptr); + let parsed = parseString(str, ptr, endPtr); + if (end) { + endPtr = skipVoid(str, endPtr); + if (str[endPtr] && str[endPtr] !== "," && str[endPtr] !== end && str[endPtr] !== "\n" && str[endPtr] !== "\r") { + throw new TomlError("unexpected character encountered", { + toml: str, + ptr: endPtr + }); + } + endPtr += +(str[endPtr] === ","); + } + return [parsed, endPtr]; + } + endPtr = skipUntil(str, ptr, ",", end); + let slice = sliceAndTrimEndOf(str, ptr, endPtr - +(str[endPtr - 1] === ",")); + if (!slice[0]) { + throw new TomlError("incomplete key-value declaration: no value specified", { + toml: str, + ptr + }); + } + if (end && slice[1] > -1) { + endPtr = skipVoid(str, ptr + slice[1]); + endPtr += +(str[endPtr] === ","); + } + return [ + parseValue2(slice[0], str, ptr, integersAsBigInt), + endPtr + ]; +} + +// node_modules/smol-toml/dist/struct.js +var KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \t]*$/; +function parseKey(str, ptr, end = "=") { + let dot = ptr - 1; + let parsed = []; + let endPtr = str.indexOf(end, ptr); + if (endPtr < 0) { + throw new TomlError("incomplete key-value: cannot find end of key", { + toml: str, + ptr + }); + } + do { + let c = str[ptr = ++dot]; + if (c !== " " && c !== " ") { + if (c === '"' || c === "'") { + if (c === str[ptr + 1] && c === str[ptr + 2]) { + throw new TomlError("multiline strings are not allowed in keys", { + toml: str, + ptr + }); + } + let eos = getStringEnd(str, ptr); + if (eos < 0) { + throw new TomlError("unfinished string encountered", { + toml: str, + ptr + }); + } + dot = str.indexOf(".", eos); + let strEnd = str.slice(eos, dot < 0 || dot > endPtr ? endPtr : dot); + let newLine = indexOfNewline(strEnd); + if (newLine > -1) { + throw new TomlError("newlines are not allowed in keys", { + toml: str, + ptr: ptr + dot + newLine + }); + } + if (strEnd.trimStart()) { + throw new TomlError("found extra tokens after the string part", { + toml: str, + ptr: eos + }); + } + if (endPtr < eos) { + endPtr = str.indexOf(end, eos); + if (endPtr < 0) { + throw new TomlError("incomplete key-value: cannot find end of key", { + toml: str, + ptr + }); + } + } + parsed.push(parseString(str, ptr, eos)); + } else { + dot = str.indexOf(".", ptr); + let part = str.slice(ptr, dot < 0 || dot > endPtr ? endPtr : dot); + if (!KEY_PART_RE.test(part)) { + throw new TomlError("only letter, numbers, dashes and underscores are allowed in keys", { + toml: str, + ptr + }); + } + parsed.push(part.trimEnd()); + } + } + } while (dot + 1 && dot < endPtr); + return [parsed, skipVoid(str, endPtr + 1, true, true)]; +} +function parseInlineTable(str, ptr, depth, integersAsBigInt) { + let res = {}; + let seen = /* @__PURE__ */ new Set(); + let c; + ptr++; + while ((c = str[ptr++]) !== "}" && c) { + if (c === ",") { + throw new TomlError("expected value, found comma", { + toml: str, + ptr: ptr - 1 + }); + } else if (c === "#") + ptr = skipComment(str, ptr); + else if (c !== " " && c !== " " && c !== "\n" && c !== "\r") { + let k; + let t = res; + let hasOwn = false; + let [key, keyEndPtr] = parseKey(str, ptr - 1); + for (let i = 0; i < key.length; i++) { + if (i) + t = hasOwn ? t[k] : t[k] = {}; + k = key[i]; + if ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== "object" || seen.has(t[k]))) { + throw new TomlError("trying to redefine an already defined value", { + toml: str, + ptr + }); + } + if (!hasOwn && k === "__proto__") { + Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true }); + } + } + if (hasOwn) { + throw new TomlError("trying to redefine an already defined value", { + toml: str, + ptr + }); + } + let [value, valueEndPtr] = extractValue(str, keyEndPtr, "}", depth - 1, integersAsBigInt); + seen.add(value); + t[k] = value; + ptr = valueEndPtr; + } + } + if (!c) { + throw new TomlError("unfinished table encountered", { + toml: str, + ptr + }); + } + return [res, ptr]; +} +function parseArray(str, ptr, depth, integersAsBigInt) { + let res = []; + let c; + ptr++; + while ((c = str[ptr++]) !== "]" && c) { + if (c === ",") { + throw new TomlError("expected value, found comma", { + toml: str, + ptr: ptr - 1 + }); + } else if (c === "#") + ptr = skipComment(str, ptr); + else if (c !== " " && c !== " " && c !== "\n" && c !== "\r") { + let e = extractValue(str, ptr - 1, "]", depth - 1, integersAsBigInt); + res.push(e[0]); + ptr = e[1]; + } + } + if (!c) { + throw new TomlError("unfinished array encountered", { + toml: str, + ptr + }); + } + return [res, ptr]; +} + +// node_modules/smol-toml/dist/parse.js +function peekTable(key, table, meta, type) { + let t = table; + let m = meta; + let k; + let hasOwn = false; + let state3; + for (let i = 0; i < key.length; i++) { + if (i) { + t = hasOwn ? t[k] : t[k] = {}; + m = (state3 = m[k]).c; + if (type === 0 && (state3.t === 1 || state3.t === 2)) { + return null; + } + if (state3.t === 2) { + let l = t.length - 1; + t = t[l]; + m = m[l].c; + } + } + k = key[i]; + if ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === 0 && m[k]?.d) { + return null; + } + if (!hasOwn) { + if (k === "__proto__") { + Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true }); + Object.defineProperty(m, k, { enumerable: true, configurable: true, writable: true }); + } + m[k] = { + t: i < key.length - 1 && type === 2 ? 3 : type, + d: false, + i: 0, + c: {} + }; + } + } + state3 = m[k]; + if (state3.t !== type && !(type === 1 && state3.t === 3)) { + return null; + } + if (type === 2) { + if (!state3.d) { + state3.d = true; + t[k] = []; + } + t[k].push(t = {}); + state3.c[state3.i++] = state3 = { t: 1, d: false, i: 0, c: {} }; + } + if (state3.d) { + return null; + } + state3.d = true; + if (type === 1) { + t = hasOwn ? t[k] : t[k] = {}; + } else if (type === 0 && hasOwn) { + return null; + } + return [k, t, state3.c]; +} +function parse2(toml, { maxDepth = 1e3, integersAsBigInt } = {}) { + let res = {}; + let meta = {}; + let tbl = res; + let m = meta; + for (let ptr = skipVoid(toml, 0); ptr < toml.length; ) { + if (toml[ptr] === "[") { + let isTableArray = toml[++ptr] === "["; + let k = parseKey(toml, ptr += +isTableArray, "]"); + if (isTableArray) { + if (toml[k[1] - 1] !== "]") { + throw new TomlError("expected end of table declaration", { + toml, + ptr: k[1] - 1 + }); + } + k[1]++; + } + let p = peekTable( + k[0], + res, + meta, + isTableArray ? 2 : 1 + /* Type.EXPLICIT */ + ); + if (!p) { + throw new TomlError("trying to redefine an already defined table or value", { + toml, + ptr + }); + } + m = p[2]; + tbl = p[1]; + ptr = k[1]; + } else { + let k = parseKey(toml, ptr); + let p = peekTable( + k[0], + tbl, + m, + 0 + /* Type.DOTTED */ + ); + if (!p) { + throw new TomlError("trying to redefine an already defined table or value", { + toml, + ptr + }); + } + let v = extractValue(toml, k[1], void 0, maxDepth, integersAsBigInt); + p[1][p[0]] = v[0]; + ptr = v[1]; + } + ptr = skipVoid(toml, ptr, true); + if (toml[ptr] && toml[ptr] !== "\n" && toml[ptr] !== "\r") { + throw new TomlError("each key-value declaration must be followed by an end-of-line", { + toml, + ptr + }); + } + ptr = skipVoid(toml, ptr); + } + return res; +} + +// src/utils/config-file.ts +function getConfigValueFromTomlFile(filePath, key) { + if (!import_node_fs2.default.existsSync(filePath) || !filePath.endsWith(".toml")) { + return void 0; + } + const fileContent = import_node_fs2.default.readFileSync(filePath, "utf-8"); + if (filePath.endsWith("pyproject.toml")) { + const tomlContent2 = parse2(fileContent); + return tomlContent2?.tool?.uv?.[key]; + } + const tomlContent = parse2(fileContent); + return tomlContent[key]; +} + +// src/utils/inputs.ts +var workingDirectory = getInput("working-directory"); +var version3 = getInput("version"); +var versionFile = getVersionFile(); +var pythonVersion = getInput("python-version"); +var activateEnvironment = getBooleanInput("activate-environment"); +var venvPath = getVenvPath(); +var checkSum = getInput("checksum"); +var enableCache = getEnableCache(); +var restoreCache2 = getInput("restore-cache") === "true"; +var saveCache2 = getInput("save-cache") === "true"; +var cacheSuffix = getInput("cache-suffix") || ""; +var cacheLocalPath = getCacheLocalPath(); +var cacheDependencyGlob = getCacheDependencyGlob(); +var pruneCache = getInput("prune-cache") === "true"; +var cachePython = getInput("cache-python") === "true"; +var ignoreNothingToCache = getInput("ignore-nothing-to-cache") === "true"; +var ignoreEmptyWorkdir = getInput("ignore-empty-workdir") === "true"; +var toolBinDir = getToolBinDir(); +var toolDir = getToolDir(); +var pythonDir = getUvPythonDir(); +var githubToken = getInput("github-token"); +var manifestFile = getManifestFile(); +var addProblemMatchers = getInput("add-problem-matchers") === "true"; +var resolutionStrategy = getResolutionStrategy(); +function getVersionFile() { + const versionFileInput = getInput("version-file"); + if (versionFileInput !== "") { + const tildeExpanded = expandTilde(versionFileInput); + return resolveRelativePath(tildeExpanded); + } + return versionFileInput; +} +function getVenvPath() { + const venvPathInput = getInput("venv-path"); + if (venvPathInput !== "") { + if (!activateEnvironment) { + warning("venv-path is only used when activate-environment is true"); + } + const tildeExpanded = expandTilde(venvPathInput); + return normalizePath(resolveRelativePath(tildeExpanded)); + } + return normalizePath(resolveRelativePath(".venv")); +} +function getEnableCache() { + const enableCacheInput = getInput("enable-cache"); + if (enableCacheInput === "auto") { + return process.env.RUNNER_ENVIRONMENT === "github-hosted"; + } + return enableCacheInput === "true"; +} +function getToolBinDir() { + const toolBinDirInput = getInput("tool-bin-dir"); + if (toolBinDirInput !== "") { + const tildeExpanded = expandTilde(toolBinDirInput); + return resolveRelativePath(tildeExpanded); + } + if (process.platform === "win32") { + if (process.env.RUNNER_TEMP !== void 0) { + return `${process.env.RUNNER_TEMP}${import_node_path.default.sep}uv-tool-bin-dir`; + } + throw Error( + "Could not determine UV_TOOL_BIN_DIR. Please make sure RUNNER_TEMP is set or provide the tool-bin-dir input" + ); + } + return void 0; +} +function getToolDir() { + const toolDirInput = getInput("tool-dir"); + if (toolDirInput !== "") { + const tildeExpanded = expandTilde(toolDirInput); + return resolveRelativePath(tildeExpanded); + } + if (process.platform === "win32") { + if (process.env.RUNNER_TEMP !== void 0) { + return `${process.env.RUNNER_TEMP}${import_node_path.default.sep}uv-tool-dir`; + } + throw Error( + "Could not determine UV_TOOL_DIR. Please make sure RUNNER_TEMP is set or provide the tool-dir input" + ); + } + return void 0; +} +function getCacheLocalPath() { + const cacheLocalPathInput = getInput("cache-local-path"); + if (cacheLocalPathInput !== "") { + const tildeExpanded = expandTilde(cacheLocalPathInput); + return { + path: resolveRelativePath(tildeExpanded), + source: 0 /* Input */ + }; + } + const cacheDirFromConfig = getCacheDirFromConfig(); + if (cacheDirFromConfig !== void 0) { + return { path: cacheDirFromConfig, source: 1 /* Config */ }; + } + if (process.env.UV_CACHE_DIR !== void 0) { + info(`UV_CACHE_DIR is already set to ${process.env.UV_CACHE_DIR}`); + return { path: process.env.UV_CACHE_DIR, source: 2 /* Env */ }; + } + if (getEnableCache()) { + if (process.env.RUNNER_ENVIRONMENT === "github-hosted") { + if (process.env.RUNNER_TEMP !== void 0) { + return { + path: `${process.env.RUNNER_TEMP}${import_node_path.default.sep}setup-uv-cache`, + source: 3 /* Default */ + }; + } + throw Error( + "Could not determine UV_CACHE_DIR. Please make sure RUNNER_TEMP is set or provide the cache-local-path input" + ); + } + if (process.platform === "win32") { + return { + path: `${process.env.APPDATA}${import_node_path.default.sep}uv${import_node_path.default.sep}cache`, + source: 3 /* Default */ + }; + } + return { + path: `${process.env.HOME}${import_node_path.default.sep}.cache${import_node_path.default.sep}uv`, + source: 3 /* Default */ + }; + } +} +function getCacheDirFromConfig() { + for (const filePath of [versionFile, "uv.toml", "pyproject.toml"]) { + const resolvedPath = resolveRelativePath(filePath); + try { + const cacheDir2 = getConfigValueFromTomlFile(resolvedPath, "cache-dir"); + if (cacheDir2 !== void 0) { + info(`Found cache-dir in ${resolvedPath}: ${cacheDir2}`); + return cacheDir2; + } + } catch (err) { + const message = err.message; + warning(`Error while parsing ${filePath}: ${message}`); + return void 0; + } + } + return void 0; +} +function getUvPythonDir() { + if (process.env.UV_PYTHON_INSTALL_DIR !== void 0) { + info( + `UV_PYTHON_INSTALL_DIR is already set to ${process.env.UV_PYTHON_INSTALL_DIR}` + ); + return process.env.UV_PYTHON_INSTALL_DIR; + } + if (process.env.RUNNER_ENVIRONMENT !== "github-hosted") { + if (process.platform === "win32") { + return `${process.env.APPDATA}${import_node_path.default.sep}uv${import_node_path.default.sep}python`; + } else { + return `${process.env.HOME}${import_node_path.default.sep}.local${import_node_path.default.sep}share${import_node_path.default.sep}uv${import_node_path.default.sep}python`; + } + } + if (process.env.RUNNER_TEMP !== void 0) { + return `${process.env.RUNNER_TEMP}${import_node_path.default.sep}uv-python-dir`; + } + throw Error( + "Could not determine UV_PYTHON_INSTALL_DIR. Please make sure RUNNER_TEMP is set or provide the UV_PYTHON_INSTALL_DIR environment variable" + ); +} +function getCacheDependencyGlob() { + const cacheDependencyGlobInput = getInput("cache-dependency-glob"); + if (cacheDependencyGlobInput !== "") { + return cacheDependencyGlobInput.split("\n").map((part) => part.trim()).map((part) => expandTilde(part)).map((part) => resolveRelativePath(part)).join("\n"); + } + return cacheDependencyGlobInput; +} +function expandTilde(input) { + if (input.startsWith("~")) { + return `${process.env.HOME}${input.substring(1)}`; + } + return input; +} +function normalizePath(inputPath) { + const normalized = import_node_path.default.normalize(inputPath); + const root = import_node_path.default.parse(normalized).root; + let trimmed = normalized; + while (trimmed.length > root.length && trimmed.endsWith(import_node_path.default.sep)) { + trimmed = trimmed.slice(0, -1); + } + return trimmed; +} +function resolveRelativePath(inputPath) { + const hasNegation = inputPath.startsWith("!"); + const pathWithoutNegation = hasNegation ? inputPath.substring(1) : inputPath; + const resolvedPath = import_node_path.default.resolve(workingDirectory, pathWithoutNegation); + debug( + `Resolving relative path ${inputPath} to ${hasNegation ? "!" : ""}${resolvedPath}` + ); + return hasNegation ? `!${resolvedPath}` : resolvedPath; +} +function getManifestFile() { + const manifestFileInput = getInput("manifest-file"); + if (manifestFileInput !== "") { + return manifestFileInput; + } + return void 0; +} +function getResolutionStrategy() { + const resolutionStrategyInput = getInput("resolution-strategy"); + if (resolutionStrategyInput === "lowest") { + return "lowest"; + } + if (resolutionStrategyInput === "highest" || resolutionStrategyInput === "") { + return "highest"; + } + throw new Error( + `Invalid resolution-strategy: ${resolutionStrategyInput}. Must be 'highest' or 'lowest'.` + ); +} + +// src/utils/platforms.ts +var import_node_fs3 = __toESM(require("node:fs"), 1); var import_node_os3 = __toESM(require("node:os"), 1); function getArch() { const arch3 = process.arch; @@ -90396,7 +91314,7 @@ function getLinuxOSNameVersion() { const files = ["/etc/os-release", "/usr/lib/os-release"]; for (const file of files) { try { - const content = import_node_fs2.default.readFileSync(file, "utf8"); + const content = import_node_fs3.default.readFileSync(file, "utf8"); const id = parseOsReleaseValue(content, "ID"); const versionId2 = parseOsReleaseValue(content, "VERSION_ID"); const versionCodename = parseOsReleaseValue(content, "VERSION_CODENAME"); @@ -90427,10 +91345,10 @@ function getMacOSNameVersion() { return `macos-${macosVersion}`; } function getWindowsNameVersion() { - const version3 = import_node_os3.default.version(); - const match2 = version3.match(/Windows(?: Server)? (\d+)/); + const version4 = import_node_os3.default.version(); + const match2 = version4.match(/Windows(?: Server)? (\d+)/); if (!match2) { - throw new Error(`Failed to parse Windows version from: ${version3}`); + throw new Error(`Failed to parse Windows version from: ${version4}`); } return `windows-${match2[1]}`; } @@ -90440,30 +91358,30 @@ var STATE_CACHE_KEY = "cache-key"; var STATE_CACHE_MATCHED_KEY = "cache-matched-key"; var STATE_PYTHON_CACHE_MATCHED_KEY = "python-cache-matched-key"; var CACHE_VERSION = "2"; -async function restoreCache2(inputs, pythonVersion) { - const cacheKey = await computeKeys(inputs, pythonVersion); +async function restoreCache3(pythonVersion2) { + const cacheKey = await computeKeys(pythonVersion2); saveState(STATE_CACHE_KEY, cacheKey); setOutput("cache-key", cacheKey); - if (!inputs.restoreCache) { + if (!restoreCache2) { info("restore-cache is false. Skipping restore cache step."); setOutput("python-cache-hit", false); return; } - if (inputs.cacheLocalPath === void 0) { + if (cacheLocalPath === void 0) { throw new Error( "cache-local-path is not set. Cannot restore cache without a valid cache path." ); } await restoreCacheFromKey( cacheKey, - inputs.cacheLocalPath.path, + cacheLocalPath.path, STATE_CACHE_MATCHED_KEY, "cache-hit" ); - if (inputs.cachePython) { + if (cachePython) { await restoreCacheFromKey( `${cacheKey}-python`, - inputs.pythonDir, + pythonDir, STATE_PYTHON_CACHE_MATCHED_KEY, "python-cache-hit" ); @@ -90486,32 +91404,29 @@ async function restoreCacheFromKey(cacheKey, cachePath, stateKey, outputKey) { } handleMatchResult(matchedKey, cacheKey, stateKey, outputKey); } -async function computeKeys(inputs, pythonVersion) { +async function computeKeys(pythonVersion2) { let cacheDependencyPathHash = "-"; - if (inputs.cacheDependencyGlob !== "") { + if (cacheDependencyGlob !== "") { info( - `Searching files using cache dependency glob: ${inputs.cacheDependencyGlob.split("\n").join(",")}` - ); - cacheDependencyPathHash += await hashFiles2( - inputs.cacheDependencyGlob, - true + `Searching files using cache dependency glob: ${cacheDependencyGlob.split("\n").join(",")}` ); + cacheDependencyPathHash += await hashFiles2(cacheDependencyGlob, true); if (cacheDependencyPathHash === "-") { warning( - `No file matched to [${inputs.cacheDependencyGlob.split("\n").join(",")}]. The cache will never get invalidated. Make sure you have checked out the target repository and configured the cache-dependency-glob input correctly.` + `No file matched to [${cacheDependencyGlob.split("\n").join(",")}]. The cache will never get invalidated. Make sure you have checked out the target repository and configured the cache-dependency-glob input correctly.` ); } } if (cacheDependencyPathHash === "-") { cacheDependencyPathHash = "-no-dependency-glob"; } - const suffix = inputs.cacheSuffix ? `-${inputs.cacheSuffix}` : ""; - const version3 = pythonVersion ?? "unknown"; + const suffix = cacheSuffix ? `-${cacheSuffix}` : ""; + const version4 = pythonVersion2 ?? "unknown"; const platform2 = await getPlatform(); const osNameVersion = getOSNameVersion(); - const pruned = inputs.pruneCache ? "-pruned" : ""; - const python = inputs.cachePython ? "-py" : ""; - return `setup-uv-${CACHE_VERSION}-${getArch()}-${platform2}-${osNameVersion}-${version3}${pruned}${python}${cacheDependencyPathHash}${suffix}`; + const pruned = pruneCache ? "-pruned" : ""; + const python = cachePython ? "-py" : ""; + return `setup-uv-${CACHE_VERSION}-${getArch()}-${platform2}-${osNameVersion}-${version4}${pruned}${python}${cacheDependencyPathHash}${suffix}`; } function handleMatchResult(matchedKey, primaryKey, stateKey, outputKey) { if (!matchedKey) { @@ -90525,19 +91440,19 @@ function handleMatchResult(matchedKey, primaryKey, stateKey, outputKey) { } // src/download/download-version.ts -var import_node_fs3 = require("node:fs"); -var path13 = __toESM(require("node:path"), 1); +var import_node_fs4 = require("node:fs"); +var path14 = __toESM(require("node:path"), 1); // node_modules/@actions/tool-cache/lib/tool-cache.js var crypto5 = __toESM(require("crypto"), 1); -var fs9 = __toESM(require("fs"), 1); +var fs10 = __toESM(require("fs"), 1); // node_modules/@actions/tool-cache/lib/manifest.js var semver2 = __toESM(require_semver4(), 1); // node_modules/@actions/tool-cache/lib/tool-cache.js var os9 = __toESM(require("os"), 1); -var path12 = __toESM(require("path"), 1); +var path13 = __toESM(require("path"), 1); var semver3 = __toESM(require_semver4(), 1); var stream3 = __toESM(require("stream"), 1); var util6 = __toESM(require("util"), 1); @@ -90653,8 +91568,8 @@ var IS_MAC = process.platform === "darwin"; var userAgent = "actions/tool-cache"; function downloadTool(url2, dest, auth, headers) { return __awaiter18(this, void 0, void 0, function* () { - dest = dest || path12.join(_getTempDirectory(), crypto5.randomUUID()); - yield mkdirP(path12.dirname(dest)); + dest = dest || path13.join(_getTempDirectory(), crypto5.randomUUID()); + yield mkdirP(path13.dirname(dest)); debug(`Downloading ${url2}`); debug(`Destination ${dest}`); const maxAttempts = 3; @@ -90675,7 +91590,7 @@ function downloadTool(url2, dest, auth, headers) { } function downloadToolAttempt(url2, dest, auth, headers) { return __awaiter18(this, void 0, void 0, function* () { - if (fs9.existsSync(dest)) { + if (fs10.existsSync(dest)) { throw new Error(`Destination file path ${dest} already exists`); } const http3 = new HttpClient(userAgent, [], { @@ -90699,7 +91614,7 @@ function downloadToolAttempt(url2, dest, auth, headers) { const readStream = responseMessageFactory(); let succeeded = false; try { - yield pipeline4(readStream, fs9.createWriteStream(dest)); + yield pipeline4(readStream, fs10.createWriteStream(dest)); debug("download complete"); succeeded = true; return dest; @@ -90829,21 +91744,21 @@ function extractZipNix(file, dest) { yield exec(`"${unzipPath}"`, args, { cwd: dest }); }); } -function cacheDir(sourceDir2, tool, version3, arch3) { +function cacheDir(sourceDir2, tool, version4, arch3) { return __awaiter18(this, void 0, void 0, function* () { - version3 = semver3.clean(version3) || version3; + version4 = semver3.clean(version4) || version4; arch3 = arch3 || os9.arch(); - debug(`Caching tool ${tool} ${version3} ${arch3}`); + debug(`Caching tool ${tool} ${version4} ${arch3}`); debug(`source dir: ${sourceDir2}`); - if (!fs9.statSync(sourceDir2).isDirectory()) { + if (!fs10.statSync(sourceDir2).isDirectory()) { throw new Error("sourceDir is not a directory"); } - const destPath = yield _createToolPath(tool, version3, arch3); - for (const itemName of fs9.readdirSync(sourceDir2)) { - const s = path12.join(sourceDir2, itemName); + const destPath = yield _createToolPath(tool, version4, arch3); + for (const itemName of fs10.readdirSync(sourceDir2)) { + const s = path13.join(sourceDir2, itemName); yield cp(s, destPath, { recursive: true }); } - _completeToolPath(tool, version3, arch3); + _completeToolPath(tool, version4, arch3); return destPath; }); } @@ -90863,9 +91778,9 @@ function find(toolName, versionSpec, arch3) { let toolPath = ""; if (versionSpec) { versionSpec = semver3.clean(versionSpec) || ""; - const cachePath = path12.join(_getCacheDirectory(), toolName, versionSpec, arch3); + const cachePath = path13.join(_getCacheDirectory(), toolName, versionSpec, arch3); debug(`checking cache: ${cachePath}`); - if (fs9.existsSync(cachePath) && fs9.existsSync(`${cachePath}.complete`)) { + if (fs10.existsSync(cachePath) && fs10.existsSync(`${cachePath}.complete`)) { debug(`Found tool in cache ${toolName} ${versionSpec} ${arch3}`); toolPath = cachePath; } else { @@ -90877,13 +91792,13 @@ function find(toolName, versionSpec, arch3) { function findAllVersions(toolName, arch3) { const versions = []; arch3 = arch3 || os9.arch(); - const toolPath = path12.join(_getCacheDirectory(), toolName); - if (fs9.existsSync(toolPath)) { - const children = fs9.readdirSync(toolPath); + const toolPath = path13.join(_getCacheDirectory(), toolName); + if (fs10.existsSync(toolPath)) { + const children = fs10.readdirSync(toolPath); for (const child2 of children) { if (isExplicitVersion(child2)) { - const fullPath = path12.join(toolPath, child2, arch3 || ""); - if (fs9.existsSync(fullPath) && fs9.existsSync(`${fullPath}.complete`)) { + const fullPath = path13.join(toolPath, child2, arch3 || ""); + if (fs10.existsSync(fullPath) && fs10.existsSync(`${fullPath}.complete`)) { versions.push(child2); } } @@ -90894,15 +91809,15 @@ function findAllVersions(toolName, arch3) { function _createExtractFolder(dest) { return __awaiter18(this, void 0, void 0, function* () { if (!dest) { - dest = path12.join(_getTempDirectory(), crypto5.randomUUID()); + dest = path13.join(_getTempDirectory(), crypto5.randomUUID()); } yield mkdirP(dest); return dest; }); } -function _createToolPath(tool, version3, arch3) { +function _createToolPath(tool, version4, arch3) { return __awaiter18(this, void 0, void 0, function* () { - const folderPath = path12.join(_getCacheDirectory(), tool, semver3.clean(version3) || version3, arch3 || ""); + const folderPath = path13.join(_getCacheDirectory(), tool, semver3.clean(version4) || version4, arch3 || ""); debug(`destination ${folderPath}`); const markerPath = `${folderPath}.complete`; yield rmRF(folderPath); @@ -90911,10 +91826,10 @@ function _createToolPath(tool, version3, arch3) { return folderPath; }); } -function _completeToolPath(tool, version3, arch3) { - const folderPath = path12.join(_getCacheDirectory(), tool, semver3.clean(version3) || version3, arch3 || ""); +function _completeToolPath(tool, version4, arch3) { + const folderPath = path13.join(_getCacheDirectory(), tool, semver3.clean(version4) || version4, arch3 || ""); const markerPath = `${folderPath}.complete`; - fs9.writeFileSync(markerPath, ""); + fs10.writeFileSync(markerPath, ""); debug("finished caching tool"); } function isExplicitVersion(versionSpec) { @@ -90925,7 +91840,7 @@ function isExplicitVersion(versionSpec) { return valid2; } function evaluateVersions(versions, versionSpec) { - let version3 = ""; + let version4 = ""; debug(`evaluating ${versions.length} versions`); versions = versions.sort((a, b) => { if (semver3.gt(a, b)) { @@ -90937,16 +91852,16 @@ function evaluateVersions(versions, versionSpec) { const potential = versions[i]; const satisfied = semver3.satisfies(potential, versionSpec); if (satisfied) { - version3 = potential; + version4 = potential; break; } } - if (version3) { - debug(`matched: ${version3}`); + if (version4) { + debug(`matched: ${version4}`); } else { debug("match not found"); } - return version3; + return version4; } function _getCacheDirectory() { const cacheDirectory = process.env["RUNNER_TOOL_CACHE"] || ""; @@ -90965,109 +91880,22 @@ function _getGlobal(key, defaultValue) { // src/download/download-version.ts var pep440 = __toESM(require_pep440(), 1); -var semver4 = __toESM(require_semver5(), 1); +var semver5 = __toESM(require_semver5(), 1); // src/utils/constants.ts var TOOL_CACHE_NAME = "uv"; var STATE_UV_PATH = "uv-path"; var STATE_UV_VERSION = "uv-version"; -var VERSIONS_MANIFEST_URL = "https://raw.githubusercontent.com/astral-sh/versions/main/v1/uv.ndjson"; +var VERSIONS_NDJSON_URL = "https://raw.githubusercontent.com/astral-sh/versions/main/v1/uv.ndjson"; var GITHUB_RELEASES_PREFIX = "https://github.com/astral-sh/uv/releases/download/"; var ASTRAL_MIRROR_PREFIX = "https://releases.astral.sh/github/uv/releases/download/"; // src/download/checksum/checksum.ts var crypto6 = __toESM(require("node:crypto"), 1); -var fs10 = __toESM(require("node:fs"), 1); +var fs11 = __toESM(require("node:fs"), 1); // src/download/checksum/known-checksums.ts var KNOWN_CHECKSUMS = { - "aarch64-apple-darwin-0.11.2": "4beaa9550f93ef7f0fc02f7c28c9c48cd61fe30db00f5ac8947e0a425c3fb282", - "aarch64-pc-windows-msvc-0.11.2": "ffdded8338205f53727b51d404563a5ac8eaa9aea53279a7b7c42177e11d478c", - "aarch64-unknown-linux-gnu-0.11.2": "04792cac761c4a6ba78267f36f2af541b7f92196d42ac55d21d3ff6b0f5ab6a5", - "aarch64-unknown-linux-musl-0.11.2": "275d91dd1f1955136591e7ec5e1fa21e84d0d37ead7da7c35c3683df748d9855", - "arm-unknown-linux-musleabihf-0.11.2": "ce572dac1a8f9a92960f89e99351352fae068d34b24bed86fb88e75fd5dd67d9", - "armv7-unknown-linux-gnueabihf-0.11.2": "3e90d7de9e3a4e2d8d1bd9ce164362fce22248474986e712039479fb6fd73136", - "armv7-unknown-linux-musleabihf-0.11.2": "5222cdd7c7dd3263f8c243831606a9f01a1a07a40ffc3c26c03afb34491075c2", - "i686-pc-windows-msvc-0.11.2": "506f8274b253b2386881a121f3b7d915b637019bda15876bbd1357235305cf12", - "i686-unknown-linux-gnu-0.11.2": "c7ec378bab887443a70786382e58d76489da14a7e33b155915d648cca4bdb46c", - "i686-unknown-linux-musl-0.11.2": "ade8714be45457899568c5b03ef885a0cc94476c07a0bdbe34531ba84231bab2", - "powerpc64le-unknown-linux-gnu-0.11.2": "3f3a50e99364efc8ff7add10e79757a2b8458700a38180ec5f313524481b9fbc", - "riscv64gc-unknown-linux-gnu-0.11.2": "e56a93f0ff21d6908461a6ecbf465beae19ae22719f900284abb7680bd07ec41", - "riscv64gc-unknown-linux-musl-0.11.2": "4f263571bb457a16a31cb38fba4fcc9cf1059d1d32c5b2e54c43175fcd59205d", - "s390x-unknown-linux-gnu-0.11.2": "42ebe40775f2a77a514fa47399fde86473bf35bd33b6896c6410a0309fc4d205", - "x86_64-apple-darwin-0.11.2": "a9c3653245031304c50dd60ac0301bf6c112e12c38c32302a71d4fa6a63ba2cb", - "x86_64-pc-windows-msvc-0.11.2": "171b7ccda1bbd562da6babeffcf533a1c6cc7862cf998da826e1db534fc43e48", - "x86_64-unknown-linux-gnu-0.11.2": "7ac2ca0449c8d68dae9b99e635cd3bc9b22a4cb1de64b7c43716398447d42981", - "x86_64-unknown-linux-musl-0.11.2": "4700d9fc75734247587deb3e25dd2c6c24f4ac69e8fe91d6acad4a6013115c06", - "aarch64-apple-darwin-0.11.1": "f7815f739ed5d0e4202e6292acedb8659b9ae7de663d07188d8c6cbd7f96303f", - "aarch64-pc-windows-msvc-0.11.1": "b789db0c1504dd3b02c090bd5783487497cc46cc2eb71754874cdd1ef59eb52a", - "aarch64-unknown-linux-gnu-0.11.1": "1340e62da1ee3c1109764340e1247e8a1a232c30dde4a0f0548976dcaa90f06d", - "aarch64-unknown-linux-musl-0.11.1": "bd04ffce77ee8d77f39823c13606183581847c2f5dcd704f2ea0f15e376b1a27", - "arm-unknown-linux-musleabihf-0.11.1": "625c0e756e2374fce864ceaa6beedd5821e276e2b6307f2b719f2d62b449b89c", - "armv7-unknown-linux-gnueabihf-0.11.1": "baf8daaab20b0502d1853dbfd916afb0762c024ae7f0df1c2deb2a1a1c1c3467", - "armv7-unknown-linux-musleabihf-0.11.1": "684c25b74e83bcb1b177152379cfe2c974ba731aa5af278e1d161e41709f8bcf", - "i686-pc-windows-msvc-0.11.1": "3c07858a08c54e4e5753239354c7b07ae69071b2b6f5aa2cc970e612adcb4740", - "i686-unknown-linux-gnu-0.11.1": "6e83167c05708570563b10b6cc7e8c289daef5f51fde0b152e41af2a7ef70813", - "i686-unknown-linux-musl-0.11.1": "b0d5152635c257fec76f95cb9268112b47ff70bd33a23866295a4f2ed9f46b7f", - "powerpc64le-unknown-linux-gnu-0.11.1": "e42d2abfac46f57564789e2bfa6dbea4ae3135892e36ae066ba0ae77b69bb676", - "riscv64gc-unknown-linux-gnu-0.11.1": "5e2c757b35dab015ad37f74ee3e060208390b5f4defb6684876f1be0664f3f6e", - "riscv64gc-unknown-linux-musl-0.11.1": "6f590a824aed363cbec4079f7ddab87b5685119e0f5f0e71cd114c7b7c326199", - "s390x-unknown-linux-gnu-0.11.1": "4208173c74e29572b799178709b5ed5828b24888659f944a4b47c0aaf78b42d2", - "x86_64-apple-darwin-0.11.1": "2103670e8e949605e51926c7b953923ff6f6befbfb55aee928f5e760c9c910f8", - "x86_64-pc-windows-msvc-0.11.1": "6659250cebbd3bb6ee48bcb21a3f0c6656450d63fb97f0f069bcb532bdb688ed", - "x86_64-unknown-linux-gnu-0.11.1": "7c0c8069053e6e99e5911ff32b916be571f3419cd8e11bd28fb7da2c7dcaa553", - "x86_64-unknown-linux-musl-0.11.1": "4e949471a95b37088a1ff1a585f69abed4d3cd3f921f50709a46b6ba62986d38", - "aarch64-apple-darwin-0.11.0": "0c0f32c6a3473c5928aff96c3233715edfc79290e892f255cac93710cde7b91a", - "aarch64-pc-windows-msvc-0.11.0": "95419e04a3ef5f13fb2a06bd6d787ba80a9d8981d6f097780e5a979817a2879d", - "aarch64-unknown-linux-gnu-0.11.0": "8e179ca110343a17f801444ff9ef117dba56ef5fc9f6a4c9bb77b318ddba5f24", - "aarch64-unknown-linux-musl-0.11.0": "658be4b8ec905635f1295468d4d5120d9e1ab1722eec9a104473ce993590babe", - "arm-unknown-linux-musleabihf-0.11.0": "bfdcbd5fa41c8a9877a72c2b55a95da2bc79933885ef56c699b65bb2ed9cea91", - "armv7-unknown-linux-gnueabihf-0.11.0": "0cad4e1b6769e48aa1e80cf639ddcc7c1bfe9ed017e95868fed185a8d818c949", - "armv7-unknown-linux-musleabihf-0.11.0": "2aa9da83c6c0cf8a06bc9df14d51056284fa067ef5390b4db79998ff12f3bee7", - "i686-pc-windows-msvc-0.11.0": "3b09d70e686087e096dbd8a2af21b922a2cac7d613dc053c3281c3ddbb961961", - "i686-unknown-linux-gnu-0.11.0": "59928a0267501c20d9f9942f5f1d81a991ec55e29a19e002ae3d5c178c674c89", - "i686-unknown-linux-musl-0.11.0": "1f438d6f6f851f0dabad3307ce7fd46541ecc5c42ebb664f382eb6c9a424a67d", - "powerpc64le-unknown-linux-gnu-0.11.0": "29f17fb43595492b1a36cda57df7adad74183132df32799d32897268ff4e26dd", - "riscv64gc-unknown-linux-gnu-0.11.0": "84ef37dda1003c5b65fa6c8f84242d35a7fcc84cc5ea9490d702edc36cad1f67", - "s390x-unknown-linux-gnu-0.11.0": "b25be62f3b642348a2fece5c658624586661b8d1103891ab6903768b0529edc4", - "x86_64-apple-darwin-0.11.0": "31aaec764166af8885cf99321fd6ed24fef80225a6f26ed1ae8ce04111688a7e", - "x86_64-pc-windows-msvc-0.11.0": "e21d00b172df83531564a95e75a2bdc0c59b471dbb3515f0c1b4d6ef657dc451", - "x86_64-unknown-linux-gnu-0.11.0": "cc0fbb42b3642125f600a55b0b095bea65cddaadb94c6ea2b6ba5d79c5825089", - "x86_64-unknown-linux-musl-0.11.0": "bf6b0757c73d1726faa2a819b155d4d864919a95766720215d78fdcd09d42d26", - "aarch64-apple-darwin-0.10.12": "ae738b5661a900579ec621d3918c0ef17bdec0da2a8a6d8b161137cd15f25414", - "aarch64-pc-windows-msvc-0.10.12": "e79881e2c4f98a0f3a37b8770bf224e8fee70f6dcf8fc17055d8291bb1b0b867", - "aarch64-unknown-linux-gnu-0.10.12": "0ed7d20f49f6b9b60d45fdfcac28f3ac01a671a6ef08672401ed2833423fea2a", - "aarch64-unknown-linux-musl-0.10.12": "55bd1c1c10ec8b95a8c184f5e18b566703c6ab105f0fc118aaa4d748aabf28e4", - "arm-unknown-linux-musleabihf-0.10.12": "9714e5059b05110a1c7ddbc18c971c13e0260e10551b7b77d82cbf907a4ebd9b", - "armv7-unknown-linux-gnueabihf-0.10.12": "eaa02f36d5112029601b18ac3d1a0c03a83bb20cb4154c2f5345f777fa6c4101", - "armv7-unknown-linux-musleabihf-0.10.12": "bd735652298c6e62cdd2ac939babe176a3356613e6803baa33d0bc10e8d9e4ed", - "i686-pc-windows-msvc-0.10.12": "2312e75b9c77befdc1bff30da18f16df03083452852952553bee91da362c1a1d", - "i686-unknown-linux-gnu-0.10.12": "8501844b34e3a28cfbba5a4b857eebd696d952e0bb4160357451ad80f3f49db8", - "i686-unknown-linux-musl-0.10.12": "56cad78abcf5b710d2f7b9f774fcfd6bbed340d2aa9d9fc9e3b515542ec5e953", - "powerpc64le-unknown-linux-gnu-0.10.12": "3c8017d9112221c83f43e8a15a58099663c0b2bdeabc8b43bb800413dfa21218", - "riscv64gc-unknown-linux-gnu-0.10.12": "b1ca482b6b5dd7bf6ab733a3695cb0ab5b8e992ca96527efae93aa78fcc52a9b", - "s390x-unknown-linux-gnu-0.10.12": "e1a0345eefe6fd3300948cd6f18aab092f9b88a243782113e645ce96530a6693", - "x86_64-apple-darwin-0.10.12": "17443e293f2ae407bb2d8d34b875ebfe0ae01cf1296de5647e69e7b2e2b428f0", - "x86_64-pc-windows-msvc-0.10.12": "4c1d55501869b3330d4aabf45ad6024ce2367e0f3af83344395702d272c22e88", - "x86_64-unknown-linux-gnu-0.10.12": "ec72570c9d1f33021aa80b176d7baba390de2cfeb1abcbefca346d563bf17484", - "x86_64-unknown-linux-musl-0.10.12": "adccf40b5d1939a5e0093081ec2307ea24235adf7c2d96b122c561fa37711c46", - "aarch64-apple-darwin-0.10.11": "437a7d498dd6564d5bf986074249ba1fc600e73da55ae04d7bd4c24d5f149b95", - "aarch64-pc-windows-msvc-0.10.11": "6a3eec4105c775dd87c11ef8ec41564648273751ff807c8955c24ddbcc636d03", - "aarch64-unknown-linux-gnu-0.10.11": "23003df007937dd607409c8ddf010baa82bad2673e60e254632ca5b04edcce13", - "aarch64-unknown-linux-musl-0.10.11": "5d80a7f6343d2676dfde1e5126582070a2bbc62df6f60d5527a169be3788532a", - "arm-unknown-linux-musleabihf-0.10.11": "d3c248497c450d22a39c1d43a4a358c0c852e6056f5f49be96495eea41afb96c", - "armv7-unknown-linux-gnueabihf-0.10.11": "7895a6470dfba051af4e74253599482fc0b37141b5d229956b383365e1a22902", - "armv7-unknown-linux-musleabihf-0.10.11": "d2880c08acfdaef0985488972c8b14969f7139c27545046e2f6202f0e0f4d9d8", - "i686-pc-windows-msvc-0.10.11": "c17f3dc3b2c47490057f17a1f0c37270f11a7b7cedf9bf2c0f841ce02bc7001b", - "i686-unknown-linux-gnu-0.10.11": "1ab69ff7dd104a902731758ee05b782dfd9bdb263384e61650de638f33f586df", - "i686-unknown-linux-musl-0.10.11": "cffb80d303fc1655e259d0b769c489f452e97425a6b6d3393d766413783a1d8c", - "powerpc64le-unknown-linux-gnu-0.10.11": "ddc6a20670e60219e947b1b04813be80d7e9f4c4a0234231c8ed9298eec04aa6", - "riscv64gc-unknown-linux-gnu-0.10.11": "c0719473cf5f8b475e917b8dfef6ae5d876b86a00a82ef91e47a02f561399f4f", - "s390x-unknown-linux-gnu-0.10.11": "305ee734c585918515a22fe43b7cf253c38d468771373a0c02364d67498e07b2", - "x86_64-apple-darwin-0.10.11": "ff90020b554cf02ef8008535c9aab6ef27bb7be6b075359300dec79c361df897", - "x86_64-pc-windows-msvc-0.10.11": "9ee74df98582f37fdd6069e1caac80d2616f9a489f5dbb2b1c152f30be69c58e", - "x86_64-unknown-linux-gnu-0.10.11": "5a360b0de092ddf4131f5313d0411b48c4e95e8107e40c3f8f2e9fcb636b3583", - "x86_64-unknown-linux-musl-0.10.11": "d78246139dc6cf3ed6d03c84da762686bced7ad1de67977ee372a45b95a1f6d0", "aarch64-apple-darwin-0.10.10": "8a09f0ef51ee7f7170731b4cb8bde5bf9ba6da5304f49a7df6cdab42a1f37b5d", "aarch64-pc-windows-msvc-0.10.10": "2c6fe113f14574bc27f085751c68d3485589fcc3c3c64ed85dd1eecc2f87cffc", "aarch64-unknown-linux-gnu-0.10.10": "2b80457b950deda12e8d5dc3b9b7494ac143eae47f1fb11b1c6e5a8495a6421e", @@ -95480,8 +96308,8 @@ var KNOWN_CHECKSUMS = { }; // src/download/checksum/checksum.ts -async function validateChecksum(checksum, downloadPath, arch3, platform2, version3) { - const key = `${arch3}-${platform2}-${version3}`; +async function validateChecksum(checksum, downloadPath, arch3, platform2, version4) { + const key = `${arch3}-${platform2}-${version4}`; const hasProvidedChecksum = checksum !== void 0 && checksum !== ""; const checksumToUse = hasProvidedChecksum ? checksum : KNOWN_CHECKSUMS[key]; if (checksumToUse === void 0) { @@ -95501,7 +96329,7 @@ async function validateChecksum(checksum, downloadPath, arch3, platform2, versio async function validateFileCheckSum(filePath, expected) { return new Promise((resolve3, reject) => { const hash = crypto6.createHash("sha256"); - const stream4 = fs10.createReadStream(filePath); + const stream4 = fs11.createReadStream(filePath); stream4.on("error", (err) => reject(err)); stream4.on("data", (chunk) => hash.update(chunk)); stream4.on("end", () => { @@ -95511,6 +96339,9 @@ async function validateFileCheckSum(filePath, expected) { }); } +// src/download/version-manifest.ts +var semver4 = __toESM(require_semver5(), 1); + // src/utils/fetch.ts var import_undici2 = __toESM(require_undici2(), 1); function getProxyAgent() { @@ -95529,6 +96360,45 @@ var fetch = async (url2, opts) => await (0, import_undici2.fetch)(url2, { ...opts }); +// src/download/legacy-version-manifest.ts +var warnedLegacyManifestUrls = /* @__PURE__ */ new Set(); +function parseLegacyManifestEntries(parsedEntries, manifestUrl) { + warnAboutLegacyManifestFormat(manifestUrl); + return parsedEntries.map((entry, index) => { + if (!isLegacyManifestEntry(entry)) { + throw new Error( + `Invalid legacy manifest-file entry at index ${index} in ${manifestUrl}.` + ); + } + return { + arch: entry.arch, + checksum: entry.checksum, + downloadUrl: entry.downloadUrl, + platform: entry.platform, + version: entry.version + }; + }); +} +function warnAboutLegacyManifestFormat(manifestUrl) { + if (warnedLegacyManifestUrls.has(manifestUrl)) { + return; + } + warnedLegacyManifestUrls.add(manifestUrl); + warning( + `manifest-file ${manifestUrl} uses the legacy JSON array format, which is deprecated. Please migrate to the astral-sh/versions NDJSON format before the next major release.` + ); +} +function isLegacyManifestEntry(value) { + if (!isRecord(value)) { + return false; + } + const checksumIsValid = typeof value.checksum === "string" || value.checksum === void 0; + return typeof value.arch === "string" && checksumIsValid && typeof value.downloadUrl === "string" && typeof value.platform === "string" && typeof value.version === "string"; +} +function isRecord(value) { + return typeof value === "object" && value !== null; +} + // src/download/variant-selection.ts function selectDefaultVariant(entries, duplicateEntryDescription) { const firstEntry = entries[0]; @@ -95555,81 +96425,73 @@ function formatVariants(entries) { return entries.map((entry) => entry.variant ?? "default").sort((left, right) => left.localeCompare(right)).join(", "); } -// src/download/manifest.ts -var cachedManifestData = /* @__PURE__ */ new Map(); -async function fetchManifest(manifestUrl = VERSIONS_MANIFEST_URL) { - const cachedVersions = cachedManifestData.get(manifestUrl); +// src/download/versions-client.ts +var cachedVersionData = /* @__PURE__ */ new Map(); +async function fetchVersionData(url2 = VERSIONS_NDJSON_URL) { + const cachedVersions = cachedVersionData.get(url2); if (cachedVersions !== void 0) { - debug(`Using cached manifest data from ${manifestUrl}`); + debug(`Using cached NDJSON version data from ${url2}`); return cachedVersions; } - info(`Fetching manifest data from ${manifestUrl} ...`); - const response = await fetch(manifestUrl, {}); + info(`Fetching version data from ${url2} ...`); + const response = await fetch(url2, {}); if (!response.ok) { throw new Error( - `Failed to fetch manifest data: ${response.status} ${response.statusText}` + `Failed to fetch version data: ${response.status} ${response.statusText}` ); } const body2 = await response.text(); - const versions = parseManifest(body2, manifestUrl); - cachedManifestData.set(manifestUrl, versions); + const versions = parseVersionData(body2, url2); + cachedVersionData.set(url2, versions); return versions; } -function parseManifest(data, sourceDescription) { - const trimmed = data.trim(); - if (trimmed === "") { - throw new Error(`Manifest at ${sourceDescription} is empty.`); - } - if (trimmed.startsWith("[")) { - throw new Error( - `Legacy JSON array manifests are no longer supported in ${sourceDescription}. Use the astral-sh/versions manifest format instead.` - ); - } +function parseVersionData(data, sourceDescription) { const versions = []; for (const [index, line] of data.split("\n").entries()) { - const record = line.trim(); - if (record === "") { + const trimmed = line.trim(); + if (trimmed === "") { continue; } let parsed; try { - parsed = JSON.parse(record); + parsed = JSON.parse(trimmed); } catch (error2) { throw new Error( - `Failed to parse manifest data from ${sourceDescription} at line ${index + 1}: ${error2.message}` + `Failed to parse version data from ${sourceDescription} at line ${index + 1}: ${error2.message}` ); } - if (!isManifestVersion(parsed)) { + if (!isNdjsonVersion(parsed)) { throw new Error( - `Invalid manifest record in ${sourceDescription} at line ${index + 1}.` + `Invalid NDJSON record in ${sourceDescription} at line ${index + 1}.` ); } versions.push(parsed); } if (versions.length === 0) { - throw new Error(`No manifest data found in ${sourceDescription}.`); + throw new Error(`No version data found in ${sourceDescription}.`); } return versions; } -async function getLatestVersion(manifestUrl = VERSIONS_MANIFEST_URL) { - const latestVersion = (await fetchManifest(manifestUrl))[0]?.version; - if (latestVersion === void 0) { - throw new Error("No versions found in manifest data"); +async function getLatestVersion() { + const versions = await fetchVersionData(); + const latestVersion = versions[0]?.version; + if (!latestVersion) { + throw new Error("No versions found in NDJSON data"); } - debug(`Latest version from manifest: ${latestVersion}`); + debug(`Latest version from NDJSON: ${latestVersion}`); return latestVersion; } -async function getAllVersions(manifestUrl = VERSIONS_MANIFEST_URL) { - const versions = await fetchManifest(manifestUrl); +async function getAllVersions() { + const versions = await fetchVersionData(); return versions.map((versionData) => versionData.version); } -async function getArtifact(version3, arch3, platform2, manifestUrl = VERSIONS_MANIFEST_URL) { - const versions = await fetchManifest(manifestUrl); +async function getArtifact(version4, arch3, platform2) { + const versions = await fetchVersionData(); const versionData = versions.find( - (candidate) => candidate.version === version3 + (candidate) => candidate.version === version4 ); if (!versionData) { - debug(`Version ${version3} not found in manifest ${manifestUrl}`); + debug(`Version ${version4} not found in NDJSON data`); return void 0; } const targetPlatform = `${arch3}-${platform2}`; @@ -95638,71 +96500,177 @@ async function getArtifact(version3, arch3, platform2, manifestUrl = VERSIONS_MA ); if (matchingArtifacts.length === 0) { debug( - `Artifact for ${targetPlatform} not found in version ${version3}. Available platforms: ${versionData.artifacts.map((candidate) => candidate.platform).join(", ")}` + `Artifact for ${targetPlatform} not found in version ${version4}. Available platforms: ${versionData.artifacts.map((candidate) => candidate.platform).join(", ")}` ); return void 0; } - const artifact = selectDefaultVariant( - matchingArtifacts, - `Multiple artifacts found for ${targetPlatform} in version ${version3}` - ); + const artifact = selectArtifact(matchingArtifacts, version4, targetPlatform); return { archiveFormat: artifact.archive_format, - checksum: artifact.sha256, - downloadUrl: artifact.url + sha256: artifact.sha256, + url: artifact.url }; } -function isManifestVersion(value) { - if (!isRecord(value)) { +function selectArtifact(artifacts, version4, targetPlatform) { + return selectDefaultVariant( + artifacts, + `Multiple artifacts found for ${targetPlatform} in version ${version4}` + ); +} +function isNdjsonVersion(value) { + if (!isRecord2(value)) { return false; } if (typeof value.version !== "string" || !Array.isArray(value.artifacts)) { return false; } - return value.artifacts.every(isManifestArtifact); + return value.artifacts.every(isNdjsonArtifact); } -function isManifestArtifact(value) { - if (!isRecord(value)) { +function isNdjsonArtifact(value) { + if (!isRecord2(value)) { return false; } const variantIsValid = typeof value.variant === "string" || value.variant === void 0; return typeof value.archive_format === "string" && typeof value.platform === "string" && typeof value.sha256 === "string" && typeof value.url === "string" && variantIsValid; } -function isRecord(value) { +function isRecord2(value) { return typeof value === "object" && value !== null; } +// src/download/version-manifest.ts +var cachedManifestEntries = /* @__PURE__ */ new Map(); +async function getLatestKnownVersion(manifestUrl) { + const versions = await getAllVersions2(manifestUrl); + const latestVersion = versions.reduce( + (latest, current) => semver4.gt(current, latest) ? current : latest + ); + return latestVersion; +} +async function getAllVersions2(manifestUrl) { + const manifestEntries = await getManifestEntries(manifestUrl); + return [...new Set(manifestEntries.map((entry) => entry.version))]; +} +async function getManifestArtifact(manifestUrl, version4, arch3, platform2) { + const manifestEntries = await getManifestEntries(manifestUrl); + const entry = selectManifestEntry( + manifestEntries, + manifestUrl, + version4, + arch3, + platform2 + ); + if (!entry) { + return void 0; + } + return { + archiveFormat: entry.archiveFormat, + checksum: entry.checksum, + downloadUrl: entry.downloadUrl + }; +} +async function getManifestEntries(manifestUrl) { + const cachedEntries = cachedManifestEntries.get(manifestUrl); + if (cachedEntries !== void 0) { + debug(`Using cached manifest-file from: ${manifestUrl}`); + return cachedEntries; + } + info(`Fetching manifest-file from: ${manifestUrl}`); + const response = await fetch(manifestUrl, {}); + if (!response.ok) { + throw new Error( + `Failed to fetch manifest-file: ${response.status} ${response.statusText}` + ); + } + const data = await response.text(); + const parsedEntries = parseManifestEntries(data, manifestUrl); + cachedManifestEntries.set(manifestUrl, parsedEntries); + return parsedEntries; +} +function parseManifestEntries(data, manifestUrl) { + const trimmed = data.trim(); + if (trimmed === "") { + throw new Error(`manifest-file at ${manifestUrl} is empty.`); + } + const parsedAsJson = tryParseJson(trimmed); + if (Array.isArray(parsedAsJson)) { + return parseLegacyManifestEntries(parsedAsJson, manifestUrl); + } + const versions = parseVersionData(trimmed, manifestUrl); + return mapNdjsonVersionsToManifestEntries(versions, manifestUrl); +} +function mapNdjsonVersionsToManifestEntries(versions, manifestUrl) { + const manifestEntries = []; + for (const versionData of versions) { + for (const artifact of versionData.artifacts) { + const [arch3, ...platformParts] = artifact.platform.split("-"); + if (arch3 === void 0 || platformParts.length === 0) { + throw new Error( + `Invalid artifact platform '${artifact.platform}' in manifest-file ${manifestUrl}.` + ); + } + manifestEntries.push({ + arch: arch3, + archiveFormat: artifact.archive_format, + checksum: artifact.sha256, + downloadUrl: artifact.url, + platform: platformParts.join("-"), + variant: artifact.variant, + version: versionData.version + }); + } + } + return manifestEntries; +} +function selectManifestEntry(manifestEntries, manifestUrl, version4, arch3, platform2) { + const matches = manifestEntries.filter( + (candidate) => candidate.version === version4 && candidate.arch === arch3 && candidate.platform === platform2 + ); + if (matches.length === 0) { + return void 0; + } + return selectDefaultVariant( + matches, + `manifest-file ${manifestUrl} contains multiple artifacts for version ${version4}, arch ${arch3}, platform ${platform2}` + ); +} +function tryParseJson(value) { + try { + return JSON.parse(value); + } catch { + return void 0; + } +} + // src/download/download-version.ts -function tryGetFromToolCache(arch3, version3) { - debug(`Trying to get uv from tool cache for ${version3}...`); +function tryGetFromToolCache(arch3, version4) { + debug(`Trying to get uv from tool cache for ${version4}...`); const cachedVersions = findAllVersions(TOOL_CACHE_NAME, arch3); debug(`Cached versions: ${cachedVersions}`); - let resolvedVersion = evaluateVersions(cachedVersions, version3); + let resolvedVersion = evaluateVersions(cachedVersions, version4); if (resolvedVersion === "") { - resolvedVersion = version3; + resolvedVersion = version4; } const installedPath = find(TOOL_CACHE_NAME, resolvedVersion, arch3); return { installedPath, version: resolvedVersion }; } -async function downloadVersion(platform2, arch3, version3, checksum, githubToken, manifestUrl) { - const artifact = await getArtifact(version3, arch3, platform2, manifestUrl); +async function downloadVersionFromNdjson(platform2, arch3, version4, checkSum2, githubToken2) { + const artifact = await getArtifact(version4, arch3, platform2); if (!artifact) { throw new Error( - getMissingArtifactMessage(version3, arch3, platform2, manifestUrl) + `Could not find artifact for version ${version4}, arch ${arch3}, platform ${platform2} in ${VERSIONS_NDJSON_URL} .` ); } - const resolvedChecksum = manifestUrl === void 0 ? checksum : resolveChecksum(checksum, artifact.checksum); - const mirrorUrl = rewriteToMirror(artifact.downloadUrl); - const downloadUrl = mirrorUrl ?? artifact.downloadUrl; - const downloadToken = mirrorUrl !== void 0 ? void 0 : githubToken; + const mirrorUrl = rewriteToMirror(artifact.url); + const downloadUrl = mirrorUrl ?? artifact.url; + const downloadToken = mirrorUrl !== void 0 ? void 0 : githubToken2; try { - return await downloadArtifact( + return await downloadVersion( downloadUrl, `uv-${arch3}-${platform2}`, platform2, arch3, - version3, - resolvedChecksum, + version4, + checkSum2, downloadToken ); } catch (err) { @@ -95712,14 +96680,14 @@ async function downloadVersion(platform2, arch3, version3, checksum, githubToken warning( `Failed to download from mirror, falling back to GitHub Releases: ${err.message}` ); - return await downloadArtifact( - artifact.downloadUrl, + return await downloadVersion( + artifact.url, `uv-${arch3}-${platform2}`, platform2, arch3, - version3, - resolvedChecksum, - githubToken + version4, + checkSum2, + githubToken2 ); } } @@ -95729,14 +96697,36 @@ function rewriteToMirror(url2) { } return ASTRAL_MIRROR_PREFIX + url2.slice(GITHUB_RELEASES_PREFIX.length); } -async function downloadArtifact(downloadUrl, artifactName, platform2, arch3, version3, checksum, githubToken) { +async function downloadVersionFromManifest(manifestUrl, platform2, arch3, version4, checkSum2, githubToken2) { + const artifact = await getManifestArtifact( + manifestUrl, + version4, + arch3, + platform2 + ); + if (!artifact) { + throw new Error( + `manifest-file does not contain version ${version4}, arch ${arch3}, platform ${platform2}.` + ); + } + return await downloadVersion( + artifact.downloadUrl, + `uv-${arch3}-${platform2}`, + platform2, + arch3, + version4, + resolveChecksum(checkSum2, artifact.checksum), + githubToken2 + ); +} +async function downloadVersion(downloadUrl, artifactName, platform2, arch3, version4, checksum, githubToken2) { info(`Downloading uv from "${downloadUrl}" ...`); const downloadPath = await downloadTool( downloadUrl, void 0, - githubToken + githubToken2 ); - await validateChecksum(checksum, downloadPath, arch3, platform2, version3); + await validateChecksum(checksum, downloadPath, arch3, platform2, version4); let uvDir; if (platform2 === "pc-windows-msvc") { try { @@ -95747,53 +96737,54 @@ async function downloadArtifact(downloadUrl, artifactName, platform2, arch3, ver ); const extension = getExtension(platform2); const fullPathWithExtension = `${downloadPath}${extension}`; - await import_node_fs3.promises.copyFile(downloadPath, fullPathWithExtension); + await import_node_fs4.promises.copyFile(downloadPath, fullPathWithExtension); uvDir = await extractZip(fullPathWithExtension); } } else { const extractedDir = await extractTar2(downloadPath); - uvDir = path13.join(extractedDir, artifactName); + uvDir = path14.join(extractedDir, artifactName); } const cachedToolDir = await cacheDir( uvDir, TOOL_CACHE_NAME, - version3, + version4, arch3 ); - return { cachedToolDir, version: version3 }; + return { cachedToolDir, version: version4 }; } -function getMissingArtifactMessage(version3, arch3, platform2, manifestUrl) { - if (manifestUrl === void 0) { - return `Could not find artifact for version ${version3}, arch ${arch3}, platform ${platform2} in ${VERSIONS_MANIFEST_URL} .`; - } - return `manifest-file does not contain version ${version3}, arch ${arch3}, platform ${platform2}.`; -} -function resolveChecksum(checksum, manifestChecksum) { - return checksum !== void 0 && checksum !== "" ? checksum : manifestChecksum; +function resolveChecksum(checkSum2, manifestChecksum) { + return checkSum2 !== void 0 && checkSum2 !== "" ? checkSum2 : manifestChecksum; } function getExtension(platform2) { return platform2 === "pc-windows-msvc" ? ".zip" : ".tar.gz"; } -async function resolveVersion(versionInput, manifestUrl, resolutionStrategy = "highest") { +async function resolveVersion(versionInput, manifestUrl, resolutionStrategy2 = "highest") { debug(`Resolving version: ${versionInput}`); + let version4; const isSimpleMinimumVersionSpecifier = versionInput.includes(">") && !versionInput.includes(","); - const resolveVersionSpecifierToLatest = isSimpleMinimumVersionSpecifier && resolutionStrategy === "highest"; + const resolveVersionSpecifierToLatest = isSimpleMinimumVersionSpecifier && resolutionStrategy2 === "highest"; if (resolveVersionSpecifierToLatest) { info("Found minimum version specifier, using latest version"); } - const version3 = versionInput === "latest" || resolveVersionSpecifierToLatest ? await getLatestVersion(manifestUrl) : versionInput; - if (isExplicitVersion(version3)) { - debug(`Version ${version3} is an explicit version.`); - if (resolveVersionSpecifierToLatest && !pep440.satisfies(version3, versionInput)) { - throw new Error(`No version found for ${versionInput}`); + if (manifestUrl !== void 0) { + version4 = versionInput === "latest" || resolveVersionSpecifierToLatest ? await getLatestKnownVersion(manifestUrl) : versionInput; + } else { + version4 = versionInput === "latest" || resolveVersionSpecifierToLatest ? await getLatestVersion() : versionInput; + } + if (isExplicitVersion(version4)) { + debug(`Version ${version4} is an explicit version.`); + if (resolveVersionSpecifierToLatest) { + if (!pep440.satisfies(version4, versionInput)) { + throw new Error(`No version found for ${versionInput}`); + } } - return version3; + return version4; } const availableVersions = await getAvailableVersions(manifestUrl); debug(`Available versions: ${availableVersions}`); - const resolvedVersion = resolutionStrategy === "lowest" ? minSatisfying3(availableVersions, version3) : maxSatisfying2(availableVersions, version3); + const resolvedVersion = resolutionStrategy2 === "lowest" ? minSatisfying3(availableVersions, version4) : maxSatisfying2(availableVersions, version4); if (resolvedVersion === void 0) { - throw new Error(`No version found for ${version3}`); + throw new Error(`No version found for ${version4}`); } return resolvedVersion; } @@ -95802,18 +96793,18 @@ async function getAvailableVersions(manifestUrl) { info( `Getting available versions from manifest-file ${manifestUrl} ...` ); - } else { - info(`Getting available versions from ${VERSIONS_MANIFEST_URL} ...`); + return await getAllVersions2(manifestUrl); } - return await getAllVersions(manifestUrl); + info(`Getting available versions from ${VERSIONS_NDJSON_URL} ...`); + return await getAllVersions(); } -function maxSatisfying2(versions, version3) { - const maxSemver = evaluateVersions(versions, version3); +function maxSatisfying2(versions, version4) { + const maxSemver = evaluateVersions(versions, version4); if (maxSemver !== "") { debug(`Found a version that satisfies the semver range: ${maxSemver}`); return maxSemver; } - const maxPep440 = pep440.maxSatisfying(versions, version3); + const maxPep440 = pep440.maxSatisfying(versions, version4); if (maxPep440 !== null) { debug( `Found a version that satisfies the pep440 specifier: ${maxPep440}` @@ -95822,13 +96813,13 @@ function maxSatisfying2(versions, version3) { } return void 0; } -function minSatisfying3(versions, version3) { - const minSemver = semver4.minSatisfying(versions, version3); +function minSatisfying3(versions, version4) { + const minSemver = semver5.minSatisfying(versions, version4); if (minSemver !== null) { debug(`Found a version that satisfies the semver range: ${minSemver}`); return minSemver; } - const minPep440 = pep440.minSatisfying(versions, version3); + const minPep440 = pep440.minSatisfying(versions, version4); if (minPep440 !== null) { debug( `Found a version that satisfies the pep440 specifier: ${minPep440}` @@ -95838,958 +96829,6 @@ function minSatisfying3(versions, version3) { return void 0; } -// src/utils/inputs.ts -var import_node_path = __toESM(require("node:path"), 1); - -// src/utils/config-file.ts -var import_node_fs4 = __toESM(require("node:fs"), 1); - -// node_modules/smol-toml/dist/error.js -function getLineColFromPtr(string, ptr) { - let lines = string.slice(0, ptr).split(/\r\n|\n|\r/g); - return [lines.length, lines.pop().length + 1]; -} -function makeCodeBlock(string, line, column) { - let lines = string.split(/\r\n|\n|\r/g); - let codeblock = ""; - let numberLen = (Math.log10(line + 1) | 0) + 1; - for (let i = line - 1; i <= line + 1; i++) { - let l = lines[i - 1]; - if (!l) - continue; - codeblock += i.toString().padEnd(numberLen, " "); - codeblock += ": "; - codeblock += l; - codeblock += "\n"; - if (i === line) { - codeblock += " ".repeat(numberLen + column + 2); - codeblock += "^\n"; - } - } - return codeblock; -} -var TomlError = class extends Error { - line; - column; - codeblock; - constructor(message, options) { - const [line, column] = getLineColFromPtr(options.toml, options.ptr); - const codeblock = makeCodeBlock(options.toml, line, column); - super(`Invalid TOML document: ${message} - -${codeblock}`, options); - this.line = line; - this.column = column; - this.codeblock = codeblock; - } -}; - -// node_modules/smol-toml/dist/util.js -function isEscaped(str, ptr) { - let i = 0; - while (str[ptr - ++i] === "\\") - ; - return --i && i % 2; -} -function indexOfNewline(str, start = 0, end = str.length) { - let idx = str.indexOf("\n", start); - if (str[idx - 1] === "\r") - idx--; - return idx <= end ? idx : -1; -} -function skipComment(str, ptr) { - for (let i = ptr; i < str.length; i++) { - let c = str[i]; - if (c === "\n") - return i; - if (c === "\r" && str[i + 1] === "\n") - return i + 1; - if (c < " " && c !== " " || c === "\x7F") { - throw new TomlError("control characters are not allowed in comments", { - toml: str, - ptr - }); - } - } - return str.length; -} -function skipVoid(str, ptr, banNewLines, banComments) { - let c; - while ((c = str[ptr]) === " " || c === " " || !banNewLines && (c === "\n" || c === "\r" && str[ptr + 1] === "\n")) - ptr++; - return banComments || c !== "#" ? ptr : skipVoid(str, skipComment(str, ptr), banNewLines); -} -function skipUntil(str, ptr, sep8, end, banNewLines = false) { - if (!end) { - ptr = indexOfNewline(str, ptr); - return ptr < 0 ? str.length : ptr; - } - for (let i = ptr; i < str.length; i++) { - let c = str[i]; - if (c === "#") { - i = indexOfNewline(str, i); - } else if (c === sep8) { - return i + 1; - } else if (c === end || banNewLines && (c === "\n" || c === "\r" && str[i + 1] === "\n")) { - return i; - } - } - throw new TomlError("cannot find end of structure", { - toml: str, - ptr - }); -} -function getStringEnd(str, seek) { - let first = str[seek]; - let target = first === str[seek + 1] && str[seek + 1] === str[seek + 2] ? str.slice(seek, seek + 3) : first; - seek += target.length - 1; - do - seek = str.indexOf(target, ++seek); - while (seek > -1 && first !== "'" && isEscaped(str, seek)); - if (seek > -1) { - seek += target.length; - if (target.length > 1) { - if (str[seek] === first) - seek++; - if (str[seek] === first) - seek++; - } - } - return seek; -} - -// node_modules/smol-toml/dist/date.js -var DATE_TIME_RE = /^(\d{4}-\d{2}-\d{2})?[T ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|[-+]\d{2}:\d{2})?$/i; -var TomlDate = class _TomlDate extends Date { - #hasDate = false; - #hasTime = false; - #offset = null; - constructor(date) { - let hasDate = true; - let hasTime = true; - let offset = "Z"; - if (typeof date === "string") { - let match2 = date.match(DATE_TIME_RE); - if (match2) { - if (!match2[1]) { - hasDate = false; - date = `0000-01-01T${date}`; - } - hasTime = !!match2[2]; - hasTime && date[10] === " " && (date = date.replace(" ", "T")); - if (match2[2] && +match2[2] > 23) { - date = ""; - } else { - offset = match2[3] || null; - date = date.toUpperCase(); - if (!offset && hasTime) - date += "Z"; - } - } else { - date = ""; - } - } - super(date); - if (!isNaN(this.getTime())) { - this.#hasDate = hasDate; - this.#hasTime = hasTime; - this.#offset = offset; - } - } - isDateTime() { - return this.#hasDate && this.#hasTime; - } - isLocal() { - return !this.#hasDate || !this.#hasTime || !this.#offset; - } - isDate() { - return this.#hasDate && !this.#hasTime; - } - isTime() { - return this.#hasTime && !this.#hasDate; - } - isValid() { - return this.#hasDate || this.#hasTime; - } - toISOString() { - let iso = super.toISOString(); - if (this.isDate()) - return iso.slice(0, 10); - if (this.isTime()) - return iso.slice(11, 23); - if (this.#offset === null) - return iso.slice(0, -1); - if (this.#offset === "Z") - return iso; - let offset = +this.#offset.slice(1, 3) * 60 + +this.#offset.slice(4, 6); - offset = this.#offset[0] === "-" ? offset : -offset; - let offsetDate = new Date(this.getTime() - offset * 6e4); - return offsetDate.toISOString().slice(0, -1) + this.#offset; - } - static wrapAsOffsetDateTime(jsDate, offset = "Z") { - let date = new _TomlDate(jsDate); - date.#offset = offset; - return date; - } - static wrapAsLocalDateTime(jsDate) { - let date = new _TomlDate(jsDate); - date.#offset = null; - return date; - } - static wrapAsLocalDate(jsDate) { - let date = new _TomlDate(jsDate); - date.#hasTime = false; - date.#offset = null; - return date; - } - static wrapAsLocalTime(jsDate) { - let date = new _TomlDate(jsDate); - date.#hasDate = false; - date.#offset = null; - return date; - } -}; - -// node_modules/smol-toml/dist/primitive.js -var INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\d(_?\d)*))$/; -var FLOAT_REGEX = /^[+-]?\d(_?\d)*(\.\d(_?\d)*)?([eE][+-]?\d(_?\d)*)?$/; -var LEADING_ZERO = /^[+-]?0[0-9_]/; -var ESCAPE_REGEX = /^[0-9a-f]{2,8}$/i; -var ESC_MAP = { - b: "\b", - t: " ", - n: "\n", - f: "\f", - r: "\r", - e: "\x1B", - '"': '"', - "\\": "\\" -}; -function parseString(str, ptr = 0, endPtr = str.length) { - let isLiteral = str[ptr] === "'"; - let isMultiline = str[ptr++] === str[ptr] && str[ptr] === str[ptr + 1]; - if (isMultiline) { - endPtr -= 2; - if (str[ptr += 2] === "\r") - ptr++; - if (str[ptr] === "\n") - ptr++; - } - let tmp = 0; - let isEscape; - let parsed = ""; - let sliceStart = ptr; - while (ptr < endPtr - 1) { - let c = str[ptr++]; - if (c === "\n" || c === "\r" && str[ptr] === "\n") { - if (!isMultiline) { - throw new TomlError("newlines are not allowed in strings", { - toml: str, - ptr: ptr - 1 - }); - } - } else if (c < " " && c !== " " || c === "\x7F") { - throw new TomlError("control characters are not allowed in strings", { - toml: str, - ptr: ptr - 1 - }); - } - if (isEscape) { - isEscape = false; - if (c === "x" || c === "u" || c === "U") { - let code = str.slice(ptr, ptr += c === "x" ? 2 : c === "u" ? 4 : 8); - if (!ESCAPE_REGEX.test(code)) { - throw new TomlError("invalid unicode escape", { - toml: str, - ptr: tmp - }); - } - try { - parsed += String.fromCodePoint(parseInt(code, 16)); - } catch { - throw new TomlError("invalid unicode escape", { - toml: str, - ptr: tmp - }); - } - } else if (isMultiline && (c === "\n" || c === " " || c === " " || c === "\r")) { - ptr = skipVoid(str, ptr - 1, true); - if (str[ptr] !== "\n" && str[ptr] !== "\r") { - throw new TomlError("invalid escape: only line-ending whitespace may be escaped", { - toml: str, - ptr: tmp - }); - } - ptr = skipVoid(str, ptr); - } else if (c in ESC_MAP) { - parsed += ESC_MAP[c]; - } else { - throw new TomlError("unrecognized escape sequence", { - toml: str, - ptr: tmp - }); - } - sliceStart = ptr; - } else if (!isLiteral && c === "\\") { - tmp = ptr - 1; - isEscape = true; - parsed += str.slice(sliceStart, tmp); - } - } - return parsed + str.slice(sliceStart, endPtr - 1); -} -function parseValue2(value, toml, ptr, integersAsBigInt) { - if (value === "true") - return true; - if (value === "false") - return false; - if (value === "-inf") - return -Infinity; - if (value === "inf" || value === "+inf") - return Infinity; - if (value === "nan" || value === "+nan" || value === "-nan") - return NaN; - if (value === "-0") - return integersAsBigInt ? 0n : 0; - let isInt = INT_REGEX.test(value); - if (isInt || FLOAT_REGEX.test(value)) { - if (LEADING_ZERO.test(value)) { - throw new TomlError("leading zeroes are not allowed", { - toml, - ptr - }); - } - value = value.replace(/_/g, ""); - let numeric = +value; - if (isNaN(numeric)) { - throw new TomlError("invalid number", { - toml, - ptr - }); - } - if (isInt) { - if ((isInt = !Number.isSafeInteger(numeric)) && !integersAsBigInt) { - throw new TomlError("integer value cannot be represented losslessly", { - toml, - ptr - }); - } - if (isInt || integersAsBigInt === true) - numeric = BigInt(value); - } - return numeric; - } - const date = new TomlDate(value); - if (!date.isValid()) { - throw new TomlError("invalid value", { - toml, - ptr - }); - } - return date; -} - -// node_modules/smol-toml/dist/extract.js -function sliceAndTrimEndOf(str, startPtr, endPtr) { - let value = str.slice(startPtr, endPtr); - let commentIdx = value.indexOf("#"); - if (commentIdx > -1) { - skipComment(str, commentIdx); - value = value.slice(0, commentIdx); - } - return [value.trimEnd(), commentIdx]; -} -function extractValue(str, ptr, end, depth, integersAsBigInt) { - if (depth === 0) { - throw new TomlError("document contains excessively nested structures. aborting.", { - toml: str, - ptr - }); - } - let c = str[ptr]; - if (c === "[" || c === "{") { - let [value, endPtr2] = c === "[" ? parseArray(str, ptr, depth, integersAsBigInt) : parseInlineTable(str, ptr, depth, integersAsBigInt); - if (end) { - endPtr2 = skipVoid(str, endPtr2); - if (str[endPtr2] === ",") - endPtr2++; - else if (str[endPtr2] !== end) { - throw new TomlError("expected comma or end of structure", { - toml: str, - ptr: endPtr2 - }); - } - } - return [value, endPtr2]; - } - let endPtr; - if (c === '"' || c === "'") { - endPtr = getStringEnd(str, ptr); - let parsed = parseString(str, ptr, endPtr); - if (end) { - endPtr = skipVoid(str, endPtr); - if (str[endPtr] && str[endPtr] !== "," && str[endPtr] !== end && str[endPtr] !== "\n" && str[endPtr] !== "\r") { - throw new TomlError("unexpected character encountered", { - toml: str, - ptr: endPtr - }); - } - endPtr += +(str[endPtr] === ","); - } - return [parsed, endPtr]; - } - endPtr = skipUntil(str, ptr, ",", end); - let slice = sliceAndTrimEndOf(str, ptr, endPtr - +(str[endPtr - 1] === ",")); - if (!slice[0]) { - throw new TomlError("incomplete key-value declaration: no value specified", { - toml: str, - ptr - }); - } - if (end && slice[1] > -1) { - endPtr = skipVoid(str, ptr + slice[1]); - endPtr += +(str[endPtr] === ","); - } - return [ - parseValue2(slice[0], str, ptr, integersAsBigInt), - endPtr - ]; -} - -// node_modules/smol-toml/dist/struct.js -var KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \t]*$/; -function parseKey(str, ptr, end = "=") { - let dot = ptr - 1; - let parsed = []; - let endPtr = str.indexOf(end, ptr); - if (endPtr < 0) { - throw new TomlError("incomplete key-value: cannot find end of key", { - toml: str, - ptr - }); - } - do { - let c = str[ptr = ++dot]; - if (c !== " " && c !== " ") { - if (c === '"' || c === "'") { - if (c === str[ptr + 1] && c === str[ptr + 2]) { - throw new TomlError("multiline strings are not allowed in keys", { - toml: str, - ptr - }); - } - let eos = getStringEnd(str, ptr); - if (eos < 0) { - throw new TomlError("unfinished string encountered", { - toml: str, - ptr - }); - } - dot = str.indexOf(".", eos); - let strEnd = str.slice(eos, dot < 0 || dot > endPtr ? endPtr : dot); - let newLine = indexOfNewline(strEnd); - if (newLine > -1) { - throw new TomlError("newlines are not allowed in keys", { - toml: str, - ptr: ptr + dot + newLine - }); - } - if (strEnd.trimStart()) { - throw new TomlError("found extra tokens after the string part", { - toml: str, - ptr: eos - }); - } - if (endPtr < eos) { - endPtr = str.indexOf(end, eos); - if (endPtr < 0) { - throw new TomlError("incomplete key-value: cannot find end of key", { - toml: str, - ptr - }); - } - } - parsed.push(parseString(str, ptr, eos)); - } else { - dot = str.indexOf(".", ptr); - let part = str.slice(ptr, dot < 0 || dot > endPtr ? endPtr : dot); - if (!KEY_PART_RE.test(part)) { - throw new TomlError("only letter, numbers, dashes and underscores are allowed in keys", { - toml: str, - ptr - }); - } - parsed.push(part.trimEnd()); - } - } - } while (dot + 1 && dot < endPtr); - return [parsed, skipVoid(str, endPtr + 1, true, true)]; -} -function parseInlineTable(str, ptr, depth, integersAsBigInt) { - let res = {}; - let seen = /* @__PURE__ */ new Set(); - let c; - ptr++; - while ((c = str[ptr++]) !== "}" && c) { - if (c === ",") { - throw new TomlError("expected value, found comma", { - toml: str, - ptr: ptr - 1 - }); - } else if (c === "#") - ptr = skipComment(str, ptr); - else if (c !== " " && c !== " " && c !== "\n" && c !== "\r") { - let k; - let t = res; - let hasOwn = false; - let [key, keyEndPtr] = parseKey(str, ptr - 1); - for (let i = 0; i < key.length; i++) { - if (i) - t = hasOwn ? t[k] : t[k] = {}; - k = key[i]; - if ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== "object" || seen.has(t[k]))) { - throw new TomlError("trying to redefine an already defined value", { - toml: str, - ptr - }); - } - if (!hasOwn && k === "__proto__") { - Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true }); - } - } - if (hasOwn) { - throw new TomlError("trying to redefine an already defined value", { - toml: str, - ptr - }); - } - let [value, valueEndPtr] = extractValue(str, keyEndPtr, "}", depth - 1, integersAsBigInt); - seen.add(value); - t[k] = value; - ptr = valueEndPtr; - } - } - if (!c) { - throw new TomlError("unfinished table encountered", { - toml: str, - ptr - }); - } - return [res, ptr]; -} -function parseArray(str, ptr, depth, integersAsBigInt) { - let res = []; - let c; - ptr++; - while ((c = str[ptr++]) !== "]" && c) { - if (c === ",") { - throw new TomlError("expected value, found comma", { - toml: str, - ptr: ptr - 1 - }); - } else if (c === "#") - ptr = skipComment(str, ptr); - else if (c !== " " && c !== " " && c !== "\n" && c !== "\r") { - let e = extractValue(str, ptr - 1, "]", depth - 1, integersAsBigInt); - res.push(e[0]); - ptr = e[1]; - } - } - if (!c) { - throw new TomlError("unfinished array encountered", { - toml: str, - ptr - }); - } - return [res, ptr]; -} - -// node_modules/smol-toml/dist/parse.js -function peekTable(key, table, meta, type) { - let t = table; - let m = meta; - let k; - let hasOwn = false; - let state3; - for (let i = 0; i < key.length; i++) { - if (i) { - t = hasOwn ? t[k] : t[k] = {}; - m = (state3 = m[k]).c; - if (type === 0 && (state3.t === 1 || state3.t === 2)) { - return null; - } - if (state3.t === 2) { - let l = t.length - 1; - t = t[l]; - m = m[l].c; - } - } - k = key[i]; - if ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === 0 && m[k]?.d) { - return null; - } - if (!hasOwn) { - if (k === "__proto__") { - Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true }); - Object.defineProperty(m, k, { enumerable: true, configurable: true, writable: true }); - } - m[k] = { - t: i < key.length - 1 && type === 2 ? 3 : type, - d: false, - i: 0, - c: {} - }; - } - } - state3 = m[k]; - if (state3.t !== type && !(type === 1 && state3.t === 3)) { - return null; - } - if (type === 2) { - if (!state3.d) { - state3.d = true; - t[k] = []; - } - t[k].push(t = {}); - state3.c[state3.i++] = state3 = { t: 1, d: false, i: 0, c: {} }; - } - if (state3.d) { - return null; - } - state3.d = true; - if (type === 1) { - t = hasOwn ? t[k] : t[k] = {}; - } else if (type === 0 && hasOwn) { - return null; - } - return [k, t, state3.c]; -} -function parse2(toml, { maxDepth = 1e3, integersAsBigInt } = {}) { - let res = {}; - let meta = {}; - let tbl = res; - let m = meta; - for (let ptr = skipVoid(toml, 0); ptr < toml.length; ) { - if (toml[ptr] === "[") { - let isTableArray = toml[++ptr] === "["; - let k = parseKey(toml, ptr += +isTableArray, "]"); - if (isTableArray) { - if (toml[k[1] - 1] !== "]") { - throw new TomlError("expected end of table declaration", { - toml, - ptr: k[1] - 1 - }); - } - k[1]++; - } - let p = peekTable( - k[0], - res, - meta, - isTableArray ? 2 : 1 - /* Type.EXPLICIT */ - ); - if (!p) { - throw new TomlError("trying to redefine an already defined table or value", { - toml, - ptr - }); - } - m = p[2]; - tbl = p[1]; - ptr = k[1]; - } else { - let k = parseKey(toml, ptr); - let p = peekTable( - k[0], - tbl, - m, - 0 - /* Type.DOTTED */ - ); - if (!p) { - throw new TomlError("trying to redefine an already defined table or value", { - toml, - ptr - }); - } - let v = extractValue(toml, k[1], void 0, maxDepth, integersAsBigInt); - p[1][p[0]] = v[0]; - ptr = v[1]; - } - ptr = skipVoid(toml, ptr, true); - if (toml[ptr] && toml[ptr] !== "\n" && toml[ptr] !== "\r") { - throw new TomlError("each key-value declaration must be followed by an end-of-line", { - toml, - ptr - }); - } - ptr = skipVoid(toml, ptr); - } - return res; -} - -// src/utils/config-file.ts -function getConfigValueFromTomlFile(filePath, key) { - if (!import_node_fs4.default.existsSync(filePath) || !filePath.endsWith(".toml")) { - return void 0; - } - const fileContent = import_node_fs4.default.readFileSync(filePath, "utf-8"); - if (filePath.endsWith("pyproject.toml")) { - const tomlContent2 = parse2(fileContent); - return tomlContent2?.tool?.uv?.[key]; - } - const tomlContent = parse2(fileContent); - return tomlContent[key]; -} - -// src/utils/inputs.ts -function loadInputs() { - const workingDirectory = getInput("working-directory"); - const version3 = getInput("version"); - const versionFile = getVersionFile(workingDirectory); - const pythonVersion = getInput("python-version"); - const activateEnvironment2 = getBooleanInput("activate-environment"); - const venvPath = getVenvPath(workingDirectory, activateEnvironment2); - const checksum = getInput("checksum"); - const enableCache = getEnableCache(); - const restoreCache3 = getInput("restore-cache") === "true"; - const saveCache2 = getInput("save-cache") === "true"; - const cacheSuffix = getInput("cache-suffix") || ""; - const cacheLocalPath = getCacheLocalPath( - workingDirectory, - versionFile, - enableCache - ); - const cacheDependencyGlob = getCacheDependencyGlob(workingDirectory); - const pruneCache = getInput("prune-cache") === "true"; - const cachePython = getInput("cache-python") === "true"; - const ignoreNothingToCache = getInput("ignore-nothing-to-cache") === "true"; - const ignoreEmptyWorkdir = getInput("ignore-empty-workdir") === "true"; - const toolBinDir = getToolBinDir(workingDirectory); - const toolDir = getToolDir(workingDirectory); - const pythonDir = getUvPythonDir(); - const githubToken = getInput("github-token"); - const manifestFile = getManifestFile(); - const addProblemMatchers = getInput("add-problem-matchers") === "true"; - const resolutionStrategy = getResolutionStrategy(); - return { - activateEnvironment: activateEnvironment2, - addProblemMatchers, - cacheDependencyGlob, - cacheLocalPath, - cachePython, - cacheSuffix, - checksum, - enableCache, - githubToken, - ignoreEmptyWorkdir, - ignoreNothingToCache, - manifestFile, - pruneCache, - pythonDir, - pythonVersion, - resolutionStrategy, - restoreCache: restoreCache3, - saveCache: saveCache2, - toolBinDir, - toolDir, - venvPath, - version: version3, - versionFile, - workingDirectory - }; -} -function getVersionFile(workingDirectory) { - const versionFileInput = getInput("version-file"); - if (versionFileInput !== "") { - const tildeExpanded = expandTilde(versionFileInput); - return resolveRelativePath(workingDirectory, tildeExpanded); - } - return versionFileInput; -} -function getVenvPath(workingDirectory, activateEnvironment2) { - const venvPathInput = getInput("venv-path"); - if (venvPathInput !== "") { - if (!activateEnvironment2) { - warning("venv-path is only used when activate-environment is true"); - } - const tildeExpanded = expandTilde(venvPathInput); - return normalizePath(resolveRelativePath(workingDirectory, tildeExpanded)); - } - return normalizePath(resolveRelativePath(workingDirectory, ".venv")); -} -function getEnableCache() { - const enableCacheInput = getInput("enable-cache"); - if (enableCacheInput === "auto") { - return process.env.RUNNER_ENVIRONMENT === "github-hosted"; - } - return enableCacheInput === "true"; -} -function getToolBinDir(workingDirectory) { - const toolBinDirInput = getInput("tool-bin-dir"); - if (toolBinDirInput !== "") { - const tildeExpanded = expandTilde(toolBinDirInput); - return resolveRelativePath(workingDirectory, tildeExpanded); - } - if (process.platform === "win32") { - if (process.env.RUNNER_TEMP !== void 0) { - return `${process.env.RUNNER_TEMP}${import_node_path.default.sep}uv-tool-bin-dir`; - } - throw Error( - "Could not determine UV_TOOL_BIN_DIR. Please make sure RUNNER_TEMP is set or provide the tool-bin-dir input" - ); - } - return void 0; -} -function getToolDir(workingDirectory) { - const toolDirInput = getInput("tool-dir"); - if (toolDirInput !== "") { - const tildeExpanded = expandTilde(toolDirInput); - return resolveRelativePath(workingDirectory, tildeExpanded); - } - if (process.platform === "win32") { - if (process.env.RUNNER_TEMP !== void 0) { - return `${process.env.RUNNER_TEMP}${import_node_path.default.sep}uv-tool-dir`; - } - throw Error( - "Could not determine UV_TOOL_DIR. Please make sure RUNNER_TEMP is set or provide the tool-dir input" - ); - } - return void 0; -} -function getCacheLocalPath(workingDirectory, versionFile, enableCache) { - const cacheLocalPathInput = getInput("cache-local-path"); - if (cacheLocalPathInput !== "") { - const tildeExpanded = expandTilde(cacheLocalPathInput); - return { - path: resolveRelativePath(workingDirectory, tildeExpanded), - source: 0 /* Input */ - }; - } - const cacheDirFromConfig = getCacheDirFromConfig( - workingDirectory, - versionFile - ); - if (cacheDirFromConfig !== void 0) { - return { path: cacheDirFromConfig, source: 1 /* Config */ }; - } - if (process.env.UV_CACHE_DIR !== void 0) { - info(`UV_CACHE_DIR is already set to ${process.env.UV_CACHE_DIR}`); - return { path: process.env.UV_CACHE_DIR, source: 2 /* Env */ }; - } - if (enableCache) { - if (process.env.RUNNER_ENVIRONMENT === "github-hosted") { - if (process.env.RUNNER_TEMP !== void 0) { - return { - path: `${process.env.RUNNER_TEMP}${import_node_path.default.sep}setup-uv-cache`, - source: 3 /* Default */ - }; - } - throw Error( - "Could not determine UV_CACHE_DIR. Please make sure RUNNER_TEMP is set or provide the cache-local-path input" - ); - } - if (process.platform === "win32") { - return { - path: `${process.env.APPDATA}${import_node_path.default.sep}uv${import_node_path.default.sep}cache`, - source: 3 /* Default */ - }; - } - return { - path: `${process.env.HOME}${import_node_path.default.sep}.cache${import_node_path.default.sep}uv`, - source: 3 /* Default */ - }; - } -} -function getCacheDirFromConfig(workingDirectory, versionFile) { - for (const filePath of [versionFile, "uv.toml", "pyproject.toml"]) { - const resolvedPath = resolveRelativePath(workingDirectory, filePath); - try { - const cacheDir2 = getConfigValueFromTomlFile(resolvedPath, "cache-dir"); - if (cacheDir2 !== void 0) { - info(`Found cache-dir in ${resolvedPath}: ${cacheDir2}`); - return cacheDir2; - } - } catch (err) { - const message = err.message; - warning(`Error while parsing ${filePath}: ${message}`); - return void 0; - } - } - return void 0; -} -function getUvPythonDir() { - if (process.env.UV_PYTHON_INSTALL_DIR !== void 0) { - info( - `UV_PYTHON_INSTALL_DIR is already set to ${process.env.UV_PYTHON_INSTALL_DIR}` - ); - return process.env.UV_PYTHON_INSTALL_DIR; - } - if (process.env.RUNNER_ENVIRONMENT !== "github-hosted") { - if (process.platform === "win32") { - return `${process.env.APPDATA}${import_node_path.default.sep}uv${import_node_path.default.sep}python`; - } - return `${process.env.HOME}${import_node_path.default.sep}.local${import_node_path.default.sep}share${import_node_path.default.sep}uv${import_node_path.default.sep}python`; - } - if (process.env.RUNNER_TEMP !== void 0) { - return `${process.env.RUNNER_TEMP}${import_node_path.default.sep}uv-python-dir`; - } - throw Error( - "Could not determine UV_PYTHON_INSTALL_DIR. Please make sure RUNNER_TEMP is set or provide the UV_PYTHON_INSTALL_DIR environment variable" - ); -} -function getCacheDependencyGlob(workingDirectory) { - const cacheDependencyGlobInput = getInput("cache-dependency-glob"); - if (cacheDependencyGlobInput !== "") { - return cacheDependencyGlobInput.split("\n").map((part) => part.trim()).map((part) => expandTilde(part)).map((part) => resolveRelativePath(workingDirectory, part)).join("\n"); - } - return cacheDependencyGlobInput; -} -function expandTilde(input) { - if (input.startsWith("~")) { - return `${process.env.HOME}${input.substring(1)}`; - } - return input; -} -function normalizePath(inputPath) { - const normalized = import_node_path.default.normalize(inputPath); - const root = import_node_path.default.parse(normalized).root; - let trimmed = normalized; - while (trimmed.length > root.length && trimmed.endsWith(import_node_path.default.sep)) { - trimmed = trimmed.slice(0, -1); - } - return trimmed; -} -function resolveRelativePath(workingDirectory, inputPath) { - const hasNegation = inputPath.startsWith("!"); - const pathWithoutNegation = hasNegation ? inputPath.substring(1) : inputPath; - const resolvedPath = import_node_path.default.resolve(workingDirectory, pathWithoutNegation); - debug( - `Resolving relative path ${inputPath} to ${hasNegation ? "!" : ""}${resolvedPath}` - ); - return hasNegation ? `!${resolvedPath}` : resolvedPath; -} -function getManifestFile() { - const manifestFileInput = getInput("manifest-file"); - if (manifestFileInput !== "") { - return manifestFileInput; - } - return void 0; -} -function getResolutionStrategy() { - const resolutionStrategyInput = getInput("resolution-strategy"); - if (resolutionStrategyInput === "lowest") { - return "lowest"; - } - if (resolutionStrategyInput === "highest" || resolutionStrategyInput === "") { - return "highest"; - } - throw new Error( - `Invalid resolution-strategy: ${resolutionStrategyInput}. Must be 'highest' or 'lowest'.` - ); -} - // src/version/resolve.ts var import_node_fs7 = __toESM(require("node:fs"), 1); @@ -96877,9 +96916,9 @@ function getUvVersionFromFile(filePath) { // src/setup-uv.ts var sourceDir = __dirname; -async function getPythonVersion(inputs) { - if (inputs.pythonVersion !== "") { - return inputs.pythonVersion; +async function getPythonVersion() { + if (pythonVersion !== "") { + return pythonVersion; } let output = ""; const options = { @@ -96891,7 +96930,7 @@ async function getPythonVersion(inputs) { silent: !isDebug() }; try { - const execArgs = ["python", "find", "--directory", inputs.workingDirectory]; + const execArgs = ["python", "find", "--directory", workingDirectory]; await exec("uv", execArgs, options); const pythonPath = output.trim(); output = ""; @@ -96904,33 +96943,32 @@ async function getPythonVersion(inputs) { } } async function run() { + detectEmptyWorkdir(); + const platform2 = await getPlatform(); + const arch3 = getArch(); try { - const inputs = loadInputs(); - detectEmptyWorkdir(inputs); - const platform2 = await getPlatform(); - const arch3 = getArch(); if (platform2 === void 0) { throw new Error(`Unsupported platform: ${process.platform}`); } if (arch3 === void 0) { throw new Error(`Unsupported architecture: ${process.arch}`); } - const setupResult = await setupUv(inputs, platform2, arch3); - addToolBinToPath(inputs); + const setupResult = await setupUv(platform2, arch3, checkSum, githubToken); + addToolBinToPath(); addUvToPathAndOutput(setupResult.uvDir); - setToolDir(inputs); - addPythonDirToPath(inputs); - setupPython(inputs); - await activateEnvironment(inputs); - addMatchers(inputs); - setCacheDir(inputs); + setToolDir(); + addPythonDirToPath(); + setupPython(); + await activateEnvironment2(); + addMatchers(); + setCacheDir(); setOutput("uv-version", setupResult.version); saveState(STATE_UV_VERSION, setupResult.version); info(`Successfully installed uv version ${setupResult.version}`); - const detectedPythonVersion = await getPythonVersion(inputs); - setOutput("python-version", detectedPythonVersion); - if (inputs.enableCache) { - await restoreCache2(inputs, detectedPythonVersion); + const pythonVersion2 = await getPythonVersion(); + setOutput("python-version", pythonVersion2); + if (enableCache) { + await restoreCache3(pythonVersion2); } await new Promise((resolve3) => setTimeout(resolve3, 50)); process.exit(0); @@ -96938,9 +96976,9 @@ async function run() { setFailed(err.message); } } -function detectEmptyWorkdir(inputs) { - if (import_node_fs8.default.readdirSync(inputs.workingDirectory).length === 0) { - if (inputs.ignoreEmptyWorkdir) { +function detectEmptyWorkdir() { + if (import_node_fs8.default.readdirSync(workingDirectory).length === 0) { + if (ignoreEmptyWorkdir) { info( "Empty workdir detected. Ignoring because ignore-empty-workdir is enabled" ); @@ -96951,8 +96989,8 @@ function detectEmptyWorkdir(inputs) { } } } -async function setupUv(inputs, platform2, arch3) { - const resolvedVersion = await determineVersion(inputs); +async function setupUv(platform2, arch3, checkSum2, githubToken2) { + const resolvedVersion = await determineVersion(manifestFile); const toolCacheResult = tryGetFromToolCache(arch3, resolvedVersion); if (toolCacheResult.installedPath) { info(`Found uv in tool-cache for ${toolCacheResult.version}`); @@ -96961,51 +96999,58 @@ async function setupUv(inputs, platform2, arch3) { version: toolCacheResult.version }; } - const downloadResult = await downloadVersion( + const downloadVersionResult = manifestFile !== void 0 ? await downloadVersionFromManifest( + manifestFile, platform2, arch3, resolvedVersion, - inputs.checksum, - inputs.githubToken, - inputs.manifestFile + checkSum2, + githubToken2 + ) : await downloadVersionFromNdjson( + platform2, + arch3, + resolvedVersion, + checkSum2, + githubToken2 ); return { - uvDir: downloadResult.cachedToolDir, - version: downloadResult.version + uvDir: downloadVersionResult.cachedToolDir, + version: downloadVersionResult.version }; } -async function determineVersion(inputs) { - return await resolveVersion( - getRequestedVersion(inputs), - inputs.manifestFile, - inputs.resolutionStrategy - ); -} -function getRequestedVersion(inputs) { - if (inputs.version !== "") { - return inputs.version; +async function determineVersion(manifestFile2) { + if (version3 !== "") { + return await resolveVersion(version3, manifestFile2, resolutionStrategy); } - if (inputs.versionFile !== "") { - const versionFromFile = getUvVersionFromFile(inputs.versionFile); + if (versionFile !== "") { + const versionFromFile = getUvVersionFromFile(versionFile); if (versionFromFile === void 0) { throw new Error( - `Could not determine uv version from file: ${inputs.versionFile}` + `Could not determine uv version from file: ${versionFile}` ); } - return versionFromFile; + return await resolveVersion( + versionFromFile, + manifestFile2, + resolutionStrategy + ); } const versionFromUvToml = getUvVersionFromFile( - `${inputs.workingDirectory}${path15.sep}uv.toml` + `${workingDirectory}${path15.sep}uv.toml` ); const versionFromPyproject = getUvVersionFromFile( - `${inputs.workingDirectory}${path15.sep}pyproject.toml` + `${workingDirectory}${path15.sep}pyproject.toml` ); if (versionFromUvToml === void 0 && versionFromPyproject === void 0) { info( "Could not determine uv version from uv.toml or pyproject.toml. Falling back to latest." ); } - return versionFromUvToml || versionFromPyproject || "latest"; + return await resolveVersion( + versionFromUvToml || versionFromPyproject || "latest", + manifestFile2, + resolutionStrategy + ); } function addUvToPathAndOutput(cachedPath) { setOutput("uv-path", `${cachedPath}${path15.sep}uv`); @@ -97018,17 +97063,15 @@ function addUvToPathAndOutput(cachedPath) { info(`Added ${cachedPath} to the path`); } } -function addToolBinToPath(inputs) { - if (inputs.toolBinDir !== void 0) { - exportVariable("UV_TOOL_BIN_DIR", inputs.toolBinDir); - info(`Set UV_TOOL_BIN_DIR to ${inputs.toolBinDir}`); +function addToolBinToPath() { + if (toolBinDir !== void 0) { + exportVariable("UV_TOOL_BIN_DIR", toolBinDir); + info(`Set UV_TOOL_BIN_DIR to ${toolBinDir}`); if (process.env.UV_NO_MODIFY_PATH !== void 0) { - info( - `UV_NO_MODIFY_PATH is set, not adding ${inputs.toolBinDir} to path` - ); + info(`UV_NO_MODIFY_PATH is set, not adding ${toolBinDir} to path`); } else { - addPath(inputs.toolBinDir); - info(`Added ${inputs.toolBinDir} to the path`); + addPath(toolBinDir); + info(`Added ${toolBinDir} to the path`); } } else { if (process.env.UV_NO_MODIFY_PATH !== void 0) { @@ -97047,66 +97090,66 @@ function addToolBinToPath(inputs) { } } } -function setToolDir(inputs) { - if (inputs.toolDir !== void 0) { - exportVariable("UV_TOOL_DIR", inputs.toolDir); - info(`Set UV_TOOL_DIR to ${inputs.toolDir}`); +function setToolDir() { + if (toolDir !== void 0) { + exportVariable("UV_TOOL_DIR", toolDir); + info(`Set UV_TOOL_DIR to ${toolDir}`); } } -function addPythonDirToPath(inputs) { - exportVariable("UV_PYTHON_INSTALL_DIR", inputs.pythonDir); - info(`Set UV_PYTHON_INSTALL_DIR to ${inputs.pythonDir}`); +function addPythonDirToPath() { + exportVariable("UV_PYTHON_INSTALL_DIR", pythonDir); + info(`Set UV_PYTHON_INSTALL_DIR to ${pythonDir}`); if (process.env.UV_NO_MODIFY_PATH !== void 0) { info("UV_NO_MODIFY_PATH is set, not adding python dir to path"); } else { - addPath(inputs.pythonDir); - info(`Added ${inputs.pythonDir} to the path`); + addPath(pythonDir); + info(`Added ${pythonDir} to the path`); } } -function setupPython(inputs) { - if (inputs.pythonVersion !== "") { - exportVariable("UV_PYTHON", inputs.pythonVersion); - info(`Set UV_PYTHON to ${inputs.pythonVersion}`); +function setupPython() { + if (pythonVersion !== "") { + exportVariable("UV_PYTHON", pythonVersion); + info(`Set UV_PYTHON to ${pythonVersion}`); } } -async function activateEnvironment(inputs) { - if (inputs.activateEnvironment) { +async function activateEnvironment2() { + if (activateEnvironment) { if (process.env.UV_NO_MODIFY_PATH !== void 0) { throw new Error( "UV_NO_MODIFY_PATH and activate-environment cannot be used together." ); } - info(`Creating and activating python venv at ${inputs.venvPath}...`); + info(`Creating and activating python venv at ${venvPath}...`); await exec("uv", [ "venv", - inputs.venvPath, + venvPath, "--directory", - inputs.workingDirectory, + workingDirectory, "--clear" ]); - let venvBinPath = `${inputs.venvPath}${path15.sep}bin`; + let venvBinPath = `${venvPath}${path15.sep}bin`; if (process.platform === "win32") { - venvBinPath = `${inputs.venvPath}${path15.sep}Scripts`; + venvBinPath = `${venvPath}${path15.sep}Scripts`; } addPath(path15.resolve(venvBinPath)); - exportVariable("VIRTUAL_ENV", inputs.venvPath); - setOutput("venv", inputs.venvPath); + exportVariable("VIRTUAL_ENV", venvPath); + setOutput("venv", venvPath); } } -function setCacheDir(inputs) { - if (inputs.cacheLocalPath !== void 0) { - if (inputs.cacheLocalPath.source === 1 /* Config */) { +function setCacheDir() { + if (cacheLocalPath !== void 0) { + if (cacheLocalPath.source === 1 /* Config */) { info( "Using cache-dir from uv config file, not modifying UV_CACHE_DIR" ); return; } - exportVariable("UV_CACHE_DIR", inputs.cacheLocalPath.path); - info(`Set UV_CACHE_DIR to ${inputs.cacheLocalPath.path}`); + exportVariable("UV_CACHE_DIR", cacheLocalPath.path); + info(`Set UV_CACHE_DIR to ${cacheLocalPath.path}`); } } -function addMatchers(inputs) { - if (inputs.addProblemMatchers) { +function addMatchers() { + if (addProblemMatchers) { const matchersPath = path15.join(sourceDir, "..", "..", ".github"); info(`##[add-matcher]${path15.join(matchersPath, "python.json")}`); } diff --git a/dist/update-known-checksums/index.cjs b/dist/update-known-checksums/index.cjs index c8c7c5e..2468493 100644 --- a/dist/update-known-checksums/index.cjs +++ b/dist/update-known-checksums/index.cjs @@ -44949,93 +44949,6 @@ var semver = __toESM(require_semver(), 1); // src/download/checksum/known-checksums.ts var KNOWN_CHECKSUMS = { - "aarch64-apple-darwin-0.11.2": "4beaa9550f93ef7f0fc02f7c28c9c48cd61fe30db00f5ac8947e0a425c3fb282", - "aarch64-pc-windows-msvc-0.11.2": "ffdded8338205f53727b51d404563a5ac8eaa9aea53279a7b7c42177e11d478c", - "aarch64-unknown-linux-gnu-0.11.2": "04792cac761c4a6ba78267f36f2af541b7f92196d42ac55d21d3ff6b0f5ab6a5", - "aarch64-unknown-linux-musl-0.11.2": "275d91dd1f1955136591e7ec5e1fa21e84d0d37ead7da7c35c3683df748d9855", - "arm-unknown-linux-musleabihf-0.11.2": "ce572dac1a8f9a92960f89e99351352fae068d34b24bed86fb88e75fd5dd67d9", - "armv7-unknown-linux-gnueabihf-0.11.2": "3e90d7de9e3a4e2d8d1bd9ce164362fce22248474986e712039479fb6fd73136", - "armv7-unknown-linux-musleabihf-0.11.2": "5222cdd7c7dd3263f8c243831606a9f01a1a07a40ffc3c26c03afb34491075c2", - "i686-pc-windows-msvc-0.11.2": "506f8274b253b2386881a121f3b7d915b637019bda15876bbd1357235305cf12", - "i686-unknown-linux-gnu-0.11.2": "c7ec378bab887443a70786382e58d76489da14a7e33b155915d648cca4bdb46c", - "i686-unknown-linux-musl-0.11.2": "ade8714be45457899568c5b03ef885a0cc94476c07a0bdbe34531ba84231bab2", - "powerpc64le-unknown-linux-gnu-0.11.2": "3f3a50e99364efc8ff7add10e79757a2b8458700a38180ec5f313524481b9fbc", - "riscv64gc-unknown-linux-gnu-0.11.2": "e56a93f0ff21d6908461a6ecbf465beae19ae22719f900284abb7680bd07ec41", - "riscv64gc-unknown-linux-musl-0.11.2": "4f263571bb457a16a31cb38fba4fcc9cf1059d1d32c5b2e54c43175fcd59205d", - "s390x-unknown-linux-gnu-0.11.2": "42ebe40775f2a77a514fa47399fde86473bf35bd33b6896c6410a0309fc4d205", - "x86_64-apple-darwin-0.11.2": "a9c3653245031304c50dd60ac0301bf6c112e12c38c32302a71d4fa6a63ba2cb", - "x86_64-pc-windows-msvc-0.11.2": "171b7ccda1bbd562da6babeffcf533a1c6cc7862cf998da826e1db534fc43e48", - "x86_64-unknown-linux-gnu-0.11.2": "7ac2ca0449c8d68dae9b99e635cd3bc9b22a4cb1de64b7c43716398447d42981", - "x86_64-unknown-linux-musl-0.11.2": "4700d9fc75734247587deb3e25dd2c6c24f4ac69e8fe91d6acad4a6013115c06", - "aarch64-apple-darwin-0.11.1": "f7815f739ed5d0e4202e6292acedb8659b9ae7de663d07188d8c6cbd7f96303f", - "aarch64-pc-windows-msvc-0.11.1": "b789db0c1504dd3b02c090bd5783487497cc46cc2eb71754874cdd1ef59eb52a", - "aarch64-unknown-linux-gnu-0.11.1": "1340e62da1ee3c1109764340e1247e8a1a232c30dde4a0f0548976dcaa90f06d", - "aarch64-unknown-linux-musl-0.11.1": "bd04ffce77ee8d77f39823c13606183581847c2f5dcd704f2ea0f15e376b1a27", - "arm-unknown-linux-musleabihf-0.11.1": "625c0e756e2374fce864ceaa6beedd5821e276e2b6307f2b719f2d62b449b89c", - "armv7-unknown-linux-gnueabihf-0.11.1": "baf8daaab20b0502d1853dbfd916afb0762c024ae7f0df1c2deb2a1a1c1c3467", - "armv7-unknown-linux-musleabihf-0.11.1": "684c25b74e83bcb1b177152379cfe2c974ba731aa5af278e1d161e41709f8bcf", - "i686-pc-windows-msvc-0.11.1": "3c07858a08c54e4e5753239354c7b07ae69071b2b6f5aa2cc970e612adcb4740", - "i686-unknown-linux-gnu-0.11.1": "6e83167c05708570563b10b6cc7e8c289daef5f51fde0b152e41af2a7ef70813", - "i686-unknown-linux-musl-0.11.1": "b0d5152635c257fec76f95cb9268112b47ff70bd33a23866295a4f2ed9f46b7f", - "powerpc64le-unknown-linux-gnu-0.11.1": "e42d2abfac46f57564789e2bfa6dbea4ae3135892e36ae066ba0ae77b69bb676", - "riscv64gc-unknown-linux-gnu-0.11.1": "5e2c757b35dab015ad37f74ee3e060208390b5f4defb6684876f1be0664f3f6e", - "riscv64gc-unknown-linux-musl-0.11.1": "6f590a824aed363cbec4079f7ddab87b5685119e0f5f0e71cd114c7b7c326199", - "s390x-unknown-linux-gnu-0.11.1": "4208173c74e29572b799178709b5ed5828b24888659f944a4b47c0aaf78b42d2", - "x86_64-apple-darwin-0.11.1": "2103670e8e949605e51926c7b953923ff6f6befbfb55aee928f5e760c9c910f8", - "x86_64-pc-windows-msvc-0.11.1": "6659250cebbd3bb6ee48bcb21a3f0c6656450d63fb97f0f069bcb532bdb688ed", - "x86_64-unknown-linux-gnu-0.11.1": "7c0c8069053e6e99e5911ff32b916be571f3419cd8e11bd28fb7da2c7dcaa553", - "x86_64-unknown-linux-musl-0.11.1": "4e949471a95b37088a1ff1a585f69abed4d3cd3f921f50709a46b6ba62986d38", - "aarch64-apple-darwin-0.11.0": "0c0f32c6a3473c5928aff96c3233715edfc79290e892f255cac93710cde7b91a", - "aarch64-pc-windows-msvc-0.11.0": "95419e04a3ef5f13fb2a06bd6d787ba80a9d8981d6f097780e5a979817a2879d", - "aarch64-unknown-linux-gnu-0.11.0": "8e179ca110343a17f801444ff9ef117dba56ef5fc9f6a4c9bb77b318ddba5f24", - "aarch64-unknown-linux-musl-0.11.0": "658be4b8ec905635f1295468d4d5120d9e1ab1722eec9a104473ce993590babe", - "arm-unknown-linux-musleabihf-0.11.0": "bfdcbd5fa41c8a9877a72c2b55a95da2bc79933885ef56c699b65bb2ed9cea91", - "armv7-unknown-linux-gnueabihf-0.11.0": "0cad4e1b6769e48aa1e80cf639ddcc7c1bfe9ed017e95868fed185a8d818c949", - "armv7-unknown-linux-musleabihf-0.11.0": "2aa9da83c6c0cf8a06bc9df14d51056284fa067ef5390b4db79998ff12f3bee7", - "i686-pc-windows-msvc-0.11.0": "3b09d70e686087e096dbd8a2af21b922a2cac7d613dc053c3281c3ddbb961961", - "i686-unknown-linux-gnu-0.11.0": "59928a0267501c20d9f9942f5f1d81a991ec55e29a19e002ae3d5c178c674c89", - "i686-unknown-linux-musl-0.11.0": "1f438d6f6f851f0dabad3307ce7fd46541ecc5c42ebb664f382eb6c9a424a67d", - "powerpc64le-unknown-linux-gnu-0.11.0": "29f17fb43595492b1a36cda57df7adad74183132df32799d32897268ff4e26dd", - "riscv64gc-unknown-linux-gnu-0.11.0": "84ef37dda1003c5b65fa6c8f84242d35a7fcc84cc5ea9490d702edc36cad1f67", - "s390x-unknown-linux-gnu-0.11.0": "b25be62f3b642348a2fece5c658624586661b8d1103891ab6903768b0529edc4", - "x86_64-apple-darwin-0.11.0": "31aaec764166af8885cf99321fd6ed24fef80225a6f26ed1ae8ce04111688a7e", - "x86_64-pc-windows-msvc-0.11.0": "e21d00b172df83531564a95e75a2bdc0c59b471dbb3515f0c1b4d6ef657dc451", - "x86_64-unknown-linux-gnu-0.11.0": "cc0fbb42b3642125f600a55b0b095bea65cddaadb94c6ea2b6ba5d79c5825089", - "x86_64-unknown-linux-musl-0.11.0": "bf6b0757c73d1726faa2a819b155d4d864919a95766720215d78fdcd09d42d26", - "aarch64-apple-darwin-0.10.12": "ae738b5661a900579ec621d3918c0ef17bdec0da2a8a6d8b161137cd15f25414", - "aarch64-pc-windows-msvc-0.10.12": "e79881e2c4f98a0f3a37b8770bf224e8fee70f6dcf8fc17055d8291bb1b0b867", - "aarch64-unknown-linux-gnu-0.10.12": "0ed7d20f49f6b9b60d45fdfcac28f3ac01a671a6ef08672401ed2833423fea2a", - "aarch64-unknown-linux-musl-0.10.12": "55bd1c1c10ec8b95a8c184f5e18b566703c6ab105f0fc118aaa4d748aabf28e4", - "arm-unknown-linux-musleabihf-0.10.12": "9714e5059b05110a1c7ddbc18c971c13e0260e10551b7b77d82cbf907a4ebd9b", - "armv7-unknown-linux-gnueabihf-0.10.12": "eaa02f36d5112029601b18ac3d1a0c03a83bb20cb4154c2f5345f777fa6c4101", - "armv7-unknown-linux-musleabihf-0.10.12": "bd735652298c6e62cdd2ac939babe176a3356613e6803baa33d0bc10e8d9e4ed", - "i686-pc-windows-msvc-0.10.12": "2312e75b9c77befdc1bff30da18f16df03083452852952553bee91da362c1a1d", - "i686-unknown-linux-gnu-0.10.12": "8501844b34e3a28cfbba5a4b857eebd696d952e0bb4160357451ad80f3f49db8", - "i686-unknown-linux-musl-0.10.12": "56cad78abcf5b710d2f7b9f774fcfd6bbed340d2aa9d9fc9e3b515542ec5e953", - "powerpc64le-unknown-linux-gnu-0.10.12": "3c8017d9112221c83f43e8a15a58099663c0b2bdeabc8b43bb800413dfa21218", - "riscv64gc-unknown-linux-gnu-0.10.12": "b1ca482b6b5dd7bf6ab733a3695cb0ab5b8e992ca96527efae93aa78fcc52a9b", - "s390x-unknown-linux-gnu-0.10.12": "e1a0345eefe6fd3300948cd6f18aab092f9b88a243782113e645ce96530a6693", - "x86_64-apple-darwin-0.10.12": "17443e293f2ae407bb2d8d34b875ebfe0ae01cf1296de5647e69e7b2e2b428f0", - "x86_64-pc-windows-msvc-0.10.12": "4c1d55501869b3330d4aabf45ad6024ce2367e0f3af83344395702d272c22e88", - "x86_64-unknown-linux-gnu-0.10.12": "ec72570c9d1f33021aa80b176d7baba390de2cfeb1abcbefca346d563bf17484", - "x86_64-unknown-linux-musl-0.10.12": "adccf40b5d1939a5e0093081ec2307ea24235adf7c2d96b122c561fa37711c46", - "aarch64-apple-darwin-0.10.11": "437a7d498dd6564d5bf986074249ba1fc600e73da55ae04d7bd4c24d5f149b95", - "aarch64-pc-windows-msvc-0.10.11": "6a3eec4105c775dd87c11ef8ec41564648273751ff807c8955c24ddbcc636d03", - "aarch64-unknown-linux-gnu-0.10.11": "23003df007937dd607409c8ddf010baa82bad2673e60e254632ca5b04edcce13", - "aarch64-unknown-linux-musl-0.10.11": "5d80a7f6343d2676dfde1e5126582070a2bbc62df6f60d5527a169be3788532a", - "arm-unknown-linux-musleabihf-0.10.11": "d3c248497c450d22a39c1d43a4a358c0c852e6056f5f49be96495eea41afb96c", - "armv7-unknown-linux-gnueabihf-0.10.11": "7895a6470dfba051af4e74253599482fc0b37141b5d229956b383365e1a22902", - "armv7-unknown-linux-musleabihf-0.10.11": "d2880c08acfdaef0985488972c8b14969f7139c27545046e2f6202f0e0f4d9d8", - "i686-pc-windows-msvc-0.10.11": "c17f3dc3b2c47490057f17a1f0c37270f11a7b7cedf9bf2c0f841ce02bc7001b", - "i686-unknown-linux-gnu-0.10.11": "1ab69ff7dd104a902731758ee05b782dfd9bdb263384e61650de638f33f586df", - "i686-unknown-linux-musl-0.10.11": "cffb80d303fc1655e259d0b769c489f452e97425a6b6d3393d766413783a1d8c", - "powerpc64le-unknown-linux-gnu-0.10.11": "ddc6a20670e60219e947b1b04813be80d7e9f4c4a0234231c8ed9298eec04aa6", - "riscv64gc-unknown-linux-gnu-0.10.11": "c0719473cf5f8b475e917b8dfef6ae5d876b86a00a82ef91e47a02f561399f4f", - "s390x-unknown-linux-gnu-0.10.11": "305ee734c585918515a22fe43b7cf253c38d468771373a0c02364d67498e07b2", - "x86_64-apple-darwin-0.10.11": "ff90020b554cf02ef8008535c9aab6ef27bb7be6b075359300dec79c361df897", - "x86_64-pc-windows-msvc-0.10.11": "9ee74df98582f37fdd6069e1caac80d2616f9a489f5dbb2b1c152f30be69c58e", - "x86_64-unknown-linux-gnu-0.10.11": "5a360b0de092ddf4131f5313d0411b48c4e95e8107e40c3f8f2e9fcb636b3583", - "x86_64-unknown-linux-musl-0.10.11": "d78246139dc6cf3ed6d03c84da762686bced7ad1de67977ee372a45b95a1f6d0", "aarch64-apple-darwin-0.10.10": "8a09f0ef51ee7f7170731b4cb8bde5bf9ba6da5304f49a7df6cdab42a1f37b5d", "aarch64-pc-windows-msvc-0.10.10": "2c6fe113f14574bc27f085751c68d3485589fcc3c3c64ed85dd1eecc2f87cffc", "aarch64-unknown-linux-gnu-0.10.10": "2b80457b950deda12e8d5dc3b9b7494ac143eae47f1fb11b1c6e5a8495a6421e", @@ -49464,7 +49377,7 @@ async function updateChecksums(filePath, checksumEntries) { } // src/utils/constants.ts -var VERSIONS_MANIFEST_URL = "https://raw.githubusercontent.com/astral-sh/versions/main/v1/uv.ndjson"; +var VERSIONS_NDJSON_URL = "https://raw.githubusercontent.com/astral-sh/versions/main/v1/uv.ndjson"; // src/utils/fetch.ts var import_undici2 = __toESM(require_undici2(), 1); @@ -49484,80 +49397,72 @@ var fetch = async (url, opts) => await (0, import_undici2.fetch)(url, { ...opts }); -// src/download/manifest.ts -var cachedManifestData = /* @__PURE__ */ new Map(); -async function fetchManifest(manifestUrl = VERSIONS_MANIFEST_URL) { - const cachedVersions = cachedManifestData.get(manifestUrl); +// src/download/versions-client.ts +var cachedVersionData = /* @__PURE__ */ new Map(); +async function fetchVersionData(url = VERSIONS_NDJSON_URL) { + const cachedVersions = cachedVersionData.get(url); if (cachedVersions !== void 0) { - debug(`Using cached manifest data from ${manifestUrl}`); + debug(`Using cached NDJSON version data from ${url}`); return cachedVersions; } - info(`Fetching manifest data from ${manifestUrl} ...`); - const response = await fetch(manifestUrl, {}); + info(`Fetching version data from ${url} ...`); + const response = await fetch(url, {}); if (!response.ok) { throw new Error( - `Failed to fetch manifest data: ${response.status} ${response.statusText}` + `Failed to fetch version data: ${response.status} ${response.statusText}` ); } const body = await response.text(); - const versions = parseManifest(body, manifestUrl); - cachedManifestData.set(manifestUrl, versions); + const versions = parseVersionData(body, url); + cachedVersionData.set(url, versions); return versions; } -function parseManifest(data, sourceDescription) { - const trimmed = data.trim(); - if (trimmed === "") { - throw new Error(`Manifest at ${sourceDescription} is empty.`); - } - if (trimmed.startsWith("[")) { - throw new Error( - `Legacy JSON array manifests are no longer supported in ${sourceDescription}. Use the astral-sh/versions manifest format instead.` - ); - } +function parseVersionData(data, sourceDescription) { const versions = []; for (const [index, line] of data.split("\n").entries()) { - const record = line.trim(); - if (record === "") { + const trimmed = line.trim(); + if (trimmed === "") { continue; } let parsed; try { - parsed = JSON.parse(record); + parsed = JSON.parse(trimmed); } catch (error) { throw new Error( - `Failed to parse manifest data from ${sourceDescription} at line ${index + 1}: ${error.message}` + `Failed to parse version data from ${sourceDescription} at line ${index + 1}: ${error.message}` ); } - if (!isManifestVersion(parsed)) { + if (!isNdjsonVersion(parsed)) { throw new Error( - `Invalid manifest record in ${sourceDescription} at line ${index + 1}.` + `Invalid NDJSON record in ${sourceDescription} at line ${index + 1}.` ); } versions.push(parsed); } if (versions.length === 0) { - throw new Error(`No manifest data found in ${sourceDescription}.`); + throw new Error(`No version data found in ${sourceDescription}.`); } return versions; } -async function getLatestVersion(manifestUrl = VERSIONS_MANIFEST_URL) { - const latestVersion = (await fetchManifest(manifestUrl))[0]?.version; - if (latestVersion === void 0) { - throw new Error("No versions found in manifest data"); +async function getLatestVersion() { + const versions = await fetchVersionData(); + const latestVersion = versions[0]?.version; + if (!latestVersion) { + throw new Error("No versions found in NDJSON data"); } - debug(`Latest version from manifest: ${latestVersion}`); + debug(`Latest version from NDJSON: ${latestVersion}`); return latestVersion; } -function isManifestVersion(value) { +function isNdjsonVersion(value) { if (!isRecord(value)) { return false; } if (typeof value.version !== "string" || !Array.isArray(value.artifacts)) { return false; } - return value.artifacts.every(isManifestArtifact); + return value.artifacts.every(isNdjsonArtifact); } -function isManifestArtifact(value) { +function isNdjsonArtifact(value) { if (!isRecord(value)) { return false; } @@ -49585,8 +49490,8 @@ async function run() { ); return; } - const versions = await fetchManifest(); - const checksumEntries = extractChecksumsFromManifest(versions); + const versions = await fetchVersionData(); + const checksumEntries = extractChecksumsFromNdjson(versions); await updateChecksums(checksumFilePath, checksumEntries); setOutput("latest-version", latestVersion); } @@ -49607,7 +49512,7 @@ function getLatestKnownVersionFromChecksums() { function extractVersionFromChecksumKey(key) { return key.match(VERSION_IN_CHECKSUM_KEY_PATTERN)?.[1]; } -function extractChecksumsFromManifest(versions) { +function extractChecksumsFromNdjson(versions) { const checksums = []; for (const version of versions) { for (const artifact of version.artifacts) { diff --git a/docs/customization.md b/docs/customization.md index 5079746..a317591 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -19,14 +19,14 @@ are automatically verified by this action. The sha256 hashes can be found on the ## Manifest file By default, setup-uv reads version metadata from -[`astral-sh/versions`](https://github.com/astral-sh/versions). +[`astral-sh/versions`](https://github.com/astral-sh/versions) (NDJSON format). The `manifest-file` input lets you override that source with your own URL, for example to test custom uv builds or alternate download locations. ### Format -The manifest file must use the same format as `astral-sh/versions`: one JSON object per line, where each object represents a version and its artifacts. The versions must be sorted in descending order. For example: +The manifest file must be in NDJSON format, where each line is a JSON object representing a version and its artifacts. For example: ```json {"version":"0.10.7","artifacts":[{"platform":"x86_64-unknown-linux-gnu","variant":"default","url":"https://example.com/uv-x86_64-unknown-linux-gnu.tar.gz","archive_format":"tar.gz","sha256":"..."}]} @@ -37,6 +37,23 @@ setup-uv currently only supports `default` as the `variant`. The `archive_format` field is currently ignored. +### Legacy format: JSON array (deprecated) + +The previous JSON array format is still supported for compatibility, but deprecated and will be +removed in a future major release. + +```json +[ + { + "version": "0.7.13", + "artifactName": "uv-aarch64-apple-darwin.tar.gz", + "arch": "aarch64", + "platform": "apple-darwin", + "downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.7.13/uv-aarch64-apple-darwin.tar.gz" + } +] +``` + ```yaml - name: Use a custom manifest file uses: astral-sh/setup-uv@v7 diff --git a/src/cache/restore-cache.ts b/src/cache/restore-cache.ts index f2ef11c..a099aad 100644 --- a/src/cache/restore-cache.ts +++ b/src/cache/restore-cache.ts @@ -1,7 +1,15 @@ import * as cache from "@actions/cache"; import * as core from "@actions/core"; import { hashFiles } from "../hash/hash-files"; -import type { SetupInputs } from "../utils/inputs"; +import { + cacheDependencyGlob, + cacheLocalPath, + cachePython, + cacheSuffix, + pruneCache, + pythonDir, + restoreCache as shouldRestoreCache, +} from "../utils/inputs"; import { getArch, getOSNameVersion, getPlatform } from "../utils/platforms"; export const STATE_CACHE_KEY = "cache-key"; @@ -10,21 +18,18 @@ export const STATE_PYTHON_CACHE_MATCHED_KEY = "python-cache-matched-key"; const CACHE_VERSION = "2"; -export async function restoreCache( - inputs: SetupInputs, - pythonVersion?: string, -): Promise { - const cacheKey = await computeKeys(inputs, pythonVersion); +export async function restoreCache(pythonVersion?: string): Promise { + const cacheKey = await computeKeys(pythonVersion); core.saveState(STATE_CACHE_KEY, cacheKey); core.setOutput("cache-key", cacheKey); - if (!inputs.restoreCache) { + if (!shouldRestoreCache) { core.info("restore-cache is false. Skipping restore cache step."); core.setOutput("python-cache-hit", false); return; } - if (inputs.cacheLocalPath === undefined) { + if (cacheLocalPath === undefined) { throw new Error( "cache-local-path is not set. Cannot restore cache without a valid cache path.", ); @@ -32,15 +37,15 @@ export async function restoreCache( await restoreCacheFromKey( cacheKey, - inputs.cacheLocalPath.path, + cacheLocalPath.path, STATE_CACHE_MATCHED_KEY, "cache-hit", ); - if (inputs.cachePython) { + if (cachePython) { await restoreCacheFromKey( `${cacheKey}-python`, - inputs.pythonDir, + pythonDir, STATE_PYTHON_CACHE_MATCHED_KEY, "python-cache-hit", ); @@ -71,34 +76,28 @@ async function restoreCacheFromKey( handleMatchResult(matchedKey, cacheKey, stateKey, outputKey); } -async function computeKeys( - inputs: SetupInputs, - pythonVersion?: string, -): Promise { +async function computeKeys(pythonVersion?: string): Promise { let cacheDependencyPathHash = "-"; - if (inputs.cacheDependencyGlob !== "") { + if (cacheDependencyGlob !== "") { core.info( - `Searching files using cache dependency glob: ${inputs.cacheDependencyGlob.split("\n").join(",")}`, - ); - cacheDependencyPathHash += await hashFiles( - inputs.cacheDependencyGlob, - true, + `Searching files using cache dependency glob: ${cacheDependencyGlob.split("\n").join(",")}`, ); + cacheDependencyPathHash += await hashFiles(cacheDependencyGlob, true); if (cacheDependencyPathHash === "-") { core.warning( - `No file matched to [${inputs.cacheDependencyGlob.split("\n").join(",")}]. The cache will never get invalidated. Make sure you have checked out the target repository and configured the cache-dependency-glob input correctly.`, + `No file matched to [${cacheDependencyGlob.split("\n").join(",")}]. The cache will never get invalidated. Make sure you have checked out the target repository and configured the cache-dependency-glob input correctly.`, ); } } if (cacheDependencyPathHash === "-") { cacheDependencyPathHash = "-no-dependency-glob"; } - const suffix = inputs.cacheSuffix ? `-${inputs.cacheSuffix}` : ""; + const suffix = cacheSuffix ? `-${cacheSuffix}` : ""; const version = pythonVersion ?? "unknown"; const platform = await getPlatform(); const osNameVersion = getOSNameVersion(); - const pruned = inputs.pruneCache ? "-pruned" : ""; - const python = inputs.cachePython ? "-py" : ""; + const pruned = pruneCache ? "-pruned" : ""; + const python = cachePython ? "-py" : ""; return `setup-uv-${CACHE_VERSION}-${getArch()}-${platform}-${osNameVersion}-${version}${pruned}${python}${cacheDependencyPathHash}${suffix}`; } diff --git a/src/download/checksum/known-checksums.ts b/src/download/checksum/known-checksums.ts index 3caebc2..8f32d6a 100644 --- a/src/download/checksum/known-checksums.ts +++ b/src/download/checksum/known-checksums.ts @@ -1,179 +1,5 @@ // AUTOGENERATED_DO_NOT_EDIT export const KNOWN_CHECKSUMS: { [key: string]: string } = { - "aarch64-apple-darwin-0.11.2": - "4beaa9550f93ef7f0fc02f7c28c9c48cd61fe30db00f5ac8947e0a425c3fb282", - "aarch64-pc-windows-msvc-0.11.2": - "ffdded8338205f53727b51d404563a5ac8eaa9aea53279a7b7c42177e11d478c", - "aarch64-unknown-linux-gnu-0.11.2": - "04792cac761c4a6ba78267f36f2af541b7f92196d42ac55d21d3ff6b0f5ab6a5", - "aarch64-unknown-linux-musl-0.11.2": - "275d91dd1f1955136591e7ec5e1fa21e84d0d37ead7da7c35c3683df748d9855", - "arm-unknown-linux-musleabihf-0.11.2": - "ce572dac1a8f9a92960f89e99351352fae068d34b24bed86fb88e75fd5dd67d9", - "armv7-unknown-linux-gnueabihf-0.11.2": - "3e90d7de9e3a4e2d8d1bd9ce164362fce22248474986e712039479fb6fd73136", - "armv7-unknown-linux-musleabihf-0.11.2": - "5222cdd7c7dd3263f8c243831606a9f01a1a07a40ffc3c26c03afb34491075c2", - "i686-pc-windows-msvc-0.11.2": - "506f8274b253b2386881a121f3b7d915b637019bda15876bbd1357235305cf12", - "i686-unknown-linux-gnu-0.11.2": - "c7ec378bab887443a70786382e58d76489da14a7e33b155915d648cca4bdb46c", - "i686-unknown-linux-musl-0.11.2": - "ade8714be45457899568c5b03ef885a0cc94476c07a0bdbe34531ba84231bab2", - "powerpc64le-unknown-linux-gnu-0.11.2": - "3f3a50e99364efc8ff7add10e79757a2b8458700a38180ec5f313524481b9fbc", - "riscv64gc-unknown-linux-gnu-0.11.2": - "e56a93f0ff21d6908461a6ecbf465beae19ae22719f900284abb7680bd07ec41", - "riscv64gc-unknown-linux-musl-0.11.2": - "4f263571bb457a16a31cb38fba4fcc9cf1059d1d32c5b2e54c43175fcd59205d", - "s390x-unknown-linux-gnu-0.11.2": - "42ebe40775f2a77a514fa47399fde86473bf35bd33b6896c6410a0309fc4d205", - "x86_64-apple-darwin-0.11.2": - "a9c3653245031304c50dd60ac0301bf6c112e12c38c32302a71d4fa6a63ba2cb", - "x86_64-pc-windows-msvc-0.11.2": - "171b7ccda1bbd562da6babeffcf533a1c6cc7862cf998da826e1db534fc43e48", - "x86_64-unknown-linux-gnu-0.11.2": - "7ac2ca0449c8d68dae9b99e635cd3bc9b22a4cb1de64b7c43716398447d42981", - "x86_64-unknown-linux-musl-0.11.2": - "4700d9fc75734247587deb3e25dd2c6c24f4ac69e8fe91d6acad4a6013115c06", - "aarch64-apple-darwin-0.11.1": - "f7815f739ed5d0e4202e6292acedb8659b9ae7de663d07188d8c6cbd7f96303f", - "aarch64-pc-windows-msvc-0.11.1": - "b789db0c1504dd3b02c090bd5783487497cc46cc2eb71754874cdd1ef59eb52a", - "aarch64-unknown-linux-gnu-0.11.1": - "1340e62da1ee3c1109764340e1247e8a1a232c30dde4a0f0548976dcaa90f06d", - "aarch64-unknown-linux-musl-0.11.1": - "bd04ffce77ee8d77f39823c13606183581847c2f5dcd704f2ea0f15e376b1a27", - "arm-unknown-linux-musleabihf-0.11.1": - "625c0e756e2374fce864ceaa6beedd5821e276e2b6307f2b719f2d62b449b89c", - "armv7-unknown-linux-gnueabihf-0.11.1": - "baf8daaab20b0502d1853dbfd916afb0762c024ae7f0df1c2deb2a1a1c1c3467", - "armv7-unknown-linux-musleabihf-0.11.1": - "684c25b74e83bcb1b177152379cfe2c974ba731aa5af278e1d161e41709f8bcf", - "i686-pc-windows-msvc-0.11.1": - "3c07858a08c54e4e5753239354c7b07ae69071b2b6f5aa2cc970e612adcb4740", - "i686-unknown-linux-gnu-0.11.1": - "6e83167c05708570563b10b6cc7e8c289daef5f51fde0b152e41af2a7ef70813", - "i686-unknown-linux-musl-0.11.1": - "b0d5152635c257fec76f95cb9268112b47ff70bd33a23866295a4f2ed9f46b7f", - "powerpc64le-unknown-linux-gnu-0.11.1": - "e42d2abfac46f57564789e2bfa6dbea4ae3135892e36ae066ba0ae77b69bb676", - "riscv64gc-unknown-linux-gnu-0.11.1": - "5e2c757b35dab015ad37f74ee3e060208390b5f4defb6684876f1be0664f3f6e", - "riscv64gc-unknown-linux-musl-0.11.1": - "6f590a824aed363cbec4079f7ddab87b5685119e0f5f0e71cd114c7b7c326199", - "s390x-unknown-linux-gnu-0.11.1": - "4208173c74e29572b799178709b5ed5828b24888659f944a4b47c0aaf78b42d2", - "x86_64-apple-darwin-0.11.1": - "2103670e8e949605e51926c7b953923ff6f6befbfb55aee928f5e760c9c910f8", - "x86_64-pc-windows-msvc-0.11.1": - "6659250cebbd3bb6ee48bcb21a3f0c6656450d63fb97f0f069bcb532bdb688ed", - "x86_64-unknown-linux-gnu-0.11.1": - "7c0c8069053e6e99e5911ff32b916be571f3419cd8e11bd28fb7da2c7dcaa553", - "x86_64-unknown-linux-musl-0.11.1": - "4e949471a95b37088a1ff1a585f69abed4d3cd3f921f50709a46b6ba62986d38", - "aarch64-apple-darwin-0.11.0": - "0c0f32c6a3473c5928aff96c3233715edfc79290e892f255cac93710cde7b91a", - "aarch64-pc-windows-msvc-0.11.0": - "95419e04a3ef5f13fb2a06bd6d787ba80a9d8981d6f097780e5a979817a2879d", - "aarch64-unknown-linux-gnu-0.11.0": - "8e179ca110343a17f801444ff9ef117dba56ef5fc9f6a4c9bb77b318ddba5f24", - "aarch64-unknown-linux-musl-0.11.0": - "658be4b8ec905635f1295468d4d5120d9e1ab1722eec9a104473ce993590babe", - "arm-unknown-linux-musleabihf-0.11.0": - "bfdcbd5fa41c8a9877a72c2b55a95da2bc79933885ef56c699b65bb2ed9cea91", - "armv7-unknown-linux-gnueabihf-0.11.0": - "0cad4e1b6769e48aa1e80cf639ddcc7c1bfe9ed017e95868fed185a8d818c949", - "armv7-unknown-linux-musleabihf-0.11.0": - "2aa9da83c6c0cf8a06bc9df14d51056284fa067ef5390b4db79998ff12f3bee7", - "i686-pc-windows-msvc-0.11.0": - "3b09d70e686087e096dbd8a2af21b922a2cac7d613dc053c3281c3ddbb961961", - "i686-unknown-linux-gnu-0.11.0": - "59928a0267501c20d9f9942f5f1d81a991ec55e29a19e002ae3d5c178c674c89", - "i686-unknown-linux-musl-0.11.0": - "1f438d6f6f851f0dabad3307ce7fd46541ecc5c42ebb664f382eb6c9a424a67d", - "powerpc64le-unknown-linux-gnu-0.11.0": - "29f17fb43595492b1a36cda57df7adad74183132df32799d32897268ff4e26dd", - "riscv64gc-unknown-linux-gnu-0.11.0": - "84ef37dda1003c5b65fa6c8f84242d35a7fcc84cc5ea9490d702edc36cad1f67", - "s390x-unknown-linux-gnu-0.11.0": - "b25be62f3b642348a2fece5c658624586661b8d1103891ab6903768b0529edc4", - "x86_64-apple-darwin-0.11.0": - "31aaec764166af8885cf99321fd6ed24fef80225a6f26ed1ae8ce04111688a7e", - "x86_64-pc-windows-msvc-0.11.0": - "e21d00b172df83531564a95e75a2bdc0c59b471dbb3515f0c1b4d6ef657dc451", - "x86_64-unknown-linux-gnu-0.11.0": - "cc0fbb42b3642125f600a55b0b095bea65cddaadb94c6ea2b6ba5d79c5825089", - "x86_64-unknown-linux-musl-0.11.0": - "bf6b0757c73d1726faa2a819b155d4d864919a95766720215d78fdcd09d42d26", - "aarch64-apple-darwin-0.10.12": - "ae738b5661a900579ec621d3918c0ef17bdec0da2a8a6d8b161137cd15f25414", - "aarch64-pc-windows-msvc-0.10.12": - "e79881e2c4f98a0f3a37b8770bf224e8fee70f6dcf8fc17055d8291bb1b0b867", - "aarch64-unknown-linux-gnu-0.10.12": - "0ed7d20f49f6b9b60d45fdfcac28f3ac01a671a6ef08672401ed2833423fea2a", - "aarch64-unknown-linux-musl-0.10.12": - "55bd1c1c10ec8b95a8c184f5e18b566703c6ab105f0fc118aaa4d748aabf28e4", - "arm-unknown-linux-musleabihf-0.10.12": - "9714e5059b05110a1c7ddbc18c971c13e0260e10551b7b77d82cbf907a4ebd9b", - "armv7-unknown-linux-gnueabihf-0.10.12": - "eaa02f36d5112029601b18ac3d1a0c03a83bb20cb4154c2f5345f777fa6c4101", - "armv7-unknown-linux-musleabihf-0.10.12": - "bd735652298c6e62cdd2ac939babe176a3356613e6803baa33d0bc10e8d9e4ed", - "i686-pc-windows-msvc-0.10.12": - "2312e75b9c77befdc1bff30da18f16df03083452852952553bee91da362c1a1d", - "i686-unknown-linux-gnu-0.10.12": - "8501844b34e3a28cfbba5a4b857eebd696d952e0bb4160357451ad80f3f49db8", - "i686-unknown-linux-musl-0.10.12": - "56cad78abcf5b710d2f7b9f774fcfd6bbed340d2aa9d9fc9e3b515542ec5e953", - "powerpc64le-unknown-linux-gnu-0.10.12": - "3c8017d9112221c83f43e8a15a58099663c0b2bdeabc8b43bb800413dfa21218", - "riscv64gc-unknown-linux-gnu-0.10.12": - "b1ca482b6b5dd7bf6ab733a3695cb0ab5b8e992ca96527efae93aa78fcc52a9b", - "s390x-unknown-linux-gnu-0.10.12": - "e1a0345eefe6fd3300948cd6f18aab092f9b88a243782113e645ce96530a6693", - "x86_64-apple-darwin-0.10.12": - "17443e293f2ae407bb2d8d34b875ebfe0ae01cf1296de5647e69e7b2e2b428f0", - "x86_64-pc-windows-msvc-0.10.12": - "4c1d55501869b3330d4aabf45ad6024ce2367e0f3af83344395702d272c22e88", - "x86_64-unknown-linux-gnu-0.10.12": - "ec72570c9d1f33021aa80b176d7baba390de2cfeb1abcbefca346d563bf17484", - "x86_64-unknown-linux-musl-0.10.12": - "adccf40b5d1939a5e0093081ec2307ea24235adf7c2d96b122c561fa37711c46", - "aarch64-apple-darwin-0.10.11": - "437a7d498dd6564d5bf986074249ba1fc600e73da55ae04d7bd4c24d5f149b95", - "aarch64-pc-windows-msvc-0.10.11": - "6a3eec4105c775dd87c11ef8ec41564648273751ff807c8955c24ddbcc636d03", - "aarch64-unknown-linux-gnu-0.10.11": - "23003df007937dd607409c8ddf010baa82bad2673e60e254632ca5b04edcce13", - "aarch64-unknown-linux-musl-0.10.11": - "5d80a7f6343d2676dfde1e5126582070a2bbc62df6f60d5527a169be3788532a", - "arm-unknown-linux-musleabihf-0.10.11": - "d3c248497c450d22a39c1d43a4a358c0c852e6056f5f49be96495eea41afb96c", - "armv7-unknown-linux-gnueabihf-0.10.11": - "7895a6470dfba051af4e74253599482fc0b37141b5d229956b383365e1a22902", - "armv7-unknown-linux-musleabihf-0.10.11": - "d2880c08acfdaef0985488972c8b14969f7139c27545046e2f6202f0e0f4d9d8", - "i686-pc-windows-msvc-0.10.11": - "c17f3dc3b2c47490057f17a1f0c37270f11a7b7cedf9bf2c0f841ce02bc7001b", - "i686-unknown-linux-gnu-0.10.11": - "1ab69ff7dd104a902731758ee05b782dfd9bdb263384e61650de638f33f586df", - "i686-unknown-linux-musl-0.10.11": - "cffb80d303fc1655e259d0b769c489f452e97425a6b6d3393d766413783a1d8c", - "powerpc64le-unknown-linux-gnu-0.10.11": - "ddc6a20670e60219e947b1b04813be80d7e9f4c4a0234231c8ed9298eec04aa6", - "riscv64gc-unknown-linux-gnu-0.10.11": - "c0719473cf5f8b475e917b8dfef6ae5d876b86a00a82ef91e47a02f561399f4f", - "s390x-unknown-linux-gnu-0.10.11": - "305ee734c585918515a22fe43b7cf253c38d468771373a0c02364d67498e07b2", - "x86_64-apple-darwin-0.10.11": - "ff90020b554cf02ef8008535c9aab6ef27bb7be6b075359300dec79c361df897", - "x86_64-pc-windows-msvc-0.10.11": - "9ee74df98582f37fdd6069e1caac80d2616f9a489f5dbb2b1c152f30be69c58e", - "x86_64-unknown-linux-gnu-0.10.11": - "5a360b0de092ddf4131f5313d0411b48c4e95e8107e40c3f8f2e9fcb636b3583", - "x86_64-unknown-linux-musl-0.10.11": - "d78246139dc6cf3ed6d03c84da762686bced7ad1de67977ee372a45b95a1f6d0", "aarch64-apple-darwin-0.10.10": "8a09f0ef51ee7f7170731b4cb8bde5bf9ba6da5304f49a7df6cdab42a1f37b5d", "aarch64-pc-windows-msvc-0.10.10": diff --git a/src/download/download-version.ts b/src/download/download-version.ts index 29f40d3..5c92068 100644 --- a/src/download/download-version.ts +++ b/src/download/download-version.ts @@ -8,11 +8,20 @@ import { ASTRAL_MIRROR_PREFIX, GITHUB_RELEASES_PREFIX, TOOL_CACHE_NAME, - VERSIONS_MANIFEST_URL, + VERSIONS_NDJSON_URL, } from "../utils/constants"; import type { Architecture, Platform } from "../utils/platforms"; import { validateChecksum } from "./checksum/checksum"; -import { getAllVersions, getArtifact, getLatestVersion } from "./manifest"; +import { + getAllVersions as getAllManifestVersions, + getLatestKnownVersion as getLatestVersionInManifest, + getManifestArtifact, +} from "./version-manifest"; +import { + getAllVersions as getAllVersionsFromNdjson, + getArtifact as getArtifactFromNdjson, + getLatestVersion as getLatestVersionFromNdjson, +} from "./versions-client"; export function tryGetFromToolCache( arch: Architecture, @@ -29,42 +38,36 @@ export function tryGetFromToolCache( return { installedPath, version: resolvedVersion }; } -export async function downloadVersion( +export async function downloadVersionFromNdjson( platform: Platform, arch: Architecture, version: string, - checksum: string | undefined, + checkSum: string | undefined, githubToken: string, - manifestUrl?: string, ): Promise<{ version: string; cachedToolDir: string }> { - const artifact = await getArtifact(version, arch, platform, manifestUrl); + const artifact = await getArtifactFromNdjson(version, arch, platform); if (!artifact) { throw new Error( - getMissingArtifactMessage(version, arch, platform, manifestUrl), + `Could not find artifact for version ${version}, arch ${arch}, platform ${platform} in ${VERSIONS_NDJSON_URL} .`, ); } - // For the default astral-sh/versions source, checksum validation relies on - // user input or the built-in KNOWN_CHECKSUMS table, not manifest sha256 values. - const resolvedChecksum = - manifestUrl === undefined - ? checksum - : resolveChecksum(checksum, artifact.checksum); - - const mirrorUrl = rewriteToMirror(artifact.downloadUrl); - const downloadUrl = mirrorUrl ?? artifact.downloadUrl; + const mirrorUrl = rewriteToMirror(artifact.url); + const downloadUrl = mirrorUrl ?? artifact.url; // Don't send the GitHub token to the Astral mirror. const downloadToken = mirrorUrl !== undefined ? undefined : githubToken; + // For the default astral-sh/versions source, checksum validation relies on + // user input or the built-in KNOWN_CHECKSUMS table, not NDJSON sha256 values. try { - return await downloadArtifact( + return await downloadVersion( downloadUrl, `uv-${arch}-${platform}`, platform, arch, version, - resolvedChecksum, + checkSum, downloadToken, ); } catch (err) { @@ -76,13 +79,13 @@ export async function downloadVersion( `Failed to download from mirror, falling back to GitHub Releases: ${(err as Error).message}`, ); - return await downloadArtifact( - artifact.downloadUrl, + return await downloadVersion( + artifact.url, `uv-${arch}-${platform}`, platform, arch, version, - resolvedChecksum, + checkSum, githubToken, ); } @@ -96,11 +99,41 @@ export function rewriteToMirror(url: string): string | undefined { if (!url.startsWith(GITHUB_RELEASES_PREFIX)) { return undefined; } - return ASTRAL_MIRROR_PREFIX + url.slice(GITHUB_RELEASES_PREFIX.length); } -async function downloadArtifact( +export async function downloadVersionFromManifest( + manifestUrl: string, + platform: Platform, + arch: Architecture, + version: string, + checkSum: string | undefined, + githubToken: string, +): Promise<{ version: string; cachedToolDir: string }> { + const artifact = await getManifestArtifact( + manifestUrl, + version, + arch, + platform, + ); + if (!artifact) { + throw new Error( + `manifest-file does not contain version ${version}, arch ${arch}, platform ${platform}.`, + ); + } + + return await downloadVersion( + artifact.downloadUrl, + `uv-${arch}-${platform}`, + platform, + arch, + version, + resolveChecksum(checkSum, artifact.checksum), + githubToken, + ); +} + +async function downloadVersion( downloadUrl: string, artifactName: string, platform: Platform, @@ -144,28 +177,15 @@ async function downloadArtifact( version, arch, ); - return { cachedToolDir, version }; -} - -function getMissingArtifactMessage( - version: string, - arch: Architecture, - platform: Platform, - manifestUrl?: string, -): string { - if (manifestUrl === undefined) { - return `Could not find artifact for version ${version}, arch ${arch}, platform ${platform} in ${VERSIONS_MANIFEST_URL} .`; - } - - return `manifest-file does not contain version ${version}, arch ${arch}, platform ${platform}.`; + return { cachedToolDir, version: version }; } function resolveChecksum( - checksum: string | undefined, - manifestChecksum: string, -): string { - return checksum !== undefined && checksum !== "" - ? checksum + checkSum: string | undefined, + manifestChecksum?: string, +): string | undefined { + return checkSum !== undefined && checkSum !== "" + ? checkSum : manifestChecksum; } @@ -179,27 +199,31 @@ export async function resolveVersion( resolutionStrategy: "highest" | "lowest" = "highest", ): Promise { core.debug(`Resolving version: ${versionInput}`); + let version: string; const isSimpleMinimumVersionSpecifier = versionInput.includes(">") && !versionInput.includes(","); const resolveVersionSpecifierToLatest = isSimpleMinimumVersionSpecifier && resolutionStrategy === "highest"; - if (resolveVersionSpecifierToLatest) { core.info("Found minimum version specifier, using latest version"); } - - const version = - versionInput === "latest" || resolveVersionSpecifierToLatest - ? await getLatestVersion(manifestUrl) - : versionInput; - + if (manifestUrl !== undefined) { + version = + versionInput === "latest" || resolveVersionSpecifierToLatest + ? await getLatestVersionInManifest(manifestUrl) + : versionInput; + } else { + version = + versionInput === "latest" || resolveVersionSpecifierToLatest + ? await getLatestVersionFromNdjson() + : versionInput; + } if (tc.isExplicitVersion(version)) { core.debug(`Version ${version} is an explicit version.`); - if ( - resolveVersionSpecifierToLatest && - !pep440.satisfies(version, versionInput) - ) { - throw new Error(`No version found for ${versionInput}`); + if (resolveVersionSpecifierToLatest) { + if (!pep440.satisfies(version, versionInput)) { + throw new Error(`No version found for ${versionInput}`); + } } return version; } @@ -225,11 +249,11 @@ async function getAvailableVersions( core.info( `Getting available versions from manifest-file ${manifestUrl} ...`, ); - } else { - core.info(`Getting available versions from ${VERSIONS_MANIFEST_URL} ...`); + return await getAllManifestVersions(manifestUrl); } - return await getAllVersions(manifestUrl); + core.info(`Getting available versions from ${VERSIONS_NDJSON_URL} ...`); + return await getAllVersionsFromNdjson(); } function maxSatisfying( diff --git a/src/download/legacy-version-manifest.ts b/src/download/legacy-version-manifest.ts new file mode 100644 index 0000000..69e76c0 --- /dev/null +++ b/src/download/legacy-version-manifest.ts @@ -0,0 +1,80 @@ +import * as core from "@actions/core"; + +export interface ManifestEntry { + arch: string; + platform: string; + version: string; + downloadUrl: string; + checksum?: string; + variant?: string; + archiveFormat?: string; +} + +interface LegacyManifestEntry { + arch: string; + platform: string; + version: string; + downloadUrl: string; + checksum?: string; +} + +const warnedLegacyManifestUrls = new Set(); + +export function parseLegacyManifestEntries( + parsedEntries: unknown[], + manifestUrl: string, +): ManifestEntry[] { + warnAboutLegacyManifestFormat(manifestUrl); + + return parsedEntries.map((entry, index) => { + if (!isLegacyManifestEntry(entry)) { + throw new Error( + `Invalid legacy manifest-file entry at index ${index} in ${manifestUrl}.`, + ); + } + + return { + arch: entry.arch, + checksum: entry.checksum, + downloadUrl: entry.downloadUrl, + platform: entry.platform, + version: entry.version, + }; + }); +} + +export function clearLegacyManifestWarnings(): void { + warnedLegacyManifestUrls.clear(); +} + +function warnAboutLegacyManifestFormat(manifestUrl: string): void { + if (warnedLegacyManifestUrls.has(manifestUrl)) { + return; + } + + warnedLegacyManifestUrls.add(manifestUrl); + core.warning( + `manifest-file ${manifestUrl} uses the legacy JSON array format, which is deprecated. Please migrate to the astral-sh/versions NDJSON format before the next major release.`, + ); +} + +function isLegacyManifestEntry(value: unknown): value is LegacyManifestEntry { + if (!isRecord(value)) { + return false; + } + + const checksumIsValid = + typeof value.checksum === "string" || value.checksum === undefined; + + return ( + typeof value.arch === "string" && + checksumIsValid && + typeof value.downloadUrl === "string" && + typeof value.platform === "string" && + typeof value.version === "string" + ); +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null; +} diff --git a/src/download/manifest.ts b/src/download/manifest.ts deleted file mode 100644 index a033334..0000000 --- a/src/download/manifest.ts +++ /dev/null @@ -1,199 +0,0 @@ -import * as core from "@actions/core"; -import { VERSIONS_MANIFEST_URL } from "../utils/constants"; -import { fetch } from "../utils/fetch"; -import { selectDefaultVariant } from "./variant-selection"; - -export interface ManifestArtifact { - platform: string; - variant?: string; - url: string; - archive_format: string; - sha256: string; -} - -export interface ManifestVersion { - version: string; - artifacts: ManifestArtifact[]; -} - -export interface ArtifactResult { - archiveFormat: string; - checksum: string; - downloadUrl: string; -} - -const cachedManifestData = new Map(); - -export async function fetchManifest( - manifestUrl: string = VERSIONS_MANIFEST_URL, -): Promise { - const cachedVersions = cachedManifestData.get(manifestUrl); - if (cachedVersions !== undefined) { - core.debug(`Using cached manifest data from ${manifestUrl}`); - return cachedVersions; - } - - core.info(`Fetching manifest data from ${manifestUrl} ...`); - const response = await fetch(manifestUrl, {}); - if (!response.ok) { - throw new Error( - `Failed to fetch manifest data: ${response.status} ${response.statusText}`, - ); - } - - const body = await response.text(); - const versions = parseManifest(body, manifestUrl); - cachedManifestData.set(manifestUrl, versions); - return versions; -} - -export function parseManifest( - data: string, - sourceDescription: string, -): ManifestVersion[] { - const trimmed = data.trim(); - if (trimmed === "") { - throw new Error(`Manifest at ${sourceDescription} is empty.`); - } - - if (trimmed.startsWith("[")) { - throw new Error( - `Legacy JSON array manifests are no longer supported in ${sourceDescription}. Use the astral-sh/versions manifest format instead.`, - ); - } - - const versions: ManifestVersion[] = []; - - for (const [index, line] of data.split("\n").entries()) { - const record = line.trim(); - if (record === "") { - continue; - } - - let parsed: unknown; - try { - parsed = JSON.parse(record); - } catch (error) { - throw new Error( - `Failed to parse manifest data from ${sourceDescription} at line ${index + 1}: ${(error as Error).message}`, - ); - } - - if (!isManifestVersion(parsed)) { - throw new Error( - `Invalid manifest record in ${sourceDescription} at line ${index + 1}.`, - ); - } - - versions.push(parsed); - } - - if (versions.length === 0) { - throw new Error(`No manifest data found in ${sourceDescription}.`); - } - - return versions; -} - -export async function getLatestVersion( - manifestUrl: string = VERSIONS_MANIFEST_URL, -): Promise { - const latestVersion = (await fetchManifest(manifestUrl))[0]?.version; - - if (latestVersion === undefined) { - throw new Error("No versions found in manifest data"); - } - - core.debug(`Latest version from manifest: ${latestVersion}`); - return latestVersion; -} - -export async function getAllVersions( - manifestUrl: string = VERSIONS_MANIFEST_URL, -): Promise { - const versions = await fetchManifest(manifestUrl); - return versions.map((versionData) => versionData.version); -} - -export async function getArtifact( - version: string, - arch: string, - platform: string, - manifestUrl: string = VERSIONS_MANIFEST_URL, -): Promise { - const versions = await fetchManifest(manifestUrl); - const versionData = versions.find( - (candidate) => candidate.version === version, - ); - if (!versionData) { - core.debug(`Version ${version} not found in manifest ${manifestUrl}`); - return undefined; - } - - const targetPlatform = `${arch}-${platform}`; - const matchingArtifacts = versionData.artifacts.filter( - (candidate) => candidate.platform === targetPlatform, - ); - - if (matchingArtifacts.length === 0) { - core.debug( - `Artifact for ${targetPlatform} not found in version ${version}. Available platforms: ${versionData.artifacts - .map((candidate) => candidate.platform) - .join(", ")}`, - ); - return undefined; - } - - const artifact = selectDefaultVariant( - matchingArtifacts, - `Multiple artifacts found for ${targetPlatform} in version ${version}`, - ); - - return { - archiveFormat: artifact.archive_format, - checksum: artifact.sha256, - downloadUrl: artifact.url, - }; -} - -export function clearManifestCache(manifestUrl?: string): void { - if (manifestUrl === undefined) { - cachedManifestData.clear(); - return; - } - - cachedManifestData.delete(manifestUrl); -} - -function isManifestVersion(value: unknown): value is ManifestVersion { - if (!isRecord(value)) { - return false; - } - - if (typeof value.version !== "string" || !Array.isArray(value.artifacts)) { - return false; - } - - return value.artifacts.every(isManifestArtifact); -} - -function isManifestArtifact(value: unknown): value is ManifestArtifact { - if (!isRecord(value)) { - return false; - } - - const variantIsValid = - typeof value.variant === "string" || value.variant === undefined; - - return ( - typeof value.archive_format === "string" && - typeof value.platform === "string" && - typeof value.sha256 === "string" && - typeof value.url === "string" && - variantIsValid - ); -} - -function isRecord(value: unknown): value is Record { - return typeof value === "object" && value !== null; -} diff --git a/src/download/version-manifest.ts b/src/download/version-manifest.ts new file mode 100644 index 0000000..92f2ba1 --- /dev/null +++ b/src/download/version-manifest.ts @@ -0,0 +1,169 @@ +import * as core from "@actions/core"; +import * as semver from "semver"; +import { fetch } from "../utils/fetch"; +import { + clearLegacyManifestWarnings, + type ManifestEntry, + parseLegacyManifestEntries, +} from "./legacy-version-manifest"; +import { selectDefaultVariant } from "./variant-selection"; +import { type NdjsonVersion, parseVersionData } from "./versions-client"; + +export interface ManifestArtifact { + downloadUrl: string; + checksum?: string; + archiveFormat?: string; +} + +const cachedManifestEntries = new Map(); + +export async function getLatestKnownVersion( + manifestUrl: string, +): Promise { + const versions = await getAllVersions(manifestUrl); + const latestVersion = versions.reduce((latest, current) => + semver.gt(current, latest) ? current : latest, + ); + + return latestVersion; +} + +export async function getAllVersions(manifestUrl: string): Promise { + const manifestEntries = await getManifestEntries(manifestUrl); + return [...new Set(manifestEntries.map((entry) => entry.version))]; +} + +export async function getManifestArtifact( + manifestUrl: string, + version: string, + arch: string, + platform: string, +): Promise { + const manifestEntries = await getManifestEntries(manifestUrl); + const entry = selectManifestEntry( + manifestEntries, + manifestUrl, + version, + arch, + platform, + ); + + if (!entry) { + return undefined; + } + + return { + archiveFormat: entry.archiveFormat, + checksum: entry.checksum, + downloadUrl: entry.downloadUrl, + }; +} + +export function clearManifestCache(): void { + cachedManifestEntries.clear(); + clearLegacyManifestWarnings(); +} + +async function getManifestEntries( + manifestUrl: string, +): Promise { + const cachedEntries = cachedManifestEntries.get(manifestUrl); + if (cachedEntries !== undefined) { + core.debug(`Using cached manifest-file from: ${manifestUrl}`); + return cachedEntries; + } + + core.info(`Fetching manifest-file from: ${manifestUrl}`); + const response = await fetch(manifestUrl, {}); + if (!response.ok) { + throw new Error( + `Failed to fetch manifest-file: ${response.status} ${response.statusText}`, + ); + } + + const data = await response.text(); + const parsedEntries = parseManifestEntries(data, manifestUrl); + cachedManifestEntries.set(manifestUrl, parsedEntries); + + return parsedEntries; +} + +function parseManifestEntries( + data: string, + manifestUrl: string, +): ManifestEntry[] { + const trimmed = data.trim(); + if (trimmed === "") { + throw new Error(`manifest-file at ${manifestUrl} is empty.`); + } + + const parsedAsJson = tryParseJson(trimmed); + if (Array.isArray(parsedAsJson)) { + return parseLegacyManifestEntries(parsedAsJson, manifestUrl); + } + + const versions = parseVersionData(trimmed, manifestUrl); + return mapNdjsonVersionsToManifestEntries(versions, manifestUrl); +} + +function mapNdjsonVersionsToManifestEntries( + versions: NdjsonVersion[], + manifestUrl: string, +): ManifestEntry[] { + const manifestEntries: ManifestEntry[] = []; + + for (const versionData of versions) { + for (const artifact of versionData.artifacts) { + const [arch, ...platformParts] = artifact.platform.split("-"); + if (arch === undefined || platformParts.length === 0) { + throw new Error( + `Invalid artifact platform '${artifact.platform}' in manifest-file ${manifestUrl}.`, + ); + } + + manifestEntries.push({ + arch, + archiveFormat: artifact.archive_format, + checksum: artifact.sha256, + downloadUrl: artifact.url, + platform: platformParts.join("-"), + variant: artifact.variant, + version: versionData.version, + }); + } + } + + return manifestEntries; +} + +function selectManifestEntry( + manifestEntries: ManifestEntry[], + manifestUrl: string, + version: string, + arch: string, + platform: string, +): ManifestEntry | undefined { + const matches = manifestEntries.filter( + (candidate) => + candidate.version === version && + candidate.arch === arch && + candidate.platform === platform, + ); + + if (matches.length === 0) { + return undefined; + } + + return selectDefaultVariant( + matches, + `manifest-file ${manifestUrl} contains multiple artifacts for version ${version}, arch ${arch}, platform ${platform}`, + ); +} + +function tryParseJson(value: string): unknown { + try { + return JSON.parse(value); + } catch { + return undefined; + } +} diff --git a/src/download/versions-client.ts b/src/download/versions-client.ts new file mode 100644 index 0000000..f11c091 --- /dev/null +++ b/src/download/versions-client.ts @@ -0,0 +1,191 @@ +import * as core from "@actions/core"; +import { VERSIONS_NDJSON_URL } from "../utils/constants"; +import { fetch } from "../utils/fetch"; +import { selectDefaultVariant } from "./variant-selection"; + +export interface NdjsonArtifact { + platform: string; + variant?: string; + url: string; + archive_format: string; + sha256: string; +} + +export interface NdjsonVersion { + version: string; + artifacts: NdjsonArtifact[]; +} + +export interface ArtifactResult { + url: string; + sha256: string; + archiveFormat: string; +} + +const cachedVersionData = new Map(); + +export async function fetchVersionData( + url: string = VERSIONS_NDJSON_URL, +): Promise { + const cachedVersions = cachedVersionData.get(url); + if (cachedVersions !== undefined) { + core.debug(`Using cached NDJSON version data from ${url}`); + return cachedVersions; + } + + core.info(`Fetching version data from ${url} ...`); + const response = await fetch(url, {}); + if (!response.ok) { + throw new Error( + `Failed to fetch version data: ${response.status} ${response.statusText}`, + ); + } + + const body = await response.text(); + const versions = parseVersionData(body, url); + cachedVersionData.set(url, versions); + return versions; +} + +export function parseVersionData( + data: string, + sourceDescription: string, +): NdjsonVersion[] { + const versions: NdjsonVersion[] = []; + + for (const [index, line] of data.split("\n").entries()) { + const trimmed = line.trim(); + if (trimmed === "") { + continue; + } + + let parsed: unknown; + try { + parsed = JSON.parse(trimmed); + } catch (error) { + throw new Error( + `Failed to parse version data from ${sourceDescription} at line ${index + 1}: ${(error as Error).message}`, + ); + } + + if (!isNdjsonVersion(parsed)) { + throw new Error( + `Invalid NDJSON record in ${sourceDescription} at line ${index + 1}.`, + ); + } + + versions.push(parsed); + } + + if (versions.length === 0) { + throw new Error(`No version data found in ${sourceDescription}.`); + } + + return versions; +} + +export async function getLatestVersion(): Promise { + const versions = await fetchVersionData(); + const latestVersion = versions[0]?.version; + if (!latestVersion) { + throw new Error("No versions found in NDJSON data"); + } + + core.debug(`Latest version from NDJSON: ${latestVersion}`); + return latestVersion; +} + +export async function getAllVersions(): Promise { + const versions = await fetchVersionData(); + return versions.map((versionData) => versionData.version); +} + +export async function getArtifact( + version: string, + arch: string, + platform: string, +): Promise { + const versions = await fetchVersionData(); + const versionData = versions.find( + (candidate) => candidate.version === version, + ); + if (!versionData) { + core.debug(`Version ${version} not found in NDJSON data`); + return undefined; + } + + const targetPlatform = `${arch}-${platform}`; + const matchingArtifacts = versionData.artifacts.filter( + (candidate) => candidate.platform === targetPlatform, + ); + + if (matchingArtifacts.length === 0) { + core.debug( + `Artifact for ${targetPlatform} not found in version ${version}. Available platforms: ${versionData.artifacts + .map((candidate) => candidate.platform) + .join(", ")}`, + ); + return undefined; + } + + const artifact = selectArtifact(matchingArtifacts, version, targetPlatform); + + return { + archiveFormat: artifact.archive_format, + sha256: artifact.sha256, + url: artifact.url, + }; +} + +export function clearCache(url?: string): void { + if (url === undefined) { + cachedVersionData.clear(); + return; + } + + cachedVersionData.delete(url); +} + +function selectArtifact( + artifacts: NdjsonArtifact[], + version: string, + targetPlatform: string, +): NdjsonArtifact { + return selectDefaultVariant( + artifacts, + `Multiple artifacts found for ${targetPlatform} in version ${version}`, + ); +} + +function isNdjsonVersion(value: unknown): value is NdjsonVersion { + if (!isRecord(value)) { + return false; + } + + if (typeof value.version !== "string" || !Array.isArray(value.artifacts)) { + return false; + } + + return value.artifacts.every(isNdjsonArtifact); +} + +function isNdjsonArtifact(value: unknown): value is NdjsonArtifact { + if (!isRecord(value)) { + return false; + } + + const variantIsValid = + typeof value.variant === "string" || value.variant === undefined; + + return ( + typeof value.archive_format === "string" && + typeof value.platform === "string" && + typeof value.sha256 === "string" && + typeof value.url === "string" && + variantIsValid + ); +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null; +} diff --git a/src/save-cache.ts b/src/save-cache.ts index 5921b72..3872ae9 100644 --- a/src/save-cache.ts +++ b/src/save-cache.ts @@ -9,14 +9,21 @@ import { STATE_PYTHON_CACHE_MATCHED_KEY, } from "./cache/restore-cache"; import { STATE_UV_PATH, STATE_UV_VERSION } from "./utils/constants"; -import { loadInputs, type SetupInputs } from "./utils/inputs"; +import { + cacheLocalPath, + cachePython, + enableCache, + ignoreNothingToCache, + pythonDir, + pruneCache as shouldPruneCache, + saveCache as shouldSaveCache, +} from "./utils/inputs"; export async function run(): Promise { try { - const inputs = loadInputs(); - if (inputs.enableCache) { - if (inputs.saveCache) { - await saveCache(inputs); + if (enableCache) { + if (shouldSaveCache) { + await saveCache(); } else { core.info("save-cache is false. Skipping save cache step."); } @@ -36,7 +43,7 @@ export async function run(): Promise { } } -async function saveCache(inputs: SetupInputs): Promise { +async function saveCache(): Promise { const cacheKey = core.getState(STATE_CACHE_KEY); const matchedKey = core.getState(STATE_CACHE_MATCHED_KEY); @@ -47,13 +54,13 @@ async function saveCache(inputs: SetupInputs): Promise { if (matchedKey === cacheKey) { core.info(`Cache hit occurred on key ${cacheKey}, not saving cache.`); } else { - if (inputs.pruneCache) { + if (shouldPruneCache) { await pruneCache(); } - const actualCachePath = getUvCachePath(inputs); + const actualCachePath = getUvCachePath(); if (!fs.existsSync(actualCachePath)) { - if (inputs.ignoreNothingToCache) { + if (ignoreNothingToCache) { core.info( "No cacheable uv cache paths were found. Ignoring because ignore-nothing-to-cache is enabled.", ); @@ -72,10 +79,10 @@ async function saveCache(inputs: SetupInputs): Promise { } } - if (inputs.cachePython) { - if (!fs.existsSync(inputs.pythonDir)) { + if (cachePython) { + if (!fs.existsSync(pythonDir)) { core.warning( - `Python cache path ${inputs.pythonDir} does not exist on disk. Skipping Python cache save because no managed Python installation was found. If you want uv to install managed Python instead of using a system interpreter, set UV_PYTHON_PREFERENCE=only-managed.`, + `Python cache path ${pythonDir} does not exist on disk. Skipping Python cache save because no managed Python installation was found. If you want uv to install managed Python instead of using a system interpreter, set UV_PYTHON_PREFERENCE=only-managed.`, ); return; } @@ -83,7 +90,7 @@ async function saveCache(inputs: SetupInputs): Promise { const pythonCacheKey = `${cacheKey}-python`; await saveCacheToKey( pythonCacheKey, - inputs.pythonDir, + pythonDir, STATE_PYTHON_CACHE_MATCHED_KEY, "Python cache", ); @@ -106,22 +113,22 @@ async function pruneCache(): Promise { await exec.exec(uvPath, execArgs, options); } -function getUvCachePath(inputs: SetupInputs): string { - if (inputs.cacheLocalPath === undefined) { +function getUvCachePath(): string { + if (cacheLocalPath === undefined) { throw new Error( "cache-local-path is not set. Cannot save cache without a valid cache path.", ); } if ( process.env.UV_CACHE_DIR && - process.env.UV_CACHE_DIR !== inputs.cacheLocalPath.path + process.env.UV_CACHE_DIR !== cacheLocalPath.path ) { core.warning( - `The environment variable UV_CACHE_DIR has been changed to "${process.env.UV_CACHE_DIR}", by an action or step running after astral-sh/setup-uv. This can lead to unexpected behavior. If you expected this to happen set the cache-local-path input to "${process.env.UV_CACHE_DIR}" instead of "${inputs.cacheLocalPath.path}".`, + `The environment variable UV_CACHE_DIR has been changed to "${process.env.UV_CACHE_DIR}", by an action or step running after astral-sh/setup-uv. This can lead to unexpected behavior. If you expected this to happen set the cache-local-path input to "${process.env.UV_CACHE_DIR}" instead of "${cacheLocalPath.path}".`, ); return process.env.UV_CACHE_DIR; } - return inputs.cacheLocalPath.path; + return cacheLocalPath.path; } async function saveCacheToKey( diff --git a/src/setup-uv.ts b/src/setup-uv.ts index e1d40c2..08da661 100644 --- a/src/setup-uv.ts +++ b/src/setup-uv.ts @@ -4,12 +4,32 @@ import * as core from "@actions/core"; import * as exec from "@actions/exec"; import { restoreCache } from "./cache/restore-cache"; import { - downloadVersion, + downloadVersionFromManifest, + downloadVersionFromNdjson, resolveVersion, tryGetFromToolCache, } from "./download/download-version"; import { STATE_UV_PATH, STATE_UV_VERSION } from "./utils/constants"; -import { CacheLocalSource, loadInputs, type SetupInputs } from "./utils/inputs"; +import { + activateEnvironment as activateEnvironmentInput, + addProblemMatchers, + CacheLocalSource, + cacheLocalPath, + checkSum, + enableCache, + githubToken, + ignoreEmptyWorkdir, + manifestFile, + pythonDir, + pythonVersion, + resolutionStrategy, + toolBinDir, + toolDir, + venvPath, + versionFile as versionFileInput, + version as versionInput, + workingDirectory, +} from "./utils/inputs"; import { type Architecture, getArch, @@ -20,9 +40,9 @@ import { getUvVersionFromFile } from "./version/resolve"; const sourceDir = __dirname; -async function getPythonVersion(inputs: SetupInputs): Promise { - if (inputs.pythonVersion !== "") { - return inputs.pythonVersion; +async function getPythonVersion(): Promise { + if (pythonVersion !== "") { + return pythonVersion; } let output = ""; @@ -36,7 +56,7 @@ async function getPythonVersion(inputs: SetupInputs): Promise { }; try { - const execArgs = ["python", "find", "--directory", inputs.workingDirectory]; + const execArgs = ["python", "find", "--directory", workingDirectory]; await exec.exec("uv", execArgs, options); const pythonPath = output.trim(); @@ -52,38 +72,37 @@ async function getPythonVersion(inputs: SetupInputs): Promise { } async function run(): Promise { - try { - const inputs = loadInputs(); - detectEmptyWorkdir(inputs); - const platform = await getPlatform(); - const arch = getArch(); + detectEmptyWorkdir(); + const platform = await getPlatform(); + const arch = getArch(); + try { if (platform === undefined) { throw new Error(`Unsupported platform: ${process.platform}`); } if (arch === undefined) { throw new Error(`Unsupported architecture: ${process.arch}`); } - const setupResult = await setupUv(inputs, platform, arch); + const setupResult = await setupUv(platform, arch, checkSum, githubToken); - addToolBinToPath(inputs); + addToolBinToPath(); addUvToPathAndOutput(setupResult.uvDir); - setToolDir(inputs); - addPythonDirToPath(inputs); - setupPython(inputs); - await activateEnvironment(inputs); - addMatchers(inputs); - setCacheDir(inputs); + setToolDir(); + addPythonDirToPath(); + setupPython(); + await activateEnvironment(); + addMatchers(); + setCacheDir(); core.setOutput("uv-version", setupResult.version); core.saveState(STATE_UV_VERSION, setupResult.version); core.info(`Successfully installed uv version ${setupResult.version}`); - const detectedPythonVersion = await getPythonVersion(inputs); - core.setOutput("python-version", detectedPythonVersion); + const pythonVersion = await getPythonVersion(); + core.setOutput("python-version", pythonVersion); - if (inputs.enableCache) { - await restoreCache(inputs, detectedPythonVersion); + if (enableCache) { + await restoreCache(pythonVersion); } // https://github.com/nodejs/node/issues/56645#issuecomment-3077594952 await new Promise((resolve) => setTimeout(resolve, 50)); @@ -93,9 +112,9 @@ async function run(): Promise { } } -function detectEmptyWorkdir(inputs: SetupInputs): void { - if (fs.readdirSync(inputs.workingDirectory).length === 0) { - if (inputs.ignoreEmptyWorkdir) { +function detectEmptyWorkdir(): void { + if (fs.readdirSync(workingDirectory).length === 0) { + if (ignoreEmptyWorkdir) { core.info( "Empty workdir detected. Ignoring because ignore-empty-workdir is enabled", ); @@ -108,11 +127,12 @@ function detectEmptyWorkdir(inputs: SetupInputs): void { } async function setupUv( - inputs: SetupInputs, platform: Platform, arch: Architecture, + checkSum: string | undefined, + githubToken: string, ): Promise<{ uvDir: string; version: string }> { - const resolvedVersion = await determineVersion(inputs); + const resolvedVersion = await determineVersion(manifestFile); const toolCacheResult = tryGetFromToolCache(arch, resolvedVersion); if (toolCacheResult.installedPath) { core.info(`Found uv in tool-cache for ${toolCacheResult.version}`); @@ -122,58 +142,65 @@ async function setupUv( }; } - const downloadResult = await downloadVersion( - platform, - arch, - resolvedVersion, - inputs.checksum, - inputs.githubToken, - inputs.manifestFile, - ); + const downloadVersionResult = + manifestFile !== undefined + ? await downloadVersionFromManifest( + manifestFile, + platform, + arch, + resolvedVersion, + checkSum, + githubToken, + ) + : await downloadVersionFromNdjson( + platform, + arch, + resolvedVersion, + checkSum, + githubToken, + ); return { - uvDir: downloadResult.cachedToolDir, - version: downloadResult.version, + uvDir: downloadVersionResult.cachedToolDir, + version: downloadVersionResult.version, }; } -async function determineVersion(inputs: SetupInputs): Promise { - return await resolveVersion( - getRequestedVersion(inputs), - inputs.manifestFile, - inputs.resolutionStrategy, - ); -} - -function getRequestedVersion(inputs: SetupInputs): string { - if (inputs.version !== "") { - return inputs.version; +async function determineVersion( + manifestFile: string | undefined, +): Promise { + if (versionInput !== "") { + return await resolveVersion(versionInput, manifestFile, resolutionStrategy); } - - if (inputs.versionFile !== "") { - const versionFromFile = getUvVersionFromFile(inputs.versionFile); + if (versionFileInput !== "") { + const versionFromFile = getUvVersionFromFile(versionFileInput); if (versionFromFile === undefined) { throw new Error( - `Could not determine uv version from file: ${inputs.versionFile}`, + `Could not determine uv version from file: ${versionFileInput}`, ); } - return versionFromFile; + return await resolveVersion( + versionFromFile, + manifestFile, + resolutionStrategy, + ); } - const versionFromUvToml = getUvVersionFromFile( - `${inputs.workingDirectory}${path.sep}uv.toml`, + `${workingDirectory}${path.sep}uv.toml`, ); const versionFromPyproject = getUvVersionFromFile( - `${inputs.workingDirectory}${path.sep}pyproject.toml`, + `${workingDirectory}${path.sep}pyproject.toml`, ); - if (versionFromUvToml === undefined && versionFromPyproject === undefined) { core.info( "Could not determine uv version from uv.toml or pyproject.toml. Falling back to latest.", ); } - - return versionFromUvToml || versionFromPyproject || "latest"; + return await resolveVersion( + versionFromUvToml || versionFromPyproject || "latest", + manifestFile, + resolutionStrategy, + ); } function addUvToPathAndOutput(cachedPath: string): void { @@ -188,17 +215,15 @@ function addUvToPathAndOutput(cachedPath: string): void { } } -function addToolBinToPath(inputs: SetupInputs): void { - if (inputs.toolBinDir !== undefined) { - core.exportVariable("UV_TOOL_BIN_DIR", inputs.toolBinDir); - core.info(`Set UV_TOOL_BIN_DIR to ${inputs.toolBinDir}`); +function addToolBinToPath(): void { + if (toolBinDir !== undefined) { + core.exportVariable("UV_TOOL_BIN_DIR", toolBinDir); + core.info(`Set UV_TOOL_BIN_DIR to ${toolBinDir}`); if (process.env.UV_NO_MODIFY_PATH !== undefined) { - core.info( - `UV_NO_MODIFY_PATH is set, not adding ${inputs.toolBinDir} to path`, - ); + core.info(`UV_NO_MODIFY_PATH is set, not adding ${toolBinDir} to path`); } else { - core.addPath(inputs.toolBinDir); - core.info(`Added ${inputs.toolBinDir} to the path`); + core.addPath(toolBinDir); + core.info(`Added ${toolBinDir} to the path`); } } else { if (process.env.UV_NO_MODIFY_PATH !== undefined) { @@ -218,73 +243,73 @@ function addToolBinToPath(inputs: SetupInputs): void { } } -function setToolDir(inputs: SetupInputs): void { - if (inputs.toolDir !== undefined) { - core.exportVariable("UV_TOOL_DIR", inputs.toolDir); - core.info(`Set UV_TOOL_DIR to ${inputs.toolDir}`); +function setToolDir(): void { + if (toolDir !== undefined) { + core.exportVariable("UV_TOOL_DIR", toolDir); + core.info(`Set UV_TOOL_DIR to ${toolDir}`); } } -function addPythonDirToPath(inputs: SetupInputs): void { - core.exportVariable("UV_PYTHON_INSTALL_DIR", inputs.pythonDir); - core.info(`Set UV_PYTHON_INSTALL_DIR to ${inputs.pythonDir}`); +function addPythonDirToPath(): void { + core.exportVariable("UV_PYTHON_INSTALL_DIR", pythonDir); + core.info(`Set UV_PYTHON_INSTALL_DIR to ${pythonDir}`); if (process.env.UV_NO_MODIFY_PATH !== undefined) { core.info("UV_NO_MODIFY_PATH is set, not adding python dir to path"); } else { - core.addPath(inputs.pythonDir); - core.info(`Added ${inputs.pythonDir} to the path`); + core.addPath(pythonDir); + core.info(`Added ${pythonDir} to the path`); } } -function setupPython(inputs: SetupInputs): void { - if (inputs.pythonVersion !== "") { - core.exportVariable("UV_PYTHON", inputs.pythonVersion); - core.info(`Set UV_PYTHON to ${inputs.pythonVersion}`); +function setupPython(): void { + if (pythonVersion !== "") { + core.exportVariable("UV_PYTHON", pythonVersion); + core.info(`Set UV_PYTHON to ${pythonVersion}`); } } -async function activateEnvironment(inputs: SetupInputs): Promise { - if (inputs.activateEnvironment) { +async function activateEnvironment(): Promise { + if (activateEnvironmentInput) { if (process.env.UV_NO_MODIFY_PATH !== undefined) { throw new Error( "UV_NO_MODIFY_PATH and activate-environment cannot be used together.", ); } - core.info(`Creating and activating python venv at ${inputs.venvPath}...`); + core.info(`Creating and activating python venv at ${venvPath}...`); await exec.exec("uv", [ "venv", - inputs.venvPath, + venvPath, "--directory", - inputs.workingDirectory, + workingDirectory, "--clear", ]); - let venvBinPath = `${inputs.venvPath}${path.sep}bin`; + let venvBinPath = `${venvPath}${path.sep}bin`; if (process.platform === "win32") { - venvBinPath = `${inputs.venvPath}${path.sep}Scripts`; + venvBinPath = `${venvPath}${path.sep}Scripts`; } core.addPath(path.resolve(venvBinPath)); - core.exportVariable("VIRTUAL_ENV", inputs.venvPath); - core.setOutput("venv", inputs.venvPath); + core.exportVariable("VIRTUAL_ENV", venvPath); + core.setOutput("venv", venvPath); } } -function setCacheDir(inputs: SetupInputs): void { - if (inputs.cacheLocalPath !== undefined) { - if (inputs.cacheLocalPath.source === CacheLocalSource.Config) { +function setCacheDir(): void { + if (cacheLocalPath !== undefined) { + if (cacheLocalPath.source === CacheLocalSource.Config) { core.info( "Using cache-dir from uv config file, not modifying UV_CACHE_DIR", ); return; } - core.exportVariable("UV_CACHE_DIR", inputs.cacheLocalPath.path); - core.info(`Set UV_CACHE_DIR to ${inputs.cacheLocalPath.path}`); + core.exportVariable("UV_CACHE_DIR", cacheLocalPath.path); + core.info(`Set UV_CACHE_DIR to ${cacheLocalPath.path}`); } } -function addMatchers(inputs: SetupInputs): void { - if (inputs.addProblemMatchers) { +function addMatchers(): void { + if (addProblemMatchers) { const matchersPath = path.join(sourceDir, "..", "..", ".github"); core.info(`##[add-matcher]${path.join(matchersPath, "python.json")}`); } diff --git a/src/update-known-checksums.ts b/src/update-known-checksums.ts index 95bda6b..f29f267 100644 --- a/src/update-known-checksums.ts +++ b/src/update-known-checksums.ts @@ -6,10 +6,10 @@ import { updateChecksums, } from "./download/checksum/update-known-checksums"; import { - fetchManifest, + fetchVersionData, getLatestVersion, - type ManifestVersion, -} from "./download/manifest"; + type NdjsonVersion, +} from "./download/versions-client"; const VERSION_IN_CHECKSUM_KEY_PATTERN = /-(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)$/; @@ -32,8 +32,8 @@ async function run(): Promise { return; } - const versions = await fetchManifest(); - const checksumEntries = extractChecksumsFromManifest(versions); + const versions = await fetchVersionData(); + const checksumEntries = extractChecksumsFromNdjson(versions); await updateChecksums(checksumFilePath, checksumEntries); core.setOutput("latest-version", latestVersion); @@ -61,8 +61,8 @@ function extractVersionFromChecksumKey(key: string): string | undefined { return key.match(VERSION_IN_CHECKSUM_KEY_PATTERN)?.[1]; } -function extractChecksumsFromManifest( - versions: ManifestVersion[], +function extractChecksumsFromNdjson( + versions: NdjsonVersion[], ): ChecksumEntry[] { const checksums: ChecksumEntry[] = []; diff --git a/src/utils/constants.ts b/src/utils/constants.ts index ba2d07e..bc7d03a 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -1,7 +1,7 @@ export const TOOL_CACHE_NAME = "uv"; export const STATE_UV_PATH = "uv-path"; export const STATE_UV_VERSION = "uv-version"; -export const VERSIONS_MANIFEST_URL = +export const VERSIONS_NDJSON_URL = "https://raw.githubusercontent.com/astral-sh/versions/main/v1/uv.ndjson"; /** GitHub Releases URL prefix for uv artifacts. */ diff --git a/src/utils/inputs.ts b/src/utils/inputs.ts index be8ce83..4c189d6 100644 --- a/src/utils/inputs.ts +++ b/src/utils/inputs.ts @@ -9,121 +9,53 @@ export enum CacheLocalSource { Default, } -export interface CacheLocalPath { - path: string; - source: CacheLocalSource; -} +export const workingDirectory = core.getInput("working-directory"); +export const version = core.getInput("version"); +export const versionFile = getVersionFile(); +export const pythonVersion = core.getInput("python-version"); +export const activateEnvironment = core.getBooleanInput("activate-environment"); +export const venvPath = getVenvPath(); +export const checkSum = core.getInput("checksum"); +export const enableCache = getEnableCache(); +export const restoreCache = core.getInput("restore-cache") === "true"; +export const saveCache = core.getInput("save-cache") === "true"; +export const cacheSuffix = core.getInput("cache-suffix") || ""; +export const cacheLocalPath = getCacheLocalPath(); +export const cacheDependencyGlob = getCacheDependencyGlob(); +export const pruneCache = core.getInput("prune-cache") === "true"; +export const cachePython = core.getInput("cache-python") === "true"; +export const ignoreNothingToCache = + core.getInput("ignore-nothing-to-cache") === "true"; +export const ignoreEmptyWorkdir = + core.getInput("ignore-empty-workdir") === "true"; +export const toolBinDir = getToolBinDir(); +export const toolDir = getToolDir(); +export const pythonDir = getUvPythonDir(); +export const githubToken = core.getInput("github-token"); +export const manifestFile = getManifestFile(); +export const addProblemMatchers = + core.getInput("add-problem-matchers") === "true"; +export const resolutionStrategy = getResolutionStrategy(); -export type ResolutionStrategy = "highest" | "lowest"; - -export interface SetupInputs { - workingDirectory: string; - version: string; - versionFile: string; - pythonVersion: string; - activateEnvironment: boolean; - venvPath: string; - checksum: string; - enableCache: boolean; - restoreCache: boolean; - saveCache: boolean; - cacheSuffix: string; - cacheLocalPath?: CacheLocalPath; - cacheDependencyGlob: string; - pruneCache: boolean; - cachePython: boolean; - ignoreNothingToCache: boolean; - ignoreEmptyWorkdir: boolean; - toolBinDir?: string; - toolDir?: string; - pythonDir: string; - githubToken: string; - manifestFile?: string; - addProblemMatchers: boolean; - resolutionStrategy: ResolutionStrategy; -} - -export function loadInputs(): SetupInputs { - const workingDirectory = core.getInput("working-directory"); - const version = core.getInput("version"); - const versionFile = getVersionFile(workingDirectory); - const pythonVersion = core.getInput("python-version"); - const activateEnvironment = core.getBooleanInput("activate-environment"); - const venvPath = getVenvPath(workingDirectory, activateEnvironment); - const checksum = core.getInput("checksum"); - const enableCache = getEnableCache(); - const restoreCache = core.getInput("restore-cache") === "true"; - const saveCache = core.getInput("save-cache") === "true"; - const cacheSuffix = core.getInput("cache-suffix") || ""; - const cacheLocalPath = getCacheLocalPath( - workingDirectory, - versionFile, - enableCache, - ); - const cacheDependencyGlob = getCacheDependencyGlob(workingDirectory); - const pruneCache = core.getInput("prune-cache") === "true"; - const cachePython = core.getInput("cache-python") === "true"; - const ignoreNothingToCache = - core.getInput("ignore-nothing-to-cache") === "true"; - const ignoreEmptyWorkdir = core.getInput("ignore-empty-workdir") === "true"; - const toolBinDir = getToolBinDir(workingDirectory); - const toolDir = getToolDir(workingDirectory); - const pythonDir = getUvPythonDir(); - const githubToken = core.getInput("github-token"); - const manifestFile = getManifestFile(); - const addProblemMatchers = core.getInput("add-problem-matchers") === "true"; - const resolutionStrategy = getResolutionStrategy(); - - return { - activateEnvironment, - addProblemMatchers, - cacheDependencyGlob, - cacheLocalPath, - cachePython, - cacheSuffix, - checksum, - enableCache, - githubToken, - ignoreEmptyWorkdir, - ignoreNothingToCache, - manifestFile, - pruneCache, - pythonDir, - pythonVersion, - resolutionStrategy, - restoreCache, - saveCache, - toolBinDir, - toolDir, - venvPath, - version, - versionFile, - workingDirectory, - }; -} - -function getVersionFile(workingDirectory: string): string { +function getVersionFile(): string { const versionFileInput = core.getInput("version-file"); if (versionFileInput !== "") { const tildeExpanded = expandTilde(versionFileInput); - return resolveRelativePath(workingDirectory, tildeExpanded); + return resolveRelativePath(tildeExpanded); } return versionFileInput; } -function getVenvPath( - workingDirectory: string, - activateEnvironment: boolean, -): string { +function getVenvPath(): string { const venvPathInput = core.getInput("venv-path"); if (venvPathInput !== "") { if (!activateEnvironment) { core.warning("venv-path is only used when activate-environment is true"); } const tildeExpanded = expandTilde(venvPathInput); - return normalizePath(resolveRelativePath(workingDirectory, tildeExpanded)); + return normalizePath(resolveRelativePath(tildeExpanded)); } - return normalizePath(resolveRelativePath(workingDirectory, ".venv")); + return normalizePath(resolveRelativePath(".venv")); } function getEnableCache(): boolean { @@ -134,11 +66,11 @@ function getEnableCache(): boolean { return enableCacheInput === "true"; } -function getToolBinDir(workingDirectory: string): string | undefined { +function getToolBinDir(): string | undefined { const toolBinDirInput = core.getInput("tool-bin-dir"); if (toolBinDirInput !== "") { const tildeExpanded = expandTilde(toolBinDirInput); - return resolveRelativePath(workingDirectory, tildeExpanded); + return resolveRelativePath(tildeExpanded); } if (process.platform === "win32") { if (process.env.RUNNER_TEMP !== undefined) { @@ -151,11 +83,11 @@ function getToolBinDir(workingDirectory: string): string | undefined { return undefined; } -function getToolDir(workingDirectory: string): string | undefined { +function getToolDir(): string | undefined { const toolDirInput = core.getInput("tool-dir"); if (toolDirInput !== "") { const tildeExpanded = expandTilde(toolDirInput); - return resolveRelativePath(workingDirectory, tildeExpanded); + return resolveRelativePath(tildeExpanded); } if (process.platform === "win32") { if (process.env.RUNNER_TEMP !== undefined) { @@ -168,23 +100,21 @@ function getToolDir(workingDirectory: string): string | undefined { return undefined; } -function getCacheLocalPath( - workingDirectory: string, - versionFile: string, - enableCache: boolean, -): CacheLocalPath | undefined { +function getCacheLocalPath(): + | { + path: string; + source: CacheLocalSource; + } + | undefined { const cacheLocalPathInput = core.getInput("cache-local-path"); if (cacheLocalPathInput !== "") { const tildeExpanded = expandTilde(cacheLocalPathInput); return { - path: resolveRelativePath(workingDirectory, tildeExpanded), + path: resolveRelativePath(tildeExpanded), source: CacheLocalSource.Input, }; } - const cacheDirFromConfig = getCacheDirFromConfig( - workingDirectory, - versionFile, - ); + const cacheDirFromConfig = getCacheDirFromConfig(); if (cacheDirFromConfig !== undefined) { return { path: cacheDirFromConfig, source: CacheLocalSource.Config }; } @@ -192,7 +122,7 @@ function getCacheLocalPath( core.info(`UV_CACHE_DIR is already set to ${process.env.UV_CACHE_DIR}`); return { path: process.env.UV_CACHE_DIR, source: CacheLocalSource.Env }; } - if (enableCache) { + if (getEnableCache()) { if (process.env.RUNNER_ENVIRONMENT === "github-hosted") { if (process.env.RUNNER_TEMP !== undefined) { return { @@ -217,12 +147,9 @@ function getCacheLocalPath( } } -function getCacheDirFromConfig( - workingDirectory: string, - versionFile: string, -): string | undefined { +function getCacheDirFromConfig(): string | undefined { for (const filePath of [versionFile, "uv.toml", "pyproject.toml"]) { - const resolvedPath = resolveRelativePath(workingDirectory, filePath); + const resolvedPath = resolveRelativePath(filePath); try { const cacheDir = getConfigValueFromTomlFile(resolvedPath, "cache-dir"); if (cacheDir !== undefined) { @@ -248,8 +175,9 @@ export function getUvPythonDir(): string { if (process.env.RUNNER_ENVIRONMENT !== "github-hosted") { if (process.platform === "win32") { return `${process.env.APPDATA}${path.sep}uv${path.sep}python`; + } else { + return `${process.env.HOME}${path.sep}.local${path.sep}share${path.sep}uv${path.sep}python`; } - return `${process.env.HOME}${path.sep}.local${path.sep}share${path.sep}uv${path.sep}python`; } if (process.env.RUNNER_TEMP !== undefined) { return `${process.env.RUNNER_TEMP}${path.sep}uv-python-dir`; @@ -259,14 +187,14 @@ export function getUvPythonDir(): string { ); } -function getCacheDependencyGlob(workingDirectory: string): string { +function getCacheDependencyGlob(): string { const cacheDependencyGlobInput = core.getInput("cache-dependency-glob"); if (cacheDependencyGlobInput !== "") { return cacheDependencyGlobInput .split("\n") .map((part) => part.trim()) .map((part) => expandTilde(part)) - .map((part) => resolveRelativePath(workingDirectory, part)) + .map((part) => resolveRelativePath(part)) .join("\n"); } return cacheDependencyGlobInput; @@ -292,10 +220,7 @@ function normalizePath(inputPath: string): string { return trimmed; } -function resolveRelativePath( - workingDirectory: string, - inputPath: string, -): string { +function resolveRelativePath(inputPath: string): string { const hasNegation = inputPath.startsWith("!"); const pathWithoutNegation = hasNegation ? inputPath.substring(1) : inputPath; @@ -315,7 +240,7 @@ function getManifestFile(): string | undefined { return undefined; } -function getResolutionStrategy(): ResolutionStrategy { +function getResolutionStrategy(): "highest" | "lowest" { const resolutionStrategyInput = core.getInput("resolution-strategy"); if (resolutionStrategyInput === "lowest") { return "lowest";