Compare commits

..

1 Commits

Author SHA1 Message Date
Kevin Stillhammer
6120bf3e89 Inline the check-dist workflow to test 2025-03-18 15:05:38 +01:00
55 changed files with 6616 additions and 45396 deletions

View File

@@ -1,9 +0,0 @@
self-hosted-runner:
# Custom labels of self-hosted or large GitHub hosted runners
# so that actionlint knows that they are not a typo
labels:
- selfhosted-ubuntu-arm64
# Configuration variables in array of strings defined in your repository or
# organization. `null` means disabling configuration variables check.
# Empty array means no configuration variable is allowed.
config-variables: null

8
.github/python.json vendored
View File

@@ -4,13 +4,13 @@
"owner": "python",
"pattern": [
{
"regexp": "^\\s*File\\s\\\"(.*)\\\",\\sline\\s(\\d+),\\sin\\s(.*)$",
"file": 1,
"line": 2,
"regexp": "^\\s*File\\s\\\"(.*)\\\",\\sline\\s(\\d+),\\sin\\s(.*)$"
"line": 2
},
{
"message": 2,
"regexp": "^\\s*raise\\s(.*)\\(\\'(.*)\\'\\)$"
"regexp": "^\\s*raise\\s(.*)\\(\\'(.*)\\'\\)$",
"message": 2
}
]
}

View File

@@ -19,7 +19,7 @@ categories:
labels:
- "maintenance"
- "ci"
- "update-known-versions"
- "update-known-checksums"
- title: "📚 Documentation"
labels:
- "documentation"

View File

@@ -1,35 +0,0 @@
import * as fs from "node:fs";
import * as yaml from "js-yaml";
interface WorkflowJob {
needs?: string[];
[key: string]: unknown;
}
interface Workflow {
jobs: Record<string, WorkflowJob>;
[key: string]: unknown;
}
const workflow = yaml.load(
fs.readFileSync("../workflows/test.yml", "utf8"),
) as Workflow;
const jobs = Object.keys(workflow.jobs);
const allTestsPassed = workflow.jobs["all-tests-passed"];
const needs: string[] = allTestsPassed.needs || [];
const expectedNeeds = jobs.filter((j) => j !== "all-tests-passed");
const missing = expectedNeeds.filter((j) => !needs.includes(j));
if (missing.length > 0) {
console.error(
`Missing jobs in all-tests-passed needs: ${missing.join(", ")}`,
);
console.info(
"Please add the missing jobs to the needs section of all-tests-passed in test.yml.",
);
process.exit(1);
}
console.log(
"All jobs in test.yml are in the needs section of all-tests-passed.",
);

View File

@@ -39,7 +39,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v5
uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL

View File

@@ -11,10 +11,7 @@ on:
jobs:
update_release_draft:
name: ✏️ Draft release
runs-on: ubuntu-24.04-arm
permissions:
contents: write
pull-requests: read
runs-on: ubuntu-latest
steps:
- name: 🚀 Run Release Drafter
uses: release-drafter/release-drafter@v6.1.0

View File

@@ -0,0 +1,46 @@
name: "test-cache-windows"
on:
workflow_dispatch:
pull_request:
branches:
- main
push:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
test-setup-cache:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}
- run: uv sync
working-directory: __tests__\fixtures\uv-project
test-restore-cache:
runs-on: windows-latest
needs: test-setup-cache
steps:
- uses: actions/checkout@v4
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}
- name: Cache was hit
run: |
if ($env:CACHE_HIT -ne "true") {
exit 1
}
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
- run: uv sync
working-directory: __tests__\fixtures\uv-project

232
.github/workflows/test-cache.yml vendored Normal file
View File

@@ -0,0 +1,232 @@
name: "test-cache"
on:
workflow_dispatch:
pull_request:
branches:
- main
push:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
test-setup-cache:
runs-on: ${{ matrix.os }}
strategy:
matrix:
enable-cache: [ "true", "false", "auto" ]
os: ["ubuntu-latest", "selfhosted-ubuntu-arm64"]
steps:
- uses: actions/checkout@v4
- name: Setup with cache
uses: ./
with:
enable-cache: ${{ matrix.enable-cache }}
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-${{ matrix.os }}-${{ matrix.enable-cache }}
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-restore-cache:
runs-on: ${{ matrix.os }}
strategy:
matrix:
enable-cache: [ "true", "false", "auto" ]
os: [ "ubuntu-latest", "selfhosted-ubuntu-arm64" ]
needs: test-setup-cache
steps:
- uses: actions/checkout@v4
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: ${{ matrix.enable-cache }}
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-${{ matrix.os }}-${{ matrix.enable-cache }}
- name: Cache was hit
if: ${{ matrix.enable-cache == 'true' || (matrix.enable-cache == 'auto' && matrix.os == 'ubuntu-latest') }}
run: |
if [ "$CACHE_HIT" != "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
- name: Cache was not hit
if: ${{ matrix.enable-cache == 'false' || (matrix.enable-cache == 'auto' && matrix.os == 'selfhosted-ubuntu-arm64') }}
run: |
if [ "$CACHE_HIT" == "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-setup-cache-requirements-txt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-requirements-txt
- run: |
uv venv
uv pip install -r requirements.txt
working-directory: __tests__/fixtures/requirements-txt-project
test-restore-cache-requirements-txt:
runs-on: ubuntu-latest
needs: test-setup-cache
steps:
- uses: actions/checkout@v4
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-requirements-txt
- name: Cache was hit
run: |
if [ "$CACHE_HIT" != "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
- run: |
uv venv
uv pip install -r requirements.txt
working-directory: __tests__/fixtures/requirements-txt-project
test-setup-cache-dependency-glob:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-dependency-glob: |
__tests__/fixtures/uv-project/uv.lock
**/pyproject.toml
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-dependency-glob
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-restore-cache-dependency-glob:
runs-on: ubuntu-latest
needs: test-setup-cache-dependency-glob
steps:
- uses: actions/checkout@v4
- name: Change pyproject.toml
run: |
echo '[tool.uv]' >> __tests__/fixtures/uv-project/pyproject.toml
echo 'dev-dependencies = []' >> __tests__/fixtures/uv-project/pyproject.toml
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: true
cache-dependency-glob: |
__tests__/fixtures/uv-project/uv.lock
**/pyproject.toml
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-dependency-glob
ignore-nothing-to-cache: true
- name: Cache was not hit
run: |
if [ "$CACHE_HIT" == "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
test-setup-cache-local:
runs-on: selfhosted-ubuntu-arm64
steps:
- uses: actions/checkout@v4
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-local
cache-local-path: /tmp/uv-cache
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-restore-cache-local:
runs-on: selfhosted-ubuntu-arm64
needs: test-setup-cache-local
steps:
- uses: actions/checkout@v4
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-local
cache-local-path: /tmp/uv-cache
- name: Cache was hit
run: |
if [ "$CACHE_HIT" != "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-tilde-expansion-cache-local-path:
runs-on: selfhosted-ubuntu-arm64
steps:
- uses: actions/checkout@v4
- name: Create cache directory
run: mkdir -p ~/uv-cache
shell: bash
- name: Setup with cache
uses: ./
with:
cache-local-path: ~/uv-cache/cache-local-path
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-tilde-expansion-cache-dependency-glob:
runs-on: selfhosted-ubuntu-arm64
steps:
- uses: actions/checkout@v4
- name: Create cache directory
run: mkdir -p ~/uv-cache
shell: bash
- name: Create cache dependency glob file
run: touch ~/uv-cache.glob
shell: bash
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-local-path: ~/uv-cache/cache-dependency-glob
cache-dependency-glob: "~/uv-cache.glob"
- run: uv sync
working-directory: __tests__/fixtures/uv-project
cleanup-tilde-expansion-tests:
needs:
- test-tilde-expansion-cache-local-path
- test-tilde-expansion-cache-dependency-glob
runs-on: selfhosted-ubuntu-arm64
steps:
- name: Remove cache directory
run: rm -rf ~/uv-cache
shell: bash
- name: Remove cache dependency glob file
run: rm -f ~/uv-cache.glob
shell: bash
test-no-python-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Fake pyproject.toml at root
run: cp __tests__/fixtures/old-python-constraint-project/pyproject.toml pyproject.toml
- name: Setup with cache
uses: ./
with:
enable-cache: true
- run: uv sync
working-directory: __tests__/fixtures/old-python-constraint-project

30
.github/workflows/test-windows.yml vendored Normal file
View File

@@ -0,0 +1,30 @@
name: "test-windows"
on:
workflow_dispatch:
pull_request:
branches:
- main
push:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
test-default-version:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Should not be on path
run: |
if (!(Get-Command -Name "uv" -ErrorAction SilentlyContinue)) {
exit 0
} else {
exit 1
}
- name: Setup uv
uses: ./
- run: uv sync
working-directory: __tests__\fixtures\uv-project

View File

@@ -12,14 +12,11 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Actionlint
uses: eifinger/actionlint-action@23c85443d840cd73bbecb9cddfc933cc21649a38 # v1.9.1
- uses: actions/setup-node@v4
@@ -29,218 +26,121 @@ jobs:
npm install
- run: |
npm run all
- name: Check all jobs are in all-tests-passed.needs
run: |
tsc 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
run: |
git diff --exit-code || (echo "::error::Please run 'npm run all' to fix the issues" && exit 1)
test-default-version:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, macos-14, windows-latest]
os: [ubuntu-latest, macos-latest, macos-14]
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Install latest version
id: setup-uv
uses: ./
- run: uv sync
working-directory: __tests__/fixtures/uv-project
shell: bash
- name: Check uv-path is set
run: ${{ steps.setup-uv.outputs.uv-path }} --version
- name: Check uvx-path is set
run: ${{ steps.setup-uv.outputs.uvx-path }} --version
test-specific-version:
runs-on: ubuntu-latest
strategy:
matrix:
uv-version: ["0.3.0", "0.3.2", "0.3", "0.3.x", ">=0.3.0"]
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Install version ${{ matrix.uv-version }}
uses: ./
with:
version: ${{ matrix.uv-version }}
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-semver-range:
strategy:
matrix:
os: [ ubuntu-latest, selfhosted-ubuntu-arm64 ]
runs-on: ${{ matrix.os }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Install version 0.3
id: setup-uv
uses: ./
with:
version: "0.3"
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.3.5" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
- name: Output has correct version
run: |
if [ "$UV_VERSION" != "0.3.5" ]; then
exit 1
fi
env:
UV_VERSION: ${{ steps.setup-uv.outputs.uv-version }}
test-pep440-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Install version 0.4.30
id: setup-uv
uses: ./
with:
version: ">=0.4.25,<0.5"
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.4.30" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
test-pyproject-file-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Install version 0.5.14
id: setup-uv
uses: ./
with:
working-directory: "__tests__/fixtures/pyproject-toml-project"
pyproject-file: "__tests__/fixtures/pyproject-toml-project/pyproject.toml"
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.5.14" ]; then
echo "Wrong uv version: $(uv --version)"
if [ "$UV_VERSION" != "0.5.14" ]; then
exit 1
fi
test-malformed-pyproject-file-fallback:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Install using malformed pyproject.toml
id: setup-uv
uses: ./
with:
working-directory: "__tests__/fixtures/malformed-pyproject-toml-project"
- run: uv --help
env:
UV_VERSION: ${{ steps.setup-uv.outputs.uv-version }}
test-uv-file-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Install version 0.5.15
id: setup-uv
uses: ./
with:
working-directory: "__tests__/fixtures/uv-toml-project"
pyproject-file: "__tests__/fixtures/uv-toml-project/pyproject.toml"
uv-file: "__tests__/fixtures/uv-toml-project/uv.toml"
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.5.15" ]; then
echo "Wrong uv version: $(uv --version)"
if [ "$UV_VERSION" != "0.5.15" ]; then
exit 1
fi
test-version-file-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Install from requirements file
id: setup-uv
uses: ./
with:
version-file: "__tests__/fixtures/uv-in-requirements-txt-project/requirements.txt"
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.6.17" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
test-version-file-hash-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Install from requirements file
id: setup-uv
uses: ./
with:
version-file: "__tests__/fixtures/uv-in-requirements-hash-txt-project/requirements.txt"
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.8.3" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
test-tool-versions-file-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Install from .tools-versions file
id: setup-uv
uses: ./
with:
version-file: "__tests__/fixtures/.tool-versions"
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.5.15" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
env:
UV_VERSION: ${{ steps.setup-uv.outputs.uv-version }}
test-checksum:
runs-on: ${{ matrix.inputs.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
inputs:
- os: ubuntu-latest
os: [ubuntu-latest, macos-latest]
checksum:
["4d9279ad5ca596b1e2d703901d508430eb07564dc4d8837de9e2fca9c90f8ecd"]
exclude:
- os: macos-latest
checksum: "4d9279ad5ca596b1e2d703901d508430eb07564dc4d8837de9e2fca9c90f8ecd"
include:
- os: macos-latest
checksum: "a70cbfbf3bb5c08b2f84963b4f12c94e08fbb2468ba418a3bfe1066fbe9e7218"
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Checksum matches expected
uses: ./
with:
version: "0.3.2"
checksum: ${{ matrix.inputs.checksum }}
checksum: ${{ matrix.checksum }}
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-with-explicit-token:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Install default version
uses: ./
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-uvx:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Install default version
uses: ./
- run: uvx ruff --version
test-tool-install:
runs-on: ${{ matrix.os }}
strategy:
@@ -253,16 +153,15 @@ jobs:
windows-latest,
]
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Install default version
uses: ./
- run: uv tool install ruff
- run: ruff --version
test-tilde-expansion-tool-dirs:
runs-on: selfhosted-ubuntu-arm64
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Setup with cache
uses: ./
with:
@@ -278,14 +177,13 @@ jobs:
echo "UV_TOOL_DIR does not contain /home/ubuntu/tool-dir: $UV_TOOL_DIR"
exit 1
fi
test-python-version:
runs-on: ${{ matrix.os }}
runs-on: ubuntu-latest
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Install latest version
uses: ./
with:
@@ -297,23 +195,8 @@ jobs:
exit 1
fi
shell: bash
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-activate-environment:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ ubuntu-latest, macos-latest, windows-latest ]
steps:
- uses: actions/checkout@v5
- name: Install latest version
uses: ./
with:
python-version: 3.13.1t
activate-environment: true
- name: Verify packages can be installed
run: uv pip install pip
run: uv pip install --python=3.13.1t pip
shell: bash
- name: Verify python version is correct
run: |
@@ -322,364 +205,23 @@ jobs:
exit 1
fi
shell: bash
test-malformed-pyproject-file-fallback:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install using malformed pyproject.toml
id: setup-uv
uses: ./
with:
pyproject-file: "__tests__/fixtures/malformed-pyproject-toml-project/pyproject.toml"
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-musl:
runs-on: ubuntu-latest
container: alpine
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Install latest version
uses: ./
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-setup-cache:
runs-on: ${{ matrix.os }}
strategy:
matrix:
enable-cache: [ "true", "false", "auto" ]
os: [ "ubuntu-latest", "selfhosted-ubuntu-arm64", "windows-latest" ]
steps:
- uses: actions/checkout@v5
- name: Setup with cache
uses: ./
with:
enable-cache: ${{ matrix.enable-cache }}
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-${{ matrix.os }}-${{ matrix.enable-cache }}
- run: uv sync
working-directory: __tests__/fixtures/uv-project
shell: bash
test-restore-cache:
runs-on: ${{ matrix.os }}
strategy:
matrix:
enable-cache: [ "true", "false", "auto" ]
os: [ "ubuntu-latest", "selfhosted-ubuntu-arm64", "windows-latest" ]
needs: test-setup-cache
steps:
- uses: actions/checkout@v5
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: ${{ matrix.enable-cache }}
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-${{ matrix.os }}-${{ matrix.enable-cache }}
- name: Cache was hit
if: ${{ matrix.enable-cache == 'true' || (matrix.enable-cache == 'auto' && matrix.os == 'ubuntu-latest') }}
run: |
if [ "$CACHE_HIT" != "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
shell: bash
- name: Cache was not hit
if: ${{ matrix.enable-cache == 'false' || (matrix.enable-cache == 'auto' && matrix.os == 'selfhosted-ubuntu-arm64') }}
run: |
if [ "$CACHE_HIT" == "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
shell: bash
- run: uv sync
working-directory: __tests__/fixtures/uv-project
shell: bash
test-setup-cache-requirements-txt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-requirements-txt
- run: |
uv venv
uv pip install -r requirements.txt
working-directory: __tests__/fixtures/requirements-txt-project
test-restore-cache-requirements-txt:
runs-on: ubuntu-latest
needs: test-setup-cache
steps:
- uses: actions/checkout@v5
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-requirements-txt
- name: Cache was hit
run: |
if [ "$CACHE_HIT" != "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
- run: |
uv venv
uv pip install -r requirements.txt
working-directory: __tests__/fixtures/requirements-txt-project
test-setup-cache-dependency-glob:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-dependency-glob: |
__tests__/fixtures/uv-project/uv.lock
**/pyproject.toml
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-dependency-glob
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-restore-cache-dependency-glob:
runs-on: ubuntu-latest
needs: test-setup-cache-dependency-glob
steps:
- uses: actions/checkout@v5
- name: Change pyproject.toml
run: |
echo '[tool.uv]' >> __tests__/fixtures/uv-project/pyproject.toml
echo 'dev-dependencies = []' >> __tests__/fixtures/uv-project/pyproject.toml
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: true
cache-dependency-glob: |
__tests__/fixtures/uv-project/uv.lock
**/pyproject.toml
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-dependency-glob
ignore-nothing-to-cache: true
- name: Cache was not hit
run: |
if [ "$CACHE_HIT" == "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
test-cache-local:
strategy:
matrix:
inputs:
- os: ubuntu-latest
expected-cache-dir: "/home/runner/work/_temp/setup-uv-cache"
- os: windows-latest
expected-cache-dir: "D:\\a\\_temp\\setup-uv-cache"
- os: selfhosted-ubuntu-arm64
expected-cache-dir: "/home/ubuntu/.cache/uv"
runs-on: ${{ matrix.inputs.os }}
steps:
- uses: actions/checkout@v5
- name: Setup with cache
uses: ./
with:
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-cache-local
- run: |
if [ "$UV_CACHE_DIR" != "${{ matrix.inputs.expected-cache-dir }}" ]; then
echo "UV_CACHE_DIR is not set to the expected value: $UV_CACHE_DIR"
exit 1
fi
shell: bash
test-setup-cache-local:
runs-on: selfhosted-ubuntu-arm64
steps:
- uses: actions/checkout@v5
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-local
cache-local-path: /tmp/uv-cache
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-restore-cache-local:
runs-on: selfhosted-ubuntu-arm64
needs: test-setup-cache-local
steps:
- uses: actions/checkout@v5
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-local
cache-local-path: /tmp/uv-cache
- name: Cache was hit
run: |
if [ "$CACHE_HIT" != "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-tilde-expansion-cache-local-path:
runs-on: selfhosted-ubuntu-arm64
steps:
- uses: actions/checkout@v5
- name: Create cache directory
run: mkdir -p ~/uv-cache
shell: bash
- name: Setup with cache
uses: ./
with:
cache-local-path: ~/uv-cache/cache-local-path
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-tilde-expansion-cache-dependency-glob:
runs-on: selfhosted-ubuntu-arm64
steps:
- uses: actions/checkout@v5
- name: Create cache directory
run: mkdir -p ~/uv-cache
shell: bash
- name: Create cache dependency glob file
run: touch ~/uv-cache.glob
shell: bash
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-local-path: ~/uv-cache/cache-dependency-glob
cache-dependency-glob: "~/uv-cache.glob"
- run: uv sync
working-directory: __tests__/fixtures/uv-project
cleanup-tilde-expansion-tests:
needs:
- test-tilde-expansion-cache-local-path
- test-tilde-expansion-cache-dependency-glob
if: always()
runs-on: selfhosted-ubuntu-arm64
steps:
- name: Remove cache directory
run: rm -rf ~/uv-cache
shell: bash
- name: Remove cache dependency glob file
run: rm -f ~/uv-cache.glob
shell: bash
test-no-python-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Fake pyproject.toml at root
run: cp __tests__/fixtures/old-python-constraint-project/pyproject.toml pyproject.toml
- name: Setup with cache
uses: ./
with:
enable-cache: true
- run: uv sync
working-directory: __tests__/fixtures/old-python-constraint-project
test-custom-manifest-file:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Install from custom manifest file
uses: ./
with:
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.7.12-alpha.1" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
test-absolute-path:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Create requirements.txt
run: echo "uv==0.6.17" > /tmp/setup-uv-requirements.txt
- name: Install from requirements file
id: setup-uv
uses: ./
with:
version-file: "/tmp/setup-uv-requirements.txt"
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.6.17" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
test-relative-path:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: mkdir
run: mkdir -p /tmp/setup-uv-test-relative-path
- name: Create requirements.txt
run: echo "uv==0.6.17" > /tmp/setup-uv-test-relative-path/setup-uv-requirements.txt
- name: Install from requirements file
id: setup-uv
uses: ./
with:
version-file: "./setup-uv-requirements.txt"
working-directory: "/tmp/setup-uv-test-relative-path"
cache-dependency-glob: "./setup-uv-requirements.txt"
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.6.17" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
all-tests-passed:
runs-on: ubuntu-latest
needs:
- lint
- test-default-version
- test-specific-version
- test-semver-range
- test-pep440-version
- test-pyproject-file-version
- test-malformed-pyproject-file-fallback
- test-uv-file-version
- test-version-file-version
- test-version-file-hash-version
- test-tool-versions-file-version
- test-checksum
- test-with-explicit-token
- test-uvx
- test-tool-install
- test-tilde-expansion-tool-dirs
- test-python-version
- test-activate-environment
- test-musl
- test-cache-local
- test-setup-cache
- test-restore-cache
- test-setup-cache-requirements-txt
- test-restore-cache-requirements-txt
- test-setup-cache-dependency-glob
- test-restore-cache-dependency-glob
- test-setup-cache-local
- test-restore-cache-local
- test-tilde-expansion-cache-local-path
- test-tilde-expansion-cache-dependency-glob
- cleanup-tilde-expansion-tests
- test-no-python-version
- test-custom-manifest-file
- test-absolute-path
- test-relative-path
if: always()
steps:
- name: All tests passed
run: |
echo "All jobs passed: ${{ !contains(needs.*.result, 'failure') }}"
# shellcheck disable=SC2242
exit ${{ contains(needs.*.result, 'failure') && 1 || 0 }}

View File

@@ -0,0 +1,34 @@
name: "Update known checksums"
on:
workflow_dispatch:
schedule:
- cron: "0 4 * * *" # Run every day at 4am UTC
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "20"
- name: Update known checksums
id: update-known-checksums
run:
node dist/update-known-checksums/index.js
src/download/checksum/known-checksums.ts ${{ secrets.GITHUB_TOKEN }}
- run: npm install && npm run all
- name: Create Pull Request
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
with:
commit-message: "chore: update known checksums"
title:
"chore: update known checksums for ${{
steps.update-known-checksums.outputs.latest-version }}"
body:
"chore: update known checksums for ${{
steps.update-known-checksums.outputs.latest-version }}"
base: main
labels: "automated-pr,update-known-checksums"
branch: update-known-checksums-pr
delete-branch: true

View File

@@ -1,39 +0,0 @@
name: "Update known versions"
on:
workflow_dispatch:
schedule:
- cron: "0 4 * * *" # Run every day at 4am UTC
jobs:
build:
runs-on: ubuntu-24.04-arm
permissions:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v4
with:
node-version: "20"
- name: Update known versions
id: update-known-versions
run:
node dist/update-known-versions/index.js
src/download/checksum/known-checksums.ts
version-manifest.json
${{ secrets.GITHUB_TOKEN }}
- run: npm install && npm run all
- name: Create Pull Request
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
with:
commit-message: "chore: update known versions"
title:
"chore: update known versions for ${{
steps.update-known-versions.outputs.latest-version }}"
body:
"chore: update known versions for ${{
steps.update-known-versions.outputs.latest-version }}"
base: main
labels: "automated-pr,update-known-versions"
branch: update-known-versions-pr
delete-branch: true

View File

@@ -11,11 +11,9 @@ on:
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
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Update Major Minor Tags
run: |
set -x

View File

@@ -1,3 +0,0 @@
{
"recommendations": ["biomejs.biome"]
}

16
.vscode/settings.json vendored
View File

@@ -1,16 +0,0 @@
{
"editor.codeActionsOnSave": {
"source.action.useSortedAttributes.biome": "explicit",
"source.action.useSortedKeys.biome": "explicit",
"source.fixAll.biome": "explicit"
},
"editor.defaultFormatter": "biomejs.biome",
"editor.formatOnSave": true,
"explorer.excludeGitIgnore": false,
"search.defaultViewMode": "list",
"search.exclude": {
"**/node_modules": true
},
"typescript.enablePromptUseWorkspaceTsdk": true,
"typescript.tsdk": "node_modules/typescript/lib"
}

222
README.md
View File

@@ -14,11 +14,9 @@ Set up your GitHub Actions workflow with a specific version of [uv](https://docs
- [Install a required-version or latest (default)](#install-a-required-version-or-latest-default)
- [Install the latest version](#install-the-latest-version)
- [Install a specific version](#install-a-specific-version)
- [Install a version by supplying a semver range or pep440 specifier](#install-a-version-by-supplying-a-semver-range-or-pep440-specifier)
- [Install a version defined in a requirements or config file](#install-a-version-defined-in-a-requirements-or-config-file)
- [Install a version by supplying a semver range](#install-a-version-by-supplying-a-semver-range)
- [Install a required-version](#install-a-required-version)
- [Python version](#python-version)
- [Activate environment](#activate-environment)
- [Working directory](#working-directory)
- [Validate checksum](#validate-checksum)
- [Enable Caching](#enable-caching)
- [Cache dependency glob](#cache-dependency-glob)
@@ -29,8 +27,6 @@ Set up your GitHub Actions workflow with a specific version of [uv](https://docs
- [UV_TOOL_DIR](#uv_tool_dir)
- [UV_TOOL_BIN_DIR](#uv_tool_bin_dir)
- [Tilde Expansion](#tilde-expansion)
- [Manifest file](#manifest-file)
- [Add problem matchers](#add-problem-matchers)
- [How it works](#how-it-works)
- [FAQ](#faq)
@@ -40,7 +36,7 @@ Set up your GitHub Actions workflow with a specific version of [uv](https://docs
```yaml
- name: Install the latest version of uv
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
```
If you do not specify a version, this action will look for a [required-version](https://docs.astral.sh/uv/reference/settings/#required-version)
@@ -53,7 +49,7 @@ For an example workflow, see
```yaml
- name: Install the latest version of uv
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
version: "latest"
```
@@ -62,62 +58,62 @@ For an example workflow, see
```yaml
- name: Install a specific version of uv
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
version: "0.4.4"
```
### Install a version by supplying a semver range or pep440 specifier
### Install a version by supplying a semver range
You can specify a [semver range](https://github.com/npm/node-semver?tab=readme-ov-file#ranges)
or [pep440 specifier](https://peps.python.org/pep-0440/#version-specifiers)
to install the latest version that satisfies the range.
```yaml
- name: Install a semver range of uv
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
version: ">=0.4.0"
```
```yaml
- name: Pinning a minor version of uv
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
version: "0.4.x"
```
### Install a required-version
You can specify a [required-version](https://docs.astral.sh/uv/reference/settings/#required-version)
in either a `uv.toml` or `pyproject.toml` file:
```yaml
- name: Install a pep440-specifier-satisfying version of uv
uses: astral-sh/setup-uv@v6
- name: Install required-version defined in uv.toml
uses: astral-sh/setup-uv@v5
with:
version: ">=0.4.25,<0.5"
uv-file: "path/to/uv.toml"
```
### Install a version defined in a requirements or config file
You can use the `version-file` input to specify a file that contains the version of uv to install.
This can either be a `pyproject.toml` or `uv.toml` file which defines a `required-version` or
uv defined as a dependency in `pyproject.toml` or `requirements.txt`.
[asdf](https://asdf-vm.com/) `.tool-versions` is also supported, but without the `ref` syntax.
```yaml
- name: Install uv based on the version defined in pyproject.toml
uses: astral-sh/setup-uv@v6
- name: Install required-version defined in pyproject.toml
uses: astral-sh/setup-uv@v5
with:
version-file: "pyproject.toml"
pyproject-file: "path/to/pyproject.toml"
```
### Python version
You can use the input `python-version` to set the environment variable `UV_PYTHON` for the rest of your workflow
You can use the input `python-version` to
- set the environment variable `UV_PYTHON` for the rest of your workflow
- create a new virtual environment with the specified python version
- activate the virtual environment for the rest of your workflow
This will override any python version specifications in `pyproject.toml` and `.python-version`
```yaml
- name: Install the latest version of uv and set the python version to 3.13t
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
python-version: 3.13t
- run: uv pip install --python=3.13t pip
@@ -135,51 +131,13 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Install the latest version of uv and set the python version
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
python-version: ${{ matrix.python-version }}
- name: Test with python ${{ matrix.python-version }}
run: uv run --frozen pytest
```
### Activate environment
You can set `activate-environment` to `true` to automatically activate a venv.
This allows directly using it in later steps:
```yaml
- name: Install the latest version of uv and activate the environment
uses: astral-sh/setup-uv@v6
with:
activate-environment: true
- run: uv pip install pip
```
> [!WARNING]
>
> Activating the environment adds your dependencies to the `PATH`, which could break some workflows.
> For example, if you have a dependency which requires uv, e.g., `hatch`, activating the
> environment will shadow the `uv` binary installed by this action and may result in a different uv
> version being used.
>
> We do not recommend using this setting for most use-cases. Instead, use `uv run` to execute
> commands in the environment.
### Working directory
You can set the working directory with the `working-directory` input.
This controls where we look for `pyproject.toml`, `uv.toml` and `.python-version` files
which are used to determine the version of uv and python to install.
It also controls where [the venv gets created](#activate-environment).
```yaml
- name: Install uv based on the config files in the working-directory
uses: astral-sh/setup-uv@v6
with:
working-directory: my/subproject/dir
```
### Validate checksum
You can specify a checksum to validate the downloaded executable. Checksums up to the default version
@@ -188,7 +146,7 @@ are automatically verified by this action. The sha256 hashes can be found on the
```yaml
- name: Install a specific version and validate the checksum
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
version: "0.3.1"
checksum: "e11b01402ab645392c7ad6044db63d37e4fd1e745e015306993b07695ea5f9f8"
@@ -196,10 +154,6 @@ are automatically verified by this action. The sha256 hashes can be found on the
### Enable caching
> [!NOTE]
> The cache is pruned before it is uploaded to the GitHub Actions cache. This can lead to
> a small or empty cache. See [Disable cache pruning](#disable-cache-pruning) for more details.
If you enable caching, the [uv cache](https://docs.astral.sh/uv/concepts/cache/) will be uploaded to
the GitHub Actions cache. This can speed up runs that reuse the cache by several minutes.
Caching is enabled by default on GitHub-hosted runners.
@@ -214,7 +168,7 @@ You can optionally define a custom cache key suffix.
```yaml
- name: Enable caching and define a custom cache key suffix
id: setup-uv
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
enable-cache: true
cache-suffix: "optional-suffix"
@@ -237,22 +191,16 @@ changes. If you use relative paths, they are relative to the repository root.
> [!NOTE]
>
> You can look up supported patterns [here](https://github.com/actions/toolkit/tree/main/packages/glob#patterns)
>
> The default is
> ```yaml
> cache-dependency-glob: |
> **/*requirements*.txt
> **/*requirements*.in
> **/*constraints*.txt
> **/*constraints*.in
> **/pyproject.toml
> **/requirements*.txt
> **/uv.lock
> ```
```yaml
- name: Define a cache dependency glob
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
enable-cache: true
cache-dependency-glob: "**/pyproject.toml"
@@ -260,7 +208,7 @@ changes. If you use relative paths, they are relative to the repository root.
```yaml
- name: Define a list of cache dependency globs
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
enable-cache: true
cache-dependency-glob: |
@@ -270,7 +218,7 @@ changes. If you use relative paths, they are relative to the repository root.
```yaml
- name: Define an absolute cache dependency glob
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
enable-cache: true
cache-dependency-glob: "/tmp/my-folder/requirements*.txt"
@@ -278,7 +226,7 @@ changes. If you use relative paths, they are relative to the repository root.
```yaml
- name: Never invalidate the cache
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
enable-cache: true
cache-dependency-glob: ""
@@ -293,7 +241,7 @@ It defaults to `setup-uv-cache` in the `TMP` dir, `D:\a\_temp\uv-tool-dir` on Wi
```yaml
- name: Define a custom uv cache path
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
cache-local-path: "/path/to/cache"
```
@@ -312,7 +260,7 @@ input.
```yaml
- name: Don't prune the cache before saving it
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
enable-cache: true
prune-cache: false
@@ -325,7 +273,7 @@ If you want to ignore this, set the `ignore-nothing-to-cache` input to `true`.
```yaml
- name: Ignore nothing to cache
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
enable-cache: true
ignore-nothing-to-cache: true
@@ -340,7 +288,7 @@ If you want to ignore this, set the `ignore-empty-workdir` input to `true`.
```yaml
- name: Ignore empty workdir
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
ignore-empty-workdir: true
```
@@ -357,7 +305,7 @@ are not sufficient, you can provide a custom GitHub token with the necessary per
```yaml
- name: Install the latest version of uv with a custom GitHub token
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
github-token: ${{ secrets.CUSTOM_GITHUB_TOKEN }}
```
@@ -375,7 +323,7 @@ input:
```yaml
- name: Install the latest version of uv with a custom tool dir
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
tool-dir: "/path/to/tool/dir"
```
@@ -394,7 +342,7 @@ If you want to change this behaviour (especially on self-hosted runners) you can
```yaml
- name: Install the latest version of uv with a custom tool bin dir
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
tool-bin-dir: "/path/to/tool-bin/dir"
```
@@ -403,7 +351,6 @@ If you want to change this behaviour (especially on self-hosted runners) you can
This action supports expanding the `~` character to the user's home directory for the following inputs:
- `version-file`
- `cache-local-path`
- `tool-dir`
- `tool-bin-dir`
@@ -411,7 +358,7 @@ This action supports expanding the `~` character to the user's home directory fo
```yaml
- name: Expand the tilde character
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
cache-local-path: "~/path/to/cache"
tool-dir: "~/path/to/tool/dir"
@@ -419,59 +366,6 @@ This action supports expanding the `~` character to the user's home directory fo
cache-dependency-glob: "~/my-cache-buster"
```
### Manifest file
The `manifest-file` input allows you to specify a JSON manifest that lists available uv versions,
architectures, and their download URLs. By default, this action uses the manifest file contained
in this repository, which is automatically updated with each release of uv.
The manifest file contains an array of objects, each describing a version,
architecture, platform, and the corresponding download URL. For example:
```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"
},
...
]
```
You can supply a custom manifest file URL to define additional versions,
architectures, or different download URLs.
This is useful if you maintain your own uv builds or want to override the default sources.
```yaml
- name: Use a custom manifest file
uses: astral-sh/setup-uv@v6
with:
manifest-file: "https://example.com/my-custom-manifest.json"
```
> [!NOTE]
> When you use a custom manifest file and do not set the `version` input, its default value is `latest`.
> This means the action will install the latest version available in the custom manifest file.
> This is different from the default behavior of installing the latest version from the official uv releases.
### Add problem matchers
This action automatically adds
[problem matchers](https://github.com/actions/toolkit/blob/main/docs/problem-matchers.md)
for python errors.
You can disable this by setting the `add-problem-matchers` input to `false`.
```yaml
- name: Install the latest version of uv without problem matchers
uses: astral-sh/setup-uv@v6
with:
add-problem-matchers: false
```
## How it works
This action downloads uv from the uv repo's official
@@ -479,7 +373,7 @@ This action downloads uv from the uv repo's official
[GitHub Actions Toolkit](https://github.com/actions/toolkit) to cache it as a tool to speed up
consecutive runs on self-hosted runners.
The installed version of uv is then added to the runner PATH, enabling later steps to invoke it
The installed version of uv is then added to the runner PATH, enabling subsequent steps to invoke it
by name (`uv`).
## FAQ
@@ -497,7 +391,7 @@ For example:
- name: Checkout the repository
uses: actions/checkout@main
- name: Install the latest version of uv
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
enable-cache: true
- name: Test
@@ -509,7 +403,7 @@ To install a specific version of Python, use
```yaml
- name: Install the latest version of uv
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
with:
enable-cache: true
- name: Install Python 3.12
@@ -528,7 +422,7 @@ output:
uses: actions/checkout@main
- name: Install the default version of uv
id: setup-uv
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@v5
- name: Print the installed version
run: echo "Installed uv version is ${{ steps.setup-uv.outputs.uv-version }}"
```
@@ -554,11 +448,11 @@ because they try to upload with the same cache key.
You might see errors like
`Failed to save: Failed to CreateCacheEntry: Received non-retryable error: Failed request: (409) Conflict: cache entry with the same key, version, and scope already exists`
### Why do I see warnings like `No GitHub Actions cache found for key`
### Why do I see warnings like `Cache not found for keys`
When a workflow runs for the first time on a branch and has a new cache key, because the
[cache-dependency-glob](#cache-dependency-glob) found changed files (changed dependencies),
the cache will not be found and the warning `No GitHub Actions cache found for key` will be printed.
the cache will not be found and the warning `Cache not found for keys` will be printed.
While this might be irritating at first, it is expected behaviour and the cache will be created
and reused in later workflows.
@@ -574,28 +468,6 @@ Some workflows need uv but do not need to access the repository content.
But **if** you need to access the repository content, you have run `actions/checkout` before running `setup-uv`.
Running `actions/checkout` after `setup-uv` **is not supported**.
### Does `setup-uv` also install my project or its dependencies automatically?
No, `setup-uv` alone wont install any libraries from your `pyproject.toml` or `requirements.txt`, it only sets up `uv`.
You should run `uv sync` or `uv pip install .` separately, or use `uv run ...` to ensure necessary dependencies are installed.
### Why is a changed cache not detected and not the full cache uploaded?
When `setup-uv` starts it has to know whether it is better to download an existing cache
or start fresh and download every dependency again.
It does this by using a combination of hashes calculated on the contents of e.g. `uv.lock`.
By calculating these hashes and combining them in a key `setup-uv` can check
if an uploaded cache exists for this key.
If yes (e.g. contents of `uv.lock` did not change since last run) the dependencies in the cache
are up to date and the cache will be downloaded and used.
Details on determining which files will lead to different caches can be read under
[cache-dependency-glob](#cache-dependency-glob)
Some dependencies will never be uploaded to the cache and will be downloaded again on each run
as described in [disable-cache-pruning](#disable-cache-pruning)
## Acknowledgements
`setup-uv` was initially written and published by [Kevin Stillhammer](https://github.com/eifinger)

View File

@@ -1,4 +1,4 @@
import { expect, it, test } from "@jest/globals";
import { expect, test, it } from "@jest/globals";
import {
isknownVersion,
validateChecksum,
@@ -22,12 +22,12 @@ type KnownVersionFixture = { version: string; known: boolean };
it.each<KnownVersionFixture>([
{
known: true,
version: "0.3.0",
known: true,
},
{
known: false,
version: "0.0.15",
known: false,
},
])(
"isknownVersion should return $known for version $version",

View File

@@ -1,9 +0,0 @@
[
{
"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"
}
]

View File

@@ -1 +0,0 @@
uv 0.5.15

View File

@@ -1 +0,0 @@
print("Hello world")

View File

@@ -1,33 +0,0 @@
# This file was autogenerated by uv via the following command:
# uv pip compile --generate-hashes - -o ex-requirements.txt
click==8.2.1 \
--hash=sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202 \
--hash=sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b
# via uvicorn
h11==0.16.0 \
--hash=sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1 \
--hash=sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86
# via uvicorn
uv==0.8.3 \
--hash=sha256:1121ad1c9389b865d029385031d3fd7d90d343c92a2149a4d4aa20bf469cb27f \
--hash=sha256:17bcdb0615e37cc5f985f7d7546f755ac6343c1dc8bbe876c892437f14f8f904 \
--hash=sha256:2ccaae4c749126c99f6404d67a0ae1eae29cbafb05603d09094a775061fdf4e5 \
--hash=sha256:2e311c029bff2ca07c6ddf877ccc5935cabb78e09b94b53a849542665b6a6fa1 \
--hash=sha256:391c97577048a40fd8c85b370055df6420f26e81df7fa906f0e0ce1aa2af3527 \
--hash=sha256:3f904f574dc2d7aa1d96ddf2483480ecd121dc9d060108cadd8bff100b754b64 \
--hash=sha256:526f2c3bd6f311ce31f6f7b6b7d818b191f41e76bed3aaab671b716220c02d8f \
--hash=sha256:5313ee776ad65731ffa8ac585246f987d3a2bf72e6153c12add1fff22ad6e500 \
--hash=sha256:5843cc43bafad05cc710d8e31bd347ee37202462a63d32c30746e9df48cfbda2 \
--hash=sha256:76de331a07e5ae9b6490e70a9439a072b91b3167a5684510af10c2752c4ece9a \
--hash=sha256:8486f7576d15cc73509f93f47b3190f44701ea36839906369301b58c8604d5db \
--hash=sha256:8b16f1bddfdf8f7470924ab34a7b55e4c372d5340c7c1e47e7fc84a743dc541f \
--hash=sha256:966ec7d7f57521fef0fee685d71e183c9cafb358ddcfe27519dfeaf40550f247 \
--hash=sha256:989898caeb6e972979543b57547d1c28ab8af81ff8fc15921fd354c17d432749 \
--hash=sha256:9ce7981f4fbeecf93dc5cf0a5a7915e84956fd99ad3ac977c048fe0cfdb1a17e \
--hash=sha256:ad13453ab0a1dfa64a221aac8f52199efdcaa52c97134fffd7bcebed794a6f4b \
--hash=sha256:ae7efe91dcfc24126fa91e0fb69a1daf6c0e494a781ba192bb0cc62d7ab623ee \
--hash=sha256:daa6e0d657a94f20e962d4a03d833ef7af5c8e51b7c8a2d92ba6cf64a4c07ac1 \
--hash=sha256:f1eb7c896fc0d80ed534748aaf46697b6ebc8ce401f1c51666ce0b9923c3db9a
uvicorn==0.35.0 \
--hash=sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a \
--hash=sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01

View File

@@ -1 +0,0 @@
print("Hello world")

View File

@@ -1,2 +0,0 @@
uvicorn==0.35.0
uv==0.6.17

View File

@@ -1,86 +0,0 @@
jest.mock("@actions/core", () => {
return {
debug: jest.fn(),
getBooleanInput: jest.fn(
(name: string) => (mockInputs[name] ?? "") === "true",
),
getInput: jest.fn((name: string) => mockInputs[name] ?? ""),
};
});
import {
afterEach,
beforeEach,
describe,
expect,
it,
jest,
} from "@jest/globals";
// Will be mutated per test before (re-)importing the module under test
let mockInputs: Record<string, string> = {};
const ORIGINAL_HOME = process.env.HOME;
describe("cacheDependencyGlob", () => {
beforeEach(() => {
jest.resetModules();
mockInputs = {};
process.env.HOME = "/home/testuser";
});
afterEach(() => {
process.env.HOME = ORIGINAL_HOME;
});
it("returns empty string when input not provided", async () => {
mockInputs["working-directory"] = "/workspace";
const { cacheDependencyGlob } = await import("../../src/utils/inputs");
expect(cacheDependencyGlob).toBe("");
});
it("resolves a single relative path", async () => {
mockInputs["working-directory"] = "/workspace";
mockInputs["cache-dependency-glob"] = "requirements.txt";
const { cacheDependencyGlob } = await import("../../src/utils/inputs");
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 import("../../src/utils/inputs");
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 { cacheDependencyGlob } = await import("../../src/utils/inputs");
expect(cacheDependencyGlob).toBe(
[
"/home/testuser/.cache/file1", // expanded tilde, absolute path unchanged
"/workspace/rel/file2", // ./ stripped and resolved
"/workspace/file3.txt", // relative path resolved
].join("\n"),
);
});
it("keeps absolute path unchanged in multiline input", async () => {
mockInputs["working-directory"] = "/workspace";
mockInputs["cache-dependency-glob"] = "/abs/path.lock\nrelative.lock";
const { cacheDependencyGlob } = await import("../../src/utils/inputs");
expect(cacheDependencyGlob).toBe(
["/abs/path.lock", "/workspace/relative.lock"].join("\n"),
);
});
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 import("../../src/utils/inputs");
expect(cacheDependencyGlob).toBe(
["!/abs/path.lock", "!/workspace/relative.lock"].join("\n"),
);
});
});

View File

@@ -1,9 +0,0 @@
import { expect, test } from "@jest/globals";
import { getUvVersionFromFile } from "../../src/version/resolve";
test("ignores dependencies starting with uv", async () => {
const parsedVersion = getUvVersionFromFile(
"__tests__/fixtures/uv-in-requirements-txt-project/requirements.txt",
);
expect(parsedVersion).toBe("0.6.17");
});

View File

@@ -1,9 +0,0 @@
import { expect, test } from "@jest/globals";
import { getUvVersionFromFile } from "../../src/version/resolve";
test("ignores dependencies starting with uv", async () => {
const parsedVersion = getUvVersionFromFile(
"__tests__/fixtures/uv-in-requirements-hash-txt-project/requirements.txt",
);
expect(parsedVersion).toBe("0.8.3");
});

View File

@@ -1,115 +0,0 @@
jest.mock("node:fs");
jest.mock("@actions/core", () => ({
warning: jest.fn(),
}));
import fs from "node:fs";
import * as core from "@actions/core";
import { beforeEach, describe, expect, it, jest } from "@jest/globals";
import { getUvVersionFromToolVersions } from "../../src/version/tool-versions-file";
const mockedFs = fs as jest.Mocked<typeof fs>;
const mockedCore = core as jest.Mocked<typeof core>;
describe("getUvVersionFromToolVersions", () => {
beforeEach(() => {
jest.clearAllMocks();
});
it("should return undefined for non-.tool-versions files", () => {
const result = getUvVersionFromToolVersions("package.json");
expect(result).toBeUndefined();
expect(mockedFs.readFileSync).not.toHaveBeenCalled();
});
it("should return version for valid uv entry", () => {
const fileContent = "python 3.11.0\nuv 0.1.0\nnodejs 18.0.0";
mockedFs.readFileSync.mockReturnValue(fileContent);
const result = getUvVersionFromToolVersions(".tool-versions");
expect(result).toBe("0.1.0");
expect(mockedFs.readFileSync).toHaveBeenCalledWith(
".tool-versions",
"utf8",
);
});
it("should return version for uv entry with v prefix", () => {
const fileContent = "uv v0.2.0";
mockedFs.readFileSync.mockReturnValue(fileContent);
const result = getUvVersionFromToolVersions(".tool-versions");
expect(result).toBe("0.2.0");
});
it("should handle whitespace around uv entry", () => {
const fileContent = " uv 0.3.0 ";
mockedFs.readFileSync.mockReturnValue(fileContent);
const result = getUvVersionFromToolVersions(".tool-versions");
expect(result).toBe("0.3.0");
});
it("should skip commented lines", () => {
const fileContent = "# uv 0.1.0\npython 3.11.0\nuv 0.2.0";
mockedFs.readFileSync.mockReturnValue(fileContent);
const result = getUvVersionFromToolVersions(".tool-versions");
expect(result).toBe("0.2.0");
});
it("should return first matching uv version", () => {
const fileContent = "uv 0.1.0\npython 3.11.0\nuv 0.2.0";
mockedFs.readFileSync.mockReturnValue(fileContent);
const result = getUvVersionFromToolVersions(".tool-versions");
expect(result).toBe("0.1.0");
});
it("should return undefined when no uv entry found", () => {
const fileContent = "python 3.11.0\nnodejs 18.0.0";
mockedFs.readFileSync.mockReturnValue(fileContent);
const result = getUvVersionFromToolVersions(".tool-versions");
expect(result).toBeUndefined();
});
it("should return undefined for empty file", () => {
mockedFs.readFileSync.mockReturnValue("");
const result = getUvVersionFromToolVersions(".tool-versions");
expect(result).toBeUndefined();
});
it("should warn and return undefined for ref syntax", () => {
const fileContent = "uv ref:main";
mockedFs.readFileSync.mockReturnValue(fileContent);
const result = getUvVersionFromToolVersions(".tool-versions");
expect(result).toBeUndefined();
expect(mockedCore.warning).toHaveBeenCalledWith(
"The ref syntax of .tool-versions is not supported. Please use a released version instead.",
);
});
it("should handle file path with .tool-versions extension", () => {
const fileContent = "uv 0.1.0";
mockedFs.readFileSync.mockReturnValue(fileContent);
const result = getUvVersionFromToolVersions("path/to/.tool-versions");
expect(result).toBe("0.1.0");
expect(mockedFs.readFileSync).toHaveBeenCalledWith(
"path/to/.tool-versions",
"utf8",
);
});
});

View File

@@ -6,25 +6,18 @@ inputs:
version:
description: "The version of uv to install e.g., `0.5.0` Defaults to the version in pyproject.toml or 'latest'."
default: ""
version-file:
description: "Path to a file containing the version of uv to install. Defaults to searching for uv.toml and if not found pyproject.toml."
pyproject-file:
description: "Path to a pyproject.toml"
default: ""
uv-file:
description: "Path to a uv.toml"
default: ""
python-version:
description: "The version of Python to set UV_PYTHON to"
required: false
activate-environment:
description: "Use uv venv to activate a venv ready to be used by later steps. "
default: "false"
working-directory:
description: "The directory to execute all commands in and look for files such as pyproject.toml"
default: ${{ github.workspace }}
checksum:
description: "The checksum of the uv version to install"
required: false
server-url:
description: "(Deprecated) The server url to use when downloading uv"
required: false
default: "https://github.com"
github-token:
description:
"Used to increase the rate limit when retrieving versions and downloading uv."
@@ -38,12 +31,8 @@ inputs:
"Glob pattern to match files relative to the repository root to control
the cache."
default: |
**/*requirements*.txt
**/*requirements*.in
**/*constraints*.txt
**/*constraints*.in
**/pyproject.toml
**/uv.lock
**/requirements*.txt
cache-suffix:
description: "Suffix for the cache key"
required: false
@@ -65,19 +54,9 @@ inputs:
tool-bin-dir:
description: "Custom path to set UV_TOOL_BIN_DIR to."
required: false
manifest-file:
description: "URL to the manifest file containing available versions and download URLs."
required: false
add-problem-matchers:
description: "Add problem matchers."
default: "true"
outputs:
uv-version:
description: "The installed uv version. Useful when using latest."
uv-path:
description: "The path to the installed uv binary."
uvx-path:
description: "The path to the installed uvx binary."
cache-hit:
description: "A boolean value to indicate a cache entry was found"
runs:

View File

@@ -1,34 +1,20 @@
{
"$schema": "https://biomejs.dev/schemas/2.2.2/schema.json",
"assist": {
"actions": {
"source": {
"organizeImports": "on",
"useSortedAttributes": "on",
"useSortedKeys": "on"
}
}
"$schema": "https://biomejs.dev/schemas/1.9.2/schema.json",
"vcs": {
"enabled": true,
"clientKind": "git",
"useIgnoreFile": false
},
"files": {
"ignoreUnknown": false,
"includes": [
"**",
"!**/dist",
"!**/lib",
"!**/node_modules",
"!**/package*.json",
"!**/known-checksums.*"
]
"ignore": ["dist", "lib", "node_modules"]
},
"formatter": {
"enabled": true,
"indentStyle": "space"
},
"javascript": {
"formatter": {
"quoteStyle": "double",
"trailingCommas": "all"
}
"organizeImports": {
"enabled": true
},
"linter": {
"enabled": true,
@@ -36,9 +22,10 @@
"recommended": true
}
},
"vcs": {
"clientKind": "git",
"enabled": true,
"useIgnoreFile": false
"javascript": {
"formatter": {
"quoteStyle": "double",
"trailingCommas": "all"
}
}
}

1712
dist/save-cache/index.js generated vendored
View File

@@ -48,7 +48,6 @@ const cacheTwirpClient = __importStar(__nccwpck_require__(6819));
const config_1 = __nccwpck_require__(7606);
const tar_1 = __nccwpck_require__(5321);
const constants_1 = __nccwpck_require__(8287);
const http_client_1 = __nccwpck_require__(4844);
class ValidationError extends Error {
constructor(message) {
super(message);
@@ -85,17 +84,7 @@ function checkKey(key) {
* @returns boolean return true if Actions cache service feature is available, otherwise false
*/
function isFeatureAvailable() {
const cacheServiceVersion = (0, config_1.getCacheServiceVersion)();
// Check availability based on cache service version
switch (cacheServiceVersion) {
case 'v2':
// For v2, we need ACTIONS_RESULTS_URL
return !!process.env['ACTIONS_RESULTS_URL'];
case 'v1':
default:
// For v1, we only need ACTIONS_CACHE_URL
return !!process.env['ACTIONS_CACHE_URL'];
}
return !!process.env['ACTIONS_CACHE_URL'];
}
exports.isFeatureAvailable = isFeatureAvailable;
/**
@@ -180,16 +169,8 @@ function restoreCacheV1(paths, primaryKey, restoreKeys, options, enableCrossOsAr
throw error;
}
else {
// warn on cache restore failure and continue build
// Log server errors (5xx) as errors, all other errors as warnings
if (typedError instanceof http_client_1.HttpClientError &&
typeof typedError.statusCode === 'number' &&
typedError.statusCode >= 500) {
core.error(`Failed to restore: ${error.message}`);
}
else {
core.warning(`Failed to restore: ${error.message}`);
}
// Supress all non-validation cache related errors because caching should be optional
core.warning(`Failed to restore: ${error.message}`);
}
}
finally {
@@ -239,16 +220,10 @@ function restoreCacheV2(paths, primaryKey, restoreKeys, options, enableCrossOsAr
};
const response = yield twirpClient.GetCacheEntryDownloadURL(request);
if (!response.ok) {
core.debug(`Cache not found for version ${request.version} of keys: ${keys.join(', ')}`);
core.debug(`Cache not found for keys: ${keys.join(', ')}`);
return undefined;
}
const isRestoreKeyMatch = request.key !== response.matchedKey;
if (isRestoreKeyMatch) {
core.info(`Cache hit for restore-key: ${response.matchedKey}`);
}
else {
core.info(`Cache hit for: ${response.matchedKey}`);
}
core.info(`Cache hit for: ${request.key}`);
if (options === null || options === void 0 ? void 0 : options.lookupOnly) {
core.info('Lookup only - skipping download');
return response.matchedKey;
@@ -273,15 +248,7 @@ function restoreCacheV2(paths, primaryKey, restoreKeys, options, enableCrossOsAr
}
else {
// Supress all non-validation cache related errors because caching should be optional
// Log server errors (5xx) as errors, all other errors as warnings
if (typedError instanceof http_client_1.HttpClientError &&
typeof typedError.statusCode === 'number' &&
typedError.statusCode >= 500) {
core.error(`Failed to restore: ${error.message}`);
}
else {
core.warning(`Failed to restore: ${error.message}`);
}
core.warning(`Failed to restore: ${error.message}`);
}
}
finally {
@@ -384,15 +351,7 @@ function saveCacheV1(paths, key, options, enableCrossOsArchive = false) {
core.info(`Failed to save: ${typedError.message}`);
}
else {
// Log server errors (5xx) as errors, all other errors as warnings
if (typedError instanceof http_client_1.HttpClientError &&
typeof typedError.statusCode === 'number' &&
typedError.statusCode >= 500) {
core.error(`Failed to save: ${typedError.message}`);
}
else {
core.warning(`Failed to save: ${typedError.message}`);
}
core.warning(`Failed to save: ${typedError.message}`);
}
}
finally {
@@ -488,15 +447,7 @@ function saveCacheV2(paths, key, options, enableCrossOsArchive = false) {
core.info(`Failed to save: ${typedError.message}`);
}
else {
// Log server errors (5xx) as errors, all other errors as warnings
if (typedError instanceof http_client_1.HttpClientError &&
typeof typedError.statusCode === 'number' &&
typedError.statusCode >= 500) {
core.error(`Failed to save: ${typedError.message}`);
}
else {
core.warning(`Failed to save: ${typedError.message}`);
}
core.warning(`Failed to save: ${typedError.message}`);
}
}
finally {
@@ -2253,7 +2204,6 @@ const cacheUtils_1 = __nccwpck_require__(8299);
const auth_1 = __nccwpck_require__(4552);
const http_client_1 = __nccwpck_require__(4844);
const cache_twirp_client_1 = __nccwpck_require__(1486);
const util_1 = __nccwpck_require__(5183);
/**
* This class is a wrapper around the CacheServiceClientJSON class generated by Twirp.
*
@@ -2313,7 +2263,6 @@ class CacheServiceClient {
(0, core_1.debug)(`[Response] - ${response.message.statusCode}`);
(0, core_1.debug)(`Headers: ${JSON.stringify(response.message.headers, null, 2)}`);
const body = JSON.parse(rawBody);
(0, util_1.maskSecretUrls)(body);
(0, core_1.debug)(`Body: ${JSON.stringify(body, null, 2)}`);
if (this.isSuccessStatusCode(statusCode)) {
return { response, body };
@@ -2495,87 +2444,6 @@ exports.getUserAgentString = getUserAgentString;
/***/ }),
/***/ 5183:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.maskSecretUrls = exports.maskSigUrl = void 0;
const core_1 = __nccwpck_require__(7484);
/**
* Masks the `sig` parameter in a URL and sets it as a secret.
*
* @param url - The URL containing the signature parameter to mask
* @remarks
* This function attempts to parse the provided URL and identify the 'sig' query parameter.
* If found, it registers both the raw and URL-encoded signature values as secrets using
* the Actions `setSecret` API, which prevents them from being displayed in logs.
*
* The function handles errors gracefully if URL parsing fails, logging them as debug messages.
*
* @example
* ```typescript
* // Mask a signature in an Azure SAS token URL
* maskSigUrl('https://example.blob.core.windows.net/container/file.txt?sig=abc123&se=2023-01-01');
* ```
*/
function maskSigUrl(url) {
if (!url)
return;
try {
const parsedUrl = new URL(url);
const signature = parsedUrl.searchParams.get('sig');
if (signature) {
(0, core_1.setSecret)(signature);
(0, core_1.setSecret)(encodeURIComponent(signature));
}
}
catch (error) {
(0, core_1.debug)(`Failed to parse URL: ${url} ${error instanceof Error ? error.message : String(error)}`);
}
}
exports.maskSigUrl = maskSigUrl;
/**
* Masks sensitive information in URLs containing signature parameters.
* Currently supports masking 'sig' parameters in the 'signed_upload_url'
* and 'signed_download_url' properties of the provided object.
*
* @param body - The object should contain a signature
* @remarks
* This function extracts URLs from the object properties and calls maskSigUrl
* on each one to redact sensitive signature information. The function doesn't
* modify the original object; it only marks the signatures as secrets for
* logging purposes.
*
* @example
* ```typescript
* const responseBody = {
* signed_upload_url: 'https://blob.core.windows.net/?sig=abc123',
* signed_download_url: 'https://blob.core/windows.net/?sig=def456'
* };
* maskSecretUrls(responseBody);
* ```
*/
function maskSecretUrls(body) {
if (typeof body !== 'object' || body === null) {
(0, core_1.debug)('body is not an object or is null');
return;
}
if ('signed_upload_url' in body &&
typeof body.signed_upload_url === 'string') {
maskSigUrl(body.signed_upload_url);
}
if ('signed_download_url' in body &&
typeof body.signed_download_url === 'string') {
maskSigUrl(body.signed_download_url);
}
}
exports.maskSecretUrls = maskSecretUrls;
//# sourceMappingURL=util.js.map
/***/ }),
/***/ 5321:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
@@ -13466,7 +13334,7 @@ module.exports = {
const { parseSetCookie } = __nccwpck_require__(7803)
const { stringify } = __nccwpck_require__(6338)
const { stringify, getHeadersList } = __nccwpck_require__(6338)
const { webidl } = __nccwpck_require__(8134)
const { Headers } = __nccwpck_require__(9061)
@@ -13542,13 +13410,14 @@ function getSetCookies (headers) {
webidl.brandCheck(headers, Headers, { strict: false })
const cookies = headers.getSetCookie()
const cookies = getHeadersList(headers).cookies
if (!cookies) {
return []
}
return cookies.map((pair) => parseSetCookie(pair))
// In older versions of undici, cookies is a list of name:value.
return cookies.map((pair) => parseSetCookie(Array.isArray(pair) ? pair[1] : pair))
}
/**
@@ -13976,15 +13845,14 @@ module.exports = {
/***/ }),
/***/ 6338:
/***/ ((module) => {
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
/**
* @param {string} value
* @returns {boolean}
*/
const assert = __nccwpck_require__(2613)
const { kHeadersList } = __nccwpck_require__(9411)
function isCTLExcludingHtab (value) {
if (value.length === 0) {
return false
@@ -14245,13 +14113,31 @@ function stringify (cookie) {
return out.join('; ')
}
let kHeadersListNode
function getHeadersList (headers) {
if (headers[kHeadersList]) {
return headers[kHeadersList]
}
if (!kHeadersListNode) {
kHeadersListNode = Object.getOwnPropertySymbols(headers).find(
(symbol) => symbol.description === 'headers list'
)
assert(kHeadersListNode, 'Headers cannot be parsed')
}
const headersList = headers[kHeadersListNode]
assert(headersList)
return headersList
}
module.exports = {
isCTLExcludingHtab,
validateCookieName,
validateCookiePath,
validateCookieValue,
toIMFDate,
stringify
stringify,
getHeadersList
}
@@ -18255,7 +18141,6 @@ const {
isValidHeaderName,
isValidHeaderValue
} = __nccwpck_require__(555)
const util = __nccwpck_require__(9023)
const { webidl } = __nccwpck_require__(8134)
const assert = __nccwpck_require__(2613)
@@ -18809,9 +18694,6 @@ Object.defineProperties(Headers.prototype, {
[Symbol.toStringTag]: {
value: 'Headers',
configurable: true
},
[util.inspect.custom]: {
enumerable: false
}
})
@@ -27988,20 +27870,6 @@ class Pool extends PoolBase {
? { ...options.interceptors }
: undefined
this[kFactory] = factory
this.on('connectionError', (origin, targets, error) => {
// If a connection error occurs, we remove the client from the pool,
// and emit a connectionError event. They will not be re-used.
// Fixes https://github.com/nodejs/undici/issues/3895
for (const target of targets) {
// Do not use kRemoveClient here, as it will close the client,
// but the client cannot be closed in this state.
const idx = this[kClients].indexOf(target)
if (idx !== -1) {
this[kClients].splice(idx, 1)
}
}
})
}
[kGetDispatcher] () {
@@ -36748,9 +36616,6 @@ exports.userAgentPolicy = userAgentPolicy;
/***/ 172:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var CombinedStream = __nccwpck_require__(5630);
var util = __nccwpck_require__(9023);
var path = __nccwpck_require__(6928);
@@ -36759,20 +36624,23 @@ var https = __nccwpck_require__(5692);
var parseUrl = (__nccwpck_require__(7016).parse);
var fs = __nccwpck_require__(9896);
var Stream = (__nccwpck_require__(2203).Stream);
var crypto = __nccwpck_require__(6982);
var mime = __nccwpck_require__(4096);
var asynckit = __nccwpck_require__(1324);
var setToStringTag = __nccwpck_require__(8700);
var hasOwn = __nccwpck_require__(4076);
var populate = __nccwpck_require__(2209);
// Public API
module.exports = FormData;
// make it a Stream
util.inherits(FormData, CombinedStream);
/**
* Create readable "multipart/form-data" streams.
* Can be used to submit forms
* and file uploads to other web applications.
*
* @constructor
* @param {object} options - Properties to be added/overriden for FormData and CombinedStream
* @param {Object} options - Properties to be added/overriden for FormData and CombinedStream
*/
function FormData(options) {
if (!(this instanceof FormData)) {
@@ -36785,39 +36653,35 @@ function FormData(options) {
CombinedStream.call(this);
options = options || {}; // eslint-disable-line no-param-reassign
for (var option in options) { // eslint-disable-line no-restricted-syntax
options = options || {};
for (var option in options) {
this[option] = options[option];
}
}
// make it a Stream
util.inherits(FormData, CombinedStream);
FormData.LINE_BREAK = '\r\n';
FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream';
FormData.prototype.append = function (field, value, options) {
options = options || {}; // eslint-disable-line no-param-reassign
FormData.prototype.append = function(field, value, options) {
options = options || {};
// allow filename as single option
if (typeof options === 'string') {
options = { filename: options }; // eslint-disable-line no-param-reassign
if (typeof options == 'string') {
options = {filename: options};
}
var append = CombinedStream.prototype.append.bind(this);
// all that streamy business can't handle numbers
if (typeof value === 'number' || value == null) {
value = String(value); // eslint-disable-line no-param-reassign
if (typeof value == 'number') {
value = '' + value;
}
// https://github.com/felixge/node-form-data/issues/38
if (Array.isArray(value)) {
/*
* Please convert your array into string
* the way web server expects it
*/
if (util.isArray(value)) {
// Please convert your array into string
// the way web server expects it
this._error(new Error('Arrays are not supported.'));
return;
}
@@ -36833,17 +36697,15 @@ FormData.prototype.append = function (field, value, options) {
this._trackLength(header, value, options);
};
FormData.prototype._trackLength = function (header, value, options) {
FormData.prototype._trackLength = function(header, value, options) {
var valueLength = 0;
/*
* used w/ getLengthSync(), when length is known.
* e.g. for streaming directly from a remote server,
* w/ a known file a size, and not wanting to wait for
* incoming file to finish to get its size.
*/
// used w/ getLengthSync(), when length is known.
// e.g. for streaming directly from a remote server,
// w/ a known file a size, and not wanting to wait for
// incoming file to finish to get its size.
if (options.knownLength != null) {
valueLength += Number(options.knownLength);
valueLength += +options.knownLength;
} else if (Buffer.isBuffer(value)) {
valueLength = value.length;
} else if (typeof value === 'string') {
@@ -36853,10 +36715,12 @@ FormData.prototype._trackLength = function (header, value, options) {
this._valueLength += valueLength;
// @check why add CRLF? does this account for custom/multiple CRLFs?
this._overheadLength += Buffer.byteLength(header) + FormData.LINE_BREAK.length;
this._overheadLength +=
Buffer.byteLength(header) +
FormData.LINE_BREAK.length;
// empty or either doesn't have path or not an http response or not a stream
if (!value || (!value.path && !(value.readable && hasOwn(value, 'httpVersion')) && !(value instanceof Stream))) {
if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) && !(value instanceof Stream))) {
return;
}
@@ -36866,8 +36730,10 @@ FormData.prototype._trackLength = function (header, value, options) {
}
};
FormData.prototype._lengthRetriever = function (value, callback) {
if (hasOwn(value, 'fd')) {
FormData.prototype._lengthRetriever = function(value, callback) {
if (value.hasOwnProperty('fd')) {
// take read range into a account
// `end` = Infinity > read file till the end
//
@@ -36876,52 +36742,54 @@ FormData.prototype._lengthRetriever = function (value, callback) {
// Fix it when node fixes it.
// https://github.com/joyent/node/issues/7819
if (value.end != undefined && value.end != Infinity && value.start != undefined) {
// when end specified
// no need to calculate range
// inclusive, starts with 0
callback(null, value.end + 1 - (value.start ? value.start : 0)); // eslint-disable-line callback-return
callback(null, value.end + 1 - (value.start ? value.start : 0));
// not that fast snoopy
// not that fast snoopy
} else {
// still need to fetch file size from fs
fs.stat(value.path, function (err, stat) {
fs.stat(value.path, function(err, stat) {
var fileSize;
if (err) {
callback(err);
return;
}
// update final size based on the range options
var fileSize = stat.size - (value.start ? value.start : 0);
fileSize = stat.size - (value.start ? value.start : 0);
callback(null, fileSize);
});
}
// or http response
} else if (hasOwn(value, 'httpVersion')) {
callback(null, Number(value.headers['content-length'])); // eslint-disable-line callback-return
// or http response
} else if (value.hasOwnProperty('httpVersion')) {
callback(null, +value.headers['content-length']);
// or request stream http://github.com/mikeal/request
} else if (hasOwn(value, 'httpModule')) {
// or request stream http://github.com/mikeal/request
} else if (value.hasOwnProperty('httpModule')) {
// wait till response come back
value.on('response', function (response) {
value.on('response', function(response) {
value.pause();
callback(null, Number(response.headers['content-length']));
callback(null, +response.headers['content-length']);
});
value.resume();
// something else
// something else
} else {
callback('Unknown stream'); // eslint-disable-line callback-return
callback('Unknown stream');
}
};
FormData.prototype._multiPartHeader = function (field, value, options) {
/*
* custom header specified (as string)?
* it becomes responsible for boundary
* (e.g. to handle extra CRLFs on .NET servers)
*/
if (typeof options.header === 'string') {
FormData.prototype._multiPartHeader = function(field, value, options) {
// custom header specified (as string)?
// it becomes responsible for boundary
// (e.g. to handle extra CRLFs on .NET servers)
if (typeof options.header == 'string') {
return options.header;
}
@@ -36929,7 +36797,7 @@ FormData.prototype._multiPartHeader = function (field, value, options) {
var contentType = this._getContentType(value, options);
var contents = '';
var headers = {
var headers = {
// add custom disposition as third element or keep it two elements if not
'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []),
// if no content type. allow it to be empty array
@@ -36937,74 +36805,77 @@ FormData.prototype._multiPartHeader = function (field, value, options) {
};
// allow custom headers.
if (typeof options.header === 'object') {
if (typeof options.header == 'object') {
populate(headers, options.header);
}
var header;
for (var prop in headers) { // eslint-disable-line no-restricted-syntax
if (hasOwn(headers, prop)) {
header = headers[prop];
for (var prop in headers) {
if (!headers.hasOwnProperty(prop)) continue;
header = headers[prop];
// skip nullish headers.
if (header == null) {
continue; // eslint-disable-line no-restricted-syntax, no-continue
}
// skip nullish headers.
if (header == null) {
continue;
}
// convert all headers to arrays.
if (!Array.isArray(header)) {
header = [header];
}
// convert all headers to arrays.
if (!Array.isArray(header)) {
header = [header];
}
// add non-empty headers.
if (header.length) {
contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK;
}
// add non-empty headers.
if (header.length) {
contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK;
}
}
return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK;
};
FormData.prototype._getContentDisposition = function (value, options) { // eslint-disable-line consistent-return
var filename;
FormData.prototype._getContentDisposition = function(value, options) {
var filename
, contentDisposition
;
if (typeof options.filepath === 'string') {
// custom filepath for relative paths
filename = path.normalize(options.filepath).replace(/\\/g, '/');
} else if (options.filename || (value && (value.name || value.path))) {
/*
* custom filename take precedence
* formidable and the browser add a name property
* fs- and request- streams have path property
*/
filename = path.basename(options.filename || (value && (value.name || value.path)));
} else if (value && value.readable && hasOwn(value, 'httpVersion')) {
} else if (options.filename || value.name || value.path) {
// custom filename take precedence
// formidable and the browser add a name property
// fs- and request- streams have path property
filename = path.basename(options.filename || value.name || value.path);
} else if (value.readable && value.hasOwnProperty('httpVersion')) {
// or try http response
filename = path.basename(value.client._httpMessage.path || '');
}
if (filename) {
return 'filename="' + filename + '"';
contentDisposition = 'filename="' + filename + '"';
}
return contentDisposition;
};
FormData.prototype._getContentType = function (value, options) {
FormData.prototype._getContentType = function(value, options) {
// use custom content-type above all
var contentType = options.contentType;
// or try `name` from formidable, browser
if (!contentType && value && value.name) {
if (!contentType && value.name) {
contentType = mime.lookup(value.name);
}
// or try `path` from fs-, request- streams
if (!contentType && value && value.path) {
if (!contentType && value.path) {
contentType = mime.lookup(value.path);
}
// or if it's http-reponse
if (!contentType && value && value.readable && hasOwn(value, 'httpVersion')) {
if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) {
contentType = value.headers['content-type'];
}
@@ -37014,18 +36885,18 @@ FormData.prototype._getContentType = function (value, options) {
}
// fallback to the default content type if `value` is not simple value
if (!contentType && value && typeof value === 'object') {
if (!contentType && typeof value == 'object') {
contentType = FormData.DEFAULT_CONTENT_TYPE;
}
return contentType;
};
FormData.prototype._multiPartFooter = function () {
return function (next) {
FormData.prototype._multiPartFooter = function() {
return function(next) {
var footer = FormData.LINE_BREAK;
var lastPart = this._streams.length === 0;
var lastPart = (this._streams.length === 0);
if (lastPart) {
footer += this._lastBoundary();
}
@@ -37034,18 +36905,18 @@ FormData.prototype._multiPartFooter = function () {
}.bind(this);
};
FormData.prototype._lastBoundary = function () {
FormData.prototype._lastBoundary = function() {
return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK;
};
FormData.prototype.getHeaders = function (userHeaders) {
FormData.prototype.getHeaders = function(userHeaders) {
var header;
var formHeaders = {
'content-type': 'multipart/form-data; boundary=' + this.getBoundary()
};
for (header in userHeaders) { // eslint-disable-line no-restricted-syntax
if (hasOwn(userHeaders, header)) {
for (header in userHeaders) {
if (userHeaders.hasOwnProperty(header)) {
formHeaders[header.toLowerCase()] = userHeaders[header];
}
}
@@ -37053,14 +36924,11 @@ FormData.prototype.getHeaders = function (userHeaders) {
return formHeaders;
};
FormData.prototype.setBoundary = function (boundary) {
if (typeof boundary !== 'string') {
throw new TypeError('FormData boundary must be a string');
}
FormData.prototype.setBoundary = function(boundary) {
this._boundary = boundary;
};
FormData.prototype.getBoundary = function () {
FormData.prototype.getBoundary = function() {
if (!this._boundary) {
this._generateBoundary();
}
@@ -37068,55 +36936,60 @@ FormData.prototype.getBoundary = function () {
return this._boundary;
};
FormData.prototype.getBuffer = function () {
var dataBuffer = new Buffer.alloc(0); // eslint-disable-line new-cap
FormData.prototype.getBuffer = function() {
var dataBuffer = new Buffer.alloc( 0 );
var boundary = this.getBoundary();
// Create the form content. Add Line breaks to the end of data.
for (var i = 0, len = this._streams.length; i < len; i++) {
if (typeof this._streams[i] !== 'function') {
// Add content to the buffer.
if (Buffer.isBuffer(this._streams[i])) {
dataBuffer = Buffer.concat([dataBuffer, this._streams[i]]);
} else {
dataBuffer = Buffer.concat([dataBuffer, Buffer.from(this._streams[i])]);
if(Buffer.isBuffer(this._streams[i])) {
dataBuffer = Buffer.concat( [dataBuffer, this._streams[i]]);
}else {
dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(this._streams[i])]);
}
// Add break after content.
if (typeof this._streams[i] !== 'string' || this._streams[i].substring(2, boundary.length + 2) !== boundary) {
dataBuffer = Buffer.concat([dataBuffer, Buffer.from(FormData.LINE_BREAK)]);
if (typeof this._streams[i] !== 'string' || this._streams[i].substring( 2, boundary.length + 2 ) !== boundary) {
dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(FormData.LINE_BREAK)] );
}
}
}
// Add the footer and return the Buffer object.
return Buffer.concat([dataBuffer, Buffer.from(this._lastBoundary())]);
return Buffer.concat( [dataBuffer, Buffer.from(this._lastBoundary())] );
};
FormData.prototype._generateBoundary = function () {
FormData.prototype._generateBoundary = function() {
// This generates a 50 character boundary similar to those used by Firefox.
// They are optimized for boyer-moore parsing.
this._boundary = '--------------------------' + crypto.randomBytes(12).toString('hex');
var boundary = '--------------------------';
for (var i = 0; i < 24; i++) {
boundary += Math.floor(Math.random() * 10).toString(16);
}
this._boundary = boundary;
};
// Note: getLengthSync DOESN'T calculate streams length
// As workaround one can calculate file size manually and add it as knownLength option
FormData.prototype.getLengthSync = function () {
// As workaround one can calculate file size manually
// and add it as knownLength option
FormData.prototype.getLengthSync = function() {
var knownLength = this._overheadLength + this._valueLength;
// Don't get confused, there are 3 "internal" streams for each keyval pair so it basically checks if there is any value added to the form
// Don't get confused, there are 3 "internal" streams for each keyval pair
// so it basically checks if there is any value added to the form
if (this._streams.length) {
knownLength += this._lastBoundary().length;
}
// https://github.com/form-data/form-data/issues/40
if (!this.hasKnownLength()) {
/*
* Some async length retrievers are present
* therefore synchronous length calculation is false.
* Please use getLength(callback) to get proper length
*/
// Some async length retrievers are present
// therefore synchronous length calculation is false.
// Please use getLength(callback) to get proper length
this._error(new Error('Cannot calculate proper length in synchronous way.'));
}
@@ -37126,7 +36999,7 @@ FormData.prototype.getLengthSync = function () {
// Public API to check if length of added values is known
// https://github.com/form-data/form-data/issues/196
// https://github.com/form-data/form-data/issues/262
FormData.prototype.hasKnownLength = function () {
FormData.prototype.hasKnownLength = function() {
var hasKnownLength = true;
if (this._valuesToMeasure.length) {
@@ -37136,7 +37009,7 @@ FormData.prototype.hasKnownLength = function () {
return hasKnownLength;
};
FormData.prototype.getLength = function (cb) {
FormData.prototype.getLength = function(cb) {
var knownLength = this._overheadLength + this._valueLength;
if (this._streams.length) {
@@ -37148,13 +37021,13 @@ FormData.prototype.getLength = function (cb) {
return;
}
asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function (err, values) {
asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) {
if (err) {
cb(err);
return;
}
values.forEach(function (length) {
values.forEach(function(length) {
knownLength += length;
});
@@ -37162,26 +37035,31 @@ FormData.prototype.getLength = function (cb) {
});
};
FormData.prototype.submit = function (params, cb) {
var request;
var options;
var defaults = { method: 'post' };
FormData.prototype.submit = function(params, cb) {
var request
, options
, defaults = {method: 'post'}
;
// parse provided url if it's string or treat it as options object
if (typeof params === 'string') {
params = parseUrl(params); // eslint-disable-line no-param-reassign
/* eslint sort-keys: 0 */
// parse provided url if it's string
// or treat it as options object
if (typeof params == 'string') {
params = parseUrl(params);
options = populate({
port: params.port,
path: params.pathname,
host: params.hostname,
protocol: params.protocol
}, defaults);
} else { // use custom params
// use custom params
} else {
options = populate(params, defaults);
// if no port provided use default one
if (!options.port) {
options.port = options.protocol === 'https:' ? 443 : 80;
options.port = options.protocol == 'https:' ? 443 : 80;
}
}
@@ -37189,14 +37067,14 @@ FormData.prototype.submit = function (params, cb) {
options.headers = this.getHeaders(params.headers);
// https if specified, fallback to http in any other case
if (options.protocol === 'https:') {
if (options.protocol == 'https:') {
request = https.request(options);
} else {
request = http.request(options);
}
// get content length and fire away
this.getLength(function (err, length) {
this.getLength(function(err, length) {
if (err && err !== 'Unknown stream') {
this._error(err);
return;
@@ -37215,7 +37093,7 @@ FormData.prototype.submit = function (params, cb) {
request.removeListener('error', callback);
request.removeListener('response', onResponse);
return cb.call(this, error, responce); // eslint-disable-line no-invalid-this
return cb.call(this, error, responce);
};
onResponse = callback.bind(this, null);
@@ -37228,7 +37106,7 @@ FormData.prototype.submit = function (params, cb) {
return request;
};
FormData.prototype._error = function (err) {
FormData.prototype._error = function(err) {
if (!this.error) {
this.error = err;
this.pause();
@@ -37239,10 +37117,6 @@ FormData.prototype._error = function (err) {
FormData.prototype.toString = function () {
return '[object FormData]';
};
setToStringTag(FormData, 'FormData');
// Public API
module.exports = FormData;
/***/ }),
@@ -37250,13 +37124,12 @@ module.exports = FormData;
/***/ 2209:
/***/ ((module) => {
"use strict";
// populates missing values
module.exports = function (dst, src) {
Object.keys(src).forEach(function (prop) {
dst[prop] = dst[prop] || src[prop]; // eslint-disable-line no-param-reassign
module.exports = function(dst, src) {
Object.keys(src).forEach(function(prop)
{
dst[prop] = dst[prop] || src[prop];
});
return dst;
@@ -71380,10 +71253,6 @@ class RpcOutputStreamController {
cmp: [],
};
this._closed = false;
// --- RpcOutputStream async iterator API
// iterator state.
// is undefined when no iterator has been acquired yet.
this._itState = { q: [] };
}
// --- RpcOutputStream callback API
onNext(callback) {
@@ -71483,6 +71352,10 @@ class RpcOutputStreamController {
* messages are queued.
*/
[Symbol.asyncIterator]() {
// init the iterator state, enabling pushIt()
if (!this._itState) {
this._itState = { q: [] };
}
// if we are closed, we are definitely not receiving any more messages.
// but we can't let the iterator get stuck. we want to either:
// a) finish the new iterator immediately, because we are completed
@@ -71515,6 +71388,8 @@ class RpcOutputStreamController {
// this either resolves a pending promise, or enqueues the result.
pushIt(result) {
let state = this._itState;
if (!state)
return;
// is the consumer waiting for us?
if (state.p) {
// yes, consumer is waiting for this promise.
@@ -73426,7 +73301,6 @@ const reflection_equals_1 = __nccwpck_require__(4827);
const binary_writer_1 = __nccwpck_require__(3957);
const binary_reader_1 = __nccwpck_require__(2889);
const baseDescriptors = Object.getOwnPropertyDescriptors(Object.getPrototypeOf({}));
const messageTypeDescriptor = baseDescriptors[message_type_contract_1.MESSAGE_TYPE] = {};
/**
* This standard message type provides reflection-based
* operations to work with a message.
@@ -73437,8 +73311,7 @@ class MessageType {
this.typeName = name;
this.fields = fields.map(reflection_info_1.normalizeFieldInfo);
this.options = options !== null && options !== void 0 ? options : {};
messageTypeDescriptor.value = this;
this.messagePrototype = Object.create(null, baseDescriptors);
this.messagePrototype = Object.create(null, Object.assign(Object.assign({}, baseDescriptors), { [message_type_contract_1.MESSAGE_TYPE]: { value: this } }));
this.refTypeCheck = new reflection_type_check_1.ReflectionTypeCheck(this);
this.refJsonReader = new reflection_json_reader_1.ReflectionJsonReader(this);
this.refJsonWriter = new reflection_json_writer_1.ReflectionJsonWriter(this);
@@ -74955,16 +74828,12 @@ class ReflectionJsonReader {
target[localName] = field.T().internalJsonRead(jsonValue, options, target[localName]);
break;
case "enum":
if (jsonValue === null)
continue;
let val = this.enum(field.T(), jsonValue, field.name, options.ignoreUnknownFields);
if (val === false)
continue;
target[localName] = val;
break;
case "scalar":
if (jsonValue === null)
continue;
target[localName] = this.scalar(jsonValue, field.T, field.L, field.name);
break;
}
@@ -76399,7 +76268,7 @@ function expand(str, isTop) {
var isOptions = m.body.indexOf(',') >= 0;
if (!isSequence && !isOptions) {
// {a},b}
if (m.post.match(/,(?!,).*\}/)) {
if (m.post.match(/,.*\}/)) {
str = m.pre + '{' + m.body + escClose + m.post;
return expand(str);
}
@@ -76491,83 +76360,6 @@ function expand(str, isTop) {
/***/ }),
/***/ 2639:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var bind = __nccwpck_require__(7564);
var $apply = __nccwpck_require__(3945);
var $call = __nccwpck_require__(8093);
var $reflectApply = __nccwpck_require__(1330);
/** @type {import('./actualApply')} */
module.exports = $reflectApply || bind.call($call, $apply);
/***/ }),
/***/ 3945:
/***/ ((module) => {
"use strict";
/** @type {import('./functionApply')} */
module.exports = Function.prototype.apply;
/***/ }),
/***/ 8093:
/***/ ((module) => {
"use strict";
/** @type {import('./functionCall')} */
module.exports = Function.prototype.call;
/***/ }),
/***/ 8705:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var bind = __nccwpck_require__(7564);
var $TypeError = __nccwpck_require__(3314);
var $call = __nccwpck_require__(8093);
var $actualApply = __nccwpck_require__(2639);
/** @type {(args: [Function, thisArg?: unknown, ...args: unknown[]]) => Function} TODO FIXME, find a way to use import('.') */
module.exports = function callBindBasic(args) {
if (args.length < 1 || typeof args[0] !== 'function') {
throw new $TypeError('a function is required');
}
return $actualApply(bind, $call, args);
};
/***/ }),
/***/ 1330:
/***/ ((module) => {
"use strict";
/** @type {import('./reflectApply')} */
module.exports = typeof Reflect !== 'undefined' && Reflect && Reflect.apply;
/***/ }),
/***/ 5630:
@@ -76917,1004 +76709,6 @@ DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {
};
/***/ }),
/***/ 6669:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var callBind = __nccwpck_require__(8705);
var gOPD = __nccwpck_require__(3170);
var hasProtoAccessor;
try {
// eslint-disable-next-line no-extra-parens, no-proto
hasProtoAccessor = /** @type {{ __proto__?: typeof Array.prototype }} */ ([]).__proto__ === Array.prototype;
} catch (e) {
if (!e || typeof e !== 'object' || !('code' in e) || e.code !== 'ERR_PROTO_ACCESS') {
throw e;
}
}
// eslint-disable-next-line no-extra-parens
var desc = !!hasProtoAccessor && gOPD && gOPD(Object.prototype, /** @type {keyof typeof Object.prototype} */ ('__proto__'));
var $Object = Object;
var $getPrototypeOf = $Object.getPrototypeOf;
/** @type {import('./get')} */
module.exports = desc && typeof desc.get === 'function'
? callBind([desc.get])
: typeof $getPrototypeOf === 'function'
? /** @type {import('./get')} */ function getDunder(value) {
// eslint-disable-next-line eqeqeq
return $getPrototypeOf(value == null ? value : $Object(value));
}
: false;
/***/ }),
/***/ 9094:
/***/ ((module) => {
"use strict";
/** @type {import('.')} */
var $defineProperty = Object.defineProperty || false;
if ($defineProperty) {
try {
$defineProperty({}, 'a', { value: 1 });
} catch (e) {
// IE 8 has a broken defineProperty
$defineProperty = false;
}
}
module.exports = $defineProperty;
/***/ }),
/***/ 3056:
/***/ ((module) => {
"use strict";
/** @type {import('./eval')} */
module.exports = EvalError;
/***/ }),
/***/ 1620:
/***/ ((module) => {
"use strict";
/** @type {import('.')} */
module.exports = Error;
/***/ }),
/***/ 4585:
/***/ ((module) => {
"use strict";
/** @type {import('./range')} */
module.exports = RangeError;
/***/ }),
/***/ 6905:
/***/ ((module) => {
"use strict";
/** @type {import('./ref')} */
module.exports = ReferenceError;
/***/ }),
/***/ 105:
/***/ ((module) => {
"use strict";
/** @type {import('./syntax')} */
module.exports = SyntaxError;
/***/ }),
/***/ 3314:
/***/ ((module) => {
"use strict";
/** @type {import('./type')} */
module.exports = TypeError;
/***/ }),
/***/ 2578:
/***/ ((module) => {
"use strict";
/** @type {import('./uri')} */
module.exports = URIError;
/***/ }),
/***/ 5399:
/***/ ((module) => {
"use strict";
/** @type {import('.')} */
module.exports = Object;
/***/ }),
/***/ 8700:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var GetIntrinsic = __nccwpck_require__(8089);
var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
var hasToStringTag = __nccwpck_require__(5479)();
var hasOwn = __nccwpck_require__(4076);
var $TypeError = __nccwpck_require__(3314);
var toStringTag = hasToStringTag ? Symbol.toStringTag : null;
/** @type {import('.')} */
module.exports = function setToStringTag(object, value) {
var overrideIfSet = arguments.length > 2 && !!arguments[2] && arguments[2].force;
var nonConfigurable = arguments.length > 2 && !!arguments[2] && arguments[2].nonConfigurable;
if (
(typeof overrideIfSet !== 'undefined' && typeof overrideIfSet !== 'boolean')
|| (typeof nonConfigurable !== 'undefined' && typeof nonConfigurable !== 'boolean')
) {
throw new $TypeError('if provided, the `overrideIfSet` and `nonConfigurable` options must be booleans');
}
if (toStringTag && (overrideIfSet || !hasOwn(object, toStringTag))) {
if ($defineProperty) {
$defineProperty(object, toStringTag, {
configurable: !nonConfigurable,
enumerable: false,
value: value,
writable: false
});
} else {
object[toStringTag] = value; // eslint-disable-line no-param-reassign
}
}
};
/***/ }),
/***/ 9808:
/***/ ((module) => {
"use strict";
/* eslint no-invalid-this: 1 */
var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
var toStr = Object.prototype.toString;
var max = Math.max;
var funcType = '[object Function]';
var concatty = function concatty(a, b) {
var arr = [];
for (var i = 0; i < a.length; i += 1) {
arr[i] = a[i];
}
for (var j = 0; j < b.length; j += 1) {
arr[j + a.length] = b[j];
}
return arr;
};
var slicy = function slicy(arrLike, offset) {
var arr = [];
for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) {
arr[j] = arrLike[i];
}
return arr;
};
var joiny = function (arr, joiner) {
var str = '';
for (var i = 0; i < arr.length; i += 1) {
str += arr[i];
if (i + 1 < arr.length) {
str += joiner;
}
}
return str;
};
module.exports = function bind(that) {
var target = this;
if (typeof target !== 'function' || toStr.apply(target) !== funcType) {
throw new TypeError(ERROR_MESSAGE + target);
}
var args = slicy(arguments, 1);
var bound;
var binder = function () {
if (this instanceof bound) {
var result = target.apply(
this,
concatty(args, arguments)
);
if (Object(result) === result) {
return result;
}
return this;
}
return target.apply(
that,
concatty(args, arguments)
);
};
var boundLength = max(0, target.length - args.length);
var boundArgs = [];
for (var i = 0; i < boundLength; i++) {
boundArgs[i] = '$' + i;
}
bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder);
if (target.prototype) {
var Empty = function Empty() {};
Empty.prototype = target.prototype;
bound.prototype = new Empty();
Empty.prototype = null;
}
return bound;
};
/***/ }),
/***/ 7564:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var implementation = __nccwpck_require__(9808);
module.exports = Function.prototype.bind || implementation;
/***/ }),
/***/ 8089:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var undefined;
var $Object = __nccwpck_require__(5399);
var $Error = __nccwpck_require__(1620);
var $EvalError = __nccwpck_require__(3056);
var $RangeError = __nccwpck_require__(4585);
var $ReferenceError = __nccwpck_require__(6905);
var $SyntaxError = __nccwpck_require__(105);
var $TypeError = __nccwpck_require__(3314);
var $URIError = __nccwpck_require__(2578);
var abs = __nccwpck_require__(5641);
var floor = __nccwpck_require__(6171);
var max = __nccwpck_require__(7147);
var min = __nccwpck_require__(1017);
var pow = __nccwpck_require__(6947);
var round = __nccwpck_require__(2621);
var sign = __nccwpck_require__(156);
var $Function = Function;
// eslint-disable-next-line consistent-return
var getEvalledConstructor = function (expressionSyntax) {
try {
return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')();
} catch (e) {}
};
var $gOPD = __nccwpck_require__(3170);
var $defineProperty = __nccwpck_require__(9094);
var throwTypeError = function () {
throw new $TypeError();
};
var ThrowTypeError = $gOPD
? (function () {
try {
// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties
arguments.callee; // IE 8 does not throw here
return throwTypeError;
} catch (calleeThrows) {
try {
// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')
return $gOPD(arguments, 'callee').get;
} catch (gOPDthrows) {
return throwTypeError;
}
}
}())
: throwTypeError;
var hasSymbols = __nccwpck_require__(3336)();
var getProto = __nccwpck_require__(1967);
var $ObjectGPO = __nccwpck_require__(1311);
var $ReflectGPO = __nccwpck_require__(8681);
var $apply = __nccwpck_require__(3945);
var $call = __nccwpck_require__(8093);
var needsEval = {};
var TypedArray = typeof Uint8Array === 'undefined' || !getProto ? undefined : getProto(Uint8Array);
var INTRINSICS = {
__proto__: null,
'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,
'%Array%': Array,
'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,
'%ArrayIteratorPrototype%': hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined,
'%AsyncFromSyncIteratorPrototype%': undefined,
'%AsyncFunction%': needsEval,
'%AsyncGenerator%': needsEval,
'%AsyncGeneratorFunction%': needsEval,
'%AsyncIteratorPrototype%': needsEval,
'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,
'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,
'%BigInt64Array%': typeof BigInt64Array === 'undefined' ? undefined : BigInt64Array,
'%BigUint64Array%': typeof BigUint64Array === 'undefined' ? undefined : BigUint64Array,
'%Boolean%': Boolean,
'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,
'%Date%': Date,
'%decodeURI%': decodeURI,
'%decodeURIComponent%': decodeURIComponent,
'%encodeURI%': encodeURI,
'%encodeURIComponent%': encodeURIComponent,
'%Error%': $Error,
'%eval%': eval, // eslint-disable-line no-eval
'%EvalError%': $EvalError,
'%Float16Array%': typeof Float16Array === 'undefined' ? undefined : Float16Array,
'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,
'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,
'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,
'%Function%': $Function,
'%GeneratorFunction%': needsEval,
'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,
'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,
'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,
'%isFinite%': isFinite,
'%isNaN%': isNaN,
'%IteratorPrototype%': hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined,
'%JSON%': typeof JSON === 'object' ? JSON : undefined,
'%Map%': typeof Map === 'undefined' ? undefined : Map,
'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Map()[Symbol.iterator]()),
'%Math%': Math,
'%Number%': Number,
'%Object%': $Object,
'%Object.getOwnPropertyDescriptor%': $gOPD,
'%parseFloat%': parseFloat,
'%parseInt%': parseInt,
'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,
'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,
'%RangeError%': $RangeError,
'%ReferenceError%': $ReferenceError,
'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,
'%RegExp%': RegExp,
'%Set%': typeof Set === 'undefined' ? undefined : Set,
'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Set()[Symbol.iterator]()),
'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,
'%String%': String,
'%StringIteratorPrototype%': hasSymbols && getProto ? getProto(''[Symbol.iterator]()) : undefined,
'%Symbol%': hasSymbols ? Symbol : undefined,
'%SyntaxError%': $SyntaxError,
'%ThrowTypeError%': ThrowTypeError,
'%TypedArray%': TypedArray,
'%TypeError%': $TypeError,
'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,
'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,
'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,
'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,
'%URIError%': $URIError,
'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,
'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,
'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet,
'%Function.prototype.call%': $call,
'%Function.prototype.apply%': $apply,
'%Object.defineProperty%': $defineProperty,
'%Object.getPrototypeOf%': $ObjectGPO,
'%Math.abs%': abs,
'%Math.floor%': floor,
'%Math.max%': max,
'%Math.min%': min,
'%Math.pow%': pow,
'%Math.round%': round,
'%Math.sign%': sign,
'%Reflect.getPrototypeOf%': $ReflectGPO
};
if (getProto) {
try {
null.error; // eslint-disable-line no-unused-expressions
} catch (e) {
// https://github.com/tc39/proposal-shadowrealm/pull/384#issuecomment-1364264229
var errorProto = getProto(getProto(e));
INTRINSICS['%Error.prototype%'] = errorProto;
}
}
var doEval = function doEval(name) {
var value;
if (name === '%AsyncFunction%') {
value = getEvalledConstructor('async function () {}');
} else if (name === '%GeneratorFunction%') {
value = getEvalledConstructor('function* () {}');
} else if (name === '%AsyncGeneratorFunction%') {
value = getEvalledConstructor('async function* () {}');
} else if (name === '%AsyncGenerator%') {
var fn = doEval('%AsyncGeneratorFunction%');
if (fn) {
value = fn.prototype;
}
} else if (name === '%AsyncIteratorPrototype%') {
var gen = doEval('%AsyncGenerator%');
if (gen && getProto) {
value = getProto(gen.prototype);
}
}
INTRINSICS[name] = value;
return value;
};
var LEGACY_ALIASES = {
__proto__: null,
'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],
'%ArrayPrototype%': ['Array', 'prototype'],
'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],
'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],
'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],
'%ArrayProto_values%': ['Array', 'prototype', 'values'],
'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],
'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],
'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],
'%BooleanPrototype%': ['Boolean', 'prototype'],
'%DataViewPrototype%': ['DataView', 'prototype'],
'%DatePrototype%': ['Date', 'prototype'],
'%ErrorPrototype%': ['Error', 'prototype'],
'%EvalErrorPrototype%': ['EvalError', 'prototype'],
'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],
'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],
'%FunctionPrototype%': ['Function', 'prototype'],
'%Generator%': ['GeneratorFunction', 'prototype'],
'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],
'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],
'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],
'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],
'%JSONParse%': ['JSON', 'parse'],
'%JSONStringify%': ['JSON', 'stringify'],
'%MapPrototype%': ['Map', 'prototype'],
'%NumberPrototype%': ['Number', 'prototype'],
'%ObjectPrototype%': ['Object', 'prototype'],
'%ObjProto_toString%': ['Object', 'prototype', 'toString'],
'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],
'%PromisePrototype%': ['Promise', 'prototype'],
'%PromiseProto_then%': ['Promise', 'prototype', 'then'],
'%Promise_all%': ['Promise', 'all'],
'%Promise_reject%': ['Promise', 'reject'],
'%Promise_resolve%': ['Promise', 'resolve'],
'%RangeErrorPrototype%': ['RangeError', 'prototype'],
'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],
'%RegExpPrototype%': ['RegExp', 'prototype'],
'%SetPrototype%': ['Set', 'prototype'],
'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],
'%StringPrototype%': ['String', 'prototype'],
'%SymbolPrototype%': ['Symbol', 'prototype'],
'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],
'%TypedArrayPrototype%': ['TypedArray', 'prototype'],
'%TypeErrorPrototype%': ['TypeError', 'prototype'],
'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],
'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],
'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],
'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],
'%URIErrorPrototype%': ['URIError', 'prototype'],
'%WeakMapPrototype%': ['WeakMap', 'prototype'],
'%WeakSetPrototype%': ['WeakSet', 'prototype']
};
var bind = __nccwpck_require__(7564);
var hasOwn = __nccwpck_require__(4076);
var $concat = bind.call($call, Array.prototype.concat);
var $spliceApply = bind.call($apply, Array.prototype.splice);
var $replace = bind.call($call, String.prototype.replace);
var $strSlice = bind.call($call, String.prototype.slice);
var $exec = bind.call($call, RegExp.prototype.exec);
/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */
var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g;
var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */
var stringToPath = function stringToPath(string) {
var first = $strSlice(string, 0, 1);
var last = $strSlice(string, -1);
if (first === '%' && last !== '%') {
throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`');
} else if (last === '%' && first !== '%') {
throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`');
}
var result = [];
$replace(string, rePropName, function (match, number, quote, subString) {
result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;
});
return result;
};
/* end adaptation */
var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {
var intrinsicName = name;
var alias;
if (hasOwn(LEGACY_ALIASES, intrinsicName)) {
alias = LEGACY_ALIASES[intrinsicName];
intrinsicName = '%' + alias[0] + '%';
}
if (hasOwn(INTRINSICS, intrinsicName)) {
var value = INTRINSICS[intrinsicName];
if (value === needsEval) {
value = doEval(intrinsicName);
}
if (typeof value === 'undefined' && !allowMissing) {
throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
}
return {
alias: alias,
name: intrinsicName,
value: value
};
}
throw new $SyntaxError('intrinsic ' + name + ' does not exist!');
};
module.exports = function GetIntrinsic(name, allowMissing) {
if (typeof name !== 'string' || name.length === 0) {
throw new $TypeError('intrinsic name must be a non-empty string');
}
if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
throw new $TypeError('"allowMissing" argument must be a boolean');
}
if ($exec(/^%?[^%]*%?$/, name) === null) {
throw new $SyntaxError('`%` may not be present anywhere but at the beginning and end of the intrinsic name');
}
var parts = stringToPath(name);
var intrinsicBaseName = parts.length > 0 ? parts[0] : '';
var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);
var intrinsicRealName = intrinsic.name;
var value = intrinsic.value;
var skipFurtherCaching = false;
var alias = intrinsic.alias;
if (alias) {
intrinsicBaseName = alias[0];
$spliceApply(parts, $concat([0, 1], alias));
}
for (var i = 1, isOwn = true; i < parts.length; i += 1) {
var part = parts[i];
var first = $strSlice(part, 0, 1);
var last = $strSlice(part, -1);
if (
(
(first === '"' || first === "'" || first === '`')
|| (last === '"' || last === "'" || last === '`')
)
&& first !== last
) {
throw new $SyntaxError('property names with quotes must have matching quotes');
}
if (part === 'constructor' || !isOwn) {
skipFurtherCaching = true;
}
intrinsicBaseName += '.' + part;
intrinsicRealName = '%' + intrinsicBaseName + '%';
if (hasOwn(INTRINSICS, intrinsicRealName)) {
value = INTRINSICS[intrinsicRealName];
} else if (value != null) {
if (!(part in value)) {
if (!allowMissing) {
throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');
}
return void undefined;
}
if ($gOPD && (i + 1) >= parts.length) {
var desc = $gOPD(value, part);
isOwn = !!desc;
// By convention, when a data property is converted to an accessor
// property to emulate a data property that does not suffer from
// the override mistake, that accessor's getter is marked with
// an `originalValue` property. Here, when we detect this, we
// uphold the illusion by pretending to see that original data
// property, i.e., returning the value rather than the getter
// itself.
if (isOwn && 'get' in desc && !('originalValue' in desc.get)) {
value = desc.get;
} else {
value = value[part];
}
} else {
isOwn = hasOwn(value, part);
value = value[part];
}
if (isOwn && !skipFurtherCaching) {
INTRINSICS[intrinsicRealName] = value;
}
}
}
return value;
};
/***/ }),
/***/ 1311:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var $Object = __nccwpck_require__(5399);
/** @type {import('./Object.getPrototypeOf')} */
module.exports = $Object.getPrototypeOf || null;
/***/ }),
/***/ 8681:
/***/ ((module) => {
"use strict";
/** @type {import('./Reflect.getPrototypeOf')} */
module.exports = (typeof Reflect !== 'undefined' && Reflect.getPrototypeOf) || null;
/***/ }),
/***/ 1967:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var reflectGetProto = __nccwpck_require__(8681);
var originalGetProto = __nccwpck_require__(1311);
var getDunderProto = __nccwpck_require__(6669);
/** @type {import('.')} */
module.exports = reflectGetProto
? function getProto(O) {
// @ts-expect-error TS can't narrow inside a closure, for some reason
return reflectGetProto(O);
}
: originalGetProto
? function getProto(O) {
if (!O || (typeof O !== 'object' && typeof O !== 'function')) {
throw new TypeError('getProto: not an object');
}
// @ts-expect-error TS can't narrow inside a closure, for some reason
return originalGetProto(O);
}
: getDunderProto
? function getProto(O) {
// @ts-expect-error TS can't narrow inside a closure, for some reason
return getDunderProto(O);
}
: null;
/***/ }),
/***/ 1174:
/***/ ((module) => {
"use strict";
/** @type {import('./gOPD')} */
module.exports = Object.getOwnPropertyDescriptor;
/***/ }),
/***/ 3170:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
/** @type {import('.')} */
var $gOPD = __nccwpck_require__(1174);
if ($gOPD) {
try {
$gOPD([], 'length');
} catch (e) {
// IE 8 has a broken gOPD
$gOPD = null;
}
}
module.exports = $gOPD;
/***/ }),
/***/ 3336:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var origSymbol = typeof Symbol !== 'undefined' && Symbol;
var hasSymbolSham = __nccwpck_require__(1114);
/** @type {import('.')} */
module.exports = function hasNativeSymbols() {
if (typeof origSymbol !== 'function') { return false; }
if (typeof Symbol !== 'function') { return false; }
if (typeof origSymbol('foo') !== 'symbol') { return false; }
if (typeof Symbol('bar') !== 'symbol') { return false; }
return hasSymbolSham();
};
/***/ }),
/***/ 1114:
/***/ ((module) => {
"use strict";
/** @type {import('./shams')} */
/* eslint complexity: [2, 18], max-statements: [2, 33] */
module.exports = function hasSymbols() {
if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
if (typeof Symbol.iterator === 'symbol') { return true; }
/** @type {{ [k in symbol]?: unknown }} */
var obj = {};
var sym = Symbol('test');
var symObj = Object(sym);
if (typeof sym === 'string') { return false; }
if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }
// temp disabled per https://github.com/ljharb/object.assign/issues/17
// if (sym instanceof Symbol) { return false; }
// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
// if (!(symObj instanceof Symbol)) { return false; }
// if (typeof Symbol.prototype.toString !== 'function') { return false; }
// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }
var symVal = 42;
obj[sym] = symVal;
for (var _ in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop
if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }
if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }
var syms = Object.getOwnPropertySymbols(obj);
if (syms.length !== 1 || syms[0] !== sym) { return false; }
if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }
if (typeof Object.getOwnPropertyDescriptor === 'function') {
// eslint-disable-next-line no-extra-parens
var descriptor = /** @type {PropertyDescriptor} */ (Object.getOwnPropertyDescriptor(obj, sym));
if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
}
return true;
};
/***/ }),
/***/ 5479:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var hasSymbols = __nccwpck_require__(1114);
/** @type {import('.')} */
module.exports = function hasToStringTagShams() {
return hasSymbols() && !!Symbol.toStringTag;
};
/***/ }),
/***/ 4076:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var call = Function.prototype.call;
var $hasOwn = Object.prototype.hasOwnProperty;
var bind = __nccwpck_require__(7564);
/** @type {import('.')} */
module.exports = bind.call(call, $hasOwn);
/***/ }),
/***/ 5641:
/***/ ((module) => {
"use strict";
/** @type {import('./abs')} */
module.exports = Math.abs;
/***/ }),
/***/ 6171:
/***/ ((module) => {
"use strict";
/** @type {import('./floor')} */
module.exports = Math.floor;
/***/ }),
/***/ 7044:
/***/ ((module) => {
"use strict";
/** @type {import('./isNaN')} */
module.exports = Number.isNaN || function isNaN(a) {
return a !== a;
};
/***/ }),
/***/ 7147:
/***/ ((module) => {
"use strict";
/** @type {import('./max')} */
module.exports = Math.max;
/***/ }),
/***/ 1017:
/***/ ((module) => {
"use strict";
/** @type {import('./min')} */
module.exports = Math.min;
/***/ }),
/***/ 6947:
/***/ ((module) => {
"use strict";
/** @type {import('./pow')} */
module.exports = Math.pow;
/***/ }),
/***/ 2621:
/***/ ((module) => {
"use strict";
/** @type {import('./round')} */
module.exports = Math.round;
/***/ }),
/***/ 156:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var $isNaN = __nccwpck_require__(7044);
/** @type {import('./sign')} */
module.exports = function sign(number) {
if ($isNaN(number) || number === 0) {
return number;
}
return number < 0 ? -1 : +1;
};
/***/ }),
/***/ 9829:
@@ -89800,10 +88594,10 @@ exports.STATE_CACHE_MATCHED_KEY = exports.STATE_CACHE_KEY = void 0;
exports.restoreCache = restoreCache;
const cache = __importStar(__nccwpck_require__(5116));
const core = __importStar(__nccwpck_require__(7484));
const exec = __importStar(__nccwpck_require__(5236));
const hash_files_1 = __nccwpck_require__(9660);
const inputs_1 = __nccwpck_require__(9612);
const platforms_1 = __nccwpck_require__(8361);
const hash_files_1 = __nccwpck_require__(9660);
const exec = __importStar(__nccwpck_require__(5236));
exports.STATE_CACHE_KEY = "cache-key";
exports.STATE_CACHE_MATCHED_KEY = "cache-matched-key";
const CACHE_VERSION = "1";
@@ -89838,8 +88632,7 @@ async function computeKeys() {
const suffix = inputs_1.cacheSuffix ? `-${inputs_1.cacheSuffix}` : "";
const pythonVersion = await getPythonVersion();
const platform = await (0, platforms_1.getPlatform)();
const pruned = inputs_1.pruneCache ? "-pruned" : "";
return `setup-uv-${CACHE_VERSION}-${(0, platforms_1.getArch)()}-${platform}-${pythonVersion}${pruned}${cacheDependencyPathHash}${suffix}`;
return `setup-uv-${CACHE_VERSION}-${(0, platforms_1.getArch)()}-${platform}-${pythonVersion}${cacheDependencyPathHash}${suffix}`;
}
async function getPythonVersion() {
if (inputs_1.pythonVersion !== "") {
@@ -89847,15 +88640,15 @@ async function getPythonVersion() {
}
let output = "";
const options = {
silent: !core.isDebug(),
listeners: {
stdout: (data) => {
output += data.toString();
},
},
silent: !core.isDebug(),
};
try {
const execArgs = ["python", "find", "--directory", inputs_1.workingDirectory];
const execArgs = ["python", "find"];
await exec.exec("uv", execArgs, options);
const pythonPath = output.trim();
output = "";
@@ -89924,10 +88717,10 @@ var __importStar = (this && this.__importStar) || (function () {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.hashFiles = hashFiles;
const crypto = __importStar(__nccwpck_require__(7598));
const core = __importStar(__nccwpck_require__(7484));
const fs = __importStar(__nccwpck_require__(3024));
const stream = __importStar(__nccwpck_require__(7075));
const util = __importStar(__nccwpck_require__(7975));
const core = __importStar(__nccwpck_require__(7484));
const glob_1 = __nccwpck_require__(7206);
/**
* Hashes files matching the given glob pattern.
@@ -90010,10 +88803,10 @@ var __importStar = (this && this.__importStar) || (function () {
})();
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.run = run;
const fs = __importStar(__nccwpck_require__(3024));
const cache = __importStar(__nccwpck_require__(5116));
const core = __importStar(__nccwpck_require__(7484));
const exec = __importStar(__nccwpck_require__(5236));
const fs = __importStar(__nccwpck_require__(3024));
const restore_cache_1 = __nccwpck_require__(5391);
const inputs_1 = __nccwpck_require__(9612);
async function run() {
@@ -90121,36 +88914,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.addProblemMatchers = exports.manifestFile = exports.githubToken = exports.serverUrl = exports.toolDir = exports.toolBinDir = exports.ignoreEmptyWorkdir = exports.ignoreNothingToCache = exports.pruneCache = exports.cacheDependencyGlob = exports.cacheLocalPath = exports.cacheSuffix = exports.enableCache = exports.checkSum = exports.activateEnvironment = exports.pythonVersion = exports.versionFile = exports.version = exports.workingDirectory = void 0;
const node_path_1 = __importDefault(__nccwpck_require__(6760));
exports.githubToken = exports.toolDir = exports.toolBinDir = exports.ignoreEmptyWorkdir = exports.ignoreNothingToCache = exports.pruneCache = exports.cacheDependencyGlob = exports.cacheLocalPath = exports.cacheSuffix = exports.enableCache = exports.checkSum = exports.pythonVersion = exports.uvFile = exports.pyProjectFile = exports.version = void 0;
const core = __importStar(__nccwpck_require__(7484));
exports.workingDirectory = core.getInput("working-directory");
const node_path_1 = __importDefault(__nccwpck_require__(6760));
exports.version = core.getInput("version");
exports.versionFile = getVersionFile();
exports.pyProjectFile = core.getInput("pyproject-file");
exports.uvFile = core.getInput("uv-file");
exports.pythonVersion = core.getInput("python-version");
exports.activateEnvironment = core.getBooleanInput("activate-environment");
exports.checkSum = core.getInput("checksum");
exports.enableCache = getEnableCache();
exports.cacheSuffix = core.getInput("cache-suffix") || "";
exports.cacheLocalPath = getCacheLocalPath();
exports.cacheDependencyGlob = getCacheDependencyGlob();
exports.cacheDependencyGlob = core.getInput("cache-dependency-glob");
exports.pruneCache = core.getInput("prune-cache") === "true";
exports.ignoreNothingToCache = core.getInput("ignore-nothing-to-cache") === "true";
exports.ignoreEmptyWorkdir = core.getInput("ignore-empty-workdir") === "true";
exports.toolBinDir = getToolBinDir();
exports.toolDir = getToolDir();
exports.serverUrl = core.getInput("server-url");
exports.githubToken = core.getInput("github-token");
exports.manifestFile = getManifestFile();
exports.addProblemMatchers = core.getInput("add-problem-matchers") === "true";
function getVersionFile() {
const versionFileInput = core.getInput("version-file");
if (versionFileInput !== "") {
const tildeExpanded = expandTilde(versionFileInput);
return resolveRelativePath(tildeExpanded);
}
return versionFileInput;
}
function getEnableCache() {
const enableCacheInput = core.getInput("enable-cache");
if (enableCacheInput === "auto") {
@@ -90161,8 +88942,7 @@ function getEnableCache() {
function getToolBinDir() {
const toolBinDirInput = core.getInput("tool-bin-dir");
if (toolBinDirInput !== "") {
const tildeExpanded = expandTilde(toolBinDirInput);
return resolveRelativePath(tildeExpanded);
return expandTilde(toolBinDirInput);
}
if (process.platform === "win32") {
if (process.env.RUNNER_TEMP !== undefined) {
@@ -90175,8 +88955,7 @@ function getToolBinDir() {
function getToolDir() {
const toolDirInput = core.getInput("tool-dir");
if (toolDirInput !== "") {
const tildeExpanded = expandTilde(toolDirInput);
return resolveRelativePath(tildeExpanded);
return expandTilde(toolDirInput);
}
if (process.platform === "win32") {
if (process.env.RUNNER_TEMP !== undefined) {
@@ -90189,31 +88968,12 @@ function getToolDir() {
function getCacheLocalPath() {
const cacheLocalPathInput = core.getInput("cache-local-path");
if (cacheLocalPathInput !== "") {
const tildeExpanded = expandTilde(cacheLocalPathInput);
return resolveRelativePath(tildeExpanded);
return expandTilde(cacheLocalPathInput);
}
if (process.env.RUNNER_ENVIRONMENT === "github-hosted") {
if (process.env.RUNNER_TEMP !== undefined) {
return `${process.env.RUNNER_TEMP}${node_path_1.default.sep}setup-uv-cache`;
}
throw Error("Could not determine UV_CACHE_DIR. Please make sure RUNNER_TEMP is set or provide the cache-local-path input");
if (process.env.RUNNER_TEMP !== undefined) {
return `${process.env.RUNNER_TEMP}${node_path_1.default.sep}setup-uv-cache`;
}
if (process.platform === "win32") {
return `${process.env.APPDATA}${node_path_1.default.sep}uv${node_path_1.default.sep}cache`;
}
return `${process.env.HOME}${node_path_1.default.sep}.cache${node_path_1.default.sep}uv`;
}
function getCacheDependencyGlob() {
const cacheDependencyGlobInput = core.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;
throw Error("Could not determine UV_CACHE_DIR. Please make sure RUNNER_TEMP is set or provide the cache-local-path input");
}
function expandTilde(input) {
if (input.startsWith("~")) {
@@ -90221,20 +88981,6 @@ function expandTilde(input) {
}
return input;
}
function resolveRelativePath(inputPath) {
const hasNegation = inputPath.startsWith("!");
const pathWithoutNegation = hasNegation ? inputPath.substring(1) : inputPath;
const resolvedPath = node_path_1.default.resolve(exports.workingDirectory, pathWithoutNegation);
core.debug(`Resolving relative path ${inputPath} to ${hasNegation ? "!" : ""}${resolvedPath}`);
return hasNegation ? `!${resolvedPath}` : resolvedPath;
}
function getManifestFile() {
const manifestFileInput = core.getInput("manifest-file");
if (manifestFileInput !== "") {
return manifestFileInput;
}
return undefined;
}
/***/ }),
@@ -90280,16 +89026,16 @@ var __importStar = (this && this.__importStar) || (function () {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getArch = getArch;
exports.getPlatform = getPlatform;
const core = __importStar(__nccwpck_require__(7484));
const exec = __importStar(__nccwpck_require__(5236));
const core = __importStar(__nccwpck_require__(7484));
function getArch() {
const arch = process.arch;
const archMapping = {
arm64: "aarch64",
ia32: "i686",
ppc64: "powerpc64le",
s390x: "s390x",
x64: "x86_64",
arm64: "aarch64",
s390x: "s390x",
ppc64: "powerpc64le",
};
if (arch in archMapping) {
return archMapping[arch];
@@ -90298,8 +89044,8 @@ function getArch() {
async function getPlatform() {
const processPlatform = process.platform;
const platformMapping = {
darwin: "apple-darwin",
linux: "unknown-linux-gnu",
darwin: "apple-darwin",
win32: "pc-windows-msvc",
};
if (processPlatform in platformMapping) {
@@ -90315,16 +89061,16 @@ async function isMuslOs() {
let stdOutput = "";
let errOutput = "";
const options = {
ignoreReturnCode: true,
silent: !core.isDebug(),
listeners: {
stderr: (data) => {
errOutput += data.toString();
},
stdout: (data) => {
stdOutput += data.toString();
},
stderr: (data) => {
errOutput += data.toString();
},
},
silent: !core.isDebug(),
ignoreReturnCode: true,
};
try {
const execArgs = ["--version"];
@@ -92250,7 +90996,7 @@ module.exports = parseParams
/***/ ((module) => {
"use strict";
module.exports = /*#__PURE__*/JSON.parse('{"name":"@actions/cache","version":"4.0.5","preview":true,"description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","main":"lib/cache.js","types":"lib/cache.d.ts","directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^1.11.1","@actions/exec":"^1.0.1","@actions/glob":"^0.1.0","@protobuf-ts/runtime-rpc":"^2.11.1","@actions/http-client":"^2.1.1","@actions/io":"^1.0.1","@azure/abort-controller":"^1.1.0","@azure/ms-rest-js":"^2.6.0","@azure/storage-blob":"^12.13.0","semver":"^6.3.1"},"devDependencies":{"@types/node":"^22.13.9","@types/semver":"^6.0.0","@protobuf-ts/plugin":"^2.9.4","typescript":"^5.2.2"}}');
module.exports = /*#__PURE__*/JSON.parse('{"name":"@actions/cache","version":"4.0.2","preview":true,"description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","main":"lib/cache.js","types":"lib/cache.d.ts","directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^1.11.1","@actions/exec":"^1.0.1","@actions/glob":"^0.1.0","@actions/http-client":"^2.1.1","@actions/io":"^1.0.1","@azure/abort-controller":"^1.1.0","@azure/ms-rest-js":"^2.6.0","@azure/storage-blob":"^12.13.0","@protobuf-ts/plugin":"^2.9.4","semver":"^6.3.1"},"devDependencies":{"@types/semver":"^6.0.0","typescript":"^5.2.2"}}');
/***/ }),

8585
dist/setup/index.js generated vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

7252
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -6,12 +6,14 @@
"main": "dist/index.js",
"scripts": {
"build": "tsc",
"check": "biome check --write",
"package": "ncc build -o dist/setup src/setup-uv.ts && ncc build -o dist/save-cache src/save-cache.ts && ncc build -o dist/update-known-versions src/update-known-versions.ts",
"format": "biome format --fix",
"format-check": "biome format",
"lint": "biome lint --fix",
"package": "ncc build -o dist/setup src/setup-uv.ts && ncc build -o dist/save-cache src/save-cache.ts && ncc build -o dist/update-known-checksums src/update-known-checksums.ts",
"test": "jest",
"act": "act pull_request -W .github/workflows/test.yml --container-architecture linux/amd64 -s GITHUB_TOKEN=\"$(gh auth token)\"",
"update-known-versions": "RUNNER_TEMP=known_versions node dist/update-known-versions/index.js src/download/checksum/known-versions.ts \"$(gh auth token)\"",
"all": "npm run build && npm run check && npm run package && npm test"
"update-known-checksums": "RUNNER_TEMP=known_checksums node dist/update-known-checksums/index.js src/download/checksum/known-checksums.ts \"$(gh auth token)\"",
"all": "npm run build && npm run format && npm run lint && npm run package && npm test"
},
"repository": {
"type": "git",
@@ -21,28 +23,26 @@
"author": "@eifinger",
"license": "MIT",
"dependencies": {
"@actions/cache": "^4.0.5",
"@actions/cache": "^4.0.2",
"@actions/core": "^1.11.1",
"@actions/exec": "^1.1.1",
"@actions/glob": "^0.5.0",
"@actions/io": "^1.1.3",
"@actions/tool-cache": "^2.0.2",
"@octokit/core": "^7.0.3",
"@octokit/plugin-paginate-rest": "^13.1.1",
"@octokit/plugin-rest-endpoint-methods": "^16.0.0",
"@renovatebot/pep440": "^4.2.0",
"smol-toml": "^1.4.2",
"undici": "^7.15.0"
"@octokit/core": "^6.1.4",
"@octokit/plugin-paginate-rest": "^11.4.3",
"@octokit/plugin-rest-endpoint-methods": "^13.3.1",
"undici": "^7.5.0",
"smol-toml": "^1.3.1"
},
"devDependencies": {
"@biomejs/biome": "2.2.2",
"@types/js-yaml": "^4.0.9",
"@types/node": "^24.3.0",
"@types/semver": "^7.7.0",
"@biomejs/biome": "1.9.4",
"@types/node": "^22.13.10",
"@types/semver": "^7.5.8",
"@vercel/ncc": "^0.38.3",
"jest": "^30.1.1",
"jest": "^29.7.0",
"js-yaml": "^4.1.0",
"ts-jest": "^29.4.1",
"typescript": "^5.9.2"
"ts-jest": "^29.2.6",
"typescript": "^5.8.2"
}
}

View File

@@ -1,16 +1,14 @@
import * as cache from "@actions/cache";
import * as core from "@actions/core";
import * as exec from "@actions/exec";
import { hashFiles } from "../hash/hash-files";
import {
cacheDependencyGlob,
cacheLocalPath,
cacheSuffix,
pruneCache,
pythonVersion as pythonVersionInput,
workingDirectory,
} from "../utils/inputs";
import { getArch, getPlatform } from "../utils/platforms";
import { hashFiles } from "../hash/hash-files";
import * as exec from "@actions/exec";
export const STATE_CACHE_KEY = "cache-key";
export const STATE_CACHE_MATCHED_KEY = "cache-matched-key";
@@ -56,8 +54,7 @@ async function computeKeys(): Promise<string> {
const suffix = cacheSuffix ? `-${cacheSuffix}` : "";
const pythonVersion = await getPythonVersion();
const platform = await getPlatform();
const pruned = pruneCache ? "-pruned" : "";
return `setup-uv-${CACHE_VERSION}-${getArch()}-${platform}-${pythonVersion}${pruned}${cacheDependencyPathHash}${suffix}`;
return `setup-uv-${CACHE_VERSION}-${getArch()}-${platform}-${pythonVersion}${cacheDependencyPathHash}${suffix}`;
}
async function getPythonVersion(): Promise<string> {
@@ -67,16 +64,16 @@ async function getPythonVersion(): Promise<string> {
let output = "";
const options: exec.ExecOptions = {
silent: !core.isDebug(),
listeners: {
stdout: (data: Buffer) => {
output += data.toString();
},
},
silent: !core.isDebug(),
};
try {
const execArgs = ["python", "find", "--directory", workingDirectory];
const execArgs = ["python", "find"];
await exec.exec("uv", execArgs, options);
const pythonPath = output.trim();

View File

@@ -1,9 +1,9 @@
import * as crypto from "node:crypto";
import * as fs from "node:fs";
import * as crypto from "node:crypto";
import * as core from "@actions/core";
import type { Architecture, Platform } from "../../utils/platforms";
import { KNOWN_CHECKSUMS } from "./known-checksums";
import type { Architecture, Platform } from "../../utils/platforms";
export async function validateChecksum(
checkSum: string | undefined,
@@ -12,7 +12,7 @@ export async function validateChecksum(
platform: Platform,
version: string,
): Promise<void> {
let isValid: boolean | undefined;
let isValid: boolean | undefined = undefined;
if (checkSum !== undefined && checkSum !== "") {
isValid = await validateFileCheckSum(downloadPath, checkSum);
} else {

View File

@@ -1,1721 +1,5 @@
// AUTOGENERATED_DO_NOT_EDIT
export const KNOWN_CHECKSUMS: { [key: string]: string } = {
"aarch64-apple-darwin-0.8.14":
"281ea18a5778099f7edeee0a7b20671d14918782de153604c939486f2b8a2791",
"aarch64-pc-windows-msvc-0.8.14":
"d7fef1d1d0b0f8e0aa94391376fe5fb95f0e213ef7ee1c498c287fe0ea76f886",
"aarch64-unknown-linux-gnu-0.8.14":
"69616218470b2ad053617efb9e7027b1518ea38918d933c2791e113d99cec507",
"aarch64-unknown-linux-musl-0.8.14":
"d492d433d8ea87a4051c3f071ed04f13f8f001aa782e2e8192eaa5143e9a6f39",
"arm-unknown-linux-musleabihf-0.8.14":
"ef6a51cc1808de75969e2719420464d494bb5932d18ebf3ac07df7a5ab27b16a",
"armv7-unknown-linux-gnueabihf-0.8.14":
"75c77b40c39dd526f88f5119d686e44d95c10cece436e4306f0db32b94d91716",
"armv7-unknown-linux-musleabihf-0.8.14":
"33a15d40d407323a516edabdc4eb33bbefc04e17d40769a04bfc15605d2eee1e",
"i686-pc-windows-msvc-0.8.14":
"b43c5703cdfb15c019b04cad2ef19034a91e8a0872ae2d674d366dfc0a755124",
"i686-unknown-linux-gnu-0.8.14":
"d49a796d569b010d43eeb8d9259f1a12fa910176b076c04c13609648973f428e",
"i686-unknown-linux-musl-0.8.14":
"cee58d8fe55f59a0869039f83875ee44a4a12b3b3f1f1f5a2bdc68968e449f54",
"powerpc64-unknown-linux-gnu-0.8.14":
"f118e642a7e360384a0277980986cea4857cc2d90364d58865d941c6b8abfcd1",
"powerpc64le-unknown-linux-gnu-0.8.14":
"c411e63edd125283641420bb4be830872be269451756de2095aebc3ca8b0277a",
"riscv64gc-unknown-linux-gnu-0.8.14":
"1bb13f9d1a3e55dcea09f3b99b35ec0fbd3428276311b068268b07cd07c5b067",
"s390x-unknown-linux-gnu-0.8.14":
"8643d6ab3513ab4adc3ffb56c39813651725d047ee6af5de3ae1fd0e4975c364",
"x86_64-apple-darwin-0.8.14":
"567d98b0c541a68df8aaa2c3214242c4070068b2edaea1be376a4c0fa348bdf1",
"x86_64-pc-windows-msvc-0.8.14":
"3f68ab95d2856e6b238e0e3f4255a723ccdc2cf1d4b8e53f5a4f5a47b645dc72",
"x86_64-unknown-linux-gnu-0.8.14":
"954add045f29f93191523175e4aea066996840e86c1b6339dee25f48b15b5ddb",
"x86_64-unknown-linux-musl-0.8.14":
"e018287fb321c3c633df2b622c2cf53042caa5c4c43a4ca6431bcb38e0685fa4",
"aarch64-apple-darwin-0.8.13":
"c3eddc0e314abb8588f1cdf312f0b060d79e1906eff8f43b64a05ff5e2727872",
"aarch64-pc-windows-msvc-0.8.13":
"5b3a80d385d26fb9f63579a0712d020ec413ada38a6900e88fdfd41b58795b7e",
"aarch64-unknown-linux-gnu-0.8.13":
"3bb77b764618f65a969da063d1c4a507d8de5360ca2858f771cab109fa879a4d",
"aarch64-unknown-linux-musl-0.8.13":
"40ba6e62de35820e8460eacee2b5b8f4add70a834d3859f7a60cdfc6b19ab599",
"arm-unknown-linux-musleabihf-0.8.13":
"f108a49a17b0700d7121b0215575f96c46a203774ed80ef40544005d7af74a67",
"armv7-unknown-linux-gnueabihf-0.8.13":
"730d8ef57f221ecc572d47b227ecbd8261be08157efb351311f7bc1f6c1c944a",
"armv7-unknown-linux-musleabihf-0.8.13":
"b78dacab7c2fb352301d8997c0c705c3959a4e44d7b3afe670aee2397a2c9ab3",
"i686-pc-windows-msvc-0.8.13":
"08482edef8b077e12e73f76e6b4bb0300c054b8009cfac5cc354297f47d24623",
"i686-unknown-linux-gnu-0.8.13":
"0ce384911d4af9007576ceba2557c5d474a953ced34602ee4e09bd888cee13c0",
"i686-unknown-linux-musl-0.8.13":
"b6462dc8190c7a1eafa74287d8ff213764baa49e098aeeb522fa479d29e1c0bf",
"powerpc64-unknown-linux-gnu-0.8.13":
"9a8e8a8927df9fa39af79214ab1acfc227dba9d9e690a424cef1dc17296161a8",
"powerpc64le-unknown-linux-gnu-0.8.13":
"4880a8e2ba5086e7ed4bd3aecfdae5e353da569ddaac02cd3db598b4c8e77193",
"riscv64gc-unknown-linux-gnu-0.8.13":
"0cd68055cedbc5b1194e7e7ab2b35ac7aa1d835c586fb3778c7acb0e8a8ac822",
"s390x-unknown-linux-gnu-0.8.13":
"8cc2e70bee35c9e437c2308f130b79acc0d7c43e710296990ed76e702e220912",
"x86_64-apple-darwin-0.8.13":
"b799253441726351bc60c2e91254a821001e5e2e22a0e2b077d8983f583e8139",
"x86_64-pc-windows-msvc-0.8.13":
"60870fa18d438737088e533ed06617549e42531c522cc9a8fe4455d8e745dc29",
"x86_64-unknown-linux-gnu-0.8.13":
"8ca3db7b2a3199171cfc0870be1f819cb853ddcec29a5fa28dae30278922b7ba",
"x86_64-unknown-linux-musl-0.8.13":
"38ade73396b48fce89d9d1cb8a7e8f02b6e18a2d87467525ee8fb7e09899f70d",
"aarch64-apple-darwin-0.8.12":
"a3f78d20465c6d18f7072f118ce1c61b164b98698fdc37357e72958c7d1b68fd",
"aarch64-pc-windows-msvc-0.8.12":
"eb0c7e47411d11cbc3990eef51a5e10215a1fc9d5f5058fd8e952da94be16512",
"aarch64-unknown-linux-gnu-0.8.12":
"9a8a53df515bd64d423c85ace7ddca08fb9a91d8a115934c4495b5cf74c60ea6",
"aarch64-unknown-linux-musl-0.8.12":
"de85bafc3e238a4fce87eb6a4e584c9c04721475abb9e5f6fe186bdce650763f",
"arm-unknown-linux-musleabihf-0.8.12":
"5fe2f13d8c62d410278fbd69b0c1f03be5bd2c40168a98dc8fc82bca64c2eaad",
"armv7-unknown-linux-gnueabihf-0.8.12":
"6ddde49d5fcc04a90855f31b5cb500146dac23f31d16f6d7fa7da1ae481eab1e",
"armv7-unknown-linux-musleabihf-0.8.12":
"39b626f438c22a3122546445d581fe02b6fc449649b4890f44791af4f3d3c18b",
"i686-pc-windows-msvc-0.8.12":
"97e0e04648e48cccdd25210f5eaf6fb2d46f1a198983b7de10613faf1629663d",
"i686-unknown-linux-gnu-0.8.12":
"74484899512bb91ed4bd64d117284c20912c39c600cc775d6ef1bf278d6c2a94",
"i686-unknown-linux-musl-0.8.12":
"b1e303c231068a3a419b12d3ba4dc852931740ab3ad691c7a87309327eac732f",
"powerpc64-unknown-linux-gnu-0.8.12":
"455bd841952724bff1f45dad91555ce2a33c837cc8d734ca39afaa0ac3c8385d",
"powerpc64le-unknown-linux-gnu-0.8.12":
"30f1191e997d8d2845b27f57ce30e8d3643994161b7d099caf81fde22d723fa6",
"riscv64gc-unknown-linux-gnu-0.8.12":
"1e9e7ca966999161ef5174d28a18777d2a143c081a63d455f5b7fd5a1513d2e7",
"s390x-unknown-linux-gnu-0.8.12":
"55ec25ef06c1e0c095f2baa1a12ce38879db8db99a4b046286a9573dd3c605d5",
"x86_64-apple-darwin-0.8.12":
"467b462e854bc750fcad8e3ad35e2aca0d301c9287f2365afad8c17b7672b6a8",
"x86_64-pc-windows-msvc-0.8.12":
"3fb92ce0860db7cb094ddeeb1ac521532fdd3e61d0a130f7bbc6be54caca7c2e",
"x86_64-unknown-linux-gnu-0.8.12":
"f976ebdc612e71209f46664ab6c0325fa0090059b4474e047edd39eb9395373b",
"x86_64-unknown-linux-musl-0.8.12":
"fa682c444b8a57a0984129d0989801fb0406f9238a57df76fdde063c6b2339c2",
"aarch64-apple-darwin-0.8.11":
"c9e74f779a65798057bca2ff328d5c9952f458391e220c3d3216d7a03a338d9f",
"aarch64-pc-windows-msvc-0.8.11":
"09c6cc8c511d166dc12c9e56ce06c92de928a2e5bad14fc079654901dc8ea114",
"aarch64-unknown-linux-gnu-0.8.11":
"472dbebd1369049e58d3bbeaae663b212e691676cfd15d799e4faca616d37264",
"aarch64-unknown-linux-musl-0.8.11":
"1c6045bec4d5ca17777dd271401a0407c5acad79f74fd38f35c31ca64c689808",
"arm-unknown-linux-musleabihf-0.8.11":
"84da6bfdf9ee693c7278770e1d16d0d5e3ba5ea8f913d7fed13e9854aad95e31",
"armv7-unknown-linux-gnueabihf-0.8.11":
"a27bb0ae23d0584f1a6a7f851362cb52687bbd22ecce37cc80f3eeca0925dac4",
"armv7-unknown-linux-musleabihf-0.8.11":
"29605e9724eb7c68bc67892b4d8bcc28d03c1cb1125cb3dd783e81dd61cc15b5",
"i686-pc-windows-msvc-0.8.11":
"17e45a6afa19443a9749668540a033e9fedd3d6bec1ad8952d10da1f40ed9e92",
"i686-unknown-linux-gnu-0.8.11":
"85fb818676480ac0cc0f7219e4fd96667d851790c4dd054dc84f304128d88817",
"i686-unknown-linux-musl-0.8.11":
"194bc103af40c2a15b0a2e86e5eaad53a5219243df8e296d98e9c6269f67e0b3",
"powerpc64-unknown-linux-gnu-0.8.11":
"fde3e344ee3ef3eabc4803a27a05f06b082819d09153ec126b09f93882e54082",
"powerpc64le-unknown-linux-gnu-0.8.11":
"a1de2c76674c5566e27f8a5b8868b4f416ec659ad657aa87ccc2d17f9cfeaac5",
"riscv64gc-unknown-linux-gnu-0.8.11":
"c068fe0b27b7b91d79c3505fcca16ea8dc2df499e6420877bd5cf75b26f5304f",
"s390x-unknown-linux-gnu-0.8.11":
"e4d8ee92b9e20a7713cf7a9f7d7b288d9d726e7e96d874aaa20e3acc1d408287",
"x86_64-apple-darwin-0.8.11":
"7ed76b0cc314fa0cb6dd7ae99379efd3cf8fc14d71af8d71b0b5238582c7958d",
"x86_64-pc-windows-msvc-0.8.11":
"3e802b69307b10f228c8f1d096bd5721ac37a133bf33672f9fcc46a58dd5c920",
"x86_64-unknown-linux-gnu-0.8.11":
"0c6078318332c100d7d9988ea99144b534e40adef2958aa314a9f7c7b8516ed7",
"x86_64-unknown-linux-musl-0.8.11":
"0c66f4d06a4f933bddf75d4ad64e0e2d717f015ba1876c51e32ff293c84f57d5",
"aarch64-apple-darwin-0.8.10":
"5200278ae00b5c0822a7db7a99376b2167e8e9391b29c3de22f9e4fdebc9c0e8",
"aarch64-pc-windows-msvc-0.8.10":
"c51b02188c312baef71187273afa625576101e5680739eab83b1b09ca5d2f3a8",
"aarch64-unknown-linux-gnu-0.8.10":
"de60f5e3d69b54e6196fb8937fef4feb15e239f0fd14278e77e44dbb353214ae",
"aarch64-unknown-linux-musl-0.8.10":
"704f202ca92386eaa095706ec7e26c4f052f7e17721767d4ee18c676565c51b1",
"arm-unknown-linux-musleabihf-0.8.10":
"51d1244dd7f23d8aa021fa4d2a662a3727b27241e0ceb6f11820cb495611965f",
"armv7-unknown-linux-gnueabihf-0.8.10":
"ce22ffada0356570f63ad0aae096226f1c45c3d561023b3fb2b1f0936f2b804c",
"armv7-unknown-linux-musleabihf-0.8.10":
"9ee0a14ec4fa263095bae4da329602f7735d914db4ad59079b47d714bfb95409",
"i686-pc-windows-msvc-0.8.10":
"e62a2549135b4b9474c18e7bc9f0937837012dd9039f6b4b2c109a1cf99ad925",
"i686-unknown-linux-gnu-0.8.10":
"cdd36af87ca53ec6b8cc4507e85c9ca54c40fd77613633a1095a1a2f317a0563",
"i686-unknown-linux-musl-0.8.10":
"658f14b093e3bf4ffcad645fe27d7aa2f8f18a6f625a22a246288c6368a4d88f",
"powerpc64-unknown-linux-gnu-0.8.10":
"f16d77cfca0dfca2bcef7cc556e0316ba5fdc61b1c3387d60b7c40e12f6617dd",
"powerpc64le-unknown-linux-gnu-0.8.10":
"00bc1b47078520c588dbd383700d35c786ac2fa3e53c9fca51c5410581f8c87e",
"riscv64gc-unknown-linux-gnu-0.8.10":
"db605bb442563f0494c174be639b9d80fcc4e27e360a31ad2675005ea1a1e3ab",
"s390x-unknown-linux-gnu-0.8.10":
"83ca774828d652ce9dd1d6e2619e66c471e2cb236754783019b9ae0f4da72718",
"x86_64-apple-darwin-0.8.10":
"3b935381af9124a5d5da48235e149f5f0662f2717e75782d1b843d39d9265d6d",
"x86_64-pc-windows-msvc-0.8.10":
"37fcd011fd22b2a569f7e583a924af2d624d99445f669752923a2fd3841f8e3d",
"x86_64-unknown-linux-gnu-0.8.10":
"2c4392591fe9469d006452ef22f32712f35087d87fb1764ec03e23544eb8770d",
"x86_64-unknown-linux-musl-0.8.10":
"4031c6f7ac3890f29c72e0ea655add58b8fa1c678d20afcf57efa51e57751732",
"aarch64-apple-darwin-0.8.9":
"c233bee389c15fdef09a6028db61cc54a12e6171f27d6d9c018eedca5bbbd011",
"aarch64-pc-windows-msvc-0.8.9":
"7dc9b954e236f842c2120bdb50307f23104ca20a52896c7ae0ea0100904b2aed",
"aarch64-unknown-linux-gnu-0.8.9":
"03108a851cb87ce44069767e0ae7907d9a31180bdd64913852fcde25848d84f2",
"aarch64-unknown-linux-musl-0.8.9":
"fb1f2800bfd0bc9a121269e276653899c726d81cd08d6299f0fb34b4b0d61fcf",
"arm-unknown-linux-musleabihf-0.8.9":
"9a73ca16557efd21d4dad17759261c6f93eb4079a95bb39c578998ad787ee871",
"armv7-unknown-linux-gnueabihf-0.8.9":
"a6be2240c8bf070baaed8ee0a9071fe5f33b2fad55f67d39fcdc8ea720ff668a",
"armv7-unknown-linux-musleabihf-0.8.9":
"758bf39e33d3162fe6ec7bd5f359cc78daf8ce46b2300dec6c31f37b705521f9",
"i686-pc-windows-msvc-0.8.9":
"25988dae5e7698de1a6ff4bf08ed336d138710ee52f52de60859b99acf2bc96b",
"i686-unknown-linux-gnu-0.8.9":
"02a140e4d0af8d469ec088eff51ed9b232c76cfa02d4df0b84b7567c2d6ab95e",
"i686-unknown-linux-musl-0.8.9":
"99fa13e9079901365277b9b409a2892afe2efb0260f940388cadb2d56d706766",
"powerpc64-unknown-linux-gnu-0.8.9":
"604102c2bf07fbb3cc26bcb6b95e60cac55d74b4e21f1cee4b2d5f58930aa5cf",
"powerpc64le-unknown-linux-gnu-0.8.9":
"8ab18629d8a71a4188761e4e2b0eca0970690f13c85697ad232fe8b22e8d5a99",
"riscv64gc-unknown-linux-gnu-0.8.9":
"757944803901c5ca4049147e28e429e34c04d5ac5fe78728396ec4b810063b00",
"s390x-unknown-linux-gnu-0.8.9":
"b78f56186edfed8f117ed1fa09fc59ad9932864ae4e655ae61f3e205846c7ced",
"x86_64-apple-darwin-0.8.9":
"27fe8645c2599b672c3a6c865131a3d916eed9a3ba7cff5a0b863e01a473df66",
"x86_64-pc-windows-msvc-0.8.9":
"b08d68a0d86e4d0d1b5fa439ffa73ac90df2305c595f617ba9d9b5e8740a8efb",
"x86_64-unknown-linux-gnu-0.8.9":
"1056ab7c04bf9030dc0623c260fae0b414675775f333f318918000f667da6ee1",
"x86_64-unknown-linux-musl-0.8.9":
"6bb907345f9100978d3529c8a5b2cbb4e831080909c51a5bff714b491251303e",
"aarch64-apple-darwin-0.8.8":
"9de9365997d7579d27cdbc132883343b3c47add16804f11be679375037dec33a",
"aarch64-pc-windows-msvc-0.8.8":
"3029df83f2b40d2fa0cc896aed8a157afd02e8ce767064d80923e166e46b75ce",
"aarch64-unknown-linux-gnu-0.8.8":
"4e144807bef9a3b6f44fd5e4084d5010738787745c07e09dee4f008e8bee17a8",
"aarch64-unknown-linux-musl-0.8.8":
"fb7785d31a64f416ef67292ba3717781ef4eb1d6f93b6e30715d9127e862de2b",
"arm-unknown-linux-musleabihf-0.8.8":
"fb8ea8fa543322b4901b5acc585e1373dafd996d9aadce7d0c00c00ad36f2cdd",
"armv7-unknown-linux-gnueabihf-0.8.8":
"684538c1aa5da718abb86b0f5a3c5d2eb05a11520e5c87a2b75050751adcc8c6",
"armv7-unknown-linux-musleabihf-0.8.8":
"c5eebbf9ae549ca45f563a9a9770c1534854a5c4056acac0ab3779b9e1f24d75",
"i686-pc-windows-msvc-0.8.8":
"9ec9bf63460e0625cd941a5bbe0775b99c33def5a2f1fe6cbc9e99e167fea33e",
"i686-unknown-linux-gnu-0.8.8":
"d934b2f6c892a25d928cdc2dfd42b3e925011992603879d2035bc7b15a236c35",
"i686-unknown-linux-musl-0.8.8":
"a5b258ee1f686bb58f912ce8c5def3531e0e4cd2bcfe3ee332bfaf3b35e674e0",
"powerpc64-unknown-linux-gnu-0.8.8":
"23dc87674b030bf4d7f4f1cd1b903d18ccaec43af0373d62e309ee79cbe2c2f8",
"powerpc64le-unknown-linux-gnu-0.8.8":
"6a72bb057073ca989690882ac0ae70e6825151e0d2d52d37540be2dd41d70b56",
"riscv64gc-unknown-linux-gnu-0.8.8":
"f107450c910336bfc636208d4d0430a8a6581d98824a4deee5715ac72b73c97a",
"s390x-unknown-linux-gnu-0.8.8":
"5aafe51b39dc715c887d6c1960d82659fa18a7505d0050e6eba36ae5956e4c96",
"x86_64-apple-darwin-0.8.8":
"3346a3d4a45d7457dafadcc1715e8e529e5b65c27aaba2417db4b0b32a8cbac6",
"x86_64-pc-windows-msvc-0.8.8":
"ac76b826e5ba70c7a041e9ee344cbcba2919cdd3010fff7f1a83b7864911633e",
"x86_64-unknown-linux-gnu-0.8.8":
"ecc2e39de86afea661c145f33f6a89a45b1d2427d51a22b458e2c64238794180",
"x86_64-unknown-linux-musl-0.8.8":
"80ee2bde42e1cc39c59ae8a3a20f5b73127b90ece009ef7bdd13ab189ff0c353",
"aarch64-apple-darwin-0.8.7":
"d1f056d2d04b07a69d2be6ed7eb07ece12dda26570a9af316309787865eba374",
"aarch64-pc-windows-msvc-0.8.7":
"5e0fdc7ebe4f237fa1b24a95116243e6c5fb52e0601aed3b7ca24b6a76b6c2ec",
"aarch64-unknown-linux-gnu-0.8.7":
"405965165e6c5a782d9b69e1a641a491533cec80390b0bfbe95eedcf5cdc5078",
"aarch64-unknown-linux-musl-0.8.7":
"70fa63fca7c7b1ccb5a96b8b5691f8dee2f2caeb61fcf6a110227e3f55fcf94c",
"arm-unknown-linux-musleabihf-0.8.7":
"172e93344f2aaee552e606150a1d9bd8de2df2716c81ecc332904e4b2713b964",
"armv7-unknown-linux-gnueabihf-0.8.7":
"3277a9db5244767ed6e8848e487377dea69b67e0a196886696263ddbc5681daf",
"armv7-unknown-linux-musleabihf-0.8.7":
"3170d7251d8d2ab40c86a1b20221d6486baf5f52e7069525893cf20481cc8281",
"i686-pc-windows-msvc-0.8.7":
"f97b09e12f10e8e77b1519124f1f16720bbd64bc0436cad0868f4a2927a7a0e0",
"i686-unknown-linux-gnu-0.8.7":
"0e88d6a9f088f6632026d7009559d519598876db8b46540dcc6ff015bbf16b85",
"i686-unknown-linux-musl-0.8.7":
"1ab32b294aa94846ee9d1c2597ea8f617aade1e7faf2c8e460d5414d87dd8a58",
"powerpc64-unknown-linux-gnu-0.8.7":
"52fe0acf3cb57ee33407c1a2d25e66ec08ac6c4a259e016a54ea34cfe749f148",
"powerpc64le-unknown-linux-gnu-0.8.7":
"ad8d7a098c7f1603adb55bf794a6ba952c715d5d05112482a6c9a9b63d04fef8",
"riscv64gc-unknown-linux-gnu-0.8.7":
"f6bea3521a2d5b1593cb8f18d54237d0ae3b388cbd2cce83c1dcd4b512dde1a6",
"s390x-unknown-linux-gnu-0.8.7":
"ee877021eb1862d9d0cc37697267a01cfdae307c6a8bf7ece27ae92b330fd2d9",
"x86_64-apple-darwin-0.8.7":
"dca85ae222d59ddbd83f61355561d3183cce9d23eb5931c41646499f43cb2b93",
"x86_64-pc-windows-msvc-0.8.7":
"0baf6d021ca283df5e5c768ff51281043fefc889ac14aff8ce58189453166eef",
"x86_64-unknown-linux-gnu-0.8.7":
"060f68b7e86fee70ed19b852934ce6f05bb15d42894ce4a26c34a18b4c3cd511",
"x86_64-unknown-linux-musl-0.8.7":
"b1283a1b42f81dc79c2e58eb77a41e21fd4c59344d3d19e72810ab031ba93771",
"aarch64-apple-darwin-0.8.6":
"15269226c753f01137b5a35c79e59ab46d8aab25a242641fdc4003a6d0a831ff",
"aarch64-pc-windows-msvc-0.8.6":
"a2891f1f1c56e717115579da655951007e2e5e498535b473d9f7cbffe7369e1a",
"aarch64-unknown-linux-gnu-0.8.6":
"6fd314ca589788265ff99ec754bd2fa2a5d090ef592ddbbe8ded6b141615a491",
"aarch64-unknown-linux-musl-0.8.6":
"d78076c7e0dfcd3580736c11e009ef856bd13015f00406e3ded1fc895e2104ba",
"arm-unknown-linux-musleabihf-0.8.6":
"87d33a579cc2ee986e3163bb5de1791c6052ef8716d5fb8d8bf73aa2e5f1bf66",
"armv7-unknown-linux-gnueabihf-0.8.6":
"4139d74dfe3192bc71dacd3cf0cdf6a006d121db2c4d841e08f369761baaf00e",
"armv7-unknown-linux-musleabihf-0.8.6":
"5d4d117cebddc7dbdbf6e1410c65868f113a75700acac77eed28dfdc0411c113",
"i686-pc-windows-msvc-0.8.6":
"4eaa185b61f9cfe73ab7534de7282e51cc0f6bf47361429bdcbb6a5f3264f6e4",
"i686-unknown-linux-gnu-0.8.6":
"7fb9324cfb0c57a9b9145e73598794c7bc4df01f50730bd926d4ab10d4fc59ff",
"i686-unknown-linux-musl-0.8.6":
"3c2e2d69e8da093df76ffffa9758669c33ae47624f73d06ec2a83a363f17fbd4",
"powerpc64-unknown-linux-gnu-0.8.6":
"264dbfddd58cdbd35b33ea24dd802a3409eae1d4516d057bdff88df2e257eaa2",
"powerpc64le-unknown-linux-gnu-0.8.6":
"d34c6d7df2ed9e9739bc0313875e602a943b17fccbf1127f824a5ff9a3253bb5",
"riscv64gc-unknown-linux-gnu-0.8.6":
"6bcd5a72977a4362f042cc2568960b5a42c1f13240ada6b1cce6aa2f6d6a3e42",
"s390x-unknown-linux-gnu-0.8.6":
"8b4372280249038ea5824937d6e1ca7e2192061bd38f3362200133ff55cbb9c3",
"x86_64-apple-darwin-0.8.6":
"4b1da363d8913a85a4a40df6620ae800b16c62beb54f60b1d336432644cb12bb",
"x86_64-pc-windows-msvc-0.8.6":
"f7ed402ea1e4d7fb2b2490e1a097e9849bfdaaa689521d290bdce5478db0428f",
"x86_64-unknown-linux-gnu-0.8.6":
"5429c9b96cab65198c2e5bfe83e933329aa16303a0369d5beedc71785a4a2f36",
"x86_64-unknown-linux-musl-0.8.6":
"0d89cffae3ad1c4ae2d4da06f71ad4539974185a31f7c196a6151b400bf84039",
"aarch64-apple-darwin-0.8.5":
"467e875ac84ac2155f048b56e33741d7dee6f02369048d5b6c05b74b745411e2",
"aarch64-pc-windows-msvc-0.8.5":
"8d3dda6ff64065e65b49ecd42018a885c0f20e6967af950ef121f976d73e72db",
"aarch64-unknown-linux-gnu-0.8.5":
"db05450c7c1e9dd51eeaf4b59c3bc3721bd9146e7ad95e87f5736d45c4037ae0",
"aarch64-unknown-linux-musl-0.8.5":
"400771c1136c9d5cf624bb1695b08d46a4e4e0fc2c9b8897e7be950ac5e00ae0",
"arm-unknown-linux-musleabihf-0.8.5":
"7dcd2a34735d2871714ee4993cf0227492c860ab089691a30f6a65d48ec469b6",
"armv7-unknown-linux-gnueabihf-0.8.5":
"0032fa90b0a74559ac965538178499de6b396ec7ff9b8d8134f442d2d3079f8a",
"armv7-unknown-linux-musleabihf-0.8.5":
"daab0e8f9b563dcbd6bc6ac517a5f9ebe1b1dca9671011d40012c73f0cde8cd0",
"i686-pc-windows-msvc-0.8.5":
"2c133809d2839eac93341a14df6fb16bf834ae3c7582f069cf24ccc60cf367f7",
"i686-unknown-linux-gnu-0.8.5":
"6c6b88bf178f5bd508523457a589e09c885deb57983f8d73dfdd43794d6decfb",
"i686-unknown-linux-musl-0.8.5":
"5968f60135941a2bcca742bf44854bbbe8adfba4d0a170f5991d95572c0e4d26",
"powerpc64-unknown-linux-gnu-0.8.5":
"a4e7b7dca6386b8623c12581ecb606b31a9df53ca8acbbb14dec5ceaa23c1603",
"powerpc64le-unknown-linux-gnu-0.8.5":
"1d521c56d8ee83b90f15350f1cebb506e2441e574b27acdbdfce8449ddbfa1c3",
"riscv64gc-unknown-linux-gnu-0.8.5":
"ca7536b206090982e6f90d566bc441598a6aaad4cfc885618f12051c51a0e454",
"s390x-unknown-linux-gnu-0.8.5":
"92fd077879ea943775bebf49d3515b5da8a237bcb9a975b2476183946b6ed017",
"x86_64-apple-darwin-0.8.5":
"9ee5b34975ab4659345fc96cc08098d7ec871cdfa969a5774894bcaebdaf3b58",
"x86_64-pc-windows-msvc-0.8.5":
"898049e2db4a92e59bf1da7e14cad9b5afadb7d0cf9dd55a5274825290f7ba6d",
"x86_64-unknown-linux-gnu-0.8.5":
"9db7e7db3cf98ddb57954bfb72c9ba4b8a4514b910e666e3c57e8b4e83a0d630",
"x86_64-unknown-linux-musl-0.8.5":
"64aec5c2fa8255d19ff20480afb6445e29be94628c58a429c131f5c60bd990b5",
"aarch64-apple-darwin-0.8.4":
"ef6785df8c23232ce6209c04acefd0c0d2ffb3a3ba0eef16422bdfe99a059105",
"aarch64-pc-windows-msvc-0.8.4":
"34cdff9ed7e1ffece93a895e65377a0ea4f186eb6785ead045280be59edabf19",
"aarch64-unknown-linux-gnu-0.8.4":
"d42742a28ce161e72cce45c8c5621ee23317e30d461f595c382acf0f9b331f20",
"aarch64-unknown-linux-musl-0.8.4":
"d194e457ba2c9f4e737ee9919c66465e0297d956b6c7121b61d37b98e15a694c",
"arm-unknown-linux-musleabihf-0.8.4":
"cfd9d5c2d5bc462308c54e4224cb4102819cfc230cd7a75dcf5cd345969ab732",
"armv7-unknown-linux-gnueabihf-0.8.4":
"234358eb9384c6392678d392ab0835daf500a71b6d78b5b33f10793c2c695d05",
"armv7-unknown-linux-musleabihf-0.8.4":
"65408f9aab2895faa1c523a064eef01f2d5cea4686ceb704217d8ece03a69a8c",
"i686-pc-windows-msvc-0.8.4":
"fc4fca95757e78fa4a782ae7f5cba4f52137df49b737cec0a6ad8092ca829151",
"i686-unknown-linux-gnu-0.8.4":
"d43485d5531529c4a57bf9b504e9ac1609a4467d220a268c38464d83d6df08b6",
"i686-unknown-linux-musl-0.8.4":
"cd4e9127d6562f0817060aa9c1b396afc7db31cdf48b73ecc347bd6f4f77f075",
"powerpc64-unknown-linux-gnu-0.8.4":
"3083419366b512e89e53f7e73c48ca15e28daa1ec674f5ef6492d06b0834e62d",
"powerpc64le-unknown-linux-gnu-0.8.4":
"1e1164b8b2bfcd09daf5b32bada5fdc08b81d384bebd9707691cc48561749a27",
"riscv64gc-unknown-linux-gnu-0.8.4":
"0b4e5e41b4c2836e6d8c1b4eb5151a0ea775908bc892ba62a8126fcdd7b06914",
"s390x-unknown-linux-gnu-0.8.4":
"28aefb0bac0349aa3f218cfa43ce50793f81c6948d01e2e4b97ea5421a2734ab",
"x86_64-apple-darwin-0.8.4":
"14e5309f182d1a92cf6c82f5891a0a0dc1cd5d46627171eaa1e84fa2b7e0afc3",
"x86_64-pc-windows-msvc-0.8.4":
"817c50c80229f88de9699626ee3774c0cceed86099663e8fb00c5ffae7ea911c",
"x86_64-unknown-linux-gnu-0.8.4":
"eb61d39fdc6ea21a6d00a24b50376102168240849c5022d3eba331f972ba3934",
"x86_64-unknown-linux-musl-0.8.4":
"4e16694fcc20a94136af70fb1449e8817150896af0339b6b28dfb6d006cd8116",
"aarch64-apple-darwin-0.8.3":
"9ebfe9f3b51187932ef97270b689da48261acacadd6ea7018d2cc62719c86ffe",
"aarch64-pc-windows-msvc-0.8.3":
"6e0692b817c5d6cfddad13ad177e866e36d95e8d32b4a296a49d937fdcda18d3",
"aarch64-unknown-linux-gnu-0.8.3":
"e82b5a3eb19e5087a6ea92800b0402f60378bd395e3483acd0b46124128ab71f",
"aarch64-unknown-linux-musl-0.8.3":
"05707835aadb8d0dfacf64a50dc31eb77fb11d1773b13ddd78d2404d43be3b7f",
"arm-unknown-linux-musleabihf-0.8.3":
"63f09a167470e40f5a7afce7ba726fa31d700042107215a8f46572a617b2ba64",
"armv7-unknown-linux-gnueabihf-0.8.3":
"ca3ab5110a248febf3af56ca8e417add5a164228d8861d2f6439d6c77654ad24",
"armv7-unknown-linux-musleabihf-0.8.3":
"79b9f2f8abf64b93aaf48f87b159bc34e73b92428c6424a9e633f481449bc8be",
"i686-pc-windows-msvc-0.8.3":
"5d272849a94b7ad36711f336d745e08ed3732042fc51f5c7f28bfc4e95463615",
"i686-unknown-linux-gnu-0.8.3":
"5ca9dcdd8aba4c59266536c00453f3815ccf4852a1bef78f181f4ae43726e742",
"i686-unknown-linux-musl-0.8.3":
"7a7eb903b673c0a0fa8282e12d2130fb63c1f0e574b1b8eb24ac63503db5db9e",
"powerpc64-unknown-linux-gnu-0.8.3":
"ad94079c0aa352730e5656246ecb8fd6cb5c7c1bbcc100954020f32128d6b0de",
"powerpc64le-unknown-linux-gnu-0.8.3":
"27ccd00f3c617b59d6977e48612dc5fe49d15c1181bf995863350e78002e54ac",
"riscv64gc-unknown-linux-gnu-0.8.3":
"897257393ca612058bb22691fab3a45480d3f7fc1df5bb968696576d7d98d6c1",
"s390x-unknown-linux-gnu-0.8.3":
"d148aebfc019aa14c686713fb0a391bb700290ecdf2903c2fdab0009182d880b",
"x86_64-apple-darwin-0.8.3":
"77eac9622f76ad89a8c59b31a96277aa61eb290d2949c69ab2061076471aeda2",
"x86_64-pc-windows-msvc-0.8.3":
"4ca84e28b08f48255f95156c5987d61a5e4c51a43372708bc6d84e994eeb7bdb",
"x86_64-unknown-linux-gnu-0.8.3":
"427c27ed5f87bf91aa045cf459ea34d348ed6377c62c3c054f1b4046b2f83fe2",
"x86_64-unknown-linux-musl-0.8.3":
"bfbe34caae328355b720ad0f667be99990b1b93721c8cb726e4a502796eb6d68",
"aarch64-apple-darwin-0.8.2":
"954d24634d5f37fa26c7af75eb79893d11623fc81b4de4b82d60d1ade4bfca22",
"aarch64-pc-windows-msvc-0.8.2":
"0e1e80ca0d6faab2c716ac7b73214c6df7a37dc0a45998d5f7d6e73339db8e48",
"aarch64-unknown-linux-gnu-0.8.2":
"27da35ef54e9131c2e305de67dd59a07c19257882c6b1f3cf4d8d5fbb8eaf4ca",
"aarch64-unknown-linux-musl-0.8.2":
"725237095ea91ad4fe54b1a047138194bdef428002709e0ae9dfea33b66e1c8a",
"arm-unknown-linux-musleabihf-0.8.2":
"ea523b34d5c96b32f1f68a51b690774f7822474a355fd74973a089ba2002e82a",
"armv7-unknown-linux-gnueabihf-0.8.2":
"8fcbdce85af3b62b8625e780c0065ccd35aab830fcd380c2bb5a03e2174861b0",
"armv7-unknown-linux-musleabihf-0.8.2":
"d433a35cd4e0b9ed8163b42b69d050954b77163765e5c25ac21aa08da2117ad3",
"i686-pc-windows-msvc-0.8.2":
"d862eaf046abe9143b3e172137cb50657920d324cb3e00be78d22aba4478d7f8",
"i686-unknown-linux-gnu-0.8.2":
"fc0baebac65fba4865c23f0ec31722750543c5f5320d7c52221b0565065520ce",
"i686-unknown-linux-musl-0.8.2":
"fff6ad20fbcf808089823161a303ab32bfbec31b0af73c3d5717fe8b80aa8a81",
"powerpc64-unknown-linux-gnu-0.8.2":
"d0cfde8f85eeeb7baabbca6ad7e66fba0bfb2e6145a95fb9fc97d82d153d08c8",
"powerpc64le-unknown-linux-gnu-0.8.2":
"f44b3870a323ba5dbd189c46ef10e565f9ba94c1f675b1daf8d1deab7cda92fb",
"riscv64gc-unknown-linux-gnu-0.8.2":
"87e97d546129846a2ee73516fa71770ee787ee62121ebfc5c3db682ae0f54cf1",
"s390x-unknown-linux-gnu-0.8.2":
"de324cd0b04162e25fd1dc2332b05e556978fec4bfcc3fbea6565e8276caac53",
"x86_64-apple-darwin-0.8.2":
"ae755df53c8c2c1f3dfbee6e3d2e00be0dfbc9c9b4bdffdb040b96f43678b7ce",
"x86_64-pc-windows-msvc-0.8.2":
"503a430df36957f851daedaed707a2ab69ed21a48bd499c2f0f7253ad5ba983f",
"x86_64-unknown-linux-gnu-0.8.2":
"6dcb28a541868a455aefb2e8d4a1283dd6bf888605a2db710f0530cec888b0ad",
"x86_64-unknown-linux-musl-0.8.2":
"2df1c90246ac03b237f997dce0a31a757523a6aaa9a15b26996a9851dc08ad3c",
"aarch64-apple-darwin-0.8.1":
"4dd195318b0ca893f9e51bd243441016fcf721dfc2c29f86ab7de74c1c216e53",
"aarch64-pc-windows-msvc-0.8.1":
"759b952f7ee0f2a556f6470ea48a2a87508f9a5cbd3624c881875c93748389af",
"aarch64-unknown-linux-gnu-0.8.1":
"0604abcd1a9232022f1b093874e6303d2725512f2e9fc324f0ac49a30d1b2de6",
"aarch64-unknown-linux-musl-0.8.1":
"4b87748593ca3fd060b96599494d5bad6e172455208c3d6a0f4d36cc89a435f9",
"arm-unknown-linux-musleabihf-0.8.1":
"6903a6c4ac2f00548a0164ff53ba1898be2e48449071c90bdf38811537ef47d2",
"armv7-unknown-linux-gnueabihf-0.8.1":
"179e0c81217d97eecba4c75566404edf947614f72b0be8b5c975b60b7d973282",
"armv7-unknown-linux-musleabihf-0.8.1":
"f62be877927f3a5e6ee99e352e73af8e1735e4251bb8cf11424f79b560616b20",
"i686-pc-windows-msvc-0.8.1":
"87107714fee0e0b137360b8b5f2425d5994655c58f2743fac5203c5d5cbf2f7e",
"i686-unknown-linux-gnu-0.8.1":
"1689bb02d731cd4e0ad6e9fb384c937d5ea38246f80c4a3f86bd9bf30c395490",
"i686-unknown-linux-musl-0.8.1":
"9a39a92210752fb03436eb9e69a52cade45c6fdad92aca209fef5594df2dded1",
"powerpc64-unknown-linux-gnu-0.8.1":
"5a6bb32ba3f0e26d7a2de90987ba285850a8b405eb402484448c927721fb784d",
"powerpc64le-unknown-linux-gnu-0.8.1":
"0e7bb9f5c298b9a55e019809fbc7d4a88e491ea7b606cd6b4bbc9ab648904af0",
"riscv64gc-unknown-linux-gnu-0.8.1":
"5346c2757546b26fc3b738cc021c3c17e372a08b6ee361cde95a88ee1eb87577",
"s390x-unknown-linux-gnu-0.8.1":
"66108f45f1fe81b7b02c3490debf838a90c818de00dd8c17c45ccad65554f8d7",
"x86_64-apple-darwin-0.8.1":
"96b3836b7bf97a24ac13a8854f2da7cd3a44993820935b29be964d776e3a3446",
"x86_64-pc-windows-msvc-0.8.1":
"b161c45b2a7f97400b1005591d782d2c96ea1c4570ac1336cd82a2500dbbed1f",
"x86_64-unknown-linux-gnu-0.8.1":
"abaeb153d85cf57277945c70fe449f813b14aa1913d1caa50daf333a01b2f317",
"x86_64-unknown-linux-musl-0.8.1":
"e54c95d4f1420311b7266d57e36304755b24c956a2928f365bb91215e3554c34",
"aarch64-apple-darwin-0.8.0":
"5a5ca58e3999d4f440632da87a56f7030eaaa3a13d3896561eec5fd51cb9ad45",
"aarch64-pc-windows-msvc-0.8.0":
"2fc83c9e2de30c1de8e9461188ffdac75ad41ac1e2227fd158d46b6cd09501d3",
"aarch64-unknown-linux-gnu-0.8.0":
"61f136a187150624c10ec7025137fdf5391ef083a4cab0eba4fbdb2a928de16b",
"aarch64-unknown-linux-musl-0.8.0":
"c5a7c042e40a9acb693c5ee01f26db047b07e4f3f301470b38ee4a2f3e0e831b",
"arm-unknown-linux-musleabihf-0.8.0":
"94c54815e371c93ce08ba5d4b95e7d847d11bdc1ba5af5e15656e6d1be521f74",
"armv7-unknown-linux-gnueabihf-0.8.0":
"57c891ebe985ef1c4e83bbc60b9d2fce40fd6e383db451ac1fc04d60a415022d",
"armv7-unknown-linux-musleabihf-0.8.0":
"fa8a3f50c1ffeb7013a7fb9d9dbba54ff0a1e5d2c4c758ec6fe785c37426ae7f",
"i686-pc-windows-msvc-0.8.0":
"cd03e12986765e48297228678dbeada0c284c552884910bcb3f0ea3ceeec8ee4",
"i686-unknown-linux-gnu-0.8.0":
"ebb52595b6b5a0b6805a50c5d5dc06fd632bbfcce5854228e1e426784e7813b6",
"i686-unknown-linux-musl-0.8.0":
"b9a44b22bb0605f8413d84a811346696b79e624aed850c0087fbea389074d401",
"powerpc64-unknown-linux-gnu-0.8.0":
"7b65a08c8ac4a2fae9f466d94e29896fb5f49f92d72a7c6ac315031b94d43857",
"powerpc64le-unknown-linux-gnu-0.8.0":
"698bc873422f261ec7e9da3ddb3a1b2b2d96be3f4aa6abe566c9d4a315b9d9d4",
"riscv64gc-unknown-linux-gnu-0.8.0":
"c508d286c64d34933f06e6ce04e2aada129e039692a57f6d8adf0bf9bbb90186",
"s390x-unknown-linux-gnu-0.8.0":
"756f55e2567585f1e62522b3e25bfae8c1b7f8a856d2e7ec85b48fcf5abbe9a8",
"x86_64-apple-darwin-0.8.0":
"828917cad79aae8327811c59fcc625ff3861bfe21d2cbb77c206737d41117ff2",
"x86_64-pc-windows-msvc-0.8.0":
"bad5afed0c18bd7f6c5125f5c7ab89ac830a3db7340c96d50a50527e9880cdfe",
"x86_64-unknown-linux-gnu-0.8.0":
"a7d74ee5c5ff3069b9d88236a05f293cc4e2809bad872f3a88a384489ba3675e",
"x86_64-unknown-linux-musl-0.8.0":
"0208cbcb3850bfc69277c9a16c2b0399218b075dc923aca7e4b576ee4228c570",
"aarch64-apple-darwin-0.7.22":
"707677074a9ae6906d4ccb22089341e3541db78022dc926e985bcc35fbb53a74",
"aarch64-pc-windows-msvc-0.7.22":
"bcbee39a55eca43ea286cbaa467b083888c7811ab8f47458063bc53331224f4d",
"aarch64-unknown-linux-gnu-0.7.22":
"d2ee24524f5ed45baceaddebded48493f7dd2692fad8a1d1796c606134c133b7",
"aarch64-unknown-linux-musl-0.7.22":
"1d524e7d61336ccdc4caa2299df811f318b96d81034ff621b7217d6c440a1702",
"arm-unknown-linux-musleabihf-0.7.22":
"ad458ba424cbd77f8278b634e9e14a2fea0ba1610b7a51b38e611cd8a8072792",
"armv7-unknown-linux-gnueabihf-0.7.22":
"3523c1f0396249bc3eae97f15141921108214e4fdce50f153272c79c91d3e737",
"armv7-unknown-linux-musleabihf-0.7.22":
"b96ec5d9be9527fe3a4e6642e26489cd1b12a8cbd3f2b80145bd61bd4919e188",
"i686-pc-windows-msvc-0.7.22":
"aca18c571d8bd6d370e0440a16544afde421ea01585721a46d3847c11404fb41",
"i686-unknown-linux-gnu-0.7.22":
"ea5f6c1460843bd1c391e06d731278707806666438a9389f957e604f60be3eca",
"i686-unknown-linux-musl-0.7.22":
"e20e7eceb3100bc93ed638d723a5b4f9985dd2650398b3f10b175a93e744c7b7",
"powerpc64-unknown-linux-gnu-0.7.22":
"7e7281c99a62a729483ea0268511bf9416a97f6256cc9123d7910b42d7c27937",
"powerpc64le-unknown-linux-gnu-0.7.22":
"0891f6f9fb7099cf35cc6bf4d3e565504ce793466d0a592056703518cb771dcf",
"riscv64gc-unknown-linux-gnu-0.7.22":
"8bf7e0bff7f1cfa2c8057405c2f5a377c7b864a83dfff8ce045f5773374f7add",
"s390x-unknown-linux-gnu-0.7.22":
"d7aba1fe8783e39f5f05061fc255a28d98eff0b83600915b606903ee1764b674",
"x86_64-apple-darwin-0.7.22":
"af8fb83280a000f5864653ca0c9a1f69bbdbc8b2bbfeb2e1d450ce7fd1518ff1",
"x86_64-pc-windows-msvc-0.7.22":
"ce5c13291643e8306e8d2dbcaf340d36ea985a761a53f2ca0a45e1a8e8936c85",
"x86_64-unknown-linux-gnu-0.7.22":
"8379e040fa1828e662968edaa3856aaeb6e1a0a0ec76ef8583096be1f72f19d4",
"x86_64-unknown-linux-musl-0.7.22":
"0508e73f28fa4024c76c4e0a5e347fea6aeb4bead0234618e6cfb76804237259",
"aarch64-apple-darwin-0.7.21":
"c73af7a4e0bcea9b5b593a0c7e5c025ee78d8be3f7cd60bfeadc8614a16c92ef",
"aarch64-pc-windows-msvc-0.7.21":
"877454562ba2af12a020652fb8f63d14b6c05aa6d1d3497441822c6c0b198541",
"aarch64-unknown-linux-gnu-0.7.21":
"1dae18211605b9d00767d913da5108aea50200a88372bf8a2e1f56abdbe509f0",
"aarch64-unknown-linux-musl-0.7.21":
"6577895c91a6bf6c1fda5f0fdfd07f8ee05f75f24a70a49193f8fb8dcde81fc3",
"arm-unknown-linux-musleabihf-0.7.21":
"cb175698eeb3abf77c00c4d19e9c5e10ed847f6988769f5b18a5c98c1ebd21ad",
"armv7-unknown-linux-gnueabihf-0.7.21":
"9c64218ebc2f96520105fddf3b500026a50d9319c7faf4d2221a7113efd96fd7",
"armv7-unknown-linux-musleabihf-0.7.21":
"9f83f0c4821e572e9289e270e64429495b188e372519ee88524e97b50943e657",
"i686-pc-windows-msvc-0.7.21":
"aaf3f3bc934616214e1f33ccb22432dc59110211b2b15636d66e8e42e9cf2f6f",
"i686-unknown-linux-gnu-0.7.21":
"141a4ecfe0bf08e82fe5834a0fd265cf3c27833c1bfbab69344efb1604c2d964",
"i686-unknown-linux-musl-0.7.21":
"ae1faeda2475f0df8733215133771da58de159d9e7b5a728f30047708e21a724",
"powerpc64-unknown-linux-gnu-0.7.21":
"bef76b3992d21682dfc82e096d18f449d43a757f28a00a62eb7e05002349f287",
"powerpc64le-unknown-linux-gnu-0.7.21":
"107c6c5a444c27bf772b1ec233b5b83dffd79348488cccc832dc9c14ee5ddf56",
"riscv64gc-unknown-linux-gnu-0.7.21":
"c5c160e64809ae29404354e555df7264763f7cf67012ffc1350619cc9d19299b",
"s390x-unknown-linux-gnu-0.7.21":
"77f3472201867a766e6f2a37ceb2e2f2f78343d3460c2313e3643483c80ecf92",
"x86_64-apple-darwin-0.7.21":
"f8a9b4f4a80a44653344d36b53e148134176e8f7cc99f8e823676a57c884595e",
"x86_64-pc-windows-msvc-0.7.21":
"7a4e427ceaf3c7d8437e512cbc25af84796c4079cf842c3349d4b646a9209da5",
"x86_64-unknown-linux-gnu-0.7.21":
"ca3e8898adfce5fcc891d393a079013fa4bd0d9636cef11aded8a7485bcba312",
"x86_64-unknown-linux-musl-0.7.21":
"7400debadcd63e530cf58c3cfc71d43d5a1017d2f699be86c6e91d7dc2073c7c",
"aarch64-apple-darwin-0.7.20":
"69da236af5934209a5c059fff1b2f69068918c423601f42448b1d92336853127",
"aarch64-pc-windows-msvc-0.7.20":
"34f3720cdd736f034f3b0d1b03d6b74b85d3528ccefd3552b3aadf455f191b2f",
"aarch64-unknown-linux-gnu-0.7.20":
"675165f879d6833aa313ecb25ac44781e131933a984727e180b3218d2cd6c1e9",
"aarch64-unknown-linux-musl-0.7.20":
"0f68f4a4583923635e56f7f930526bbbcc14d090f1c1a7ec1d28cc4ddad05279",
"arm-unknown-linux-musleabihf-0.7.20":
"9d3eb7fd1e3580a40e5d3f25db5d8a0719fb77be1d750b4849f6dbc96885e39f",
"armv7-unknown-linux-gnueabihf-0.7.20":
"775c3634a1ed7f0c23e5ce8e418acdb394fe87df1ac21af9f274e1e68df0d9b4",
"armv7-unknown-linux-musleabihf-0.7.20":
"27ac3e7f44c1af5bb9f01560e1848893e09c502a85552521cc9cf0d2cd4322c5",
"i686-pc-windows-msvc-0.7.20":
"90367e9f5adc46d6effd2b2107bee5f900f959c64898ae3ffb1e28b9519b15e5",
"i686-unknown-linux-gnu-0.7.20":
"9b53f988b7024728da39fc3e4217bf8cf233d1aa7afda20599dc3acb2049f328",
"i686-unknown-linux-musl-0.7.20":
"fa3091a175cdba4202367b30bda899bc3ed3b6c2161b7c42500c3bd1b388c3e2",
"powerpc64-unknown-linux-gnu-0.7.20":
"84b76581c50071a87609d340050b2cd0ba7fad7e929106202d4c99f4c5a41243",
"powerpc64le-unknown-linux-gnu-0.7.20":
"25082231ee1b479cc9fc486949e3196affda09b82bf0c6b3c8eacde37f56e9db",
"riscv64gc-unknown-linux-gnu-0.7.20":
"339015c2c934b93355a972c737f649fdf96abb699bebbc1b0955de9e5fff04bb",
"s390x-unknown-linux-gnu-0.7.20":
"16819d631e56438ea2e58b60bfb99feb8b2b8cdbec73e375e21c6dbe1de8c725",
"x86_64-apple-darwin-0.7.20":
"0c0edf17aff045bcb9bf89ffa43fefaec2d6585ff69debdb0ade62608f8ff069",
"x86_64-pc-windows-msvc-0.7.20":
"ddf35e258c32971c00f3f4213cf1b5cf0847a42dac578738cb294d379e4a9f6c",
"x86_64-unknown-linux-gnu-0.7.20":
"10f204426ff188925d22a53c1d0310d190a8d4d24513712e1b8e2ca9873f0666",
"x86_64-unknown-linux-musl-0.7.20":
"c8efa6bacde9154aa705feb35985cbc852d75c7d634e8a6867aa2f5571b27a62",
"aarch64-apple-darwin-0.7.19":
"698d24883fd441960fb4bc153b7030b89517a295502017ff3fdbba2fb0a0aa67",
"aarch64-pc-windows-msvc-0.7.19":
"c843b95d9bad3e364ead2af00b793d42156cb4f8ac0c2e33bfd2b3e50a0efc86",
"aarch64-unknown-linux-gnu-0.7.19":
"31b81b4b4ecd51ee4202f1e710fc22b72666f716ffbb825aa397c8246624d60f",
"aarch64-unknown-linux-musl-0.7.19":
"e83c7c6d86c8e7456078c736a72550ce20222df8083f9317fc58cd49422ce5eb",
"arm-unknown-linux-musleabihf-0.7.19":
"fe9834d5383feccd095cbfdbc290d7379f64bafc894ae8d8eb0724edfa754853",
"armv7-unknown-linux-gnueabihf-0.7.19":
"6678e4d1a91349dacd3405b0efa88656d1c8a16fa7ccea822c368039988f8339",
"armv7-unknown-linux-musleabihf-0.7.19":
"3022a75e757a31978e896e2e3fc2cf2dc966267a8757a270be0b421f541467e4",
"i686-pc-windows-msvc-0.7.19":
"063829d117c2e42322b0e3a59ee91020dcb1d95522889b903ffad392df197a11",
"i686-unknown-linux-gnu-0.7.19":
"1785537fc65a35609dc33063b5f1cc85437a08ade4c0a832071c018481afe515",
"i686-unknown-linux-musl-0.7.19":
"e64bc4f74cee116694ea63ad0722245f62f386de271be1a1c28a6e4fd977326e",
"powerpc64-unknown-linux-gnu-0.7.19":
"fb8a4a0d20dd3e236a88229e15af89fa3144bd06c4087dbfc7ba8ca691b0a953",
"powerpc64le-unknown-linux-gnu-0.7.19":
"b335d0593c165fbfcc51915b3eb056f45c5691d06744a5ded7210d789469870a",
"riscv64gc-unknown-linux-gnu-0.7.19":
"36ccef1387594e8fb212257fbeafa9e260709b363e1b262f43bd5a679134e4ac",
"s390x-unknown-linux-gnu-0.7.19":
"08ac0245d24ba16bbf224b00e8bc8021d081f9dcfdc61881cb6e4ac83954705a",
"x86_64-apple-darwin-0.7.19":
"40667bcb615b5af3e373ad611c4a9b95639b97e19b5924a436df8e69ca9331e2",
"x86_64-pc-windows-msvc-0.7.19":
"3098b38638b271d8b14b81247d6d69bb105807ec9fc5eb85f8cc8b6de5867c86",
"x86_64-unknown-linux-gnu-0.7.19":
"5ad6f11d5a04cb3af2418666031f20b63190f82032ec5a7f3a174385cc5567e4",
"x86_64-unknown-linux-musl-0.7.19":
"6236ed00a7442ab2c0f56f807d5a3331f3fb5c7640a357482fbc8492682641b2",
"aarch64-apple-darwin-0.7.18":
"c33cfaab95da1413a0403f643b7edb1c5af6798d8a2370196a80fc37b894df48",
"aarch64-pc-windows-msvc-0.7.18":
"c9c78de380e459f8424f648d107d4ab5286273ab19622a5d17796dc6689de453",
"aarch64-unknown-linux-gnu-0.7.18":
"2af8d0d963f547deba09c52aca79a26113f0ed5c903c101241fedcac90c2d8f4",
"aarch64-unknown-linux-musl-0.7.18":
"32872da98e5c48945e45406d427b3b4fdc11f04e4b8f297f49f76724894eb61b",
"arm-unknown-linux-musleabihf-0.7.18":
"c6c9e718aee25142139b25bf6bb5f9566c57812abced3efa71b4677ac3ef1275",
"armv7-unknown-linux-gnueabihf-0.7.18":
"00cdc4c898a251ea0c12f5db7b22929ff6f73f87a51fc6f874dfb57aecdcc995",
"armv7-unknown-linux-musleabihf-0.7.18":
"92a07d26943b5e223e941b64fa22e048c13fb6462ccb35f18fe2e212cfdc1c18",
"i686-pc-windows-msvc-0.7.18":
"4293c65f1fce52bd5396ec4419ce1c76412e276e0f292ec2464c319b7f8d59be",
"i686-unknown-linux-gnu-0.7.18":
"e5db36cb7b7edbe405c70211802ffe3b161983027f7644ca9ddc9ed5605dd504",
"i686-unknown-linux-musl-0.7.18":
"5829e240206ca895f8e500e9432dd87553091459a80d2a40c0d144688d443336",
"powerpc64-unknown-linux-gnu-0.7.18":
"927af365bc8388da27d241149a52ee3b9772db87ebace6fec6b00062aedd4a24",
"powerpc64le-unknown-linux-gnu-0.7.18":
"dc7ca0bca11efd40a4f85c40e2d83d830dacb7b0f9626bc40360a6697aa035e6",
"riscv64gc-unknown-linux-gnu-0.7.18":
"2cd75769322d264151e9abc2cf89edd086239afa00c0a1354d52a700657f7deb",
"s390x-unknown-linux-gnu-0.7.18":
"bc63ad2eefe5278b121a78255e8c488eb69ae29784b69012439ef365701393db",
"x86_64-apple-darwin-0.7.18":
"7a4a3350224a3a3904589ea306041af68686d72ec4d4b68e34c15d25dfc5cb4a",
"x86_64-pc-windows-msvc-0.7.18":
"5a5b3ef7c6aee0bb1101ef047f35a0fc7cc82e34eef3286e54c5badd261cb599",
"x86_64-unknown-linux-gnu-0.7.18":
"bcb8093f59eb08539087faf895ea1e794fe3db395de79eb41ddaa41d8c25adf7",
"x86_64-unknown-linux-musl-0.7.18":
"c8b51ed978b5f95a7c34dfe39e1dce966f7497fc12179f27507d507d9f3ff40b",
"aarch64-apple-darwin-0.7.17":
"0777e13ba598ccb9a9f78df209c98922b219a195765b9f1b309457a08cbae43d",
"aarch64-pc-windows-msvc-0.7.17":
"be0e7263e4106ca73ac72b4f84ae1c203db446d42d764b2b6459bf1d84aa1859",
"aarch64-unknown-linux-gnu-0.7.17":
"b88fda8f37769d445dd4b433c83490112afa18fc009b75e3cb28412a1d189c53",
"aarch64-unknown-linux-musl-0.7.17":
"789f3749497181311fbc27d2da322f4f836d814389901e8a7917ee664f500a6b",
"arm-unknown-linux-musleabihf-0.7.17":
"7f39a83f2cd7925aa25020dce70f9d2617213b710aec1c9fd686c3314ee814a2",
"armv7-unknown-linux-gnueabihf-0.7.17":
"9a4ee0fe51b07b8badf7ca874b3a065a0d2cf3b04c69aa2c7618c03d6ddd46ce",
"armv7-unknown-linux-musleabihf-0.7.17":
"6a5d3fa02a7bb5696ac392d6277f29174f27bc38e0100016ee67c55c8a472e3b",
"i686-pc-windows-msvc-0.7.17":
"45ffa8cd52e6a0764c2bde7c97be840b6c7606f976e6ae51bab394a891653f52",
"i686-unknown-linux-gnu-0.7.17":
"043897d13541c11c1221761c768d4234b889ce1fa39f1f27a567e11ca2c86233",
"i686-unknown-linux-musl-0.7.17":
"0d7a846ff1ae9d620243da530adcc468bba4aa317cb3ba4210c724e2ec5734b4",
"powerpc64-unknown-linux-gnu-0.7.17":
"46331c3771dbc8aaaa4c75421b6195edb763bac5ca4b8d551efd2da013351252",
"powerpc64le-unknown-linux-gnu-0.7.17":
"9f7e13304c7f3977c2e1eaa068a6beb36e6974a2abcf8cb1b8e0d8b96c251203",
"riscv64gc-unknown-linux-gnu-0.7.17":
"789fea86b495397c7bd12c92221259f07c78ba738d568757b06500ac94b6ebe8",
"s390x-unknown-linux-gnu-0.7.17":
"208c6609012ca921aa3ca67d49dde34464e405041b1d8b041c15078687456570",
"x86_64-apple-darwin-0.7.17":
"c0aff6481443e7dc38c01dfb3535814db42c00ad3ab374e7b4ed4ebb7f5b2237",
"x86_64-pc-windows-msvc-0.7.17":
"b49d1a02662ac4a490c886fff8a340a4adc32da8d0634fc653a69459d2b5f863",
"x86_64-unknown-linux-gnu-0.7.17":
"e9bf64a66a318a82d3c37a74c31527df0ac7e7c821a10f5e1032415f000d7d43",
"x86_64-unknown-linux-musl-0.7.17":
"ffd877241741df0a6436ba6ed0d8cd6573f1f922ede3a967c32c57d2133c72b0",
"aarch64-apple-darwin-0.7.16":
"a157919a2a615fac5de0fcef5120a63de7e6582fb6e0ae4428238af347ed1054",
"aarch64-pc-windows-msvc-0.7.16":
"a832dd02c44cd8d373b226ca34128982aca5303dd3b477c90c5a1f83efa874b0",
"aarch64-unknown-linux-gnu-0.7.16":
"4ff5b8542514b453073cad1dfba08db751ada21981b869c69a2ac29fd639b586",
"aarch64-unknown-linux-musl-0.7.16":
"c1536a85aa85cae05c51d25b2819c5b9869f67c66c65948aadeb0c38c4bd51b3",
"arm-unknown-linux-musleabihf-0.7.16":
"20902d98f9a309df2a83ffd31ecfda444dfb75249c2779eedaeed7d73274f34b",
"armv7-unknown-linux-gnueabihf-0.7.16":
"72afc7e60eff20a1c2181f88c9d96e06553f854192b3a13069aba0f8b045a839",
"armv7-unknown-linux-musleabihf-0.7.16":
"c0b5300958a489330a9790b701f1491a1bec72e402281cdaf6a2362b51fa4c13",
"i686-pc-windows-msvc-0.7.16":
"6d4c4de0cc8c88fb7d94138c05091dac6746a7bc9d94b3743e804a485546154b",
"i686-unknown-linux-gnu-0.7.16":
"ee03aaf5d736524a8b6e74c273d5877be1bb720933cb8f7f5e70b42c70933418",
"i686-unknown-linux-musl-0.7.16":
"b815f060a689e0fe95ec36498533bb261b92dab5cdb60b02cc19fa30c6cd7e57",
"powerpc64-unknown-linux-gnu-0.7.16":
"a2b78151e50646b26cacef24de87d625d4b100efe69347c88a8a6d340b0e82cb",
"powerpc64le-unknown-linux-gnu-0.7.16":
"c231b3880c6584b6fe411b0c7507ed0c091856a64f84720b732ddd39b21b7e6c",
"riscv64gc-unknown-linux-gnu-0.7.16":
"6be4c3e27989ffd49befc689884b78b55c53c817a27040b8e232edd92185b037",
"s390x-unknown-linux-gnu-0.7.16":
"f4e1814f2326db1eb0d0d2ea96ee36c361a856e8c9d8d82817936aad9baa4299",
"x86_64-apple-darwin-0.7.16":
"414cb3c348b0482bc88fdabbc267973a11401e684a78fd471b2c4553fa8b6965",
"x86_64-pc-windows-msvc-0.7.16":
"409d19c14a9b1ce83bf7331dbda89984802efb3a2fbf9ffdf149b22ab9cf2826",
"x86_64-unknown-linux-gnu-0.7.16":
"c51f5dc9fd33e789992839d2957d6cfe0b6dce1cd7ec641740af456b12e9d468",
"x86_64-unknown-linux-musl-0.7.16":
"34c9da84a673e6c06d2e081d72d953f278fe5bb6aba0437210ba62817b340eb7",
"aarch64-apple-darwin-0.7.15":
"7a20f3d33cbbc75683d66e0562d4bdbd702ca656d7dc1b7be3c592de6a6517b9",
"aarch64-pc-windows-msvc-0.7.15":
"d15770be109fdde45c60a522fcc97bf19e0d9d9de8a0d2f0dadc772786110123",
"aarch64-unknown-linux-gnu-0.7.15":
"a8241809c6efcf5ff649d259276dabd297a2c46e9e2f78891a1f9b8ae858e1e8",
"aarch64-unknown-linux-musl-0.7.15":
"4351c1e2ec13f5eb4da058ac1c39f00ae3042de9d6fdb6480e0170f32813210f",
"arm-unknown-linux-musleabihf-0.7.15":
"26c7f1baf3f14857d8d5d2df86ea47a3ce5a0e6223c1db9af2a32bb3d216d5f1",
"armv7-unknown-linux-gnueabihf-0.7.15":
"6609e0f39c958a2b728ffec99ed53741cee92d5db168fb275448216a9e2f5a63",
"armv7-unknown-linux-musleabihf-0.7.15":
"3a60e3bfc6b927537eff1c6fdb359bdfb5a02a59820bb964e04144d731b12ca9",
"i686-pc-windows-msvc-0.7.15":
"831ac11382c9ae014f6f5d27506c8977bfba5aa6b104e278d3a87ff4d1e311d3",
"i686-unknown-linux-gnu-0.7.15":
"8d11cd225843aa7e7b25a5300721d48519a13bc82fc8b7bf63b063b8520b2db6",
"i686-unknown-linux-musl-0.7.15":
"8640a014e5ef7020b33a8e95fabd5e0c75adf80beeaf265ed50dfe2bee92aeb2",
"powerpc64-unknown-linux-gnu-0.7.15":
"6a4c0fe1075c4f3b9dfb8d0654a58ca547aaa84f829bc9e1b60a096153d18686",
"powerpc64le-unknown-linux-gnu-0.7.15":
"81f6d18b857cc3517f249fd7e321b9cad6e6c17bc7d7ad88cefc0c25cca3e486",
"riscv64gc-unknown-linux-gnu-0.7.15":
"6a0a6ef8fa3d03b6a6cab9185cd84e28c78db1e5736efa711e6f5efa4e6c27e3",
"s390x-unknown-linux-gnu-0.7.15":
"d5a2343934c7fec124fb0a140b12c4dd30e20c5473e67b11d064f5b6e52eead0",
"x86_64-apple-darwin-0.7.15":
"4c7c1fe116566b6f8725a3801a33fa5e066b8687643acd73249e5db1351c2103",
"x86_64-pc-windows-msvc-0.7.15":
"b78c2d265e74b21b1c04b5b4ffd61c5c7b8110f9188e24949ee9f6fd5fbaf0a8",
"x86_64-unknown-linux-gnu-0.7.15":
"b1dc0892749e93382decbd894755be0ba1535587f0bb8333572b072d1b0f652a",
"x86_64-unknown-linux-musl-0.7.15":
"c97afc120614c88bd8c13dac2d35015bc59656289633d61bc438e7e680a38710",
"aarch64-apple-darwin-0.7.14":
"7cb9cb6b3005a16356493887d7e7e297237b754b5753b91e826ada98ab2da172",
"aarch64-pc-windows-msvc-0.7.14":
"f28f27e529e30e96e7b289b724c8229cfc5ca25312c23bdae089d6998ffd0aae",
"aarch64-unknown-linux-gnu-0.7.14":
"c0932f428d24d87aaad6a6b7ad48aa09f260d2da5c69e877acd87c3ac90fbbad",
"aarch64-unknown-linux-musl-0.7.14":
"30e41b1f68b3e57c1375c0b2e7fe932a9eb5487fbcef7c4c7d03def3e05b9f7e",
"arm-unknown-linux-musleabihf-0.7.14":
"3b494d3d6a892d9c03d1fa6dcec8ac6077653939a6645570ab6f1f40adbd0b3c",
"armv7-unknown-linux-gnueabihf-0.7.14":
"d5d1f6c49559914678267ce9f3a57528ab45e26e907a816736306b4f10a7b4b8",
"armv7-unknown-linux-musleabihf-0.7.14":
"0016d3138edc52de9f2f4b0587afb6b579dc3bb3abfe2df151f97cc43a4ab421",
"i686-pc-windows-msvc-0.7.14":
"42391f3a71229342b17d944e956d116aabc5147b0ed28a26c59601feac1f24cd",
"i686-unknown-linux-gnu-0.7.14":
"71c358c315da7ddd2de334fe52a54719f9bdac8d6970e7966e2d080ae73ad028",
"i686-unknown-linux-musl-0.7.14":
"d02de9391fe7b7d7e97dc2fa63a539201a31eb51d2c6a87b7570cf8a5ac22398",
"powerpc64-unknown-linux-gnu-0.7.14":
"a2a43332f860520f7cd3d32f5a4ed5e0d938cc59e025372f8f1bfe47ea64355a",
"powerpc64le-unknown-linux-gnu-0.7.14":
"3c545528b601a75baad5e1cc93cbf973123e9e6df6d905b432d91ba9ca769c0b",
"riscv64gc-unknown-linux-gnu-0.7.14":
"4085fd8d4acb0a50a012fa63ae37e50472bf8742d58f4943529b5b5bda95a1a9",
"s390x-unknown-linux-gnu-0.7.14":
"b20a69092f3171dd99445fe0d71e3ed3e67ff85346cb0723a43a1b8d55ce0f33",
"x86_64-apple-darwin-0.7.14":
"352a56bb3823040f19f936dd5e277340cd304da03e5b00c0959800a72a9f55ac",
"x86_64-pc-windows-msvc-0.7.14":
"f9ac952c69d32b2263ba19ba93d18d9e708dcb9bddb8124555bbda96d6d5168f",
"x86_64-unknown-linux-gnu-0.7.14":
"2b38641d02bf107c5099f09778fda93bbaa4a4a2ee44ba303a4097102254e5e5",
"x86_64-unknown-linux-musl-0.7.14":
"8c62a823744630e6cf3fdf0bf38c4fe4558bfcbe082b076a76446a3aab2af5f5",
"aarch64-apple-darwin-0.7.13":
"721f532b73171586574298d4311a91d5ea2c802ef4db3ebafc434239330090c6",
"aarch64-pc-windows-msvc-0.7.13":
"bb40708ad549ad6a12209cb139dd751bf0ede41deb679ce7513ce197bd9ef234",
"aarch64-unknown-linux-gnu-0.7.13":
"0b2ad9fe4295881615295add8cc5daa02549d29cc9a61f0578e397efcf12f08f",
"aarch64-unknown-linux-musl-0.7.13":
"52baba71881c978d32b7c32216ad0cde4546a4dc62e606c9834ec4616c1610eb",
"arm-unknown-linux-musleabihf-0.7.13":
"ff2b11fff489301f9d55c851b9ebce7ca5530d743d2c0a3861cc45896715ea9b",
"armv7-unknown-linux-gnueabihf-0.7.13":
"903350811ee31b2b758c8afb853490c27a34382a535b236739705b104bc13894",
"armv7-unknown-linux-musleabihf-0.7.13":
"7e3b2aa966c54ced0fcd9febea6b913ee7ea12ee85246513895f199ab13296a8",
"i686-pc-windows-msvc-0.7.13":
"5cf71014fde208ee0833026b3828007f8eaf514ec003784dc1ae92633877179b",
"i686-unknown-linux-gnu-0.7.13":
"ff031258ff08b3aca46648398e21fe9679744501e3c9a928c8e42d596a708bbc",
"i686-unknown-linux-musl-0.7.13":
"41851d695bb5401bce5af81a156d63215087cf8e8e1275e69dd96de4bfa30c26",
"powerpc64-unknown-linux-gnu-0.7.13":
"02a80ce1436bf673b0d7276bb24dea0bbc70958dc91e5fb04ad37ac515be7424",
"powerpc64le-unknown-linux-gnu-0.7.13":
"60c8907cce089de97dcce732ae363eda0620f7196c25e8bd539f168b93f9e34c",
"riscv64gc-unknown-linux-gnu-0.7.13":
"521a5235bc5a053dd7f0221c363544cef6d033064cc9d92dbb4ef19771000052",
"s390x-unknown-linux-gnu-0.7.13":
"41e4b6093dd408b41dffb4c9e08c4aa31424ee4573ce9c95566c2617f7f2d0c6",
"x86_64-apple-darwin-0.7.13":
"d785753ac092e25316180626aa691c5dfe1fb075290457ba4fdb72c7c5661321",
"x86_64-pc-windows-msvc-0.7.13":
"e199b10bef1a7cc540014483e7f60f825a174988f41020e9d2a6b01bd60f0669",
"x86_64-unknown-linux-gnu-0.7.13":
"909278eb197c5ed0e9b5f16317d1255270d1f9ea4196e7179ce934d48c4c2545",
"x86_64-unknown-linux-musl-0.7.13":
"560bb64e060354e45138d7dd47c8dd48a4f7a349af5520d29cd3c704e79f286c",
"aarch64-apple-darwin-0.7.12":
"189108cd026c25d40fb086eaaf320aac52c3f7aab63e185bac51305a1576fc7e",
"aarch64-pc-windows-msvc-0.7.12":
"fbedfb71356d0e63c86b507cf1434a58406afe6eac77aee9d37b8282d4006e14",
"aarch64-unknown-linux-gnu-0.7.12":
"23233d2e950ed8187858350da5c6803b14cbbeaef780382093bb2f2bc4ba1200",
"aarch64-unknown-linux-musl-0.7.12":
"0589f6d27bbbe2e205aa6fc25e4cd28ab97e984cdba20842de8d3a00714e13e9",
"arm-unknown-linux-musleabihf-0.7.12":
"6996e32ac1c37af33a4c6e40ab0126a82d62ccb94edb164b7dae554be4dd8336",
"armv7-unknown-linux-gnueabihf-0.7.12":
"aee2dc202deed7e15984d71eb59803111052fbe8c0fb3ffad27ae0a6d290d74f",
"armv7-unknown-linux-musleabihf-0.7.12":
"87bd7676d31858d9e1937ab69d13e30cc93ebb09fb246dde6a8f183e9570a82c",
"i686-pc-windows-msvc-0.7.12":
"c7ec71ba64d01ef3cdb89553445de94ab4fd7375c8f2a7068353aec7a3a06342",
"i686-unknown-linux-gnu-0.7.12":
"d1def68ff10b30327a5cacab497664aaf8338e192ba277b76f45dad63208f2e2",
"i686-unknown-linux-musl-0.7.12":
"f56a0a9c84b35b7e910c4d628c667b843fb3fa1d9dddb0bbf4bf3f21eeaee07f",
"powerpc64-unknown-linux-gnu-0.7.12":
"6eafb546d1b8642a5c27e4dfda213659fee41b0fd150b4c33ef96c917e595344",
"powerpc64le-unknown-linux-gnu-0.7.12":
"0d550348d7a0f54352824cd751dc7baea0c23b17d744a5a7784b6b825e5fc909",
"s390x-unknown-linux-gnu-0.7.12":
"76f5a2c1c13446233312d140136f3f55fa7c162176327830eb109ccaae6c9cea",
"x86_64-apple-darwin-0.7.12":
"a338354420dba089218c05d4d585e4bcf174a65fe53260592b2af19ceec85835",
"x86_64-pc-windows-msvc-0.7.12":
"2cf29c8ffaa2549aa0f86927b2510008e8ca3dcd2100277d86faf437382a371b",
"x86_64-unknown-linux-gnu-0.7.12":
"735891fb553d0be129f3aa39dc8e9c4c49aaa76ec17f7dfb6a732e79a714873a",
"x86_64-unknown-linux-musl-0.7.12":
"bb493f1e6ae426c06b5a103cb71aa60c678976d2377f0590644538658656c2a7",
"aarch64-apple-darwin-0.7.11":
"b5f4cb27a3002d6590c3681377c6d826db0b52e2a9529c7144fcd53fec89ba79",
"aarch64-pc-windows-msvc-0.7.11":
"856bac93344a6980b2703a4143f26fc042c941b02f11ed21f55ec6be3fdfde87",
"aarch64-unknown-linux-gnu-0.7.11":
"80cf695c4e10b532e9db3c7fbbcfb0f8356f2e70e7a4a5040e005f0fae70923d",
"aarch64-unknown-linux-musl-0.7.11":
"2ad20d143c74d7f63d1c99db3999f239f045b7be041e23f6ac8b269c99fa54fe",
"arm-unknown-linux-musleabihf-0.7.11":
"21fec46f09d96cd9f51378fe01ed050dd2032c1fef823f8bd81fa50a2337bbcc",
"armv7-unknown-linux-gnueabihf-0.7.11":
"1a75aaff4695c07151d5b9abb50232ea9fb6f5ccc82d4b319abd8796605d9db8",
"armv7-unknown-linux-musleabihf-0.7.11":
"431b3115ab8fb5e2210d01f29b7901e6eb1174ff65545ec49318d6d4adf4c802",
"i686-pc-windows-msvc-0.7.11":
"985f5eabf42b8ad0166ae6b9f799564220fa932938a8401c890d5e07321ce7c0",
"i686-unknown-linux-gnu-0.7.11":
"619e205d56594fc530dbde6c6a543dd094c796791a5e2cfcd3bb70fa5767bf9d",
"i686-unknown-linux-musl-0.7.11":
"838c6336ba8e88818459b10c3520e83601b9c0a9850a209accef9782c050faad",
"powerpc64-unknown-linux-gnu-0.7.11":
"769c7f32cbc2ad918ccf9ae661d99a6c0d0fd3a0056691832b4a79049a9d06ec",
"powerpc64le-unknown-linux-gnu-0.7.11":
"c9bbbcc2d4f11c83e0edbff5868d95f07f81455adb6f2f909cdb9b992928101b",
"s390x-unknown-linux-gnu-0.7.11":
"0e7b9b27e9fef1b42aa052173a2a47a2ec33bad82425237dfac402b7f69bd073",
"x86_64-apple-darwin-0.7.11":
"97980b067dc3fea16534371b030eaf38554d701de5058004edcfd542a88a2e84",
"x86_64-pc-windows-msvc-0.7.11":
"0f4ef69fde75bb8bcfba7ecf0a4134d8875578cd2e98c9fcfc21573e746c70ac",
"x86_64-unknown-linux-gnu-0.7.11":
"df54b274e99b7ef26030dc21d105ce115bc21a644fc6a321bde9222cb1616de6",
"x86_64-unknown-linux-musl-0.7.11":
"e4e8948645ebea1950a3c77574ce079dfe1c71547ba5a8a141d6e362fa036684",
"aarch64-apple-darwin-0.7.10":
"316b80c19832ff4085748c3a20a3e05f36e1d19234e8b9399a6fd1c971241bce",
"aarch64-pc-windows-msvc-0.7.10":
"1eed0f11bca79403648195f8ce257763d956e861cb73de98c480dae15358bb26",
"aarch64-unknown-linux-gnu-0.7.10":
"8746acb754807050124c6dbcb05fcad2665a3f0cdb2a0fe9de528bd37b092656",
"aarch64-unknown-linux-musl-0.7.10":
"f9000f08850a5c575d5fe1ddc2ec928ecc9f287ecdcd9fa1ea4e3f405b23d4a3",
"arm-unknown-linux-musleabihf-0.7.10":
"657b1b8a534f7fe78e63aff56aac5bbcb21f6254df79825fe204d5c7c1219653",
"armv7-unknown-linux-gnueabihf-0.7.10":
"1cf4a8f40abbd802a7b44fe9695da356701100d267eb3567c17db27e0a24cf69",
"armv7-unknown-linux-musleabihf-0.7.10":
"5282b825f469295dc2b88c94eccd375a93135a279b0711cb10e615e7a71a0617",
"i686-pc-windows-msvc-0.7.10":
"f3c62ff935685d9d4312b82d01ed386493b97c3d22bd434d943fc99ce9aef83a",
"i686-unknown-linux-gnu-0.7.10":
"24a2a3eb0e89b74de6aac492516303747519439775d22254e838d33410ac27b2",
"i686-unknown-linux-musl-0.7.10":
"e317d35af60b38ad32935390a83d12adc3ed7ffdbc2ccccd3039bf6cef650eb3",
"powerpc64-unknown-linux-gnu-0.7.10":
"c1ab41ec53cd720179f3351b61b4ded73ec520804413b75051736829a125e4fe",
"powerpc64le-unknown-linux-gnu-0.7.10":
"ce2c3fdf177facf6c77c5316bb54b9deaf498bee9f664e01a4030ecf27063ab1",
"s390x-unknown-linux-gnu-0.7.10":
"b7603e3f4494e9093a86ace1103e3fcfa172a952989f0c7dca6eeac7f77be81f",
"x86_64-apple-darwin-0.7.10":
"9123e8aa944654404787f80731ec08850c4e9b9129c0d0445c9e41438828b8b8",
"x86_64-pc-windows-msvc-0.7.10":
"1568a71af55e9d9bc4a050ec79134a342a8a3765a73f6b7ec26490c2814f8797",
"x86_64-unknown-linux-gnu-0.7.10":
"ff2ef46298963fee8104ccb3c0a4ecbc97c057ac6a0bc5fec7636c855384252e",
"x86_64-unknown-linux-musl-0.7.10":
"b2cf1f63e83a873652ffef032681bbbe1469e3bab617f7e715e09529c30f5689",
"aarch64-apple-darwin-0.7.9":
"7a8b716a2b5905fb89512371ce6c6dbc0dd0344185bd1cd93a3fe27516eef7ec",
"aarch64-pc-windows-msvc-0.7.9":
"63c0990b9c49dc9f9a92aaaa27ba627cbf9cf6b2e42766588ef6f880208893de",
"aarch64-unknown-linux-gnu-0.7.9":
"23242a8051e2191ed8d61f71a6792f2fc069ef18e6cdf07dedac3d3f648643c5",
"aarch64-unknown-linux-musl-0.7.9":
"60f30508c9002b2b7af55d70db2741cf7ea24c066ced710ad09681a6d2d19b3a",
"arm-unknown-linux-musleabihf-0.7.9":
"57d8e43e257f0ccd9df2b8581338c5145b9937aba53e9c9bb81b31044b720c61",
"armv7-unknown-linux-gnueabihf-0.7.9":
"83353ee7e1724083ea94d7f488fa34c9159995a3996f87017fdf72e422c93242",
"armv7-unknown-linux-musleabihf-0.7.9":
"b2d8d81bc2abbdd857bad7cd3bf0d36c5155c0681aae8ac9fb8f49d54b95b3f2",
"i686-pc-windows-msvc-0.7.9":
"b5dc0dc10d9dd0dcf5729a94e98538418760d13877d4d4b1bc4efa9926280e78",
"i686-unknown-linux-gnu-0.7.9":
"fb8f1a7cb593c819c0fff71afa2dc480237ca80a3f5d8d433c8b51d2ae90ffdf",
"i686-unknown-linux-musl-0.7.9":
"a77592be13fea81ca42b2b7815784e769e1fd9ff476cfab69f2652823f99c55e",
"powerpc64-unknown-linux-gnu-0.7.9":
"26fee4867c158c04dd3a51ff9a23b4220a9ba69fae2e71be618d2cfa48164d96",
"powerpc64le-unknown-linux-gnu-0.7.9":
"d588fbb01cacccb7fd6e0f101d34282ebb0569381f967d332f8072055e39840e",
"s390x-unknown-linux-gnu-0.7.9":
"d823d68ff662b7e59c6791281427bf1019dae791a964ffae31ae1d2d723dfc08",
"x86_64-apple-darwin-0.7.9":
"a4c084568850588b77e4a34c21b7df5c8cf9e2160b4d614307ed92fa12411742",
"x86_64-pc-windows-msvc-0.7.9":
"f91d8a3322a10caf257fd416807bd8d2801285b80b46ee37f2d0c6e426b8822c",
"x86_64-unknown-linux-gnu-0.7.9":
"b8450a419c0bcc85841bbed8511eb59e2a5683ddd3f813f2b98b97babf6b1b8b",
"x86_64-unknown-linux-musl-0.7.9":
"95918a1e1faf851a39cad402f1a77318e8fc90b7f829833ebaff27de9722d60e",
"aarch64-apple-darwin-0.7.8":
"ad6b3825ba277de70b9d0a37055f7d828f3f37416aee1cde65000f330efd4587",
"aarch64-pc-windows-msvc-0.7.8":
"e43448e5e3267dffb6bbdc30ffa291f8db664d1da9d084c44f99dc568f459e0a",
"aarch64-unknown-linux-gnu-0.7.8":
"da9e1c97f1452b25c8955127c92da7b68be228ad0b43bf50bba4dadb25c8b337",
"aarch64-unknown-linux-musl-0.7.8":
"4d18efb46f93fa942dc4c212dea3b6b07e3db62fe57d0c3d08de6bf5d9f9bb51",
"arm-unknown-linux-musleabihf-0.7.8":
"133b1c3fb850ec496bfb4ef84379bfaeff1d2c322114a0984d8a5c2e10e63028",
"armv7-unknown-linux-gnueabihf-0.7.8":
"7d61c6e18e81447482dc80c090c65a6615a1232512899943566baf2808ca37bb",
"armv7-unknown-linux-musleabihf-0.7.8":
"0b6d6afcdb7c78e5df42cb2ab0929d2bec2654a350a8efacc6f95e830a31eb6e",
"i686-pc-windows-msvc-0.7.8":
"0d4b01372ca972543cd40366bb5480bb457e79dcf45b5f662721d709d6932dbd",
"i686-unknown-linux-gnu-0.7.8":
"db1c60961aea7a7f8c64a098801e0138e761b7556d1c1691fc4f3f771f0e47ae",
"i686-unknown-linux-musl-0.7.8":
"b765eb1817bc1d545f4860eff0adeb0c7907ea66be14536653192e588386b308",
"powerpc64-unknown-linux-gnu-0.7.8":
"2c894b104195ab194af05c6ad756ce8746a349a8620c83888207db5fccf29a8f",
"powerpc64le-unknown-linux-gnu-0.7.8":
"4b0d93385685f756068f76af1871dcb7cc8f427ab6d650afc07493d06dca71db",
"s390x-unknown-linux-gnu-0.7.8":
"e58fc9f6d846ccbf50d9bcf27920ff4bc061541df8a6a3aa6f13be24981e0772",
"x86_64-apple-darwin-0.7.8":
"f046249639014eb70b43cbaf83eb6f56aac724ada354f9b9aad65f9960737920",
"x86_64-pc-windows-msvc-0.7.8":
"355736ddf9a01ab9da918b35470027c12128d7ed1d7f54f54771507d79529679",
"x86_64-unknown-linux-gnu-0.7.8":
"285981409c746508c1fd125f66a1ea654e487bf1e4d9f45371a062338f788adb",
"x86_64-unknown-linux-musl-0.7.8":
"8a707e45e0d1a8bdbc5bd1af0ae7d19ffab55f3722c5e73471039561900e3d48",
"aarch64-apple-darwin-0.7.7":
"6a06eaa8165d5abd89c3dc37ffbe1db60fcf49a87d7c612bfca7e87a1514695d",
"aarch64-pc-windows-msvc-0.7.7":
"e86cd59f2569f4bf475e5ad944910142c0ab107ad12613429ad8873a6f41087f",
"aarch64-unknown-linux-gnu-0.7.7":
"013061d4d33385e9a3fc52df18d22334f20f12616970b0d81583d5125ce8d6fa",
"aarch64-unknown-linux-musl-0.7.7":
"4014dc9dc024bb5a082f16c54adcd5936d47dae664bafa38453b3017ede41aab",
"arm-unknown-linux-musleabihf-0.7.7":
"c1dc010e3ab855391f3a6906fcffbeac873d136df2b20cfd998105385444e45c",
"armv7-unknown-linux-gnueabihf-0.7.7":
"e08406cfcc1ccc0c069d22c91008967f662664abdbf8a15779a1944070e0f5b2",
"armv7-unknown-linux-musleabihf-0.7.7":
"35379428e6d001e63714449c26c9111d1d5ee6f3b6a95559c724ad57df9d8d17",
"i686-pc-windows-msvc-0.7.7":
"5e47a44df7707b58884cdf5d30527857ec1bf186e8f200517fd11a572669cacc",
"i686-unknown-linux-gnu-0.7.7":
"fc782a829cccb0201c4a918d9f5a3a114511d734953f7e5e60aed52951264454",
"i686-unknown-linux-musl-0.7.7":
"10b852326ee48502d6da26c7fe394345b7ce7ca94d76f293dbe4cde9577c3993",
"powerpc64-unknown-linux-gnu-0.7.7":
"4b26663e0c21289bd21c05a3ba344e6b069c600e5a6333e660ae16eb38027bd5",
"powerpc64le-unknown-linux-gnu-0.7.7":
"e691d6a8a8c285cd644cf1f6d47c2568740ddca645c860f9bb23799790b54e56",
"s390x-unknown-linux-gnu-0.7.7":
"b21953a1c6c5475306e64f9ccf721762d2fc6aa572ee5268ed61a3b1531f06c1",
"x86_64-apple-darwin-0.7.7":
"4b337495ced2a9797357ee853873c2f5a45cc52f6ed68c9feba3c997443452b0",
"x86_64-pc-windows-msvc-0.7.7":
"a27a1fdf3f6b850dfb45fb009f7ea0fe3db1a59f692ebdc64c24ff8dbd0467d1",
"x86_64-unknown-linux-gnu-0.7.7":
"d83e2b9c2b251c93985824d9a12d97f5b036b7a9ff0b7d647c9ca7ae5ff2ae1b",
"x86_64-unknown-linux-musl-0.7.7":
"3876cafbb6599287a78778d2c265fd2050acfc247409ed677a8583f20385a3ae",
"aarch64-apple-darwin-0.7.6":
"a0e7c0e44ec4b2743e1c1d1f6edca1418687b05084f48c007c6e1c7d3a35bcd2",
"aarch64-pc-windows-msvc-0.7.6":
"2ada1290e87144726b6a723b38fd34ce64da5a3fe820a21685564924f894408c",
"aarch64-unknown-linux-gnu-0.7.6":
"4eae30038653bbec528257054fe07495f20c5d4bc663b630258e87d159e282b6",
"aarch64-unknown-linux-musl-0.7.6":
"9e59f0753383d6a27404be238360165e415605b1504b209349852a27cc01d48f",
"arm-unknown-linux-musleabihf-0.7.6":
"b81d59deeba1f92aba48aefce2b364530baa1cb8aa4c59fc2a90c9acf98c9a20",
"armv7-unknown-linux-gnueabihf-0.7.6":
"e9d1b7d52def14fb1ab8af2fa52963ff8e4323934ec2e78720a94d92261fa9fc",
"armv7-unknown-linux-musleabihf-0.7.6":
"c525ad0f41c67d944e56362adffcda206aef36f3ed84daf90386fcbfa4a62c66",
"i686-pc-windows-msvc-0.7.6":
"aca45dbdb75cd2c5fdf70bf5ff436306d476352b135fcab544c4a9759d7d1af8",
"i686-unknown-linux-gnu-0.7.6":
"71448fddb93306b1b67f0c2e711eb79b6ea33d027212259abd7546a48d15b49f",
"i686-unknown-linux-musl-0.7.6":
"a641ada8b2ca3ec22c24414c2edef8c01370d7d4ac79998eac091b84f743c476",
"powerpc64-unknown-linux-gnu-0.7.6":
"9f63727933d11b0157ebc3fd640811c1224fe55215acff24e8ec5747fb4f90fc",
"powerpc64le-unknown-linux-gnu-0.7.6":
"da746e6e809f32ab9709e45c7d5e7c37901478cc610119c08ae335c43ac089b2",
"s390x-unknown-linux-gnu-0.7.6":
"a07d4303e97f72312f9db8a1a67bae08f02d883f1879fa917b9ae87aec90d933",
"x86_64-apple-darwin-0.7.6":
"718cfd68b13a1a642fadc53646742785cd33b2e06124a01454ad358617841852",
"x86_64-pc-windows-msvc-0.7.6":
"4c81818cc89d75ca54762e2641deebad69c0af6594212a9fb24b9849df8ac413",
"x86_64-unknown-linux-gnu-0.7.6":
"0c5f0935bba35359150774fc5876d72947b863b8173c94dda776e6d88014a0df",
"x86_64-unknown-linux-musl-0.7.6":
"be755e8503b7e7174f24ad8cdcadab94f0662fe0b60df4fc35e1ddae48b19f35",
"aarch64-apple-darwin-0.7.5":
"8d82c7f6fcfd79b142c8845f694c8225dd5b401cd720e8e1e2a35a1c4150f516",
"aarch64-pc-windows-msvc-0.7.5":
"9ec005bf0b472d47ab730e463cc5a156b18ca9a9a6fe1c72bf18d97384d0b717",
"aarch64-unknown-linux-gnu-0.7.5":
"715bd03f6b2924b8f742b716d0f4b9d31ccbb1ad4a7f8df4ce2f572efff7f2cb",
"aarch64-unknown-linux-musl-0.7.5":
"ce23f5e1d22f1cdfc0db4358d3b2642c115ad99d404aef15030af31e39ef3484",
"arm-unknown-linux-musleabihf-0.7.5":
"2e85c3ba3ba461822940bca197198babcb1a8ce620c3d1c624423e68bba49d43",
"armv7-unknown-linux-gnueabihf-0.7.5":
"cbd7990fb0d06750f7e966a54dc344396e4d605d029aa94a0cf00d695cb283e9",
"armv7-unknown-linux-musleabihf-0.7.5":
"96d5eb1246e654f4e2c37542797196d94c0d72fe44e470050a9fbf67e356fb10",
"i686-pc-windows-msvc-0.7.5":
"84e70b46e0f218db9573b0efce085c13e0e5ce7808b3143b990d1a334e5a8ee6",
"i686-unknown-linux-gnu-0.7.5":
"20efc06bc129d8757e81fdd00cf828a9c1d928a4a30c8c538c6d1ed219b52c5d",
"i686-unknown-linux-musl-0.7.5":
"3cc8dbcdb230a6abbaa3cd6b918d6150f747f45f8f96b7399d6258c54fab5867",
"powerpc64-unknown-linux-gnu-0.7.5":
"dab5571d40ce3347fe295b9afec9f560ad709461883ae604d0de827071b8d2f8",
"powerpc64le-unknown-linux-gnu-0.7.5":
"4c3843068cd0e1bf9e5f68e5487fba28feef3196c025a1b1eaddd533a52b7bd7",
"s390x-unknown-linux-gnu-0.7.5":
"1b286e386a4d66dd9393caf78888a881cf63202522a6a88262e551bc7b8b3995",
"x86_64-apple-darwin-0.7.5":
"751ae339c91a6b8eddb868a64222c2533c722042476e4f28466683ddf96fa488",
"x86_64-pc-windows-msvc-0.7.5":
"e95cb3789b2f80052c80048ff2865e06eae7512d06d304127898c70c4fd3564f",
"x86_64-unknown-linux-gnu-0.7.5":
"a3d1964080a855e1f8806975b5fa943376045a64852c06ba80540813aa333305",
"x86_64-unknown-linux-musl-0.7.5":
"be058167ae65f7a2b56f607b070bd4e93dacd09be52511ccb8ebb10fa132709f",
"aarch64-apple-darwin-0.7.4":
"1af8c353479890b29b75933706890627555bbc07e12a0117ae62da3ec2ee372e",
"aarch64-pc-windows-msvc-0.7.4":
"3800868f3cc1509d6ea16036e3268ff45fd22a85c922cf3de4fb9535dbb0099e",
"aarch64-unknown-linux-gnu-0.7.4":
"c407e4c7431ee6cb28deb842edb49fea1ee3f5674a357f11244bfb0fd57e2ae4",
"aarch64-unknown-linux-musl-0.7.4":
"ff0d9172d2105da526501e01c38ecf0558ea323cfcd25adff9a89cd7fad5c076",
"arm-unknown-linux-musleabihf-0.7.4":
"4e6b7d15444ae58bc196ee4e7e6e11b451b4e994c0c73968254d3d4ff1c89bca",
"armv7-unknown-linux-gnueabihf-0.7.4":
"303bac0f866c450fefe7543297fa87563941f924cb13f007dfe7cc02ac64dcd7",
"armv7-unknown-linux-musleabihf-0.7.4":
"004e22fe946fabec6b5dff668f4bd8f93569dab30efe0f3d4640f266760744bd",
"i686-pc-windows-msvc-0.7.4":
"113070d23ba1498cf9fff9ae634893a2a1dce42a0baa617c4a82009f61c71fbc",
"i686-unknown-linux-gnu-0.7.4":
"19f0f19dfe9d722a2fb89bde4771682cf632182d6204cc4ddb11d700d5b34c07",
"i686-unknown-linux-musl-0.7.4":
"fe281041401b4140a387f6101e64fcf4abb344791c12398c441c7e339510423d",
"powerpc64-unknown-linux-gnu-0.7.4":
"ef2320254e52234750d9745e6dc6e3b3c990aa51e506057d0869d4d18b55e5e3",
"powerpc64le-unknown-linux-gnu-0.7.4":
"e143278764aab89b68c6f55dfdfa4242c8f5d5213880b584880a776a5ca1b0dd",
"s390x-unknown-linux-gnu-0.7.4":
"14dbae76be8999dcc8336fac1f6f86710e7ce4f4c3e1aec01e7ef7f9a3468811",
"x86_64-apple-darwin-0.7.4":
"a6c5fd8aa67db03447934b14703a2d7bb04b5e5f7ff45630a749760393c5610f",
"x86_64-pc-windows-msvc-0.7.4":
"966d0dd8d86f02f94128714180cd5ff42cd2ea9b33b86fc197f25cfa066aaea1",
"x86_64-unknown-linux-gnu-0.7.4":
"5264d9b2bf021fccbaf6edb97bc17ce4863687745f2443460a8ca71e55891614",
"x86_64-unknown-linux-musl-0.7.4":
"70083140d9efaf82cbb7ffa6231d5de3536d6497ec84d708afaf9b7e2fffbac2",
"aarch64-apple-darwin-0.7.3":
"162b328fc63e0075d4267688201de91356e1c1b81db50419fa4466cfe2dfdebc",
"aarch64-pc-windows-msvc-0.7.3":
"542b318c98b0295dd3d620fbcd63388757f382e14c69c569cb3ce793aa75c975",
"aarch64-unknown-linux-gnu-0.7.3":
"2c2be8bbb83e9bc722f2013de8bb7506cfe6521d0e30b4ad046849d036b3eea6",
"aarch64-unknown-linux-musl-0.7.3":
"a3f01c3c993b57fa8d13855c5ba60e3847bda4f8e795a52d52879e242e886604",
"arm-unknown-linux-musleabihf-0.7.3":
"87f72dc1c3b1b598e08c8efc7f9ab8eca23df8549cf4c1fc27a4a6b2524809c1",
"armv7-unknown-linux-gnueabihf-0.7.3":
"69f285d861cd1809a4bad0f08c2ea8a77ec17cbe20524a4ebbee4c5a7c868520",
"armv7-unknown-linux-musleabihf-0.7.3":
"1a0071551cd575bbecef3218fb13bf05ab96ceb71b4b1d13a99b8a4af059f99f",
"i686-pc-windows-msvc-0.7.3":
"1c9becbc63c15dcf43b09c0ba84e0ba6fa533fa799b7baf57a36363ef42fbc52",
"i686-unknown-linux-gnu-0.7.3":
"a2b56cb262337380aa02b6d131e973d54090c3e655d3e55385d02850454c24de",
"i686-unknown-linux-musl-0.7.3":
"d6e846079ef38929206079147448c5683a3018116b2b3e6059cf4c26bcfbb290",
"powerpc64-unknown-linux-gnu-0.7.3":
"a9b94c618a5d5bc992102733a45759e38db9a9e069830c3e94c744d1bfc33c21",
"powerpc64le-unknown-linux-gnu-0.7.3":
"782e9c343cb7c219b5514e64a799a8b9fa82585f6176b53ed095dc030a22d993",
"s390x-unknown-linux-gnu-0.7.3":
"ea803eafd6e3414d3a18aed9257f8ded8f7d1f6f182d2572969c4c487faa1986",
"x86_64-apple-darwin-0.7.3":
"d676940b51bdd5606b218bc2965fed67731f94ad07926045716acbf78626e09b",
"x86_64-pc-windows-msvc-0.7.3":
"20d3a420abbf2af9699cd9a02225d9325344046af8deb15563cc451e3c4fd059",
"x86_64-unknown-linux-gnu-0.7.3":
"17fc118ba4d7e9303f84fcabdc0a593fc3480ba76eb6980668fdbbb96fe88562",
"x86_64-unknown-linux-musl-0.7.3":
"325143825b88e7b0dadd1a8e8d3cbe4791d3cbbb9e2244350d917803fec8b3d1",
"aarch64-apple-darwin-0.7.2":
"8edc0bea8a9e35409f970b352036326393e79a6039577d8cc9ef63872c178a99",
"aarch64-pc-windows-msvc-0.7.2":
"a3d7affcd62e617bd2dd2a91fde679dd8d68a84762c8f3aaac294606ec14ffe5",
"aarch64-unknown-linux-gnu-0.7.2":
"2872fdf4785666575d129ba90590c44e6508e22584735f3e7e8a30d773dfc3db",
"aarch64-unknown-linux-musl-0.7.2":
"d5b31df40da794dab943c55e67d14fc111146e185b14a6de6eb749ee264a641c",
"arm-unknown-linux-musleabihf-0.7.2":
"fd203cef8c6cd775c2a5f7da31f69a72020a6c74b6fb808db3217ab04b70a038",
"armv7-unknown-linux-gnueabihf-0.7.2":
"b69999c29c759f5a47f71c1f328d6e7c489229efa5ce0e84afce026201730abb",
"armv7-unknown-linux-musleabihf-0.7.2":
"f98a827e198de2d0a7224ecad87eb64c18c9c0ed4f0c768456e9b48482015d2f",
"i686-pc-windows-msvc-0.7.2":
"8b06489b2cc8814fc23dae4562c5e7d500e782c2b0d2556529f515a4d1e0b8e3",
"i686-unknown-linux-gnu-0.7.2":
"36f26a496c6dc53703e070761ef96f07acc88eae868f94c4665f5c17a88d8acf",
"i686-unknown-linux-musl-0.7.2":
"763bf7cd2119c40858cbd0892fd9b2c7102c79e5c590800b2f8e9c2f427cb7d1",
"powerpc64-unknown-linux-gnu-0.7.2":
"bd4a42ed0b9ab725f0cb565ae29c338ea6ce0689ddb35da632535a47c891e72f",
"powerpc64le-unknown-linux-gnu-0.7.2":
"9a598869167b7e56ab971614972a2c486c8137681210094009a6fb61ac36699b",
"s390x-unknown-linux-gnu-0.7.2":
"7dd2240d60b1628869a2348ca0901cceee572bc20116ab04f9484ea0b6d40813",
"x86_64-apple-darwin-0.7.2":
"7d30b59d54900c97c492f3c07ff21cc3387a9e5bd8ca6db2d502462eaaeefd68",
"x86_64-pc-windows-msvc-0.7.2":
"35fd793df52fd13773425c9a97cc94cc13c8ee63abec6380b5083c183c688019",
"x86_64-unknown-linux-gnu-0.7.2":
"cfaab1b5166a6439ff66f020333d3a12bbdf622deee3b510718283e8f06c9de7",
"x86_64-unknown-linux-musl-0.7.2":
"dd10babf6c531597d246c97e55e32ca17b44fe251405fe539ec8ea2f22fac2d6",
"aarch64-apple-darwin-0.7.1":
"236d70d7738a5f41b45253d68665fda039fecee579939921e0795680d300f55f",
"aarch64-pc-windows-msvc-0.7.1":
"5fdbc703e6f22696ac053811e9750ff3cf50814aabf1792b9bc49f2647b836c6",
"aarch64-unknown-linux-gnu-0.7.1":
"ee8a98f485a22837be9e95eb55e4cd06db6c8deba94b6a2dd63d828fb5ef4226",
"aarch64-unknown-linux-musl-0.7.1":
"b65409802669913f5fd49ed6656d45c434aa9273fb864aefa0fbbb685b9834b6",
"arm-unknown-linux-musleabihf-0.7.1":
"96cfceb7716a9003750111c7f1a62aebccf02e0288f95bc670c69062d2ec6e61",
"armv7-unknown-linux-gnueabihf-0.7.1":
"f156bdedd8a969dc49a5e01f6b38c7e50a63cf69acf3b5982adfaf232dfcb80f",
"armv7-unknown-linux-musleabihf-0.7.1":
"ae21a9c0b413976a24c51f095603294ca36da9089813022cb9bae0b84f0be6de",
"i686-pc-windows-msvc-0.7.1":
"38a98c532e463169e8c4f1ae3649dd500c168f6db687e3b29570930c55ffedf7",
"i686-unknown-linux-gnu-0.7.1":
"133a41ae763d8474cc4ff8e0c24ab8cdaf422f261cbcc284f4b90b57aa60f3fe",
"i686-unknown-linux-musl-0.7.1":
"6e55fea1ee9a8c5c1d29b3aeb033a8b01d3895a347b27ee108ba94c53d60cfb7",
"powerpc64-unknown-linux-gnu-0.7.1":
"cd6714a55577d6eb0ecad313646a4ade3c7a4407e1a2a4703a2fbb83c88681d5",
"powerpc64le-unknown-linux-gnu-0.7.1":
"a354eda3a43323cf5445cfdf0197ebd4b36e967df9537e97910c47dcd9321aaa",
"s390x-unknown-linux-gnu-0.7.1":
"59d194c544a8a53186c3da6ac26f90ab0f453fae71fd2e0d4d177a8ed8890abb",
"x86_64-apple-darwin-0.7.1":
"a81e655cc0b6a5ccf9197f2dc0df513171e68804e498c17076d6e56b41234c5d",
"x86_64-pc-windows-msvc-0.7.1":
"b4d48072e384014ecd04ec5c544aee523ead1faaebcd428ba5f6abf2836096df",
"x86_64-unknown-linux-gnu-0.7.1":
"cec71afc57276b1857970d6ec96e110989c3e4ed0d81f0c4c11c1231970b7e56",
"x86_64-unknown-linux-musl-0.7.1":
"9b714ddf470795d5f1aa5c8111ea153139ae202216ffbe4105fb92f202e0b02b",
"aarch64-apple-darwin-0.7.0":
"964ebe641b563920e0650a60bf5ac21e6c8c56557704e5ecfaaad7ff62c3a73c",
"aarch64-pc-windows-msvc-0.7.0":
"c00950aa4b243e1043d1ec651fdfd71e5f4e5b80135b30fcf3b70fc201aeb1c4",
"aarch64-unknown-linux-gnu-0.7.0":
"540fcb8f2f972c82260a8063a6a4b496d7ff858edc42aa0e2c733a7b55ef8dd8",
"aarch64-unknown-linux-musl-0.7.0":
"f6367e288617021aba6176945ba20a7f8ea3b22a5f8896314a7d0acb863b533e",
"arm-unknown-linux-musleabihf-0.7.0":
"6fc85b25a4b3cb27b924e1f3181f96197667b7465fe52bf703afb5539d09c09c",
"armv7-unknown-linux-gnueabihf-0.7.0":
"035b46fde90a7ee4b48292ff9d116cc771b10d9e955d1979b1a1cd6b3998f602",
"armv7-unknown-linux-musleabihf-0.7.0":
"5f43390685fbb9f29d6075df1d492f9bf39cabb868bf37e0da3cd925c679b068",
"i686-pc-windows-msvc-0.7.0":
"f045db339b2acecc790d2071598275086978a99262d9c4b0c52189c26cba68a9",
"i686-unknown-linux-gnu-0.7.0":
"9936acd12616548a04ce6875aa125ea34f3b288181f2188bfb72d914965680be",
"i686-unknown-linux-musl-0.7.0":
"bfad15225152d9fa8769731b35dd53e0b39cba045900b6d43f90e655652af5b8",
"powerpc64-unknown-linux-gnu-0.7.0":
"91cfac9b5a9ba844c3ba90944e00bfb79da2983b7c6306bdb054c75ab3fea0fe",
"powerpc64le-unknown-linux-gnu-0.7.0":
"d690793c993a1a03049b7e7f3f0e41c94ba2c45b0155bdde917d550ecd4ee02d",
"s390x-unknown-linux-gnu-0.7.0":
"429ffee0dddd8c0c59e246fb89bef721d1ed22a4c051925d7dfafcfc7dce464f",
"x86_64-apple-darwin-0.7.0":
"dc5037f3ffbf8074b3ee63de7a73aa57421b0da0837a478e26317424dbab16f3",
"x86_64-pc-windows-msvc-0.7.0":
"62836c9d6e3f346d06c45fee4109be21ca9d1df8d087472dcc8d51815f182332",
"x86_64-unknown-linux-gnu-0.7.0":
"ca1e8196672bf04ccb926519f2071208a8d6c0ce02fb65bc7d0a85be1b684b0f",
"x86_64-unknown-linux-musl-0.7.0":
"08e1bb8fdea2c6d5edbe40ab1651de097b884020056c0925a9973582ff669d04",
"aarch64-apple-darwin-0.6.17":
"e686c73b9314c77a36a6a4c9f94b07c001f0c9157c50c63c764941141c0d0088",
"aarch64-pc-windows-msvc-0.6.17":
"3a9468e90df970f75759da6caed7dfde2816e0f3842031235c3835fc0c4e7d09",
"aarch64-unknown-linux-gnu-0.6.17":
"6fb716c36e8ca9cf98b7cb347b0ced41679145837eb22890ee5fa9d8b68ce9f5",
"aarch64-unknown-linux-musl-0.6.17":
"98750f5c0cd9eb520799d10649efb18441b616150f07e6c1125f616a3fd137e8",
"arm-unknown-linux-musleabihf-0.6.17":
"649d8d0f37e8365af5aaa012b09dd083d6e71018e569a4d2e78316d5013f18a7",
"armv7-unknown-linux-gnueabihf-0.6.17":
"efc12955d7a6120ea0be2de5ee03dbb33d0d7d9de9dbe0dce560514f2ee129d3",
"armv7-unknown-linux-musleabihf-0.6.17":
"0661d97df8262ef83ccdc6a55ed101abfe8f1cf1ff1be879d9b0d7d1e894c970",
"i686-pc-windows-msvc-0.6.17":
"56dea6c98e1606e95445e77177d7e3cd49bb3d1a63c81b11fe49bf733adb62a2",
"i686-unknown-linux-gnu-0.6.17":
"4bc37f8303a4a5aae1c309f08166884027f325b6872c418cfbaa2cf20a2b2ac5",
"i686-unknown-linux-musl-0.6.17":
"8ec08cca0806a9205ccf5758258c617b57e413b33275bcd861fca363e0eaddf7",
"powerpc64-unknown-linux-gnu-0.6.17":
"d33b70ab206e1ed0663e755506a11db3776787012bfe9d2b2138a90942f506be",
"powerpc64le-unknown-linux-gnu-0.6.17":
"cd91a579850fc45d3b786a654a2c0343836f007929b2e35de9606082eec5361f",
"s390x-unknown-linux-gnu-0.6.17":
"3c753a9d3485bbac23403a0b41a9e70ceeb586f3b4df891ced7ed27d4c6c542b",
"x86_64-apple-darwin-0.6.17":
"61e9bdc02aacdb994da6ea2a477b11b34c23fc09203237aeee8d3817daab012d",
"x86_64-pc-windows-msvc-0.6.17":
"32882cf98f646cafca003e7a7c471b7ff4ba977b681c9fa3b12cf908ba64af82",
"x86_64-unknown-linux-gnu-0.6.17":
"720ec28f7a94aa8cd91d3d57dec1434d64b9ae13d1dd6a25f4c0cdb837ba9cf6",
"x86_64-unknown-linux-musl-0.6.17":
"28bd6b50be068cc09d8a46b76f8c4b72271d471c6673a5bdb47793622e62224d",
"aarch64-apple-darwin-0.6.16":
"2b1ea0d5cf27375738f5f0f229587bc3590c0f501cb00bc48133a3d122d28364",
"aarch64-pc-windows-msvc-0.6.16":
"5abca187b8aecbdffef7547cb39a527168e4cb93d8d2e4ce14271f5831a4d902",
"aarch64-unknown-linux-gnu-0.6.16":
"a82f96ab5f285825f9acee6ac1563683c4940d80df2f08549cad43d37c7ba4a7",
"aarch64-unknown-linux-musl-0.6.16":
"ae3f793c62fe6ced80483d6c78cb49f06a01088bc5d86f1446a9b5988b2acecc",
"arm-unknown-linux-musleabihf-0.6.16":
"91f7f5a4eb97b7983a8e5421d5bfea8802064422ce2f535055f373726eb0aa9a",
"armv7-unknown-linux-gnueabihf-0.6.16":
"a4ffe043952bf4e757a5ca0f546bb83b055b6ee0646dd5c4f5e5f13dbc5ee8f8",
"armv7-unknown-linux-musleabihf-0.6.16":
"0237c8d9914e0d9fd2f022d6d5f91ce392d13e0ccbb7fa7ebe601296a67c3d6c",
"i686-pc-windows-msvc-0.6.16":
"f5c6400f07db2014b2b0c66770e1125fa70efe4dd99cc8351838bed0045c34f8",
"i686-unknown-linux-gnu-0.6.16":
"f46f89efcc599a6695e8378a1201e62cd4afb9a4438d65a89098ab11201f84ab",
"i686-unknown-linux-musl-0.6.16":
"afe69380a9d3592a87893d6bdc11ff33e4180b98f1e1fd4e626c0307d7598914",
"powerpc64-unknown-linux-gnu-0.6.16":
"bf455747580dbbf76cbcf616f67f825c40bd1bdec20c9ff993e03485f9eaad44",
"powerpc64le-unknown-linux-gnu-0.6.16":
"508ec561b1740a551d2b33e96671e0e8435a1bcc0e97080f3d7ba88a096bd360",
"s390x-unknown-linux-gnu-0.6.16":
"e25c5527826524f51f114388bff47871bf1ca67badbfd72d45427bdba4b46794",
"x86_64-apple-darwin-0.6.16":
"ce512b5e40a8ad2916a46df2bdba729d5541e4b3649a09aaddff6e525be012e4",
"x86_64-pc-windows-msvc-0.6.16":
"f1b4c24ec602b6c0b06b6bc64aa447bbe4cf313e93fbec326741961e80ffa8b7",
"x86_64-unknown-linux-gnu-0.6.16":
"e9ef28b675df68978a60f87192fb8c730b8bfca9bef42b121686b218ea0f6542",
"x86_64-unknown-linux-musl-0.6.16":
"25024557931d04cc34f80b818c7547c9c62b762ec6df807e30cb52f383fa2615",
"aarch64-apple-darwin-0.6.15":
"1c5b25f75c6438b6910dbc4c6903debe53f31ee14aee55d02243dfe7bf7c9f72",
"aarch64-pc-windows-msvc-0.6.15":
"317fe0b29e647aad1e9f02ffe764dcbbc6e2ef189f018c81b673884173ab98ba",
"aarch64-unknown-linux-gnu-0.6.15":
"3bf650aec162157b7e01461f41c2a9797366b6043452c6e7035c6c926d0a585b",
"aarch64-unknown-linux-musl-0.6.15":
"183cebae8c9d91bbd48219f9006a5c0c41c90a075d6724aec53a7ea0503c665a",
"arm-unknown-linux-musleabihf-0.6.15":
"d83c76e130ffb25fb6a4ba8ea5870207d810190733a14ae87084c63a417912f6",
"armv7-unknown-linux-gnueabihf-0.6.15":
"d661ec44e5fc7553cd8dd5ad5f48848c5a4d5279ba0df0036c0e2422ec9f312b",
"armv7-unknown-linux-musleabihf-0.6.15":
"6fc86a829965362f99602c47627b269c9b676731586a60ca5bb9d6069677938d",
"i686-pc-windows-msvc-0.6.15":
"7f15e3377e94fac882b33465cb8cbb24705f5c8d63d9d65c6f1b0816c1d30a0b",
"i686-unknown-linux-gnu-0.6.15":
"bfedd03be9f579a9bc10e6c25176017e514cca0500cfb9bba43794387a577661",
"i686-unknown-linux-musl-0.6.15":
"82bf8666c0a57514af4e5403f162314b710e1682e1065ab71a845ebb5d8db0b7",
"powerpc64-unknown-linux-gnu-0.6.15":
"6e9795344d61ee9ac497d6e03a447d808f2aab13925f30e44c00638abec57deb",
"powerpc64le-unknown-linux-gnu-0.6.15":
"e38f13284ed8b645b87ef07c8b549d1f1a5b746aa0411c2115dcd5cda0da13fc",
"s390x-unknown-linux-gnu-0.6.15":
"416f61249b330ea9735cda0c866c9460f87111bc9d4e040c98916fda6a45be09",
"x86_64-apple-darwin-0.6.15":
"97adf61511c0f6ea42c090443c38d8d71116b78ae626363f9f149924c91ae886",
"x86_64-pc-windows-msvc-0.6.15":
"10c75d566db1447f3bdcbcb31d6598e4b5f4ea638be5d8b73a7350929389512b",
"x86_64-unknown-linux-gnu-0.6.15":
"85d98ef282cdbfcb4020922f0c12421ecca4130f0a4570d3b827a15ffd544acc",
"x86_64-unknown-linux-musl-0.6.15":
"78289c93836cb32b8b24e3216b5b316e7fdf483365de2fc571844d308387e8a4",
"aarch64-apple-darwin-0.6.14":
"4ea4731010fbd1bc8e790e07f199f55a5c7c2c732e9b77f85e302b0bee61b756",
"aarch64-pc-windows-msvc-0.6.14":
"7b0b3367c4060c9b47b961201ceb4252e97496c890ad1bd13c664bf5b0744d57",
"aarch64-unknown-linux-gnu-0.6.14":
"ea25597354af186bdd55aee0de431e16d45d82951a4f41f065a8e4dc27885265",
"aarch64-unknown-linux-musl-0.6.14":
"94e22c4be44d205def456427639ca5ca1c1a9e29acc31808a7b28fdd5dcf7f17",
"arm-unknown-linux-musleabihf-0.6.14":
"de00f51ff804c145f9a0a13ead54e1ed08d317fac690477312cf9430ed43e62e",
"armv7-unknown-linux-gnueabihf-0.6.14":
"d73b09f23c7056b3b5318edf670ebc8d2eac5adfdd4f4ee46796723298f21e18",
"armv7-unknown-linux-musleabihf-0.6.14":
"f7844b89c77d1d57ca28a25b6b2e16a5bb3605ccf1dd9dc17ce641a2fa2d8b29",
"i686-pc-windows-msvc-0.6.14":
"4e9f9ccc229a03d923213b8b4c7b373cd8bb941984f421de17fe9dac3d5491e9",
"i686-unknown-linux-gnu-0.6.14":
"32c967c3dd80ecc9006a30be1a9c8ec77d63aa8080b78787d4ec0f79db12dbe4",
"i686-unknown-linux-musl-0.6.14":
"c5a484d15049fd2b8ea9a7bbf0f968614819a7eda769f35c202e01e1904f6458",
"powerpc64-unknown-linux-gnu-0.6.14":
"79abdc4c6e566e98067dc4b612f1fca5cb384b964553a0b8e0f5c40885ff3db8",
"powerpc64le-unknown-linux-gnu-0.6.14":
"2eae20cf66ba5de1b7ac180458e4f2a889cd705637626e01c400f73f07dd0491",
"s390x-unknown-linux-gnu-0.6.14":
"a51f8319b2b334c1392d3927e925b46c62ac584eb35b944d384f0af227cf0f36",
"x86_64-apple-darwin-0.6.14":
"1d8ecb2eb3b68fb50e4249dc96ac9d2458dc24068848f04f4c5b42af2fd26552",
"x86_64-pc-windows-msvc-0.6.14":
"93b29fc234758e381df461d7638ff73d0f08bdf3a0dc37923b1ee0b9e442ca3f",
"x86_64-unknown-linux-gnu-0.6.14":
"0aaf451c391d3913823bfb8ed354b446dcfd0553a32ed8266611e4181c61fd51",
"x86_64-unknown-linux-musl-0.6.14":
"0cac4df0cb3457b154f2039ae471e89cd4e15f3bd790bbb3cb0b8b40d940b93e",
"aarch64-apple-darwin-0.6.13":
"0ddb8458634cc3a02799b6da839cb546dff9dabc6f3394912c48dd479016683b",
"aarch64-pc-windows-msvc-0.6.13":
"3f3d6aa73b4859469fa3ad7efca3e5d0dba1112292c91d5c5f740983f16a8d8a",
"aarch64-unknown-linux-gnu-0.6.13":
"ac0c723663ff76183077cc9aa91dcd0b5100081d87f93e1ba482930e0a584e90",
"aarch64-unknown-linux-musl-0.6.13":
"379a5c48f6e3eb32c2d16022c0a4fc10cdfcca3543b75e2e9d819d62fead6a75",
"arm-unknown-linux-musleabihf-0.6.13":
"ba1f630a299cfdd456b93a8b41e20bd2ad37a86aac884aca4efd722a62a26bb8",
"armv7-unknown-linux-gnueabihf-0.6.13":
"1d55eb46510db8f169bb9be6fbd3a6ff34aa52340dff5eda0acdcb1b834e8bee",
"armv7-unknown-linux-musleabihf-0.6.13":
"dc86e9d807ac324eed2e4a73fec341618ea288826a27143b8b695565a35f1b70",
"i686-pc-windows-msvc-0.6.13":
"08367c3a04cf4da1c3ac6784431421de1efb8584ba68b8017efcd5e889d4a2a2",
"i686-unknown-linux-gnu-0.6.13":
"2896a75940761a2ce90a8a650da02d6766de0b9990dfa6a99cd94fd3d1e6c530",
"i686-unknown-linux-musl-0.6.13":
"29e64ef33ff2d7dcbbb3167bc7241de3b9d258fb39a6a992dfc847f1b968d32d",
"powerpc64-unknown-linux-gnu-0.6.13":
"cdd2ba090ce9e3ed66a94bfe95b45a584bd5b9e45626836993f1279290b1a95e",
"powerpc64le-unknown-linux-gnu-0.6.13":
"88830c596ef2a875a0c73aefda48e8398fdafe4eb4acecbee0b44a7995e9dc13",
"s390x-unknown-linux-gnu-0.6.13":
"49e494038871006e36b404f0559f1c831b3e68692986b3c67510a675028c9696",
"x86_64-apple-darwin-0.6.13":
"ed240854d97f7b234082f5a0ce734869a4310d86d46a819860bbce6d7df8b2eb",
"x86_64-pc-windows-msvc-0.6.13":
"19bb08768fd3b8664068cc45faa633ee110bfef4215e560bc1e5833b1bc6c30e",
"x86_64-unknown-linux-gnu-0.6.13":
"f6788fd45a25ea1033a671eaa9ece6c9b004ce5c9cf09552effadde567a7d7a5",
"x86_64-unknown-linux-musl-0.6.13":
"779560faf6a21b5a6dbc2664c2dfbde2b9387b1f486c9197a9f4d143a3b66875",
"aarch64-apple-darwin-0.6.12":
"fab8db5b62da1e945524b8d1a9d4946fcc6d9b77ec0cab423d953e82159967ac",
"aarch64-pc-windows-msvc-0.6.12":
"d72d8cf0633dc40198a868e906442bc6bacfa38c3b807c26bcbf3fc364af5d96",
"aarch64-unknown-linux-gnu-0.6.12":
"d867553e5ea19f9cea08e564179d909c69ecfce5e7e382099d1844dbf1c9878c",
"aarch64-unknown-linux-musl-0.6.12":
"e999ae0679bfabe8a1e6343b8b204a531a6c851e315caff9b326f34182884af6",
"arm-unknown-linux-musleabihf-0.6.12":
"da8d0700ec5e0cb0b2f20cc20834b48d5927197042e49bea5eef7fd139d72fe9",
"armv7-unknown-linux-gnueabihf-0.6.12":
"b5dedaca5fbb46f412c5426102eec7c9f10003a67dd41b943232e4a2b6a5cc16",
"armv7-unknown-linux-musleabihf-0.6.12":
"8fb6c1b16f8b3c2aa4073cd02729432f9afd9389f110850aed8228464fa37398",
"i686-pc-windows-msvc-0.6.12":
"23431d1a798aee234bd7b271bce306fbd760c91d98e19a314ddd890a065aff83",
"i686-unknown-linux-gnu-0.6.12":
"d0774e847de6c0fe6a9c3aba44b7d400261d01171ae32da60c472eb410691785",
"i686-unknown-linux-musl-0.6.12":
"02e4503b244cbb18d2fa14b3a7e9433fe437e767ffcbfc39c5f0fdff9b8dd65e",
"powerpc64-unknown-linux-gnu-0.6.12":
"046b43cf8af74d8892e9559e8b3181ec1e4045a4910a4dfdd00b110694c93188",
"powerpc64le-unknown-linux-gnu-0.6.12":
"e61ba76fa6dfd6041c985881c024385c31d544d6a182d1a050da7594438f073f",
"s390x-unknown-linux-gnu-0.6.12":
"6eae67730009eb4f8ad7a4e5733ab69b6c4dcb21b482f4567015e3e6d0729357",
"x86_64-apple-darwin-0.6.12":
"5b6ee08766de11dc49ee9e292333e8b46ef2ceaaa3ebb0388467e114fca2ed8c",
"x86_64-pc-windows-msvc-0.6.12":
"30fdf26c209f0cb7c97d3b08a26ab4e78ce5ae0e031b88798cbaccc0f24f452b",
"x86_64-unknown-linux-gnu-0.6.12":
"eec3ccf53616e00905279a302bc043451bd96ca71a159a2ac3199452ac914c26",
"x86_64-unknown-linux-musl-0.6.12":
"25f055a556576003fefc0f5fd213bf3c6df1824d4c7fc35e6361fbecc420139f",
"aarch64-apple-darwin-0.6.11":
"a5b14a92448b908d1a5415f2a49522010fef8972695e2f7bbb4e5c5f88024573",
"aarch64-pc-windows-msvc-0.6.11":
"858e523d9498a332aab093852c30c524bbd94622137dd6f773d19da14ac920b4",
"aarch64-unknown-linux-gnu-0.6.11":
"5384098938893f060b8b47e606918c271a419b52eedda1546a4d6febae4b0c06",
"aarch64-unknown-linux-musl-0.6.11":
"de20c247ef6a6bc0948e611ace3f3f321c098d7bf75b737f169c1db06b4f4d69",
"arm-unknown-linux-musleabihf-0.6.11":
"76a1558e2cb8d0e5e646a0cf8a204b53d3779221bea3af50b204c8d28532daa7",
"armv7-unknown-linux-gnueabihf-0.6.11":
"5abacc141dabb6071fcc3a19a301874083c6cc4a36d6eb6b0654a276efbfd33b",
"armv7-unknown-linux-musleabihf-0.6.11":
"cf05ab1fe44494cc490ec5c29578e200a3c195b395e67fe62d45be9a4c897d06",
"i686-pc-windows-msvc-0.6.11":
"331e94f1db12fa92266f764f63586d8c18e6cea5d37d430af2eb7673f108e874",
"i686-unknown-linux-gnu-0.6.11":
"b9d193f28736c3166f533c61fc4a2e8e8a4c7961c6bd46e17c3db66f750ef4b6",
"i686-unknown-linux-musl-0.6.11":
"dfa735baacc13ba9962fb9b7167599407aa733bfc7853824a785773769c58ed5",
"powerpc64-unknown-linux-gnu-0.6.11":
"b79060dc0726a1fc8a4458a80fb1ce0489198dd3ad334fe54bb7926e473750ed",
"powerpc64le-unknown-linux-gnu-0.6.11":
"ebd219d0b5f0a60a584ebb88e1379c616e746cabaaf79608d54be5919d742ee3",
"s390x-unknown-linux-gnu-0.6.11":
"3b5563127303c16e0531c1fd13356763decc0ea91b860eb5f63c3108a275aa2c",
"x86_64-apple-darwin-0.6.11":
"099b163ce5098558ccdc1df54bdcf8b02eb11364458095e95f8dd54ff8984d96",
"x86_64-pc-windows-msvc-0.6.11":
"292ade13fc2e1530d0021ec7fd42526df58a8436974b8a5b829685db856e667e",
"x86_64-unknown-linux-gnu-0.6.11":
"c19b3be7ac26f8b211f7a5f07f01a77fd4d2b6205ff257790770a585f7f5bda4",
"x86_64-unknown-linux-musl-0.6.11":
"23aabfa5d0bde26d151eaf31a392595a5c88e74e0bc804351b02fbb0328f8aaa",
"aarch64-apple-darwin-0.6.10":
"82bf2cb3b34ab504eb08486093c9e97cfaf5299da4d4a60e14b6642a2a2e9b8e",
"aarch64-pc-windows-msvc-0.6.10":
"afc3c1ed78273843417b781fd30b263ba417dcfd05ef9a65be50eec7aa500f20",
"aarch64-unknown-linux-gnu-0.6.10":
"527f0adc3bcf841a3a0df0d3fef8db277b8afffac588d80948638719b611a8c2",
"aarch64-unknown-linux-musl-0.6.10":
"36c36aafdf4b2fb8040d0b8db2eaa4b3f44260a689a6e789bc1cd95689e890bc",
"arm-unknown-linux-musleabihf-0.6.10":
"abef3136f0da26055368df298f3379bbd0d6776ba7e7a0c12275e403136408d8",
"armv7-unknown-linux-gnueabihf-0.6.10":
"8b776d606b3b9566ae659ab8b2c767e771f1f3e2e632b4c634ff80b26796795f",
"armv7-unknown-linux-musleabihf-0.6.10":
"d5af6869e1f69753e9ac2b8bacadd6356f84f373b0f6edfda60dc85c194d3a6b",
"i686-pc-windows-msvc-0.6.10":
"ff6c580750d6bdbca1cb7c64601ebf0f079cc6d8ab79df6472e5fd61e4f89cf9",
"i686-unknown-linux-gnu-0.6.10":
"978e8d7b495251d842250045a3f15c59e9fe148d09538aa322d4c045db632cc3",
"i686-unknown-linux-musl-0.6.10":
"432c0609dec5d196f516639de8845fdf9393b4591978a927f6b2bfa92edd0220",
"powerpc64-unknown-linux-gnu-0.6.10":
"ec4285062cc4bec8aa7f95efba227c4ee3301503938735902fdd896c3ef8ec7f",
"powerpc64le-unknown-linux-gnu-0.6.10":
"d1dcbdd11b133bcce003aa48be6710a56f1c938eff496eb021dbeac8c09b5c2d",
"s390x-unknown-linux-gnu-0.6.10":
"4a68f92213c567a8d2bc22ccc10a328f3dd851967f315c517fc1eb52c8f58ed5",
"x86_64-apple-darwin-0.6.10":
"ddd27652b1a4053b848e35c348500841a8fde38e8ac2b37233464ab91e8f7788",
"x86_64-pc-windows-msvc-0.6.10":
"c41c4f34782558d3263f7a51e4efd053bc4d074dc46fefa574c4fdb2ed0a00e1",
"x86_64-unknown-linux-gnu-0.6.10":
"d58885f055fdb726d12cdd1cc54119432a0e4557c8e8ba04ca1d625058b98832",
"x86_64-unknown-linux-musl-0.6.10":
"1bdeaa0396405a30c4bff35b2d7c9df832836da50eec132ccc0d92657a336c4c",
"aarch64-apple-darwin-0.6.9":
"a6841484affb3c123313df98bcd8932208bdfb3d9d90a72aec274e8a696caa88",
"aarch64-pc-windows-msvc-0.6.9":
"bdb7e5eebaa5bb807f2c665b909dbba4bce6f23adf774134924a4a3c6acd4e72",
"aarch64-unknown-linux-gnu-0.6.9":
"f5032ad47151c7906c0fb25f7c3b00a85ab0bfed2170cbc444e79c438799095b",
"aarch64-unknown-linux-musl-0.6.9":
"4de15999c38a0e57a3708eccb1fe3295b3d1c0c69410029b16e5e42452d232a9",
"arm-unknown-linux-musleabihf-0.6.9":
"1a228a1cc86689894c771d0b4635b74708db416c240cfbdc36ddd87c90ae0eb0",
"armv7-unknown-linux-gnueabihf-0.6.9":
"a9a307d6b3e6a3500aa0102ff7b03cccebe2a9af40130df97382688574afc637",
"armv7-unknown-linux-musleabihf-0.6.9":
"2cf77dcd0e73b323c5f10120452f6ef34191cab3bb8061ee01d5e62706af7493",
"i686-pc-windows-msvc-0.6.9":
"709d6d7e6d0e8244b4d51ac9ef0f373d2ac2cb20570e8bdf71c84ccab8c8cba0",
"i686-unknown-linux-gnu-0.6.9":
"4000a6fd98af6ed84c9a7c2f06019cab5f4a8cfa4e5a9c37b6984e4c7cae1df2",
"i686-unknown-linux-musl-0.6.9":
"d227586d574264922f344cf98b0f469335ce52d3443619d15448140b44ff8204",
"powerpc64-unknown-linux-gnu-0.6.9":
"f12b8dbc8ed1ca24dfadbd3969730ab9c2cf797e117cdb508732f49b9fa4b620",
"powerpc64le-unknown-linux-gnu-0.6.9":
"451cd936bd35405c1cf2d0b63c975d5490e2646f1516b9bcb27af66688946903",
"s390x-unknown-linux-gnu-0.6.9":
"e25ec6762b68383abfbecb1ec24c1eda52a64dc67866021280c649ef3813726f",
"x86_64-apple-darwin-0.6.9":
"96eb2bfbe2bb3b74836aa5d6f563ae21bbb9e071148adfda1e67000735a020a3",
"x86_64-pc-windows-msvc-0.6.9":
"4d959abc2517c38b5527e3368b6755d66ecbb85679a9b2b34b7a78796c6cf7f8",
"x86_64-unknown-linux-gnu-0.6.9":
"001b87a0c2ea642a3c75a98c6af3e8528aa473d560e653cf213efcc9aaa4a028",
"x86_64-unknown-linux-musl-0.6.9":
"2b2914da53f9412a1aad7457cee424680da037e6a49c378365c3b5ff5ef0b926",
"aarch64-apple-darwin-0.6.8":
"e4f83fc42d9735512198c2d86a6fc136e2f5a2b59b3ccc4f104018ed07465499",
"aarch64-pc-windows-msvc-0.6.8":
"5619c7fbc026544c8cc77ade994ef79e799fc521a050268172aa47826f364834",
"aarch64-unknown-linux-gnu-0.6.8":
"3ffcaa4f4dba917fa58484a1c3dcb96a958a4baca0204e9c10a4799f81b9ee2f",
"aarch64-unknown-linux-musl-0.6.8":
"c1d4504ee47d8577761989c9daa4bbd1b93e5d04056215584a0415ad8738b0f9",
"arm-unknown-linux-musleabihf-0.6.8":
"7280cb1425787faf335bed8e9f2d575bcb179e1b19489ee7984c546d6ef07fff",
"armv7-unknown-linux-gnueabihf-0.6.8":
"6753d79f3f8e1556a855912f0f859b039b67e591332f6ee794e2c51f2eda1658",
"armv7-unknown-linux-musleabihf-0.6.8":
"ba73e8503d3ded103cc1fd946bd307f5b986e096d673296eb616f2edb6cf23aa",
"i686-pc-windows-msvc-0.6.8":
"c28ab471753368b79887fd5cbd12b002704fa7fb2e96b0f5a98277e4f1d8572a",
"i686-unknown-linux-gnu-0.6.8":
"df60b14b5b6bf29c75c06d8d04b0dd358070bf91f19c6f23afaf738fd05fa271",
"i686-unknown-linux-musl-0.6.8":
"b1e92aabb97fa356e8f0d4b61f698e0f372b6a5582df949ffbcc60565e7a9c7a",
"powerpc64-unknown-linux-gnu-0.6.8":
"a18998d2f8f426b1ccf1f6c7ec279dd35ccc1cbe76d90b185e453e6b199df245",
"powerpc64le-unknown-linux-gnu-0.6.8":
"0d7460fe945a7ed48a9236d50f683a5eb937f22eaa605f4e6eb6a5f9cdf3676e",
"s390x-unknown-linux-gnu-0.6.8":
"127a7d547be5029b29532f937822332fed690e135d0a97ec9574d43904a4622a",
"x86_64-apple-darwin-0.6.8":
"e069e79f6e0c430d7beaca3025b398980357b8b5c6faa7191032e20d5ee75970",
"x86_64-pc-windows-msvc-0.6.8":
"d31c3d01ca3e1a75e15ed9514c135239770b6b40a99cae716661e28e433aa495",
"x86_64-unknown-linux-gnu-0.6.8":
"2378ea0122bd56a11ee7ae2ad6116c1f22f4657c03b9efb78ac150236bf7974c",
"x86_64-unknown-linux-musl-0.6.8":
"58902317e1872994b5e707c3c77f4cbf3010104d4b07990a5110bbc09f3e9b8a",
"aarch64-apple-darwin-0.6.7":
"1a4d04477893c215e3def30149208fabe58a70d031388684d0125f553e3cd74f",
"aarch64-pc-windows-msvc-0.6.7":
"1c6de0c79ad35baadb61f6be7a014f3114a320809868b4ccb09c4d16b7118b48",
"aarch64-unknown-linux-gnu-0.6.7":
"b64c4ec32d55bd8e8b726b3162be0dfb3c117c3ca4cd798862497d33fe68e7b9",
"aarch64-unknown-linux-musl-0.6.7":
"df9e1b9530ad63085b66936e65cca107acc98197856e2ac22b896b1ab3936ac4",
"arm-unknown-linux-musleabihf-0.6.7":
"03a4b36d50fe4f0e50845559a524ed75610762072075c411f7ed84479e6c736d",
"armv7-unknown-linux-gnueabihf-0.6.7":
"a877f7697375f6b19d3b537c5152cbb3d86430120b20d957cfa7c084e6b79d6c",
"armv7-unknown-linux-musleabihf-0.6.7":
"e337a7dd6b86c842dac78041acfa9d9402662d5a8cede1d0ae694c9c17057162",
"i686-pc-windows-msvc-0.6.7":
"33002d9f1dab894f48254f43b4b882f6c88078d70ace883ed29fcde82616bbb0",
"i686-unknown-linux-gnu-0.6.7":
"b5f04a274f96aa41e8094b1c4355632f6caa9dfb7e62a45908950ca1c5d3fb38",
"i686-unknown-linux-musl-0.6.7":
"bd56de94a3ffac99a06fc0d37e7cb45e1c35ba275924b5ed502da833dc712d12",
"powerpc64-unknown-linux-gnu-0.6.7":
"57c668908878e1b12c726efc0439cd609697892a22e1e43c0ebb520ef2995a27",
"powerpc64le-unknown-linux-gnu-0.6.7":
"abe3004c0fc468e89ddcf8490991c7fc83abc9d9f6e6a29c59473541265e8bd5",
"s390x-unknown-linux-gnu-0.6.7":
"b6c60b7b907f871880a9be43294b02f84be5ec3187b1a16d7705f5beb622e01a",
"x86_64-apple-darwin-0.6.7":
"680be39f40bf00a8c3a6776e9ddaa9c3c18ef2efbb0c1a9a854b333660ca8678",
"x86_64-pc-windows-msvc-0.6.7":
"11b902b07e98331cef0d648c182c6aa1f279cde688c4411eb9153dc957d48f90",
"x86_64-unknown-linux-gnu-0.6.7":
"601c2b1147117c4471a154b4cebbdb31c818105f796d5f8115fe42d2526689c8",
"x86_64-unknown-linux-musl-0.6.7":
"a31bd6916eff780a7a44c84c194f4f8b70a8250b9175b3839ce2d4403fd735de",
"aarch64-apple-darwin-0.6.6":
"d0fb047593122746c7529960f8efd5d7d10d2cb230302f71158e9765ad37727b",
"aarch64-pc-windows-msvc-0.6.6":

View File

@@ -1,16 +1,11 @@
import { promises as fs } from "node:fs";
import * as path from "node:path";
import * as core from "@actions/core";
import * as tc from "@actions/tool-cache";
import * as pep440 from "@renovatebot/pep440";
import * as path from "node:path";
import { promises as fs } from "node:fs";
import { OWNER, REPO, TOOL_CACHE_NAME } from "../utils/constants";
import { Octokit } from "../utils/octokit";
import type { Architecture, Platform } from "../utils/platforms";
import { validateChecksum } from "./checksum/checksum";
import {
getDownloadUrl,
getLatestKnownVersion as getLatestVersionInManifest,
} from "./version-manifest";
import { Octokit } from "../utils/octokit";
export function tryGetFromToolCache(
arch: Architecture,
@@ -24,88 +19,39 @@ export function tryGetFromToolCache(
resolvedVersion = version;
}
const installedPath = tc.find(TOOL_CACHE_NAME, resolvedVersion, arch);
return { installedPath, version: resolvedVersion };
return { version: resolvedVersion, installedPath };
}
export async function downloadVersionFromGithub(
serverUrl: string,
export async function downloadVersion(
platform: Platform,
arch: Architecture,
version: string,
checkSum: string | undefined,
githubToken: string,
): Promise<{ version: string; cachedToolDir: string }> {
const resolvedVersion = await resolveVersion(version, githubToken);
const artifact = `uv-${arch}-${platform}`;
const extension = getExtension(platform);
const downloadUrl = `${serverUrl}/${OWNER}/${REPO}/releases/download/${version}/${artifact}${extension}`;
return await downloadVersion(
downloadUrl,
artifact,
platform,
arch,
version,
checkSum,
githubToken,
);
}
export async function downloadVersionFromManifest(
manifestUrl: string | undefined,
platform: Platform,
arch: Architecture,
version: string,
checkSum: string | undefined,
githubToken: string,
): Promise<{ version: string; cachedToolDir: string }> {
const downloadUrl = await getDownloadUrl(
manifestUrl,
version,
arch,
platform,
);
if (!downloadUrl) {
core.info(
`manifest-file does not contain version ${version}, arch ${arch}, platform ${platform}. Falling back to GitHub releases.`,
);
return await downloadVersionFromGithub(
"https://github.com",
platform,
arch,
version,
checkSum,
githubToken,
);
let extension = ".tar.gz";
if (platform === "pc-windows-msvc") {
extension = ".zip";
}
return await downloadVersion(
downloadUrl,
`uv-${arch}-${platform}`,
platform,
arch,
version,
checkSum,
githubToken,
);
}
async function downloadVersion(
downloadUrl: string,
artifactName: string,
platform: Platform,
arch: Architecture,
version: string,
checkSum: string | undefined,
githubToken: string,
): Promise<{ version: string; cachedToolDir: string }> {
const downloadUrl = `https://github.com/${OWNER}/${REPO}/releases/download/${resolvedVersion}/${artifact}${extension}`;
core.info(`Downloading uv from "${downloadUrl}" ...`);
const downloadPath = await tc.downloadTool(
downloadUrl,
undefined,
githubToken,
);
await validateChecksum(checkSum, downloadPath, arch, platform, version);
await validateChecksum(
checkSum,
downloadPath,
arch,
platform,
resolvedVersion,
);
let uvDir: string;
const extension = getExtension(platform);
if (platform === "pc-windows-msvc") {
const fullPathWithExtension = `${downloadPath}${extension}`;
await fs.copyFile(downloadPath, fullPathWithExtension);
@@ -113,54 +59,40 @@ async function downloadVersion(
// On windows extracting the zip does not create an intermediate directory
} else {
const extractedDir = await tc.extractTar(downloadPath);
uvDir = path.join(extractedDir, artifactName);
uvDir = path.join(extractedDir, artifact);
}
const cachedToolDir = await tc.cacheDir(
uvDir,
TOOL_CACHE_NAME,
version,
resolvedVersion,
arch,
);
return { cachedToolDir, version: version };
}
function getExtension(platform: Platform): string {
return platform === "pc-windows-msvc" ? ".zip" : ".tar.gz";
return { version: resolvedVersion, cachedToolDir };
}
export async function resolveVersion(
versionInput: string,
manifestFile: string | undefined,
githubToken: string,
): Promise<string> {
core.debug(`Resolving version: ${versionInput}`);
let version: string;
if (manifestFile) {
version =
versionInput === "latest"
? await getLatestVersionInManifest(manifestFile)
: versionInput;
} else {
version =
versionInput === "latest"
? await getLatestVersion(githubToken)
: versionInput;
}
const version =
versionInput === "latest"
? await getLatestVersion(githubToken)
: versionInput;
if (tc.isExplicitVersion(version)) {
core.debug(`Version ${version} is an explicit version.`);
return version;
}
const availableVersions = await getAvailableVersions(githubToken);
core.debug(`Available versions: ${availableVersions}`);
const resolvedVersion = maxSatisfying(availableVersions, version);
if (resolvedVersion === undefined) {
const resolvedVersion = tc.evaluateVersions(availableVersions, version);
if (resolvedVersion === "") {
throw new Error(`No version found for ${version}`);
}
return resolvedVersion;
}
async function getAvailableVersions(githubToken: string): Promise<string[]> {
core.info("Getting available versions from GitHub API...");
try {
const octokit = new Octokit({
auth: githubToken,
@@ -185,17 +117,11 @@ async function getReleaseTagNames(
owner: OWNER,
repo: REPO,
});
const releaseTagNames = response.map((release) => release.tag_name);
if (releaseTagNames.length === 0) {
throw Error(
"Github API request failed while getting releases. Check the GitHub status page for outages. Try again later.",
);
}
return releaseTagNames;
return response.map((release) => release.tag_name);
}
async function getLatestVersion(githubToken: string) {
core.info("Getting latest version from GitHub API...");
core.debug("Getting latest version...");
const octokit = new Octokit({
auth: githubToken,
});
@@ -204,18 +130,14 @@ async function getLatestVersion(githubToken: string) {
try {
latestRelease = await getLatestRelease(octokit);
} catch (err) {
if ((err as Error).message.includes("Bad credentials")) {
core.info(
"No (valid) GitHub token provided. Falling back to anonymous. Requests might be rate limited.",
);
const octokit = new Octokit();
latestRelease = await getLatestRelease(octokit);
} else {
core.error(
"Github API request failed while getting latest release. Check the GitHub status page for outages. Try again later.",
);
throw err;
core.info(
"No (valid) GitHub token provided. Falling back to anonymous. Requests might be rate limited.",
);
if (err instanceof Error) {
core.debug(err.message);
}
const octokit = new Octokit();
latestRelease = await getLatestRelease(octokit);
}
if (!latestRelease) {
@@ -232,22 +154,3 @@ async function getLatestRelease(octokit: InstanceType<typeof Octokit>) {
});
return latestRelease;
}
function maxSatisfying(
versions: string[],
version: string,
): string | undefined {
const maxSemver = tc.evaluateVersions(versions, version);
if (maxSemver !== "") {
core.debug(`Found a version that satisfies the semver range: ${maxSemver}`);
return maxSemver;
}
const maxPep440 = pep440.maxSatisfying(versions, version);
if (maxPep440 !== null) {
core.debug(
`Found a version that satisfies the pep440 specifier: ${maxPep440}`,
);
return maxPep440;
}
return undefined;
}

View File

@@ -1,91 +0,0 @@
import { promises as fs } from "node:fs";
import { join } from "node:path";
import * as core from "@actions/core";
import * as semver from "semver";
import { fetch } from "../utils/fetch";
const localManifestFile = join(__dirname, "..", "..", "version-manifest.json");
interface ManifestEntry {
version: string;
artifactName: string;
arch: string;
platform: string;
downloadUrl: string;
}
export async function getLatestKnownVersion(
manifestUrl: string | undefined,
): Promise<string> {
const manifestEntries = await getManifestEntries(manifestUrl);
return manifestEntries.reduce((a, b) =>
semver.gt(a.version, b.version) ? a : b,
).version;
}
export async function getDownloadUrl(
manifestUrl: string | undefined,
version: string,
arch: string,
platform: string,
): Promise<string | undefined> {
const manifestEntries = await getManifestEntries(manifestUrl);
const entry = manifestEntries.find(
(entry) =>
entry.version === version &&
entry.arch === arch &&
entry.platform === platform,
);
return entry ? entry.downloadUrl : undefined;
}
async function getManifestEntries(
manifestUrl: string | undefined,
): Promise<ManifestEntry[]> {
let data: string;
if (manifestUrl !== undefined) {
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}`,
);
}
data = await response.text();
} else {
core.info("manifest-file not provided, reading from local file.");
const fileContent = await fs.readFile(localManifestFile);
data = fileContent.toString();
}
return JSON.parse(data);
}
export async function updateVersionManifest(
manifestUrl: string,
downloadUrls: string[],
): Promise<void> {
const manifest: ManifestEntry[] = [];
for (const downloadUrl of downloadUrls) {
const urlParts = downloadUrl.split("/");
const version = urlParts[urlParts.length - 2];
const artifactName = urlParts[urlParts.length - 1];
if (!artifactName.startsWith("uv-")) {
continue;
}
if (artifactName.startsWith("uv-installer")) {
continue;
}
const artifactParts = artifactName.split(".")[0].split("-");
manifest.push({
arch: artifactParts[1],
artifactName: artifactName,
downloadUrl: downloadUrl,
platform: artifactName.split(`uv-${artifactParts[1]}-`)[1].split(".")[0],
version: version,
});
}
core.debug(`Updating manifest-file: ${JSON.stringify(manifest)}`);
await fs.writeFile(manifestUrl, JSON.stringify(manifest));
}

View File

@@ -1,8 +1,8 @@
import * as crypto from "node:crypto";
import * as core from "@actions/core";
import * as fs from "node:fs";
import * as stream from "node:stream";
import * as util from "node:util";
import * as core from "@actions/core";
import { create } from "@actions/glob";
/**

View File

@@ -1,10 +1,10 @@
import * as fs from "node:fs";
import * as cache from "@actions/cache";
import * as core from "@actions/core";
import * as exec from "@actions/exec";
import * as fs from "node:fs";
import {
STATE_CACHE_KEY,
STATE_CACHE_MATCHED_KEY,
STATE_CACHE_KEY,
} from "./cache/restore-cache";
import {
cacheLocalPath,

View File

@@ -1,38 +1,34 @@
import fs from "node:fs";
import * as path from "node:path";
import * as core from "@actions/core";
import * as exec from "@actions/exec";
import { restoreCache } from "./cache/restore-cache";
import * as path from "node:path";
import {
downloadVersionFromGithub,
downloadVersionFromManifest,
resolveVersion,
downloadVersion,
tryGetFromToolCache,
resolveVersion,
} from "./download/download-version";
import {
activateEnvironment as activateEnvironmentInput,
addProblemMatchers,
cacheLocalPath,
checkSum,
enableCache,
githubToken,
ignoreEmptyWorkdir,
manifestFile,
pythonVersion,
serverUrl,
toolBinDir,
toolDir,
versionFile as versionFileInput,
version as versionInput,
workingDirectory,
} from "./utils/inputs";
import { restoreCache } from "./cache/restore-cache";
import {
type Architecture,
getArch,
getPlatform,
type Platform,
} from "./utils/platforms";
import { getUvVersionFromFile } from "./version/resolve";
import {
cacheLocalPath,
checkSum,
ignoreEmptyWorkdir,
enableCache,
githubToken,
pyProjectFile,
pythonVersion,
toolBinDir,
toolDir,
uvFile,
version as versionInput,
} from "./utils/inputs";
import * as exec from "@actions/exec";
import fs from "node:fs";
import { getUvVersionFromConfigFile } from "./utils/pyproject";
async function run(): Promise<void> {
detectEmptyWorkdir();
@@ -48,11 +44,10 @@ async function run(): Promise<void> {
}
const setupResult = await setupUv(platform, arch, checkSum, githubToken);
addUvToPath(setupResult.uvDir);
addToolBinToPath();
addUvToPathAndOutput(setupResult.uvDir);
setToolDir();
setupPython();
await activateEnvironment();
await setupPython();
addMatchers();
setCacheDir(cacheLocalPath);
@@ -88,7 +83,7 @@ async function setupUv(
checkSum: string | undefined,
githubToken: string,
): Promise<{ uvDir: string; version: string }> {
const resolvedVersion = await determineVersion(manifestFile);
const resolvedVersion = await determineVersion();
const toolCacheResult = tryGetFromToolCache(arch, resolvedVersion);
if (toolCacheResult.installedPath) {
core.info(`Found uv in tool-cache for ${toolCacheResult.version}`);
@@ -98,29 +93,13 @@ async function setupUv(
};
}
let downloadVersionResult: { version: string; cachedToolDir: string };
if (serverUrl !== "https://github.com") {
core.warning(
"The input server-url is deprecated. Please use manifest-file instead.",
);
downloadVersionResult = await downloadVersionFromGithub(
serverUrl,
platform,
arch,
resolvedVersion,
checkSum,
githubToken,
);
} else {
downloadVersionResult = await downloadVersionFromManifest(
manifestFile,
platform,
arch,
resolvedVersion,
checkSum,
githubToken,
);
}
const downloadVersionResult = await downloadVersion(
platform,
arch,
resolvedVersion,
checkSum,
githubToken,
);
return {
uvDir: downloadVersionResult.cachedToolDir,
@@ -128,42 +107,29 @@ async function setupUv(
};
}
async function determineVersion(
manifestFile: string | undefined,
): Promise<string> {
async function determineVersion(): Promise<string> {
if (versionInput !== "") {
return await resolveVersion(versionInput, manifestFile, githubToken);
return await resolveVersion(versionInput, githubToken);
}
if (versionFileInput !== "") {
const versionFromFile = getUvVersionFromFile(versionFileInput);
if (versionFromFile === undefined) {
throw new Error(
`Could not determine uv version from file: ${versionFileInput}`,
const configFile = uvFile !== "" ? uvFile : pyProjectFile;
if (configFile !== "") {
const versionFromConfigFile = getUvVersionFromConfigFile(configFile);
if (versionFromConfigFile === undefined) {
core.warning(
`Could not find required-version under [tool.uv] in ${configFile}. Falling back to latest`,
);
}
return await resolveVersion(versionFromFile, manifestFile, githubToken);
return await resolveVersion(versionFromConfigFile || "latest", githubToken);
}
const versionFromUvToml = getUvVersionFromFile(
`${workingDirectory}${path.sep}uv.toml`,
);
const versionFromPyproject = getUvVersionFromFile(
`${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.",
);
if (!fs.existsSync("uv.toml") && !fs.existsSync("pyproject.toml")) {
return await resolveVersion("latest", githubToken);
}
return await resolveVersion(
versionFromUvToml || versionFromPyproject || "latest",
manifestFile,
githubToken,
);
const versionFile = fs.existsSync("uv.toml") ? "uv.toml" : "pyproject.toml";
const versionFromConfigFile = getUvVersionFromConfigFile(versionFile);
return await resolveVersion(versionFromConfigFile || "latest", githubToken);
}
function addUvToPathAndOutput(cachedPath: string): void {
core.setOutput("uv-path", `${cachedPath}${path.sep}uv`);
core.setOutput("uvx-path", `${cachedPath}${path.sep}uvx`);
function addUvToPath(cachedPath: string): void {
core.addPath(cachedPath);
core.info(`Added ${cachedPath} to the path`);
}
@@ -195,29 +161,24 @@ function setToolDir(): void {
}
}
function setupPython(): void {
async function setupPython(): Promise<void> {
if (pythonVersion !== "") {
core.exportVariable("UV_PYTHON", pythonVersion);
core.info(`Set UV_PYTHON to ${pythonVersion}`);
}
}
async function activateEnvironment(): Promise<void> {
if (activateEnvironmentInput) {
const execArgs = ["venv", ".venv", "--directory", workingDirectory];
const options: exec.ExecOptions = {
silent: !core.isDebug(),
};
const execArgs = ["venv", "--python", pythonVersion];
core.info("Activating python venv...");
await exec.exec("uv", execArgs);
await exec.exec("uv", execArgs, options);
let venvBinPath = `${workingDirectory}${path.sep}.venv${path.sep}bin`;
let venvBinPath = ".venv/bin";
if (process.platform === "win32") {
venvBinPath = `${workingDirectory}${path.sep}.venv${path.sep}Scripts`;
venvBinPath = ".venv/Scripts";
}
core.addPath(path.resolve(venvBinPath));
core.exportVariable(
"VIRTUAL_ENV",
path.resolve(`${workingDirectory}${path.sep}.venv`),
);
core.exportVariable("VIRTUAL_ENV", path.resolve(".venv"));
}
}
@@ -227,10 +188,8 @@ function setCacheDir(cacheLocalPath: string): void {
}
function addMatchers(): void {
if (addProblemMatchers) {
const matchersPath = path.join(__dirname, `..${path.sep}..`, ".github");
core.info(`##[add-matcher]${path.join(matchersPath, "python.json")}`);
}
const matchersPath = path.join(__dirname, `..${path.sep}..`, ".github");
core.info(`##[add-matcher]${path.join(matchersPath, "python.json")}`);
}
run();

View File

@@ -0,0 +1,34 @@
import * as semver from "semver";
import * as core from "@actions/core";
import { Octokit } from "./utils/octokit";
import { OWNER, REPO } from "./utils/constants";
import { updateChecksums } from "./download/checksum/update-known-checksums";
async function run(): Promise<void> {
const checksumFilePath = process.argv.slice(2)[0];
const github_token = process.argv.slice(2)[1];
const octokit = new Octokit({
auth: github_token,
});
const response = await octokit.paginate(octokit.rest.repos.listReleases, {
owner: OWNER,
repo: REPO,
});
const downloadUrls: string[] = response.flatMap((release) =>
release.assets
.filter((asset) => asset.name.endsWith(".sha256"))
.map((asset) => asset.browser_download_url),
);
await updateChecksums(checksumFilePath, downloadUrls);
const latestVersion = response
.map((release) => release.tag_name)
.sort(semver.rcompare)[0];
core.setOutput("latest-version", latestVersion);
}
run();

View File

@@ -1,56 +0,0 @@
import * as core from "@actions/core";
import * as semver from "semver";
import { updateChecksums } from "./download/checksum/update-known-checksums";
import {
getLatestKnownVersion,
updateVersionManifest,
} from "./download/version-manifest";
import { OWNER, REPO } from "./utils/constants";
import { Octokit } from "./utils/octokit";
async function run(): Promise<void> {
const checksumFilePath = process.argv.slice(2)[0];
const versionsManifestFile = process.argv.slice(2)[1];
const githubToken = process.argv.slice(2)[2];
const octokit = new Octokit({
auth: githubToken,
});
const { data: latestRelease } = await octokit.rest.repos.getLatestRelease({
owner: OWNER,
repo: REPO,
});
const latestKnownVersion = await getLatestKnownVersion(undefined);
if (semver.lte(latestRelease.tag_name, latestKnownVersion)) {
core.info(
`Latest release (${latestRelease.tag_name}) is not newer than the latest known version (${latestKnownVersion}). Skipping update.`,
);
return;
}
const releases = await octokit.paginate(octokit.rest.repos.listReleases, {
owner: OWNER,
repo: REPO,
});
const checksumDownloadUrls: string[] = releases.flatMap((release) =>
release.assets
.filter((asset) => asset.name.endsWith(".sha256"))
.map((asset) => asset.browser_download_url),
);
await updateChecksums(checksumFilePath, checksumDownloadUrls);
const artifactDownloadUrls: string[] = releases.flatMap((release) =>
release.assets
.filter((asset) => !asset.name.endsWith(".sha256"))
.map((asset) => asset.browser_download_url),
);
await updateVersionManifest(versionsManifestFile, artifactDownloadUrls);
core.setOutput("latest-version", latestRelease.tag_name);
}
run();

View File

@@ -1,21 +0,0 @@
import { ProxyAgent, type RequestInit, fetch as undiciFetch } from "undici";
export function getProxyAgent() {
const httpProxy = process.env.HTTP_PROXY || process.env.http_proxy;
if (httpProxy) {
return new ProxyAgent(httpProxy);
}
const httpsProxy = process.env.HTTPS_PROXY || process.env.https_proxy;
if (httpsProxy) {
return new ProxyAgent(httpsProxy);
}
return undefined;
}
export const fetch = async (url: string, opts: RequestInit) =>
await undiciFetch(url, {
dispatcher: getProxyAgent(),
...opts,
});

View File

@@ -1,16 +1,15 @@
import path from "node:path";
import * as core from "@actions/core";
import path from "node:path";
export const workingDirectory = core.getInput("working-directory");
export const version = core.getInput("version");
export const versionFile = getVersionFile();
export const pyProjectFile = core.getInput("pyproject-file");
export const uvFile = core.getInput("uv-file");
export const pythonVersion = core.getInput("python-version");
export const activateEnvironment = core.getBooleanInput("activate-environment");
export const checkSum = core.getInput("checksum");
export const enableCache = getEnableCache();
export const cacheSuffix = core.getInput("cache-suffix") || "";
export const cacheLocalPath = getCacheLocalPath();
export const cacheDependencyGlob = getCacheDependencyGlob();
export const cacheDependencyGlob = core.getInput("cache-dependency-glob");
export const pruneCache = core.getInput("prune-cache") === "true";
export const ignoreNothingToCache =
core.getInput("ignore-nothing-to-cache") === "true";
@@ -18,20 +17,7 @@ export const ignoreEmptyWorkdir =
core.getInput("ignore-empty-workdir") === "true";
export const toolBinDir = getToolBinDir();
export const toolDir = getToolDir();
export const serverUrl = core.getInput("server-url");
export const githubToken = core.getInput("github-token");
export const manifestFile = getManifestFile();
export const addProblemMatchers =
core.getInput("add-problem-matchers") === "true";
function getVersionFile(): string {
const versionFileInput = core.getInput("version-file");
if (versionFileInput !== "") {
const tildeExpanded = expandTilde(versionFileInput);
return resolveRelativePath(tildeExpanded);
}
return versionFileInput;
}
function getEnableCache(): boolean {
const enableCacheInput = core.getInput("enable-cache");
@@ -44,8 +30,7 @@ function getEnableCache(): boolean {
function getToolBinDir(): string | undefined {
const toolBinDirInput = core.getInput("tool-bin-dir");
if (toolBinDirInput !== "") {
const tildeExpanded = expandTilde(toolBinDirInput);
return resolveRelativePath(tildeExpanded);
return expandTilde(toolBinDirInput);
}
if (process.platform === "win32") {
if (process.env.RUNNER_TEMP !== undefined) {
@@ -61,8 +46,7 @@ function getToolBinDir(): string | undefined {
function getToolDir(): string | undefined {
const toolDirInput = core.getInput("tool-dir");
if (toolDirInput !== "") {
const tildeExpanded = expandTilde(toolDirInput);
return resolveRelativePath(tildeExpanded);
return expandTilde(toolDirInput);
}
if (process.platform === "win32") {
if (process.env.RUNNER_TEMP !== undefined) {
@@ -78,34 +62,14 @@ function getToolDir(): string | undefined {
function getCacheLocalPath(): string {
const cacheLocalPathInput = core.getInput("cache-local-path");
if (cacheLocalPathInput !== "") {
const tildeExpanded = expandTilde(cacheLocalPathInput);
return resolveRelativePath(tildeExpanded);
return expandTilde(cacheLocalPathInput);
}
if (process.env.RUNNER_ENVIRONMENT === "github-hosted") {
if (process.env.RUNNER_TEMP !== undefined) {
return `${process.env.RUNNER_TEMP}${path.sep}setup-uv-cache`;
}
throw Error(
"Could not determine UV_CACHE_DIR. Please make sure RUNNER_TEMP is set or provide the cache-local-path input",
);
if (process.env.RUNNER_TEMP !== undefined) {
return `${process.env.RUNNER_TEMP}${path.sep}setup-uv-cache`;
}
if (process.platform === "win32") {
return `${process.env.APPDATA}${path.sep}uv${path.sep}cache`;
}
return `${process.env.HOME}${path.sep}.cache${path.sep}uv`;
}
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(part))
.join("\n");
}
return cacheDependencyGlobInput;
throw Error(
"Could not determine UV_CACHE_DIR. Please make sure RUNNER_TEMP is set or provide the cache-local-path input",
);
}
function expandTilde(input: string): string {
@@ -114,23 +78,3 @@ function expandTilde(input: string): string {
}
return input;
}
function resolveRelativePath(inputPath: string): string {
const hasNegation = inputPath.startsWith("!");
const pathWithoutNegation = hasNegation ? inputPath.substring(1) : inputPath;
const resolvedPath = path.resolve(workingDirectory, pathWithoutNegation);
core.debug(
`Resolving relative path ${inputPath} to ${hasNegation ? "!" : ""}${resolvedPath}`,
);
return hasNegation ? `!${resolvedPath}` : resolvedPath;
}
function getManifestFile(): string | undefined {
const manifestFileInput = core.getInput("manifest-file");
if (manifestFileInput !== "") {
return manifestFileInput;
}
return undefined;
}

View File

@@ -4,11 +4,11 @@ import type {
OctokitOptions,
} from "@octokit/core/dist-types/types";
import {
type PaginateInterface,
paginateRest,
type PaginateInterface,
} from "@octokit/plugin-paginate-rest";
import { legacyRestEndpointMethods } from "@octokit/plugin-rest-endpoint-methods";
import { fetch as customFetch } from "./fetch";
import { fetch as undiciFetch, ProxyAgent, type RequestInit } from "undici";
export type { RestEndpointMethodTypes } from "@octokit/plugin-rest-endpoint-methods";
@@ -17,6 +17,26 @@ const DEFAULTS = {
userAgent: "setup-uv",
};
export function getProxyAgent() {
const httpProxy = process.env.HTTP_PROXY || process.env.http_prox;
if (httpProxy) {
return new ProxyAgent(httpProxy);
}
const httpsProxy = process.env.HTTPS_PROXY || process.env.https_proxy;
if (httpsProxy) {
return new ProxyAgent(httpsProxy);
}
return undefined;
}
export const customFetch = async (url: string, opts: RequestInit) =>
await undiciFetch(url, {
dispatcher: getProxyAgent(),
...opts,
});
export const Octokit: typeof Core &
Constructor<
{

View File

@@ -1,5 +1,5 @@
import * as core from "@actions/core";
import * as exec from "@actions/exec";
import * as core from "@actions/core";
export type Platform =
| "unknown-linux-gnu"
| "unknown-linux-musl"
@@ -16,11 +16,11 @@ export type Architecture =
export function getArch(): Architecture | undefined {
const arch = process.arch;
const archMapping: { [key: string]: Architecture } = {
arm64: "aarch64",
ia32: "i686",
ppc64: "powerpc64le",
s390x: "s390x",
x64: "x86_64",
arm64: "aarch64",
s390x: "s390x",
ppc64: "powerpc64le",
};
if (arch in archMapping) {
@@ -31,8 +31,8 @@ export function getArch(): Architecture | undefined {
export async function getPlatform(): Promise<Platform | undefined> {
const processPlatform = process.platform;
const platformMapping: { [key: string]: Platform } = {
darwin: "apple-darwin",
linux: "unknown-linux-gnu",
darwin: "apple-darwin",
win32: "pc-windows-msvc",
};
@@ -50,16 +50,16 @@ async function isMuslOs(): Promise<boolean> {
let stdOutput = "";
let errOutput = "";
const options: exec.ExecOptions = {
ignoreReturnCode: true,
silent: !core.isDebug(),
listeners: {
stderr: (data: Buffer) => {
errOutput += data.toString();
},
stdout: (data: Buffer) => {
stdOutput += data.toString();
},
stderr: (data: Buffer) => {
errOutput += data.toString();
},
},
silent: !core.isDebug(),
ignoreReturnCode: true,
};
try {

46
src/utils/pyproject.ts Normal file
View File

@@ -0,0 +1,46 @@
import fs from "node:fs";
import * as core from "@actions/core";
import * as toml from "smol-toml";
export function getUvVersionFromConfigFile(
filePath: string,
): string | undefined {
core.debug(`Trying to find required-version for uv in: ${filePath}`);
if (!fs.existsSync(filePath)) {
core.warning(`Could not find file: ${filePath}`);
return undefined;
}
let requiredVersion: string | undefined;
try {
requiredVersion = getRequiredVersion(filePath);
} catch (err) {
const message = (err as Error).message;
core.warning(`Error while parsing ${filePath}: ${message}`);
return undefined;
}
if (requiredVersion?.startsWith("==")) {
requiredVersion = requiredVersion.slice(2);
}
if (requiredVersion !== undefined) {
core.info(
`Found required-version for uv in ${filePath}: ${requiredVersion}`,
);
}
return requiredVersion;
}
function getRequiredVersion(filePath: string): string | undefined {
const fileContent = fs.readFileSync(filePath, "utf-8");
if (filePath.endsWith("pyproject.toml")) {
const tomlContent = toml.parse(fileContent) as {
tool?: { uv?: { "required-version"?: string } };
};
return tomlContent?.tool?.uv?.["required-version"];
}
const tomlContent = toml.parse(fileContent) as {
"required-version"?: string;
};
return tomlContent["required-version"];
}

View File

@@ -1,22 +0,0 @@
import fs from "node:fs";
import * as toml from "smol-toml";
export function getRequiredVersionFromConfigFile(
filePath: string,
): string | undefined {
if (!filePath.endsWith(".toml")) {
return undefined;
}
const fileContent = fs.readFileSync(filePath, "utf-8");
if (filePath.endsWith("pyproject.toml")) {
const tomlContent = toml.parse(fileContent) as {
tool?: { uv?: { "required-version"?: string } };
};
return tomlContent?.tool?.uv?.["required-version"];
}
const tomlContent = toml.parse(fileContent) as {
"required-version"?: string;
};
return tomlContent["required-version"];
}

View File

@@ -1,43 +0,0 @@
import fs from "node:fs";
import * as toml from "smol-toml";
export function getUvVersionFromRequirementsFile(
filePath: string,
): string | undefined {
const fileContent = fs.readFileSync(filePath, "utf-8");
if (filePath.endsWith(".txt")) {
return getUvVersionFromAllDependencies(fileContent.split("\n"));
}
const dependencies = parsePyprojectDependencies(fileContent);
return getUvVersionFromAllDependencies(dependencies);
}
function getUvVersionFromAllDependencies(
allDependencies: string[],
): string | undefined {
return allDependencies
.find((dep: string) => dep.match(/^uv[=<>~!]/))
?.match(/^uv([=<>~!]+\S*)/)?.[1]
.trim();
}
interface Pyproject {
project?: {
dependencies?: string[];
"optional-dependencies"?: Record<string, string[]>;
};
"dependency-groups"?: Record<string, Array<string | object>>;
}
function parsePyprojectDependencies(pyprojectContent: string): string[] {
const pyproject: Pyproject = toml.parse(pyprojectContent);
const dependencies: string[] = pyproject?.project?.dependencies || [];
const optionalDependencies: string[] = Object.values(
pyproject?.project?.["optional-dependencies"] || {},
).flat();
const devDependencies: string[] = Object.values(
pyproject?.["dependency-groups"] || {},
)
.flat()
.filter((item: string | object) => typeof item === "string");
return dependencies.concat(optionalDependencies, devDependencies);
}

View File

@@ -1,34 +0,0 @@
import fs from "node:fs";
import * as core from "@actions/core";
import { getRequiredVersionFromConfigFile } from "./config-file";
import { getUvVersionFromRequirementsFile } from "./requirements-file";
import { getUvVersionFromToolVersions } from "./tool-versions-file";
export function getUvVersionFromFile(filePath: string): string | undefined {
core.info(`Trying to find version for uv in: ${filePath}`);
if (!fs.existsSync(filePath)) {
core.info(`Could not find file: ${filePath}`);
return undefined;
}
let uvVersion: string | undefined;
try {
uvVersion = getUvVersionFromToolVersions(filePath);
if (uvVersion === undefined) {
uvVersion = getRequiredVersionFromConfigFile(filePath);
}
if (uvVersion === undefined) {
uvVersion = getUvVersionFromRequirementsFile(filePath);
}
} catch (err) {
const message = (err as Error).message;
core.warning(`Error while parsing ${filePath}: ${message}`);
return undefined;
}
if (uvVersion?.startsWith("==")) {
uvVersion = uvVersion.slice(2);
}
if (uvVersion !== undefined) {
core.info(`Found version for uv in ${filePath}: ${uvVersion}`);
}
return uvVersion;
}

View File

@@ -1,31 +0,0 @@
import fs from "node:fs";
import * as core from "@actions/core";
export function getUvVersionFromToolVersions(
filePath: string,
): string | undefined {
if (!filePath.endsWith(".tool-versions")) {
return undefined;
}
const fileContents = fs.readFileSync(filePath, "utf8");
const lines = fileContents.split("\n");
for (const line of lines) {
// Skip commented lines
if (line.trim().startsWith("#")) {
continue;
}
const match = line.match(/^\s*uv\s*v?\s*(?<version>[^\s]+)\s*$/);
if (match) {
const matchedVersion = match.groups?.version.trim();
if (matchedVersion?.startsWith("ref")) {
core.warning(
"The ref syntax of .tool-versions is not supported. Please use a released version instead.",
);
return undefined;
}
return matchedVersion;
}
}
return undefined;
}

View File

@@ -1,12 +1,12 @@
{
"compilerOptions": {
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
"target": "ES2022" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */,
"module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,
"noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */,
"outDir": "./lib" /* Redirect output structure to the directory. */,
"rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */,
"strict": true /* Enable all strict type-checking options. */,
"target": "ES2022" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
"noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */,
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
},
"exclude": ["node_modules", "**/*.test.ts"]
}

File diff suppressed because it is too large Load Diff