mirror of
https://github.com/astral-sh/setup-uv.git
synced 2026-03-14 17:14:58 +00:00
Compare commits
17 Commits
zb/version
...
v7.3.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eac588ad8d | ||
|
|
a97c6cbe9c | ||
|
|
02182fa02a | ||
|
|
a3b3eaea92 | ||
|
|
78cebeceac | ||
|
|
b6b8e2cd6a | ||
|
|
e31bec8546 | ||
|
|
db2b65ebae | ||
|
|
3511ff7054 | ||
|
|
99b0f0474b | ||
|
|
db4d6bf3d6 | ||
|
|
98e1309028 | ||
|
|
5ed2ede620 | ||
|
|
5fca386933 | ||
|
|
803947b9bd | ||
|
|
24553ac46d | ||
|
|
085087a5d3 |
2
.github/copilot-instructions.md
vendored
2
.github/copilot-instructions.md
vendored
@@ -23,7 +23,7 @@ and configures the environment for subsequent workflow steps.
|
|||||||
**Size**: Small-medium repository (~50 source files, ~400 total files including dependencies)
|
**Size**: Small-medium repository (~50 source files, ~400 total files including dependencies)
|
||||||
**Languages**: TypeScript (primary), JavaScript (compiled output), JSON (configuration)
|
**Languages**: TypeScript (primary), JavaScript (compiled output), JSON (configuration)
|
||||||
**Runtime**: Node.js 24 (GitHub Actions runtime)
|
**Runtime**: Node.js 24 (GitHub Actions runtime)
|
||||||
**Key Dependencies**: @actions/core, @actions/cache, @actions/tool-cache
|
**Key Dependencies**: @actions/core, @actions/cache, @actions/tool-cache, @octokit/core
|
||||||
|
|
||||||
### Core Architecture
|
### Core Architecture
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/codeql-analysis.yml
vendored
2
.github/workflows/codeql-analysis.yml
vendored
@@ -41,7 +41,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/release-drafter.yml
vendored
2
.github/workflows/release-drafter.yml
vendored
@@ -19,6 +19,6 @@ jobs:
|
|||||||
pull-requests: read
|
pull-requests: read
|
||||||
steps:
|
steps:
|
||||||
- name: 🚀 Run Release Drafter
|
- name: 🚀 Run Release Drafter
|
||||||
uses: release-drafter/release-drafter@b1476f6e6eb133afa41ed8589daba6dc69b4d3f5 # v6.1.0
|
uses: release-drafter/release-drafter@6db134d15f3909ccc9eefd369f02bd1e9cffdf97 # v6.2.0
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
294
.github/workflows/test.yml
vendored
294
.github/workflows/test.yml
vendored
@@ -21,14 +21,14 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
security-events: write # for zizmor
|
security-events: write # for zizmor
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Actionlint
|
- name: Actionlint
|
||||||
uses: eifinger/actionlint-action@213860089b7cf97d640aa67567898fabeb132746 # v1.9.3
|
uses: eifinger/actionlint-action@447fbfe7533062b7a9ea55f790f2396fba6d052a # v1.10.0
|
||||||
- name: Run zizmor
|
- name: Run zizmor
|
||||||
uses: zizmorcore/zizmor-action@e639db99335bc9038abc0e066dfcd72e23d26fb4 # v0.3.0
|
uses: zizmorcore/zizmor-action@135698455da5c3b3e55f73f4419e481ab68cdd95 # v0.4.1
|
||||||
- uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
|
- uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
|
||||||
with:
|
with:
|
||||||
node-version-file: .nvmrc
|
node-version-file: .nvmrc
|
||||||
cache: npm
|
cache: npm
|
||||||
@@ -51,7 +51,7 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-latest, macos-latest, macos-14, windows-latest]
|
os: [ubuntu-latest, macos-latest, macos-14, windows-latest]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install latest version
|
- name: Install latest version
|
||||||
@@ -76,7 +76,7 @@ jobs:
|
|||||||
test-uv-no-modify-path:
|
test-uv-no-modify-path:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install with UV_NO_MODIFY_PATH set
|
- name: Install with UV_NO_MODIFY_PATH set
|
||||||
@@ -125,7 +125,7 @@ jobs:
|
|||||||
expected-version: "0.1.0"
|
expected-version: "0.1.0"
|
||||||
resolution-strategy: "lowest"
|
resolution-strategy: "lowest"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install version ${{ matrix.input.version-input }} with strategy ${{ matrix.input.resolution-strategy || 'highest' }}
|
- name: Install version ${{ matrix.input.version-input }} with strategy ${{ matrix.input.resolution-strategy || 'highest' }}
|
||||||
@@ -154,7 +154,7 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
version-input: ["latest", ">=0.8"]
|
version-input: ["latest", ">=0.8"]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install version ${{ matrix.version-input }}
|
- name: Install version ${{ matrix.version-input }}
|
||||||
@@ -182,7 +182,7 @@ jobs:
|
|||||||
- working-directory: "__tests__/fixtures/uv-toml-project"
|
- working-directory: "__tests__/fixtures/uv-toml-project"
|
||||||
expected-version: "0.5.15"
|
expected-version: "0.5.15"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install version from ${{ matrix.input.working-directory }}
|
- name: Install version from ${{ matrix.input.working-directory }}
|
||||||
@@ -208,7 +208,7 @@ jobs:
|
|||||||
- version-file: "__tests__/fixtures/.tool-versions"
|
- version-file: "__tests__/fixtures/.tool-versions"
|
||||||
expected-version: "0.5.15"
|
expected-version: "0.5.15"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install version from ${{ matrix.input.version-file }}
|
- name: Install version from ${{ matrix.input.version-file }}
|
||||||
@@ -225,7 +225,7 @@ jobs:
|
|||||||
test-malformed-pyproject-file-fallback:
|
test-malformed-pyproject-file-fallback:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install using malformed pyproject.toml
|
- name: Install using malformed pyproject.toml
|
||||||
@@ -245,7 +245,7 @@ jobs:
|
|||||||
- os: macos-latest
|
- os: macos-latest
|
||||||
checksum: "a70cbfbf3bb5c08b2f84963b4f12c94e08fbb2468ba418a3bfe1066fbe9e7218"
|
checksum: "a70cbfbf3bb5c08b2f84963b4f12c94e08fbb2468ba418a3bfe1066fbe9e7218"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Checksum matches expected
|
- name: Checksum matches expected
|
||||||
@@ -259,7 +259,7 @@ jobs:
|
|||||||
test-with-explicit-token:
|
test-with-explicit-token:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install default version
|
- name: Install default version
|
||||||
@@ -272,7 +272,7 @@ jobs:
|
|||||||
test-uvx:
|
test-uvx:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install default version
|
- name: Install default version
|
||||||
@@ -285,7 +285,7 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-latest, macos-latest, macos-14, windows-latest]
|
os: [ubuntu-latest, macos-latest, macos-14, windows-latest]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install default version
|
- name: Install default version
|
||||||
@@ -293,35 +293,13 @@ jobs:
|
|||||||
- run: uv tool install ruff
|
- run: uv tool install ruff
|
||||||
- run: ruff --version
|
- run: ruff --version
|
||||||
|
|
||||||
test-tilde-expansion-tool-dirs:
|
|
||||||
runs-on: selfhosted-ubuntu-arm64
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
- name: Setup with cache
|
|
||||||
uses: ./
|
|
||||||
with:
|
|
||||||
tool-bin-dir: "~/tool-bin-dir"
|
|
||||||
tool-dir: "~/tool-dir"
|
|
||||||
- name: "Check if tool dirs are expanded"
|
|
||||||
run: |
|
|
||||||
if ! echo "$PATH" | grep -q "/home/ubuntu/tool-bin-dir"; then
|
|
||||||
echo "PATH does not contain /home/ubuntu/tool-bin-dir: $PATH"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if [ "$UV_TOOL_DIR" != "/home/ubuntu/tool-dir" ]; then
|
|
||||||
echo "UV_TOOL_DIR does not contain /home/ubuntu/tool-dir: $UV_TOOL_DIR"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
test-python-version:
|
test-python-version:
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install latest version
|
- name: Install latest version
|
||||||
@@ -353,7 +331,7 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install latest version
|
- name: Install latest version
|
||||||
@@ -386,11 +364,65 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
UV_VENV: ${{ steps.setup-uv.outputs.venv }}
|
UV_VENV: ${{ steps.setup-uv.outputs.venv }}
|
||||||
|
|
||||||
|
test-activate-environment-custom-path:
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
- name: Install latest version
|
||||||
|
id: setup-uv
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
python-version: 3.13.1t
|
||||||
|
activate-environment: true
|
||||||
|
venv-path: ${{ runner.temp }}/custom-venv
|
||||||
|
- name: Verify VIRTUAL_ENV matches output
|
||||||
|
run: |
|
||||||
|
if [ "$VIRTUAL_ENV" != "$UV_VENV" ]; then
|
||||||
|
echo "VIRTUAL_ENV does not match venv output: $VIRTUAL_ENV vs $UV_VENV"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
UV_VENV: ${{ steps.setup-uv.outputs.venv }}
|
||||||
|
- name: Verify venv location is runner.temp/custom-venv
|
||||||
|
run: |
|
||||||
|
python - <<'PY'
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
venv = Path(os.environ["VIRTUAL_ENV"]).resolve()
|
||||||
|
temp = Path(os.environ["RUNNER_TEMP"]).resolve()
|
||||||
|
|
||||||
|
if venv.name != "custom-venv":
|
||||||
|
raise SystemExit(f"Expected venv name 'custom-venv', got: {venv}")
|
||||||
|
if venv.parent != temp:
|
||||||
|
raise SystemExit(f"Expected venv under {temp}, got: {venv}")
|
||||||
|
if not venv.is_dir():
|
||||||
|
raise SystemExit(f"Venv directory does not exist: {venv}")
|
||||||
|
PY
|
||||||
|
shell: bash
|
||||||
|
- name: Verify packages can be installed
|
||||||
|
run: uv pip install pip
|
||||||
|
shell: bash
|
||||||
|
- name: Verify python runs from custom venv
|
||||||
|
run: |
|
||||||
|
python - <<'PY'
|
||||||
|
import sys
|
||||||
|
if "custom-venv" not in sys.executable:
|
||||||
|
raise SystemExit(f"Python is not running from custom venv: {sys.executable}")
|
||||||
|
PY
|
||||||
|
shell: bash
|
||||||
|
|
||||||
test-musl:
|
test-musl:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container: alpine
|
container: alpine
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install latest version
|
- name: Install latest version
|
||||||
@@ -429,7 +461,7 @@ jobs:
|
|||||||
- os: windows-2025
|
- os: windows-2025
|
||||||
expected-os: "windows-2025"
|
expected-os: "windows-2025"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Setup uv
|
- name: Setup uv
|
||||||
@@ -453,9 +485,9 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
enable-cache: ["true", "false", "auto"]
|
enable-cache: ["true", "false", "auto"]
|
||||||
os: ["ubuntu-latest", "selfhosted-ubuntu-arm64", "windows-latest"]
|
os: ["ubuntu-latest", "windows-latest"]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Setup with cache
|
- name: Setup with cache
|
||||||
@@ -471,10 +503,10 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
enable-cache: ["true", "false", "auto"]
|
enable-cache: ["true", "false", "auto"]
|
||||||
os: ["ubuntu-latest", "selfhosted-ubuntu-arm64", "windows-latest"]
|
os: ["ubuntu-latest", "windows-latest"]
|
||||||
needs: test-setup-cache
|
needs: test-setup-cache
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Restore with cache
|
- name: Restore with cache
|
||||||
@@ -493,7 +525,7 @@ jobs:
|
|||||||
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
|
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
|
||||||
shell: bash
|
shell: bash
|
||||||
- name: Cache was not hit
|
- name: Cache was not hit
|
||||||
if: ${{ matrix.enable-cache == 'false' || (matrix.enable-cache == 'auto' && matrix.os == 'selfhosted-ubuntu-arm64') }}
|
if: ${{ matrix.enable-cache == 'false' }}
|
||||||
run: |
|
run: |
|
||||||
if [ "$CACHE_HIT" == "true" ]; then
|
if [ "$CACHE_HIT" == "true" ]; then
|
||||||
exit 1
|
exit 1
|
||||||
@@ -508,7 +540,7 @@ jobs:
|
|||||||
test-setup-cache-requirements-txt:
|
test-setup-cache-requirements-txt:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Setup with cache
|
- name: Setup with cache
|
||||||
@@ -524,7 +556,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: test-setup-cache-requirements-txt
|
needs: test-setup-cache-requirements-txt
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Restore with cache
|
- name: Restore with cache
|
||||||
@@ -548,7 +580,7 @@ jobs:
|
|||||||
test-setup-cache-dependency-glob:
|
test-setup-cache-dependency-glob:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Setup with cache
|
- name: Setup with cache
|
||||||
@@ -565,7 +597,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: test-setup-cache-dependency-glob
|
needs: test-setup-cache-dependency-glob
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Change pyproject.toml
|
- name: Change pyproject.toml
|
||||||
@@ -593,7 +625,7 @@ jobs:
|
|||||||
test-setup-cache-save-cache-false:
|
test-setup-cache-save-cache-false:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Setup with cache
|
- name: Setup with cache
|
||||||
@@ -609,7 +641,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: test-setup-cache-save-cache-false
|
needs: test-setup-cache-save-cache-false
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Restore with cache
|
- name: Restore with cache
|
||||||
@@ -629,7 +661,7 @@ jobs:
|
|||||||
test-setup-cache-restore-cache-false:
|
test-setup-cache-restore-cache-false:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Setup with cache
|
- name: Setup with cache
|
||||||
@@ -644,7 +676,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: test-setup-cache-restore-cache-false
|
needs: test-setup-cache-restore-cache-false
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Restore with cache
|
- name: Restore with cache
|
||||||
@@ -670,11 +702,9 @@ jobs:
|
|||||||
expected-cache-dir: "/home/runner/work/_temp/setup-uv-cache"
|
expected-cache-dir: "/home/runner/work/_temp/setup-uv-cache"
|
||||||
- os: windows-latest
|
- os: windows-latest
|
||||||
expected-cache-dir: "D:\\a\\_temp\\setup-uv-cache"
|
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 }}
|
runs-on: ${{ matrix.inputs.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Setup with cache
|
- name: Setup with cache
|
||||||
@@ -692,7 +722,7 @@ jobs:
|
|||||||
test-cache-local-cache-disabled:
|
test-cache-local-cache-disabled:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Setup without cache
|
- name: Setup without cache
|
||||||
@@ -711,7 +741,7 @@ jobs:
|
|||||||
test-cache-local-cache-disabled-but-explicit-path:
|
test-cache-local-cache-disabled-but-explicit-path:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Setup without cache
|
- name: Setup without cache
|
||||||
@@ -728,99 +758,10 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
test-setup-cache-local:
|
|
||||||
runs-on: selfhosted-ubuntu-arm64
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
- 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@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
- 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@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
- 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@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
- 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:
|
test-no-python-version:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Fake pyproject.toml at root
|
- name: Fake pyproject.toml at root
|
||||||
@@ -835,7 +776,7 @@ jobs:
|
|||||||
test-custom-manifest-file:
|
test-custom-manifest-file:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install from custom manifest file
|
- name: Install from custom manifest file
|
||||||
@@ -854,7 +795,7 @@ jobs:
|
|||||||
test-absolute-path:
|
test-absolute-path:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Create requirements.txt
|
- name: Create requirements.txt
|
||||||
@@ -874,7 +815,7 @@ jobs:
|
|||||||
test-relative-path:
|
test-relative-path:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: mkdir
|
- name: mkdir
|
||||||
@@ -898,7 +839,7 @@ jobs:
|
|||||||
test-cache-prune-force:
|
test-cache-prune-force:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Setup uv
|
- name: Setup uv
|
||||||
@@ -915,7 +856,7 @@ jobs:
|
|||||||
test-cache-dir-from-file:
|
test-cache-dir-from-file:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Verify uv cache dir is not populated
|
- name: Verify uv cache dir is not populated
|
||||||
@@ -937,10 +878,33 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
test-cache-python-missing-managed-install-dir:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
UV_PYTHON_INSTALL_DIR: /tmp/missing-uv-python
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
- name: Setup uv with cache and python cache enabled
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
enable-cache: true
|
||||||
|
cache-python: true
|
||||||
|
python-version: "3.12"
|
||||||
|
cache-local-path: /tmp/setup-uv-cache
|
||||||
|
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-cache-python-missing-managed-install-dir
|
||||||
|
- name: Ensure uv cache dir exists so only python-cache behavior is tested
|
||||||
|
run: uv sync
|
||||||
|
working-directory: __tests__/fixtures/uv-project
|
||||||
|
shell: bash
|
||||||
|
- name: Ensure managed Python install dir does not exist and this does not break caching
|
||||||
|
run: rm -rf "$UV_PYTHON_INSTALL_DIR"
|
||||||
|
|
||||||
test-cache-python-installs:
|
test-cache-python-installs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Verify Python install dir is not populated
|
- name: Verify Python install dir is not populated
|
||||||
@@ -967,7 +931,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: test-cache-python-installs
|
needs: test-cache-python-installs
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Verify Python install dir does not exist
|
- name: Verify Python install dir does not exist
|
||||||
@@ -1007,11 +971,9 @@ jobs:
|
|||||||
expected-python-dir: "/home/runner/work/_temp/uv-python-dir"
|
expected-python-dir: "/home/runner/work/_temp/uv-python-dir"
|
||||||
- os: windows-latest
|
- os: windows-latest
|
||||||
expected-python-dir: "D:\\a\\_temp\\uv-python-dir"
|
expected-python-dir: "D:\\a\\_temp\\uv-python-dir"
|
||||||
- os: selfhosted-ubuntu-arm64
|
|
||||||
expected-python-dir: "/home/ubuntu/.local/share/uv/python"
|
|
||||||
runs-on: ${{ matrix.inputs.os }}
|
runs-on: ${{ matrix.inputs.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install latest version
|
- name: Install latest version
|
||||||
@@ -1030,7 +992,7 @@ jobs:
|
|||||||
test-act:
|
test-act:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install act
|
- name: Install act
|
||||||
@@ -1045,11 +1007,11 @@ jobs:
|
|||||||
validate-typings:
|
validate-typings:
|
||||||
runs-on: "ubuntu-latest"
|
runs-on: "ubuntu-latest"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Validate typings
|
- name: Validate typings
|
||||||
uses: typesafegithub/github-actions-typing@184d97003b1300f6a10e286eb98c191e416ff02b # v2.2.1
|
uses: typesafegithub/github-actions-typing@9ddf35b71a482be7d8922b28e8d00df16b77e315 # v2.2.2
|
||||||
|
|
||||||
all-tests-passed:
|
all-tests-passed:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -1066,9 +1028,9 @@ jobs:
|
|||||||
- test-with-explicit-token
|
- test-with-explicit-token
|
||||||
- test-uvx
|
- test-uvx
|
||||||
- test-tool-install
|
- test-tool-install
|
||||||
- test-tilde-expansion-tool-dirs
|
|
||||||
- test-python-version
|
- test-python-version
|
||||||
- test-activate-environment
|
- test-activate-environment
|
||||||
|
- test-activate-environment-custom-path
|
||||||
- test-musl
|
- test-musl
|
||||||
- test-cache-key-os-version
|
- test-cache-key-os-version
|
||||||
- test-cache-local
|
- test-cache-local
|
||||||
@@ -1084,17 +1046,13 @@ jobs:
|
|||||||
- test-restore-cache-save-cache-false
|
- test-restore-cache-save-cache-false
|
||||||
- test-setup-cache-restore-cache-false
|
- test-setup-cache-restore-cache-false
|
||||||
- test-restore-cache-restore-cache-false
|
- test-restore-cache-restore-cache-false
|
||||||
- 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-no-python-version
|
||||||
- test-custom-manifest-file
|
- test-custom-manifest-file
|
||||||
- test-absolute-path
|
- test-absolute-path
|
||||||
- test-relative-path
|
- test-relative-path
|
||||||
- test-cache-prune-force
|
- test-cache-prune-force
|
||||||
- test-cache-dir-from-file
|
- test-cache-dir-from-file
|
||||||
|
- test-cache-python-missing-managed-install-dir
|
||||||
- test-cache-python-installs
|
- test-cache-python-installs
|
||||||
- test-restore-python-installs
|
- test-restore-python-installs
|
||||||
- test-python-install-dir
|
- test-python-install-dir
|
||||||
|
|||||||
7
.github/workflows/update-known-versions.yml
vendored
7
.github/workflows/update-known-versions.yml
vendored
@@ -15,10 +15,10 @@ jobs:
|
|||||||
contents: write
|
contents: write
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: true
|
persist-credentials: true
|
||||||
- uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
|
- uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
|
||||||
with:
|
with:
|
||||||
node-version: "20"
|
node-version: "20"
|
||||||
- name: Update known versions
|
- name: Update known versions
|
||||||
@@ -27,6 +27,7 @@ jobs:
|
|||||||
node dist/update-known-versions/index.js
|
node dist/update-known-versions/index.js
|
||||||
src/download/checksum/known-checksums.ts
|
src/download/checksum/known-checksums.ts
|
||||||
version-manifest.json
|
version-manifest.json
|
||||||
|
${{ secrets.GITHUB_TOKEN }}
|
||||||
- name: Check for changes
|
- name: Check for changes
|
||||||
id: changes-exist
|
id: changes-exist
|
||||||
run: |
|
run: |
|
||||||
@@ -54,7 +55,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
if: ${{ steps.changes-exist.outputs.changes-exist == 'true' && steps.commit-and-push.outcome != 'success' }}
|
if: ${{ steps.changes-exist.outputs.changes-exist == 'true' && steps.commit-and-push.outcome != 'success' }}
|
||||||
uses: peter-evans/create-pull-request@98357b18bf14b5342f975ff684046ec3b2a07725 # v8.0.0
|
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0
|
||||||
with:
|
with:
|
||||||
commit-message: "chore: update known checksums"
|
commit-message: "chore: update known checksums"
|
||||||
title:
|
title:
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: true # needed for git push below
|
persist-credentials: true # needed for git push below
|
||||||
- name: Update Major Minor Tags
|
- name: Update Major Minor Tags
|
||||||
|
|||||||
@@ -59,6 +59,9 @@ Have a look under [Advanced Configuration](#advanced-configuration) for detailed
|
|||||||
# Use uv venv to activate a venv ready to be used by later steps
|
# Use uv venv to activate a venv ready to be used by later steps
|
||||||
activate-environment: "false"
|
activate-environment: "false"
|
||||||
|
|
||||||
|
# Custom path for the virtual environment when using activate-environment (default: .venv in the working directory)
|
||||||
|
venv-path: ""
|
||||||
|
|
||||||
# The directory to execute all commands in and look for files such as pyproject.toml
|
# The directory to execute all commands in and look for files such as pyproject.toml
|
||||||
working-directory: ""
|
working-directory: ""
|
||||||
|
|
||||||
@@ -167,7 +170,7 @@ 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
|
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.
|
which are used to determine the version of uv and python to install.
|
||||||
|
|
||||||
It also controls where [the venv gets created](#activate-environment).
|
It also controls where [the venv gets created](#activate-environment), unless `venv-path` is set.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- name: Install uv based on the config files in the working-directory
|
- name: Install uv based on the config files in the working-directory
|
||||||
@@ -276,7 +279,7 @@ the cache will not be found and the warning `No GitHub Actions cache found for k
|
|||||||
While this might be irritating at first, it is expected behaviour and the cache will be created
|
While this might be irritating at first, it is expected behaviour and the cache will be created
|
||||||
and reused in later workflows.
|
and reused in later workflows.
|
||||||
|
|
||||||
The reason for the warning is, that we have to way to know if this is the first run of a new
|
The reason for the warning is that we have to way to know if this is the first run of a new
|
||||||
cache key or the user accidentally misconfigured the cache-dependency-glob
|
cache key or the user accidentally misconfigured the cache-dependency-glob
|
||||||
or cache-suffix (see [Caching documentation](docs/caching.md)) and the cache never gets used.
|
or cache-suffix (see [Caching documentation](docs/caching.md)) and the cache never gets used.
|
||||||
|
|
||||||
@@ -289,7 +292,7 @@ Running `actions/checkout` after `setup-uv` **is not supported**.
|
|||||||
|
|
||||||
### Does `setup-uv` also install my project or its dependencies automatically?
|
### 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`.
|
No, `setup-uv` alone won't 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.
|
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?
|
### Why is a changed cache not detected and not the full cache uploaded?
|
||||||
|
|||||||
@@ -1,142 +0,0 @@
|
|||||||
import { beforeEach, describe, expect, it, jest } from "@jest/globals";
|
|
||||||
|
|
||||||
// biome-ignore lint/suspicious/noExplicitAny: mock needs flexible typing
|
|
||||||
const mockFetch = jest.fn<any>();
|
|
||||||
jest.mock("../../src/utils/fetch", () => ({
|
|
||||||
fetch: mockFetch,
|
|
||||||
}));
|
|
||||||
|
|
||||||
import {
|
|
||||||
clearCache,
|
|
||||||
fetchVersionData,
|
|
||||||
getAllVersions,
|
|
||||||
getArtifact,
|
|
||||||
getLatestVersion,
|
|
||||||
} from "../../src/download/versions-client";
|
|
||||||
|
|
||||||
const sampleNdjsonResponse = `{"version":"0.9.26","artifacts":[{"platform":"aarch64-apple-darwin","variant":"default","url":"https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-apple-darwin.tar.gz","archive_format":"tar.gz","sha256":"fcf0a9ea6599c6ae28a4c854ac6da76f2c889354d7c36ce136ef071f7ab9721f"},{"platform":"x86_64-pc-windows-msvc","variant":"default","url":"https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-pc-windows-msvc.zip","archive_format":"zip","sha256":"eb02fd95d8e0eed462b4a67ecdd320d865b38c560bffcda9a0b87ec944bdf036"}]}
|
|
||||||
{"version":"0.9.25","artifacts":[{"platform":"aarch64-apple-darwin","variant":"default","url":"https://github.com/astral-sh/uv/releases/download/0.9.25/uv-aarch64-apple-darwin.tar.gz","archive_format":"tar.gz","sha256":"606b3c6949d971709f2526fa0d9f0fd23ccf60e09f117999b406b424af18a6a6"}]}`;
|
|
||||||
|
|
||||||
function createMockResponse(
|
|
||||||
ok: boolean,
|
|
||||||
status: number,
|
|
||||||
statusText: string,
|
|
||||||
data: string,
|
|
||||||
) {
|
|
||||||
return {
|
|
||||||
ok,
|
|
||||||
status,
|
|
||||||
statusText,
|
|
||||||
text: async () => data,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
describe("versions-client", () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
clearCache();
|
|
||||||
mockFetch.mockReset();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("fetchVersionData", () => {
|
|
||||||
it("should fetch and parse NDJSON data", async () => {
|
|
||||||
mockFetch.mockResolvedValue(
|
|
||||||
createMockResponse(true, 200, "OK", sampleNdjsonResponse),
|
|
||||||
);
|
|
||||||
|
|
||||||
const versions = await fetchVersionData();
|
|
||||||
|
|
||||||
expect(versions).toHaveLength(2);
|
|
||||||
expect(versions[0].version).toBe("0.9.26");
|
|
||||||
expect(versions[1].version).toBe("0.9.25");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should throw error on failed fetch", async () => {
|
|
||||||
mockFetch.mockResolvedValue(
|
|
||||||
createMockResponse(false, 500, "Internal Server Error", ""),
|
|
||||||
);
|
|
||||||
|
|
||||||
await expect(fetchVersionData()).rejects.toThrow(
|
|
||||||
"Failed to fetch version data: 500 Internal Server Error",
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should cache results", async () => {
|
|
||||||
mockFetch.mockResolvedValue(
|
|
||||||
createMockResponse(true, 200, "OK", sampleNdjsonResponse),
|
|
||||||
);
|
|
||||||
|
|
||||||
await fetchVersionData();
|
|
||||||
await fetchVersionData();
|
|
||||||
|
|
||||||
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("getLatestVersion", () => {
|
|
||||||
it("should return the first version (newest)", async () => {
|
|
||||||
mockFetch.mockResolvedValue(
|
|
||||||
createMockResponse(true, 200, "OK", sampleNdjsonResponse),
|
|
||||||
);
|
|
||||||
|
|
||||||
const latest = await getLatestVersion();
|
|
||||||
|
|
||||||
expect(latest).toBe("0.9.26");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("getAllVersions", () => {
|
|
||||||
it("should return all version strings", async () => {
|
|
||||||
mockFetch.mockResolvedValue(
|
|
||||||
createMockResponse(true, 200, "OK", sampleNdjsonResponse),
|
|
||||||
);
|
|
||||||
|
|
||||||
const versions = await getAllVersions();
|
|
||||||
|
|
||||||
expect(versions).toEqual(["0.9.26", "0.9.25"]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("getArtifact", () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
mockFetch.mockResolvedValue(
|
|
||||||
createMockResponse(true, 200, "OK", sampleNdjsonResponse),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should find artifact by version and platform", async () => {
|
|
||||||
const artifact = await getArtifact("0.9.26", "aarch64", "apple-darwin");
|
|
||||||
|
|
||||||
expect(artifact).toEqual({
|
|
||||||
sha256:
|
|
||||||
"fcf0a9ea6599c6ae28a4c854ac6da76f2c889354d7c36ce136ef071f7ab9721f",
|
|
||||||
url: "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-apple-darwin.tar.gz",
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should find Windows artifact", async () => {
|
|
||||||
const artifact = await getArtifact("0.9.26", "x86_64", "pc-windows-msvc");
|
|
||||||
|
|
||||||
expect(artifact).toEqual({
|
|
||||||
sha256:
|
|
||||||
"eb02fd95d8e0eed462b4a67ecdd320d865b38c560bffcda9a0b87ec944bdf036",
|
|
||||||
url: "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-pc-windows-msvc.zip",
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should return undefined for unknown version", async () => {
|
|
||||||
const artifact = await getArtifact("0.0.1", "aarch64", "apple-darwin");
|
|
||||||
|
|
||||||
expect(artifact).toBeUndefined();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should return undefined for unknown platform", async () => {
|
|
||||||
const artifact = await getArtifact(
|
|
||||||
"0.9.26",
|
|
||||||
"aarch64",
|
|
||||||
"unknown-linux-musl",
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(artifact).toBeUndefined();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -5,6 +5,7 @@ jest.mock("@actions/core", () => {
|
|||||||
(name: string) => (mockInputs[name] ?? "") === "true",
|
(name: string) => (mockInputs[name] ?? "") === "true",
|
||||||
),
|
),
|
||||||
getInput: jest.fn((name: string) => mockInputs[name] ?? ""),
|
getInput: jest.fn((name: string) => mockInputs[name] ?? ""),
|
||||||
|
warning: jest.fn(),
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -24,6 +25,7 @@ const ORIGINAL_HOME = process.env.HOME;
|
|||||||
describe("cacheDependencyGlob", () => {
|
describe("cacheDependencyGlob", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
jest.resetModules();
|
jest.resetModules();
|
||||||
|
jest.clearAllMocks();
|
||||||
mockInputs = {};
|
mockInputs = {};
|
||||||
process.env.HOME = "/home/testuser";
|
process.env.HOME = "/home/testuser";
|
||||||
});
|
});
|
||||||
@@ -84,3 +86,125 @@ describe("cacheDependencyGlob", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("tool directories", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
jest.resetModules();
|
||||||
|
jest.clearAllMocks();
|
||||||
|
mockInputs = {};
|
||||||
|
process.env.HOME = "/home/testuser";
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
process.env.HOME = ORIGINAL_HOME;
|
||||||
|
});
|
||||||
|
|
||||||
|
it("expands tilde for tool-bin-dir and tool-dir", async () => {
|
||||||
|
mockInputs["working-directory"] = "/workspace";
|
||||||
|
mockInputs["tool-bin-dir"] = "~/tool-bin-dir";
|
||||||
|
mockInputs["tool-dir"] = "~/tool-dir";
|
||||||
|
|
||||||
|
const { toolBinDir, toolDir } = await import("../../src/utils/inputs");
|
||||||
|
|
||||||
|
expect(toolBinDir).toBe("/home/testuser/tool-bin-dir");
|
||||||
|
expect(toolDir).toBe("/home/testuser/tool-dir");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("cacheLocalPath", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
jest.resetModules();
|
||||||
|
jest.clearAllMocks();
|
||||||
|
mockInputs = {};
|
||||||
|
process.env.HOME = "/home/testuser";
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
process.env.HOME = ORIGINAL_HOME;
|
||||||
|
});
|
||||||
|
|
||||||
|
it("expands tilde in cache-local-path", async () => {
|
||||||
|
mockInputs["working-directory"] = "/workspace";
|
||||||
|
mockInputs["cache-local-path"] = "~/uv-cache/cache-local-path";
|
||||||
|
|
||||||
|
const { CacheLocalSource, cacheLocalPath } = await import(
|
||||||
|
"../../src/utils/inputs"
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(cacheLocalPath).toEqual({
|
||||||
|
path: "/home/testuser/uv-cache/cache-local-path",
|
||||||
|
source: CacheLocalSource.Input,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("venvPath", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
jest.resetModules();
|
||||||
|
jest.clearAllMocks();
|
||||||
|
mockInputs = {};
|
||||||
|
process.env.HOME = "/home/testuser";
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
process.env.HOME = ORIGINAL_HOME;
|
||||||
|
});
|
||||||
|
|
||||||
|
it("defaults to .venv in the working directory", async () => {
|
||||||
|
mockInputs["working-directory"] = "/workspace";
|
||||||
|
const { venvPath } = await import("../../src/utils/inputs");
|
||||||
|
expect(venvPath).toBe("/workspace/.venv");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("resolves a relative venv-path", async () => {
|
||||||
|
mockInputs["working-directory"] = "/workspace";
|
||||||
|
mockInputs["activate-environment"] = "true";
|
||||||
|
mockInputs["venv-path"] = "custom-venv";
|
||||||
|
const { venvPath } = await import("../../src/utils/inputs");
|
||||||
|
expect(venvPath).toBe("/workspace/custom-venv");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("normalizes venv-path with trailing slash", async () => {
|
||||||
|
mockInputs["working-directory"] = "/workspace";
|
||||||
|
mockInputs["activate-environment"] = "true";
|
||||||
|
mockInputs["venv-path"] = "custom-venv/";
|
||||||
|
const { venvPath } = await import("../../src/utils/inputs");
|
||||||
|
expect(venvPath).toBe("/workspace/custom-venv");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("keeps an absolute venv-path unchanged", async () => {
|
||||||
|
mockInputs["working-directory"] = "/workspace";
|
||||||
|
mockInputs["activate-environment"] = "true";
|
||||||
|
mockInputs["venv-path"] = "/tmp/custom-venv";
|
||||||
|
const { venvPath } = await import("../../src/utils/inputs");
|
||||||
|
expect(venvPath).toBe("/tmp/custom-venv");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("expands tilde in venv-path", async () => {
|
||||||
|
mockInputs["working-directory"] = "/workspace";
|
||||||
|
mockInputs["activate-environment"] = "true";
|
||||||
|
mockInputs["venv-path"] = "~/.venv";
|
||||||
|
const { venvPath } = await import("../../src/utils/inputs");
|
||||||
|
expect(venvPath).toBe("/home/testuser/.venv");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("warns when venv-path is set but activate-environment is false", async () => {
|
||||||
|
mockInputs["working-directory"] = "/workspace";
|
||||||
|
mockInputs["venv-path"] = "custom-venv";
|
||||||
|
|
||||||
|
const { activateEnvironment, venvPath } = await import(
|
||||||
|
"../../src/utils/inputs"
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(activateEnvironment).toBe(false);
|
||||||
|
expect(venvPath).toBe("/workspace/custom-venv");
|
||||||
|
|
||||||
|
const mockedCore = jest.requireMock("@actions/core") as {
|
||||||
|
warning: jest.Mock;
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(mockedCore.warning).toHaveBeenCalledWith(
|
||||||
|
"venv-path is only used when activate-environment is true",
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ inputs:
|
|||||||
type: string
|
type: string
|
||||||
activate-environment:
|
activate-environment:
|
||||||
type: boolean
|
type: boolean
|
||||||
|
venv-path:
|
||||||
|
type: string
|
||||||
working-directory:
|
working-directory:
|
||||||
type: string
|
type: string
|
||||||
checksum:
|
checksum:
|
||||||
|
|||||||
@@ -15,6 +15,9 @@ inputs:
|
|||||||
activate-environment:
|
activate-environment:
|
||||||
description: "Use uv venv to activate a venv ready to be used by later steps. "
|
description: "Use uv venv to activate a venv ready to be used by later steps. "
|
||||||
default: "false"
|
default: "false"
|
||||||
|
venv-path:
|
||||||
|
description: "Custom path for the virtual environment when using activate-environment. Defaults to '.venv' in the working directory."
|
||||||
|
default: ""
|
||||||
working-directory:
|
working-directory:
|
||||||
description: "The directory to execute all commands in and look for files such as pyproject.toml"
|
description: "The directory to execute all commands in and look for files such as pyproject.toml"
|
||||||
default: ${{ github.workspace }}
|
default: ${{ github.workspace }}
|
||||||
|
|||||||
66
dist/save-cache/index.js
generated
vendored
66
dist/save-cache/index.js
generated
vendored
@@ -90852,11 +90852,25 @@ async function saveCache() {
|
|||||||
await pruneCache();
|
await pruneCache();
|
||||||
}
|
}
|
||||||
const actualCachePath = getUvCachePath();
|
const actualCachePath = getUvCachePath();
|
||||||
await saveCacheToKey(cacheKey, actualCachePath, restore_cache_1.STATE_CACHE_MATCHED_KEY, "uv cache", `Cache path ${actualCachePath} does not exist on disk. This likely indicates that there are no dependencies to cache. Consider disabling the cache input if it is not needed.`);
|
if (!fs.existsSync(actualCachePath)) {
|
||||||
|
if (inputs_1.ignoreNothingToCache) {
|
||||||
|
core.info("No cacheable uv cache paths were found. Ignoring because ignore-nothing-to-cache is enabled.");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new Error(`Cache path ${actualCachePath} does not exist on disk. This likely indicates that there are no dependencies to cache. Consider disabling the cache input if it is not needed.`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
await saveCacheToKey(cacheKey, actualCachePath, restore_cache_1.STATE_CACHE_MATCHED_KEY, "uv cache");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (inputs_1.cachePython) {
|
if (inputs_1.cachePython) {
|
||||||
|
if (!fs.existsSync(inputs_1.pythonDir)) {
|
||||||
|
core.warning(`Python cache path ${inputs_1.pythonDir} does not exist on disk. Skipping Python cache save because no managed Python installation was found. If you want uv to install managed Python instead of using a system interpreter, set UV_PYTHON_PREFERENCE=only-managed.`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
const pythonCacheKey = `${cacheKey}-python`;
|
const pythonCacheKey = `${cacheKey}-python`;
|
||||||
await saveCacheToKey(pythonCacheKey, inputs_1.pythonDir, restore_cache_1.STATE_PYTHON_CACHE_MATCHED_KEY, "Python cache", `Python cache path ${inputs_1.pythonDir} does not exist on disk. This likely indicates that there are no Python installations to cache. Consider disabling the cache input if it is not needed.`);
|
await saveCacheToKey(pythonCacheKey, inputs_1.pythonDir, restore_cache_1.STATE_PYTHON_CACHE_MATCHED_KEY, "Python cache");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
async function pruneCache() {
|
async function pruneCache() {
|
||||||
@@ -90883,30 +90897,15 @@ function getUvCachePath() {
|
|||||||
}
|
}
|
||||||
return inputs_1.cacheLocalPath.path;
|
return inputs_1.cacheLocalPath.path;
|
||||||
}
|
}
|
||||||
async function saveCacheToKey(cacheKey, cachePath, stateKey, cacheName, pathNotExistErrorMessage) {
|
async function saveCacheToKey(cacheKey, cachePath, stateKey, cacheName) {
|
||||||
const matchedKey = core.getState(stateKey);
|
const matchedKey = core.getState(stateKey);
|
||||||
if (matchedKey === cacheKey) {
|
if (matchedKey === cacheKey) {
|
||||||
core.info(`${cacheName} hit occurred on key ${cacheKey}, not saving cache.`);
|
core.info(`${cacheName} hit occurred on key ${cacheKey}, not saving cache.`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
core.info(`Including ${cacheName} path: ${cachePath}`);
|
core.info(`Including ${cacheName} path: ${cachePath}`);
|
||||||
if (!fs.existsSync(cachePath) && !inputs_1.ignoreNothingToCache) {
|
await cache.saveCache([cachePath], cacheKey);
|
||||||
throw new Error(pathNotExistErrorMessage);
|
core.info(`${cacheName} saved with key: ${cacheKey}`);
|
||||||
}
|
|
||||||
try {
|
|
||||||
await cache.saveCache([cachePath], cacheKey);
|
|
||||||
core.info(`${cacheName} saved with key: ${cacheKey}`);
|
|
||||||
}
|
|
||||||
catch (e) {
|
|
||||||
if (e instanceof Error &&
|
|
||||||
e.message ===
|
|
||||||
"Path Validation Error: Path(s) specified in the action for caching do(es) not exist, hence no cache is being saved.") {
|
|
||||||
core.info(`No cacheable ${cacheName} paths were found. Ignoring because ignore-nothing-to-save is enabled.`);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
run();
|
run();
|
||||||
|
|
||||||
@@ -90980,13 +90979,12 @@ function getConfigValueFromTomlFile(filePath, key) {
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
exports.VERSIONS_NDJSON_URL = exports.STATE_UV_VERSION = exports.STATE_UV_PATH = exports.TOOL_CACHE_NAME = exports.OWNER = exports.REPO = void 0;
|
exports.STATE_UV_VERSION = exports.STATE_UV_PATH = exports.TOOL_CACHE_NAME = exports.OWNER = exports.REPO = void 0;
|
||||||
exports.REPO = "uv";
|
exports.REPO = "uv";
|
||||||
exports.OWNER = "astral-sh";
|
exports.OWNER = "astral-sh";
|
||||||
exports.TOOL_CACHE_NAME = "uv";
|
exports.TOOL_CACHE_NAME = "uv";
|
||||||
exports.STATE_UV_PATH = "uv-path";
|
exports.STATE_UV_PATH = "uv-path";
|
||||||
exports.STATE_UV_VERSION = "uv-version";
|
exports.STATE_UV_VERSION = "uv-version";
|
||||||
exports.VERSIONS_NDJSON_URL = "https://raw.githubusercontent.com/astral-sh/versions/main/v1/uv.ndjson";
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
@@ -91033,7 +91031,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
exports.resolutionStrategy = exports.addProblemMatchers = exports.manifestFile = exports.githubToken = exports.pythonDir = exports.toolDir = exports.toolBinDir = exports.ignoreEmptyWorkdir = exports.ignoreNothingToCache = exports.cachePython = exports.pruneCache = exports.cacheDependencyGlob = exports.cacheLocalPath = exports.cacheSuffix = exports.saveCache = exports.restoreCache = exports.enableCache = exports.checkSum = exports.activateEnvironment = exports.pythonVersion = exports.versionFile = exports.version = exports.workingDirectory = exports.CacheLocalSource = void 0;
|
exports.resolutionStrategy = exports.addProblemMatchers = exports.manifestFile = exports.githubToken = exports.pythonDir = exports.toolDir = exports.toolBinDir = exports.ignoreEmptyWorkdir = exports.ignoreNothingToCache = exports.cachePython = exports.pruneCache = exports.cacheDependencyGlob = exports.cacheLocalPath = exports.cacheSuffix = exports.saveCache = exports.restoreCache = exports.enableCache = exports.checkSum = exports.venvPath = exports.activateEnvironment = exports.pythonVersion = exports.versionFile = exports.version = exports.workingDirectory = exports.CacheLocalSource = void 0;
|
||||||
exports.getUvPythonDir = getUvPythonDir;
|
exports.getUvPythonDir = getUvPythonDir;
|
||||||
const node_path_1 = __importDefault(__nccwpck_require__(6760));
|
const node_path_1 = __importDefault(__nccwpck_require__(6760));
|
||||||
const core = __importStar(__nccwpck_require__(7484));
|
const core = __importStar(__nccwpck_require__(7484));
|
||||||
@@ -91050,6 +91048,7 @@ exports.version = core.getInput("version");
|
|||||||
exports.versionFile = getVersionFile();
|
exports.versionFile = getVersionFile();
|
||||||
exports.pythonVersion = core.getInput("python-version");
|
exports.pythonVersion = core.getInput("python-version");
|
||||||
exports.activateEnvironment = core.getBooleanInput("activate-environment");
|
exports.activateEnvironment = core.getBooleanInput("activate-environment");
|
||||||
|
exports.venvPath = getVenvPath();
|
||||||
exports.checkSum = core.getInput("checksum");
|
exports.checkSum = core.getInput("checksum");
|
||||||
exports.enableCache = getEnableCache();
|
exports.enableCache = getEnableCache();
|
||||||
exports.restoreCache = core.getInput("restore-cache") === "true";
|
exports.restoreCache = core.getInput("restore-cache") === "true";
|
||||||
@@ -91076,6 +91075,17 @@ function getVersionFile() {
|
|||||||
}
|
}
|
||||||
return versionFileInput;
|
return versionFileInput;
|
||||||
}
|
}
|
||||||
|
function getVenvPath() {
|
||||||
|
const venvPathInput = core.getInput("venv-path");
|
||||||
|
if (venvPathInput !== "") {
|
||||||
|
if (!exports.activateEnvironment) {
|
||||||
|
core.warning("venv-path is only used when activate-environment is true");
|
||||||
|
}
|
||||||
|
const tildeExpanded = expandTilde(venvPathInput);
|
||||||
|
return normalizePath(resolveRelativePath(tildeExpanded));
|
||||||
|
}
|
||||||
|
return normalizePath(resolveRelativePath(".venv"));
|
||||||
|
}
|
||||||
function getEnableCache() {
|
function getEnableCache() {
|
||||||
const enableCacheInput = core.getInput("enable-cache");
|
const enableCacheInput = core.getInput("enable-cache");
|
||||||
if (enableCacheInput === "auto") {
|
if (enableCacheInput === "auto") {
|
||||||
@@ -91204,6 +91214,16 @@ function expandTilde(input) {
|
|||||||
}
|
}
|
||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
function normalizePath(inputPath) {
|
||||||
|
const normalized = node_path_1.default.normalize(inputPath);
|
||||||
|
const root = node_path_1.default.parse(normalized).root;
|
||||||
|
// Remove any trailing path separators, except when the whole path is the root.
|
||||||
|
let trimmed = normalized;
|
||||||
|
while (trimmed.length > root.length && trimmed.endsWith(node_path_1.default.sep)) {
|
||||||
|
trimmed = trimmed.slice(0, -1);
|
||||||
|
}
|
||||||
|
return trimmed;
|
||||||
|
}
|
||||||
function resolveRelativePath(inputPath) {
|
function resolveRelativePath(inputPath) {
|
||||||
const hasNegation = inputPath.startsWith("!");
|
const hasNegation = inputPath.startsWith("!");
|
||||||
const pathWithoutNegation = hasNegation ? inputPath.substring(1) : inputPath;
|
const pathWithoutNegation = hasNegation ? inputPath.substring(1) : inputPath;
|
||||||
|
|||||||
4614
dist/setup/index.js
generated
vendored
4614
dist/setup/index.js
generated
vendored
File diff suppressed because it is too large
Load Diff
9657
dist/update-known-versions/index.js
generated
vendored
9657
dist/update-known-versions/index.js
generated
vendored
File diff suppressed because it is too large
Load Diff
@@ -199,6 +199,10 @@ By default, the Python install dir (`uv python dir` / `UV_PYTHON_INSTALL_DIR`) i
|
|||||||
for the same reason that the dependency cache is pruned.
|
for the same reason that the dependency cache is pruned.
|
||||||
If you want to cache Python installs along with your dependencies, set the `cache-python` input to `true`.
|
If you want to cache Python installs along with your dependencies, set the `cache-python` input to `true`.
|
||||||
|
|
||||||
|
Note that this only caches Python versions that uv actually installs into `UV_PYTHON_INSTALL_DIR`
|
||||||
|
(i.e. managed Python installs). If uv uses a system Python, there may be nothing to cache.
|
||||||
|
To force managed Python installs, set `UV_PYTHON_PREFERENCE=only-managed`.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- name: Cache Python installs
|
- name: Cache Python installs
|
||||||
uses: astral-sh/setup-uv@v7
|
uses: astral-sh/setup-uv@v7
|
||||||
|
|||||||
@@ -15,6 +15,17 @@ This allows directly using it in later steps:
|
|||||||
- run: uv pip install pip
|
- run: uv pip install pip
|
||||||
```
|
```
|
||||||
|
|
||||||
|
By default, the venv is created at `.venv` inside the `working-directory`.
|
||||||
|
|
||||||
|
You can customize the venv location with `venv-path`, for example to place it in the runner temp directory:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: astral-sh/setup-uv@v7
|
||||||
|
with:
|
||||||
|
activate-environment: true
|
||||||
|
venv-path: ${{ runner.temp }}/custom-venv
|
||||||
|
```
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
>
|
>
|
||||||
> Activating the environment adds your dependencies to the `PATH`, which could break some workflows.
|
> Activating the environment adds your dependencies to the `PATH`, which could break some workflows.
|
||||||
|
|||||||
272
package-lock.json
generated
272
package-lock.json
generated
@@ -15,6 +15,9 @@
|
|||||||
"@actions/glob": "^0.5.0",
|
"@actions/glob": "^0.5.0",
|
||||||
"@actions/io": "^1.1.3",
|
"@actions/io": "^1.1.3",
|
||||||
"@actions/tool-cache": "^2.0.2",
|
"@actions/tool-cache": "^2.0.2",
|
||||||
|
"@octokit/core": "^7.0.6",
|
||||||
|
"@octokit/plugin-paginate-rest": "^14.0.0",
|
||||||
|
"@octokit/plugin-rest-endpoint-methods": "^17.0.0",
|
||||||
"@renovatebot/pep440": "^4.2.1",
|
"@renovatebot/pep440": "^4.2.1",
|
||||||
"smol-toml": "^1.4.2",
|
"smol-toml": "^1.4.2",
|
||||||
"undici": "5.28.5"
|
"undici": "5.28.5"
|
||||||
@@ -409,6 +412,7 @@
|
|||||||
"integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==",
|
"integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ampproject/remapping": "^2.2.0",
|
"@ampproject/remapping": "^2.2.0",
|
||||||
"@babel/code-frame": "^7.27.1",
|
"@babel/code-frame": "^7.27.1",
|
||||||
@@ -1586,6 +1590,134 @@
|
|||||||
"@tybys/wasm-util": "^0.10.0"
|
"@tybys/wasm-util": "^0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@octokit/auth-token": {
|
||||||
|
"version": "6.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz",
|
||||||
|
"integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/core": {
|
||||||
|
"version": "7.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz",
|
||||||
|
"integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/auth-token": "^6.0.0",
|
||||||
|
"@octokit/graphql": "^9.0.3",
|
||||||
|
"@octokit/request": "^10.0.6",
|
||||||
|
"@octokit/request-error": "^7.0.2",
|
||||||
|
"@octokit/types": "^16.0.0",
|
||||||
|
"before-after-hook": "^4.0.0",
|
||||||
|
"universal-user-agent": "^7.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/endpoint": {
|
||||||
|
"version": "11.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz",
|
||||||
|
"integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/types": "^16.0.0",
|
||||||
|
"universal-user-agent": "^7.0.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/graphql": {
|
||||||
|
"version": "9.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz",
|
||||||
|
"integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/request": "^10.0.6",
|
||||||
|
"@octokit/types": "^16.0.0",
|
||||||
|
"universal-user-agent": "^7.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/openapi-types": {
|
||||||
|
"version": "27.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz",
|
||||||
|
"integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/plugin-paginate-rest": {
|
||||||
|
"version": "14.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz",
|
||||||
|
"integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/types": "^16.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@octokit/core": ">=6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/plugin-rest-endpoint-methods": {
|
||||||
|
"version": "17.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz",
|
||||||
|
"integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/types": "^16.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@octokit/core": ">=6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/request": {
|
||||||
|
"version": "10.0.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz",
|
||||||
|
"integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/endpoint": "^11.0.2",
|
||||||
|
"@octokit/request-error": "^7.0.2",
|
||||||
|
"@octokit/types": "^16.0.0",
|
||||||
|
"fast-content-type-parse": "^3.0.0",
|
||||||
|
"universal-user-agent": "^7.0.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/request-error": {
|
||||||
|
"version": "7.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz",
|
||||||
|
"integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/types": "^16.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/types": {
|
||||||
|
"version": "16.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz",
|
||||||
|
"integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/openapi-types": "^27.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@opentelemetry/api": {
|
"node_modules/@opentelemetry/api": {
|
||||||
"version": "1.4.1",
|
"version": "1.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz",
|
||||||
@@ -2322,6 +2454,12 @@
|
|||||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||||
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
|
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
|
||||||
},
|
},
|
||||||
|
"node_modules/before-after-hook": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==",
|
||||||
|
"license": "Apache-2.0"
|
||||||
|
},
|
||||||
"node_modules/brace-expansion": {
|
"node_modules/brace-expansion": {
|
||||||
"version": "1.1.12",
|
"version": "1.1.12",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
||||||
@@ -2364,6 +2502,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"caniuse-lite": "^1.0.30001733",
|
"caniuse-lite": "^1.0.30001733",
|
||||||
"electron-to-chromium": "^1.5.199",
|
"electron-to-chromium": "^1.5.199",
|
||||||
@@ -2931,6 +3070,22 @@
|
|||||||
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
|
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/fast-content-type-parse": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==",
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/fastify"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/fastify"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/fast-json-stable-stringify": {
|
"node_modules/fast-json-stable-stringify": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
|
||||||
@@ -3475,6 +3630,7 @@
|
|||||||
"integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==",
|
"integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jest/core": "30.2.0",
|
"@jest/core": "30.2.0",
|
||||||
"@jest/types": "30.2.0",
|
"@jest/types": "30.2.0",
|
||||||
@@ -5173,6 +5329,7 @@
|
|||||||
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
|
"peer": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"tsc": "bin/tsc",
|
"tsc": "bin/tsc",
|
||||||
"tsserver": "bin/tsserver"
|
"tsserver": "bin/tsserver"
|
||||||
@@ -5213,6 +5370,12 @@
|
|||||||
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
|
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/universal-user-agent": {
|
||||||
|
"version": "7.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz",
|
||||||
|
"integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==",
|
||||||
|
"license": "ISC"
|
||||||
|
},
|
||||||
"node_modules/unrs-resolver": {
|
"node_modules/unrs-resolver": {
|
||||||
"version": "1.11.1",
|
"version": "1.11.1",
|
||||||
"resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
|
"resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
|
||||||
@@ -5909,6 +6072,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz",
|
||||||
"integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==",
|
"integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"peer": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@ampproject/remapping": "^2.2.0",
|
"@ampproject/remapping": "^2.2.0",
|
||||||
"@babel/code-frame": "^7.27.1",
|
"@babel/code-frame": "^7.27.1",
|
||||||
@@ -6723,6 +6887,94 @@
|
|||||||
"@tybys/wasm-util": "^0.10.0"
|
"@tybys/wasm-util": "^0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@octokit/auth-token": {
|
||||||
|
"version": "6.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz",
|
||||||
|
"integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w=="
|
||||||
|
},
|
||||||
|
"@octokit/core": {
|
||||||
|
"version": "7.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz",
|
||||||
|
"integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==",
|
||||||
|
"peer": true,
|
||||||
|
"requires": {
|
||||||
|
"@octokit/auth-token": "^6.0.0",
|
||||||
|
"@octokit/graphql": "^9.0.3",
|
||||||
|
"@octokit/request": "^10.0.6",
|
||||||
|
"@octokit/request-error": "^7.0.2",
|
||||||
|
"@octokit/types": "^16.0.0",
|
||||||
|
"before-after-hook": "^4.0.0",
|
||||||
|
"universal-user-agent": "^7.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@octokit/endpoint": {
|
||||||
|
"version": "11.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz",
|
||||||
|
"integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==",
|
||||||
|
"requires": {
|
||||||
|
"@octokit/types": "^16.0.0",
|
||||||
|
"universal-user-agent": "^7.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@octokit/graphql": {
|
||||||
|
"version": "9.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz",
|
||||||
|
"integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==",
|
||||||
|
"requires": {
|
||||||
|
"@octokit/request": "^10.0.6",
|
||||||
|
"@octokit/types": "^16.0.0",
|
||||||
|
"universal-user-agent": "^7.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@octokit/openapi-types": {
|
||||||
|
"version": "27.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz",
|
||||||
|
"integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="
|
||||||
|
},
|
||||||
|
"@octokit/plugin-paginate-rest": {
|
||||||
|
"version": "14.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz",
|
||||||
|
"integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==",
|
||||||
|
"requires": {
|
||||||
|
"@octokit/types": "^16.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@octokit/plugin-rest-endpoint-methods": {
|
||||||
|
"version": "17.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz",
|
||||||
|
"integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==",
|
||||||
|
"requires": {
|
||||||
|
"@octokit/types": "^16.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@octokit/request": {
|
||||||
|
"version": "10.0.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz",
|
||||||
|
"integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==",
|
||||||
|
"requires": {
|
||||||
|
"@octokit/endpoint": "^11.0.2",
|
||||||
|
"@octokit/request-error": "^7.0.2",
|
||||||
|
"@octokit/types": "^16.0.0",
|
||||||
|
"fast-content-type-parse": "^3.0.0",
|
||||||
|
"universal-user-agent": "^7.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@octokit/request-error": {
|
||||||
|
"version": "7.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz",
|
||||||
|
"integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==",
|
||||||
|
"requires": {
|
||||||
|
"@octokit/types": "^16.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@octokit/types": {
|
||||||
|
"version": "16.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz",
|
||||||
|
"integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==",
|
||||||
|
"requires": {
|
||||||
|
"@octokit/openapi-types": "^27.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@opentelemetry/api": {
|
"@opentelemetry/api": {
|
||||||
"version": "1.4.1",
|
"version": "1.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz",
|
||||||
@@ -7223,6 +7475,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||||
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
|
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
|
||||||
},
|
},
|
||||||
|
"before-after-hook": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="
|
||||||
|
},
|
||||||
"brace-expansion": {
|
"brace-expansion": {
|
||||||
"version": "1.1.12",
|
"version": "1.1.12",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
||||||
@@ -7246,6 +7503,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz",
|
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz",
|
||||||
"integrity": "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==",
|
"integrity": "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"peer": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"caniuse-lite": "^1.0.30001733",
|
"caniuse-lite": "^1.0.30001733",
|
||||||
"electron-to-chromium": "^1.5.199",
|
"electron-to-chromium": "^1.5.199",
|
||||||
@@ -7623,6 +7881,11 @@
|
|||||||
"jest-util": "30.2.0"
|
"jest-util": "30.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"fast-content-type-parse": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg=="
|
||||||
|
},
|
||||||
"fast-json-stable-stringify": {
|
"fast-json-stable-stringify": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
|
||||||
@@ -7987,6 +8250,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz",
|
||||||
"integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==",
|
"integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"peer": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@jest/core": "30.2.0",
|
"@jest/core": "30.2.0",
|
||||||
"@jest/types": "30.2.0",
|
"@jest/types": "30.2.0",
|
||||||
@@ -9134,7 +9398,8 @@
|
|||||||
"version": "5.9.3",
|
"version": "5.9.3",
|
||||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
||||||
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"peer": true
|
||||||
},
|
},
|
||||||
"uglify-js": {
|
"uglify-js": {
|
||||||
"version": "3.19.3",
|
"version": "3.19.3",
|
||||||
@@ -9156,6 +9421,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
|
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
|
||||||
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="
|
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="
|
||||||
},
|
},
|
||||||
|
"universal-user-agent": {
|
||||||
|
"version": "7.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz",
|
||||||
|
"integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A=="
|
||||||
|
},
|
||||||
"unrs-resolver": {
|
"unrs-resolver": {
|
||||||
"version": "1.11.1",
|
"version": "1.11.1",
|
||||||
"resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
|
"resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
"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",
|
"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",
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
"act": "act pull_request -W .github/workflows/test.yml --container-architecture linux/amd64 -s GITHUB_TOKEN=\"$(gh auth token)\"",
|
"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-checksums.ts version-manifest.json",
|
"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"
|
"all": "npm run build && npm run check && npm run package && npm test"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -32,6 +32,9 @@
|
|||||||
"@actions/glob": "^0.5.0",
|
"@actions/glob": "^0.5.0",
|
||||||
"@actions/io": "^1.1.3",
|
"@actions/io": "^1.1.3",
|
||||||
"@actions/tool-cache": "^2.0.2",
|
"@actions/tool-cache": "^2.0.2",
|
||||||
|
"@octokit/core": "^7.0.6",
|
||||||
|
"@octokit/plugin-paginate-rest": "^14.0.0",
|
||||||
|
"@octokit/plugin-rest-endpoint-methods": "^17.0.0",
|
||||||
"@renovatebot/pep440": "^4.2.1",
|
"@renovatebot/pep440": "^4.2.1",
|
||||||
"smol-toml": "^1.4.2",
|
"smol-toml": "^1.4.2",
|
||||||
"undici": "5.28.5"
|
"undici": "5.28.5"
|
||||||
|
|||||||
@@ -11,36 +11,28 @@ export async function validateChecksum(
|
|||||||
arch: Architecture,
|
arch: Architecture,
|
||||||
platform: Platform,
|
platform: Platform,
|
||||||
version: string,
|
version: string,
|
||||||
ndjsonChecksum?: string,
|
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
// Priority: user-provided checksum > KNOWN_CHECKSUMS > NDJSON fallback
|
let isValid: boolean | undefined;
|
||||||
const key = `${arch}-${platform}-${version}`;
|
|
||||||
let checksumToUse: string | undefined;
|
|
||||||
let source: string;
|
|
||||||
|
|
||||||
if (checkSum !== undefined && checkSum !== "") {
|
if (checkSum !== undefined && checkSum !== "") {
|
||||||
checksumToUse = checkSum;
|
isValid = await validateFileCheckSum(downloadPath, checkSum);
|
||||||
source = "user-provided";
|
|
||||||
} else if (key in KNOWN_CHECKSUMS) {
|
|
||||||
checksumToUse = KNOWN_CHECKSUMS[key];
|
|
||||||
source = `known checksum for ${key}`;
|
|
||||||
} else if (ndjsonChecksum !== undefined && ndjsonChecksum !== "") {
|
|
||||||
checksumToUse = ndjsonChecksum;
|
|
||||||
source = "NDJSON version data";
|
|
||||||
} else {
|
} else {
|
||||||
core.debug(`No checksum found for ${key}.`);
|
core.debug("Checksum not provided. Checking known checksums.");
|
||||||
return;
|
const key = `${arch}-${platform}-${version}`;
|
||||||
|
if (key in KNOWN_CHECKSUMS) {
|
||||||
|
const knownChecksum = KNOWN_CHECKSUMS[`${arch}-${platform}-${version}`];
|
||||||
|
core.debug(`Checking checksum for ${arch}-${platform}-${version}.`);
|
||||||
|
isValid = await validateFileCheckSum(downloadPath, knownChecksum);
|
||||||
|
} else {
|
||||||
|
core.debug(`No known checksum found for ${key}.`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
core.debug(`Using ${source}.`);
|
if (isValid === false) {
|
||||||
const isValid = await validateFileCheckSum(downloadPath, checksumToUse);
|
throw new Error(`Checksum for ${downloadPath} did not match ${checkSum}.`);
|
||||||
|
}
|
||||||
if (!isValid) {
|
if (isValid === true) {
|
||||||
throw new Error(
|
core.debug(`Checksum for ${downloadPath} is valid.`);
|
||||||
`Checksum for ${downloadPath} did not match ${checksumToUse}.`,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
core.debug(`Checksum for ${downloadPath} is valid.`);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function validateFileCheckSum(
|
async function validateFileCheckSum(
|
||||||
|
|||||||
@@ -1,5 +1,183 @@
|
|||||||
// AUTOGENERATED_DO_NOT_EDIT
|
// AUTOGENERATED_DO_NOT_EDIT
|
||||||
export const KNOWN_CHECKSUMS: { [key: string]: string } = {
|
export const KNOWN_CHECKSUMS: { [key: string]: string } = {
|
||||||
|
"aarch64-apple-darwin-0.10.0":
|
||||||
|
"82d4b99dc6ea686695b5ee142ceba03dd3e3eda2b414e94215ab7bce94972fbb",
|
||||||
|
"aarch64-pc-windows-msvc-0.10.0":
|
||||||
|
"614dd3c409d7fb5a98b516d532c98db9b7799a23fb450150e3784338a9ebd903",
|
||||||
|
"aarch64-unknown-linux-gnu-0.10.0":
|
||||||
|
"c300afd5f2d31df039fe6a26a2d68a76b62832098c272a43e1e74ab9efd4fbd7",
|
||||||
|
"aarch64-unknown-linux-musl-0.10.0":
|
||||||
|
"edf1adb1d183730302f87eef9b71bc4e47b4b8058832c3393b0fbcd86f270510",
|
||||||
|
"arm-unknown-linux-musleabihf-0.10.0":
|
||||||
|
"fea6d45bce1e7172192b4a7d3feb9f37c4198c243be1c573c8dacae765a32c53",
|
||||||
|
"armv7-unknown-linux-gnueabihf-0.10.0":
|
||||||
|
"3e8ab76a515884c29c773e01360acb6da61a1351c630377b54ba58918d9673af",
|
||||||
|
"armv7-unknown-linux-musleabihf-0.10.0":
|
||||||
|
"85423cda078ed0313f993ddea6ac897e469885539ce156643ace982bbffb8109",
|
||||||
|
"i686-pc-windows-msvc-0.10.0":
|
||||||
|
"b71bca0987dd12ea09ac6a0e52fdfa89f53601b6074be38366d0592b181f3001",
|
||||||
|
"i686-unknown-linux-gnu-0.10.0":
|
||||||
|
"dbac897653b0d60fb863288587dbacb30140f9725a42718f2c017df7b2d2b3c3",
|
||||||
|
"i686-unknown-linux-musl-0.10.0":
|
||||||
|
"56a211155275dd33731cbbb33aa915d3e7efa59d4436502edaca39ba436c157a",
|
||||||
|
"powerpc64le-unknown-linux-gnu-0.10.0":
|
||||||
|
"677a414608c61e2ecd751364dae9209cc5b76019481968b99b5d5ad7258d2d77",
|
||||||
|
"riscv64gc-unknown-linux-gnu-0.10.0":
|
||||||
|
"9da4019ecfd3440a5d0a0a957d8d5e4c6534ac1e3a10636d55266a22ab4135f8",
|
||||||
|
"s390x-unknown-linux-gnu-0.10.0":
|
||||||
|
"a1b9aa45c1a6b69066179e8d7e3f6e122e0f433ef2ad4e91c0acd1433a083c31",
|
||||||
|
"x86_64-apple-darwin-0.10.0":
|
||||||
|
"664aed584c276f8d79cdc3b7685cd48f5d64657bd6840b06b4b2b0db731b9c99",
|
||||||
|
"x86_64-pc-windows-msvc-0.10.0":
|
||||||
|
"4037b444541f695cd2eb93188a9346de3e334af562381411deade0a31c7bf898",
|
||||||
|
"x86_64-unknown-linux-gnu-0.10.0":
|
||||||
|
"230e328948c92dd1ebad83949c4d56e83813dfe9c6362a4c519e6a227973f1ae",
|
||||||
|
"x86_64-unknown-linux-musl-0.10.0":
|
||||||
|
"312d37f31b6f2c3bfc65668ba0efea9f1f9eaf7bc3209fe1a109e5cf861b95fa",
|
||||||
|
"aarch64-apple-darwin-0.9.30":
|
||||||
|
"03a5d9ec7f7d588446b2ec226d13ff6300055e55365eca8f3fab39f342b0e805",
|
||||||
|
"aarch64-pc-windows-msvc-0.9.30":
|
||||||
|
"cfbc40baf1da11c55eff92ee008f5af3cdbb4c24c40ddb0bbd489b983fadf43f",
|
||||||
|
"aarch64-unknown-linux-gnu-0.9.30":
|
||||||
|
"6aadf3c71600d594e16dabf382cc15282ead4c5ca768599b6bcb43c5004d9aa8",
|
||||||
|
"aarch64-unknown-linux-musl-0.9.30":
|
||||||
|
"b658b56957bceea742ca14f3ef28fb3542adbcedfb8bd5bd718ae255394ccd09",
|
||||||
|
"arm-unknown-linux-musleabihf-0.9.30":
|
||||||
|
"5a7f4cd306363b734dba2d86eb760812cb1211254d36ace01860f9e783df1900",
|
||||||
|
"armv7-unknown-linux-gnueabihf-0.9.30":
|
||||||
|
"bf8d9c2f1b4d0eee9bfb689b5483b1bd4b0b76acbeaaa4d0d68b132574c606ff",
|
||||||
|
"armv7-unknown-linux-musleabihf-0.9.30":
|
||||||
|
"8715a9da643d9e6cb984c2d3e00480849f93f11251d1474cd382cc9d7faeab84",
|
||||||
|
"i686-pc-windows-msvc-0.9.30":
|
||||||
|
"218b7ec0d052836d7ee395d5e0592e5dac7578fd618f439a5d09c1ad36466399",
|
||||||
|
"i686-unknown-linux-gnu-0.9.30":
|
||||||
|
"1bab147179887ebcb5c31e016e9ac9987f687e79f92fd2f0ff9bcedf927b8228",
|
||||||
|
"i686-unknown-linux-musl-0.9.30":
|
||||||
|
"14d8b2e2caa0b470418e551e027f3a8283aa8d09eae79206e7dbcd23a8ffa027",
|
||||||
|
"powerpc64-unknown-linux-gnu-0.9.30":
|
||||||
|
"ac4cd1a021462885932f6023b005a4835cca4c72bb60dec186ee2be4b60dca6f",
|
||||||
|
"powerpc64le-unknown-linux-gnu-0.9.30":
|
||||||
|
"73b8cbc560c6b2fa205358365d4e174abdf50cfcf57dc36a447572c56eba5ae4",
|
||||||
|
"riscv64gc-unknown-linux-gnu-0.9.30":
|
||||||
|
"5e0453d9252aab874a3658a039d4ffdde79dba4096974fcdc945498697dc81cf",
|
||||||
|
"s390x-unknown-linux-gnu-0.9.30":
|
||||||
|
"b35975bb9e5c2c418b428d0316cc6e3c7a6eff710c69212be14005c192f54516",
|
||||||
|
"x86_64-apple-darwin-0.9.30":
|
||||||
|
"ce069bf750567e9a4a31d6e285d1eae75d444d8a281409b641235903943b7681",
|
||||||
|
"x86_64-pc-windows-msvc-0.9.30":
|
||||||
|
"875981be7908295937dee09532bb66d576986d4f223259e171b0c767c885897a",
|
||||||
|
"x86_64-unknown-linux-gnu-0.9.30":
|
||||||
|
"8b3762374972daa7a74bbc6896cc73229ca69a07403dd9f9ea3805a51ffd7582",
|
||||||
|
"x86_64-unknown-linux-musl-0.9.30":
|
||||||
|
"1caf8fe092e2005dd4c134ba515c1aa3eea3d3c143f8a1903bcb58fcdf169365",
|
||||||
|
"aarch64-apple-darwin-0.9.29":
|
||||||
|
"0729ddd5c02df33669b03627aa5d9ac7cde4421657f808d54585e3cda944bb55",
|
||||||
|
"aarch64-pc-windows-msvc-0.9.29":
|
||||||
|
"39f7dce0d2993cd18d67980c012945ea678a99aef199f7afcea522b5bd70ecf7",
|
||||||
|
"aarch64-unknown-linux-gnu-0.9.29":
|
||||||
|
"935b35542b7e25493a551dcb3487af23b72ad284ee8ac6a488a97d02ce2d84ec",
|
||||||
|
"aarch64-unknown-linux-musl-0.9.29":
|
||||||
|
"b1edc94f5d6c36bb28a20f8c8afb400e55a428fcf396b03bf78cb7394f75077c",
|
||||||
|
"arm-unknown-linux-musleabihf-0.9.29":
|
||||||
|
"c72ae74c04668d4cf3143fb11ad5bbd1c9e9a80aaa439cb3e43208c127249202",
|
||||||
|
"armv7-unknown-linux-gnueabihf-0.9.29":
|
||||||
|
"e263645c9ab44e3f7e732b0317da775082f077bb86933be662395eeab97fb3d2",
|
||||||
|
"armv7-unknown-linux-musleabihf-0.9.29":
|
||||||
|
"98ab47dcb345d746b230a359d72a96444b1be21cf24026c653d5c7848c680beb",
|
||||||
|
"i686-pc-windows-msvc-0.9.29":
|
||||||
|
"049a929882a3f4a2d054c9dc44848d2c24175079696e131a57d60d9ab62df81a",
|
||||||
|
"i686-unknown-linux-gnu-0.9.29":
|
||||||
|
"9415828fc2fdacadb56263382a27da6661a89a4bb3a6683d6d864d5c013b7c6a",
|
||||||
|
"i686-unknown-linux-musl-0.9.29":
|
||||||
|
"3ac91c9cccc85c07c0950afc4f45b3e14f2a3e9484f4940366ebab72e71fa8dc",
|
||||||
|
"powerpc64-unknown-linux-gnu-0.9.29":
|
||||||
|
"7feb1fb35fe66b4f83d3bc7776810f708c6609c9be48ceed6ec024b15733101d",
|
||||||
|
"powerpc64le-unknown-linux-gnu-0.9.29":
|
||||||
|
"1f4e1f859868abcf3557afe78b8b7525a938921af745945deef737927a017d82",
|
||||||
|
"riscv64gc-unknown-linux-gnu-0.9.29":
|
||||||
|
"18dc2d3b513c4bfe0fc4b3a67a80f62ce32077f84db343a1f0eb8003ab276732",
|
||||||
|
"s390x-unknown-linux-gnu-0.9.29":
|
||||||
|
"10e6d5dcd72bf99daee6678f6b508d1056e9f1670f6d76c1cfdf02b7560bcb4a",
|
||||||
|
"x86_64-apple-darwin-0.9.29":
|
||||||
|
"d251e48db2a962272a2efeb2771c82c02e40f473193a255e8e5c05eb61112139",
|
||||||
|
"x86_64-pc-windows-msvc-0.9.29":
|
||||||
|
"9825b1a5955d8a432b664e56660641aac8886ed30cd9c59a94aacc68ae9116ce",
|
||||||
|
"x86_64-unknown-linux-gnu-0.9.29":
|
||||||
|
"1ce5212f8f42dc7427a1bd3db4168d6d1abcf81b38d8c82a5b9d0ddc54ceebfc",
|
||||||
|
"x86_64-unknown-linux-musl-0.9.29":
|
||||||
|
"44c93c73e8870e003bda17ab50d433e27d201d0cb28d2bb75351ef1497ffa9db",
|
||||||
|
"aarch64-apple-darwin-0.9.28":
|
||||||
|
"12163fe09eb292d3ad1ea0f132a84485c902e2ff360d57562bf676e6615fcba0",
|
||||||
|
"aarch64-pc-windows-msvc-0.9.28":
|
||||||
|
"081703fa19ae05a49f486f97468f7792e1cdacda403a091b151af7f5bd6f4595",
|
||||||
|
"aarch64-unknown-linux-gnu-0.9.28":
|
||||||
|
"382c342735ff29f8ba4574d88e39bca798bcbac50bff6742710ca9cd8143e7d2",
|
||||||
|
"aarch64-unknown-linux-musl-0.9.28":
|
||||||
|
"eec3249254efac972d2555ff858f8ed20f05b40fbb38ac83b15cf0a2ccc86749",
|
||||||
|
"arm-unknown-linux-musleabihf-0.9.28":
|
||||||
|
"d0df2a9e7db464a567038bd560dc5007e488542c073989334a4a293b8957e1e1",
|
||||||
|
"armv7-unknown-linux-gnueabihf-0.9.28":
|
||||||
|
"6ddf1979609a3f5bdf897965ed6984dacce860ce57c579596bdc4b514c19320b",
|
||||||
|
"armv7-unknown-linux-musleabihf-0.9.28":
|
||||||
|
"e391ba4cc05a3a1096f1ab6cd82fcbed059d048a6ba108b4cb18da311a07c4d5",
|
||||||
|
"i686-pc-windows-msvc-0.9.28":
|
||||||
|
"fb5015efd0db178268312a7a7dcde7b0d3b7d7e0eccd0372a4b6f1dcfc075472",
|
||||||
|
"i686-unknown-linux-gnu-0.9.28":
|
||||||
|
"c0d34d92cb11925530fbc313de7536da3e1d097a442f54668417d241697fb3a2",
|
||||||
|
"i686-unknown-linux-musl-0.9.28":
|
||||||
|
"be1ad4f30d97c95af5105405fc38329d66375cde3de18cd0f9fe73b4581155c7",
|
||||||
|
"powerpc64-unknown-linux-gnu-0.9.28":
|
||||||
|
"6f23bfca0febb001792e7124d0c2ba41ddcfe01d6c030f4a8668ed634a5a582b",
|
||||||
|
"powerpc64le-unknown-linux-gnu-0.9.28":
|
||||||
|
"894ac114f076cffbf041e55e1ad0df759f7bc9dba1291158690781baad38001e",
|
||||||
|
"riscv64gc-unknown-linux-gnu-0.9.28":
|
||||||
|
"e61fa014a0b77acd17f9f366a55cbc0e67b377c4eff13629021a4242cc71eabb",
|
||||||
|
"s390x-unknown-linux-gnu-0.9.28":
|
||||||
|
"af15dc54893b2caecc3604ac68104914b155a8bbf821f667996549e777919a90",
|
||||||
|
"x86_64-apple-darwin-0.9.28":
|
||||||
|
"3a8030881d13b824e5168f5e4d060e715e40753249766bda3d52d6771d93b169",
|
||||||
|
"x86_64-pc-windows-msvc-0.9.28":
|
||||||
|
"9cb567fcd92f31431220ce620787043b946c30b9bb46ca213780e5ef471453be",
|
||||||
|
"x86_64-unknown-linux-gnu-0.9.28":
|
||||||
|
"66ad1822dd9cf96694b95c24f25bc05cff417a65351464da01682a91796d1f2b",
|
||||||
|
"x86_64-unknown-linux-musl-0.9.28":
|
||||||
|
"83cd032167b6b97ac94830608efe11159b3d485654e39fdb0bf84718ef236afe",
|
||||||
|
"aarch64-apple-darwin-0.9.27":
|
||||||
|
"1359538ed8664d172692cf4719ee0933a4a3bfb22fc91b0be1e19e7bdd8f5ef3",
|
||||||
|
"aarch64-pc-windows-msvc-0.9.27":
|
||||||
|
"b448ab228f5d1165b8497e8ca10346af6f652eb8ad4e75e47fa55e8cdb5b60d7",
|
||||||
|
"aarch64-unknown-linux-gnu-0.9.27":
|
||||||
|
"a58b3b77a25620ae15ff3587049b755c7cbf3eaa7df187620b3e6c3dbf71daa0",
|
||||||
|
"aarch64-unknown-linux-musl-0.9.27":
|
||||||
|
"f80e97e1154a06e42143a173831289336ca9e34a67096ab070346958153e8e52",
|
||||||
|
"arm-unknown-linux-musleabihf-0.9.27":
|
||||||
|
"b80f4db9254b9ddec4b576190bdf15723e948f37f648d9b273be2e153d05f820",
|
||||||
|
"armv7-unknown-linux-gnueabihf-0.9.27":
|
||||||
|
"03b45c99ca940739c2a093f6a514da3dd858b3bc1e8c957c16c1832e30b30c28",
|
||||||
|
"armv7-unknown-linux-musleabihf-0.9.27":
|
||||||
|
"da43ee6e2f17b4646e35e2d55ce6a021fdf47c06601a6ae8b827de7bb7b3b02f",
|
||||||
|
"i686-pc-windows-msvc-0.9.27":
|
||||||
|
"f47831a97b8a1bc7c7211905c1e517cc2f4ef84df877f2a283c49609275db0fa",
|
||||||
|
"i686-unknown-linux-gnu-0.9.27":
|
||||||
|
"fdf3067e0c05d39b849ad48fbbc2b58919f70a686a40506c643d32688ceba1a9",
|
||||||
|
"i686-unknown-linux-musl-0.9.27":
|
||||||
|
"3c1f8c2b148ebf884311558aaff32b9fb5b68fe4f4242e3e3765381bb594386a",
|
||||||
|
"powerpc64-unknown-linux-gnu-0.9.27":
|
||||||
|
"c3cbda5118b06f2261d32f4802adfdc71f618f808df0c6a3184695a6ffecb88a",
|
||||||
|
"powerpc64le-unknown-linux-gnu-0.9.27":
|
||||||
|
"9011f6085cee3921c9fce82ce03041ca97aacc8cab86b7a5791faa71fa5f2712",
|
||||||
|
"riscv64gc-unknown-linux-gnu-0.9.27":
|
||||||
|
"7193628620c2c50c2d6632ea8e53a4ab5313f7e8003ddedd9e999f48b6d2c222",
|
||||||
|
"s390x-unknown-linux-gnu-0.9.27":
|
||||||
|
"5b055f02f2c8e5086ae1d05cf70d32d66982d27d8469ed896a65067fac2001d2",
|
||||||
|
"x86_64-apple-darwin-0.9.27":
|
||||||
|
"3977309c5c79984c13c55d2d1cd7aa114a718eb29436c5bdb4bdfa08bf243438",
|
||||||
|
"x86_64-pc-windows-msvc-0.9.27":
|
||||||
|
"c3bf465d5f2b93c836f369aec9f3fa8350843f24abd5f710bb74e72440b82898",
|
||||||
|
"x86_64-unknown-linux-gnu-0.9.27":
|
||||||
|
"8636e693ea0e05f5f4294b161f816c4d8df065267fdb0405cfb84c8e326991fa",
|
||||||
|
"x86_64-unknown-linux-musl-0.9.27":
|
||||||
|
"9f269bfb9c2e80808c373902af6a4af6cd5f4b4668b28c44aa09639cfed925c5",
|
||||||
"aarch64-apple-darwin-0.9.26":
|
"aarch64-apple-darwin-0.9.26":
|
||||||
"fcf0a9ea6599c6ae28a4c854ac6da76f2c889354d7c36ce136ef071f7ab9721f",
|
"fcf0a9ea6599c6ae28a4c854ac6da76f2c889354d7c36ce136ef071f7ab9721f",
|
||||||
"aarch64-pc-windows-msvc-0.9.26":
|
"aarch64-pc-windows-msvc-0.9.26":
|
||||||
|
|||||||
@@ -1,13 +1,9 @@
|
|||||||
import { promises as fs } from "node:fs";
|
import { promises as fs } from "node:fs";
|
||||||
|
import * as tc from "@actions/tool-cache";
|
||||||
export interface ChecksumEntry {
|
import { KNOWN_CHECKSUMS } from "./known-checksums";
|
||||||
key: string;
|
|
||||||
checksum: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function updateChecksums(
|
export async function updateChecksums(
|
||||||
filePath: string,
|
filePath: string,
|
||||||
checksumEntries: ChecksumEntry[],
|
downloadUrls: string[],
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
await fs.rm(filePath);
|
await fs.rm(filePath);
|
||||||
await fs.appendFile(
|
await fs.appendFile(
|
||||||
@@ -15,12 +11,49 @@ export async function updateChecksums(
|
|||||||
"// AUTOGENERATED_DO_NOT_EDIT\nexport const KNOWN_CHECKSUMS: { [key: string]: string } = {\n",
|
"// AUTOGENERATED_DO_NOT_EDIT\nexport const KNOWN_CHECKSUMS: { [key: string]: string } = {\n",
|
||||||
);
|
);
|
||||||
let firstLine = true;
|
let firstLine = true;
|
||||||
for (const entry of checksumEntries) {
|
for (const downloadUrl of downloadUrls) {
|
||||||
|
const key = getKey(downloadUrl);
|
||||||
|
if (key === undefined) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const checksum = await getOrDownloadChecksum(key, downloadUrl);
|
||||||
if (!firstLine) {
|
if (!firstLine) {
|
||||||
await fs.appendFile(filePath, ",\n");
|
await fs.appendFile(filePath, ",\n");
|
||||||
}
|
}
|
||||||
await fs.appendFile(filePath, ` "${entry.key}":\n "${entry.checksum}"`);
|
await fs.appendFile(filePath, ` "${key}":\n "${checksum}"`);
|
||||||
firstLine = false;
|
firstLine = false;
|
||||||
}
|
}
|
||||||
await fs.appendFile(filePath, ",\n};\n");
|
await fs.appendFile(filePath, ",\n};\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getKey(downloadUrl: string): string | undefined {
|
||||||
|
// https://github.com/astral-sh/uv/releases/download/0.3.2/uv-aarch64-apple-darwin.tar.gz.sha256
|
||||||
|
const parts = downloadUrl.split("/");
|
||||||
|
const fileName = parts[parts.length - 1];
|
||||||
|
if (fileName.startsWith("source")) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
const name = fileName.split(".")[0].split("uv-")[1];
|
||||||
|
const version = parts[parts.length - 2];
|
||||||
|
return `${name}-${version}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getOrDownloadChecksum(
|
||||||
|
key: string,
|
||||||
|
downloadUrl: string,
|
||||||
|
): Promise<string> {
|
||||||
|
let checksum = "";
|
||||||
|
if (key in KNOWN_CHECKSUMS) {
|
||||||
|
checksum = KNOWN_CHECKSUMS[key];
|
||||||
|
} else {
|
||||||
|
const content = await downloadAssetContent(downloadUrl);
|
||||||
|
checksum = content.split(" ")[0].trim();
|
||||||
|
}
|
||||||
|
return checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function downloadAssetContent(downloadUrl: string): Promise<string> {
|
||||||
|
const downloadPath = await tc.downloadTool(downloadUrl);
|
||||||
|
const content = await fs.readFile(downloadPath, "utf8");
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,20 +2,20 @@ import { promises as fs } from "node:fs";
|
|||||||
import * as path from "node:path";
|
import * as path from "node:path";
|
||||||
import * as core from "@actions/core";
|
import * as core from "@actions/core";
|
||||||
import * as tc from "@actions/tool-cache";
|
import * as tc from "@actions/tool-cache";
|
||||||
|
import type { Endpoints } from "@octokit/types";
|
||||||
import * as pep440 from "@renovatebot/pep440";
|
import * as pep440 from "@renovatebot/pep440";
|
||||||
import * as semver from "semver";
|
import * as semver from "semver";
|
||||||
import { OWNER, REPO, TOOL_CACHE_NAME } from "../utils/constants";
|
import { OWNER, REPO, TOOL_CACHE_NAME } from "../utils/constants";
|
||||||
|
import { Octokit } from "../utils/octokit";
|
||||||
import type { Architecture, Platform } from "../utils/platforms";
|
import type { Architecture, Platform } from "../utils/platforms";
|
||||||
import { validateChecksum } from "./checksum/checksum";
|
import { validateChecksum } from "./checksum/checksum";
|
||||||
import {
|
import {
|
||||||
|
getDownloadUrl,
|
||||||
getLatestKnownVersion as getLatestVersionInManifest,
|
getLatestKnownVersion as getLatestVersionInManifest,
|
||||||
getDownloadUrl as getManifestDownloadUrl,
|
|
||||||
} from "./version-manifest";
|
} from "./version-manifest";
|
||||||
import {
|
|
||||||
getAllVersions,
|
type Release =
|
||||||
getArtifact,
|
Endpoints["GET /repos/{owner}/{repo}/releases"]["response"]["data"][number];
|
||||||
getLatestVersion as getLatestVersionFromNdjson,
|
|
||||||
} from "./versions-client";
|
|
||||||
|
|
||||||
export function tryGetFromToolCache(
|
export function tryGetFromToolCache(
|
||||||
arch: Architecture,
|
arch: Architecture,
|
||||||
@@ -32,7 +32,7 @@ export function tryGetFromToolCache(
|
|||||||
return { installedPath, version: resolvedVersion };
|
return { installedPath, version: resolvedVersion };
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function downloadVersionFromNdjson(
|
export async function downloadVersionFromGithub(
|
||||||
platform: Platform,
|
platform: Platform,
|
||||||
arch: Architecture,
|
arch: Architecture,
|
||||||
version: string,
|
version: string,
|
||||||
@@ -41,14 +41,7 @@ export async function downloadVersionFromNdjson(
|
|||||||
): Promise<{ version: string; cachedToolDir: string }> {
|
): Promise<{ version: string; cachedToolDir: string }> {
|
||||||
const artifact = `uv-${arch}-${platform}`;
|
const artifact = `uv-${arch}-${platform}`;
|
||||||
const extension = getExtension(platform);
|
const extension = getExtension(platform);
|
||||||
|
const downloadUrl = `https://github.com/${OWNER}/${REPO}/releases/download/${version}/${artifact}${extension}`;
|
||||||
// Get artifact info from NDJSON (includes URL and checksum)
|
|
||||||
const artifactInfo = await getArtifact(version, arch, platform);
|
|
||||||
|
|
||||||
const downloadUrl =
|
|
||||||
artifactInfo?.url ??
|
|
||||||
`https://github.com/${OWNER}/${REPO}/releases/download/${version}/${artifact}${extension}`;
|
|
||||||
|
|
||||||
return await downloadVersion(
|
return await downloadVersion(
|
||||||
downloadUrl,
|
downloadUrl,
|
||||||
artifact,
|
artifact,
|
||||||
@@ -57,30 +50,35 @@ export async function downloadVersionFromNdjson(
|
|||||||
version,
|
version,
|
||||||
checkSum,
|
checkSum,
|
||||||
githubToken,
|
githubToken,
|
||||||
artifactInfo?.sha256,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function downloadVersionFromManifest(
|
export async function downloadVersionFromManifest(
|
||||||
manifestUrl: string,
|
manifestUrl: string | undefined,
|
||||||
platform: Platform,
|
platform: Platform,
|
||||||
arch: Architecture,
|
arch: Architecture,
|
||||||
version: string,
|
version: string,
|
||||||
checkSum: string | undefined,
|
checkSum: string | undefined,
|
||||||
githubToken: string,
|
githubToken: string,
|
||||||
): Promise<{ version: string; cachedToolDir: string }> {
|
): Promise<{ version: string; cachedToolDir: string }> {
|
||||||
const downloadUrl = await getManifestDownloadUrl(
|
const downloadUrl = await getDownloadUrl(
|
||||||
manifestUrl,
|
manifestUrl,
|
||||||
version,
|
version,
|
||||||
arch,
|
arch,
|
||||||
platform,
|
platform,
|
||||||
);
|
);
|
||||||
if (!downloadUrl) {
|
if (!downloadUrl) {
|
||||||
throw new Error(
|
core.info(
|
||||||
`manifest-file does not contain version ${version}, arch ${arch}, platform ${platform}.`,
|
`manifest-file does not contain version ${version}, arch ${arch}, platform ${platform}. Falling back to GitHub releases.`,
|
||||||
|
);
|
||||||
|
return await downloadVersionFromGithub(
|
||||||
|
platform,
|
||||||
|
arch,
|
||||||
|
version,
|
||||||
|
checkSum,
|
||||||
|
githubToken,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return await downloadVersion(
|
return await downloadVersion(
|
||||||
downloadUrl,
|
downloadUrl,
|
||||||
`uv-${arch}-${platform}`,
|
`uv-${arch}-${platform}`,
|
||||||
@@ -89,7 +87,6 @@ export async function downloadVersionFromManifest(
|
|||||||
version,
|
version,
|
||||||
checkSum,
|
checkSum,
|
||||||
githubToken,
|
githubToken,
|
||||||
undefined, // No NDJSON checksum for manifest downloads
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,7 +98,6 @@ async function downloadVersion(
|
|||||||
version: string,
|
version: string,
|
||||||
checkSum: string | undefined,
|
checkSum: string | undefined,
|
||||||
githubToken: string,
|
githubToken: string,
|
||||||
ndjsonChecksum?: string,
|
|
||||||
): Promise<{ version: string; cachedToolDir: string }> {
|
): Promise<{ version: string; cachedToolDir: string }> {
|
||||||
core.info(`Downloading uv from "${downloadUrl}" ...`);
|
core.info(`Downloading uv from "${downloadUrl}" ...`);
|
||||||
const downloadPath = await tc.downloadTool(
|
const downloadPath = await tc.downloadTool(
|
||||||
@@ -109,14 +105,7 @@ async function downloadVersion(
|
|||||||
undefined,
|
undefined,
|
||||||
githubToken,
|
githubToken,
|
||||||
);
|
);
|
||||||
await validateChecksum(
|
await validateChecksum(checkSum, downloadPath, arch, platform, version);
|
||||||
checkSum,
|
|
||||||
downloadPath,
|
|
||||||
arch,
|
|
||||||
platform,
|
|
||||||
version,
|
|
||||||
ndjsonChecksum,
|
|
||||||
);
|
|
||||||
|
|
||||||
let uvDir: string;
|
let uvDir: string;
|
||||||
if (platform === "pc-windows-msvc") {
|
if (platform === "pc-windows-msvc") {
|
||||||
@@ -154,6 +143,7 @@ function getExtension(platform: Platform): string {
|
|||||||
export async function resolveVersion(
|
export async function resolveVersion(
|
||||||
versionInput: string,
|
versionInput: string,
|
||||||
manifestFile: string | undefined,
|
manifestFile: string | undefined,
|
||||||
|
githubToken: string,
|
||||||
resolutionStrategy: "highest" | "lowest" = "highest",
|
resolutionStrategy: "highest" | "lowest" = "highest",
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
core.debug(`Resolving version: ${versionInput}`);
|
core.debug(`Resolving version: ${versionInput}`);
|
||||||
@@ -173,7 +163,7 @@ export async function resolveVersion(
|
|||||||
} else {
|
} else {
|
||||||
version =
|
version =
|
||||||
versionInput === "latest" || resolveVersionSpecifierToLatest
|
versionInput === "latest" || resolveVersionSpecifierToLatest
|
||||||
? await getLatestVersionFromNdjson()
|
? await getLatestVersion(githubToken)
|
||||||
: versionInput;
|
: versionInput;
|
||||||
}
|
}
|
||||||
if (tc.isExplicitVersion(version)) {
|
if (tc.isExplicitVersion(version)) {
|
||||||
@@ -185,7 +175,7 @@ export async function resolveVersion(
|
|||||||
}
|
}
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
const availableVersions = await getAvailableVersions();
|
const availableVersions = await getAvailableVersions(githubToken);
|
||||||
core.debug(`Available versions: ${availableVersions}`);
|
core.debug(`Available versions: ${availableVersions}`);
|
||||||
const resolvedVersion =
|
const resolvedVersion =
|
||||||
resolutionStrategy === "lowest"
|
resolutionStrategy === "lowest"
|
||||||
@@ -197,9 +187,79 @@ export async function resolveVersion(
|
|||||||
return resolvedVersion;
|
return resolvedVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getAvailableVersions(): Promise<string[]> {
|
async function getAvailableVersions(githubToken: string): Promise<string[]> {
|
||||||
core.info("Getting available versions from NDJSON...");
|
core.info("Getting available versions from GitHub API...");
|
||||||
return await getAllVersions();
|
try {
|
||||||
|
const octokit = new Octokit({
|
||||||
|
auth: githubToken,
|
||||||
|
});
|
||||||
|
return await getReleaseTagNames(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();
|
||||||
|
return await getReleaseTagNames(octokit);
|
||||||
|
}
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getReleaseTagNames(octokit: Octokit): Promise<string[]> {
|
||||||
|
const response: Release[] = await octokit.paginate(
|
||||||
|
octokit.rest.repos.listReleases,
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getLatestVersion(githubToken: string) {
|
||||||
|
core.info("Getting latest version from GitHub API...");
|
||||||
|
const octokit = new Octokit({
|
||||||
|
auth: githubToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
let latestRelease: { tag_name: string } | undefined;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!latestRelease) {
|
||||||
|
throw new Error("Could not determine latest release.");
|
||||||
|
}
|
||||||
|
core.debug(`Latest version: ${latestRelease.tag_name}`);
|
||||||
|
return latestRelease.tag_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getLatestRelease(octokit: Octokit) {
|
||||||
|
const { data: latestRelease } = await octokit.rest.repos.getLatestRelease({
|
||||||
|
owner: OWNER,
|
||||||
|
repo: REPO,
|
||||||
|
});
|
||||||
|
return latestRelease;
|
||||||
}
|
}
|
||||||
|
|
||||||
function maxSatisfying(
|
function maxSatisfying(
|
||||||
|
|||||||
@@ -1,113 +0,0 @@
|
|||||||
import * as core from "@actions/core";
|
|
||||||
import { VERSIONS_NDJSON_URL } from "../utils/constants";
|
|
||||||
import { fetch } from "../utils/fetch";
|
|
||||||
|
|
||||||
export interface NdjsonArtifact {
|
|
||||||
platform: string;
|
|
||||||
variant: string;
|
|
||||||
url: string;
|
|
||||||
archive_format: string;
|
|
||||||
sha256: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface NdjsonVersion {
|
|
||||||
version: string;
|
|
||||||
artifacts: NdjsonArtifact[];
|
|
||||||
}
|
|
||||||
|
|
||||||
let cachedVersionData: NdjsonVersion[] | null = null;
|
|
||||||
|
|
||||||
export async function fetchVersionData(): Promise<NdjsonVersion[]> {
|
|
||||||
if (cachedVersionData !== null) {
|
|
||||||
core.debug("Using cached NDJSON version data");
|
|
||||||
return cachedVersionData;
|
|
||||||
}
|
|
||||||
|
|
||||||
core.info(`Fetching version data from ${VERSIONS_NDJSON_URL}...`);
|
|
||||||
const response = await fetch(VERSIONS_NDJSON_URL, {});
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error(
|
|
||||||
`Failed to fetch version data: ${response.status} ${response.statusText}`,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const body = await response.text();
|
|
||||||
const versions: NdjsonVersion[] = [];
|
|
||||||
|
|
||||||
for (const line of body.split("\n")) {
|
|
||||||
const trimmed = line.trim();
|
|
||||||
if (trimmed === "") {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
const version = JSON.parse(trimmed) as NdjsonVersion;
|
|
||||||
versions.push(version);
|
|
||||||
} catch {
|
|
||||||
core.debug(`Failed to parse NDJSON line: ${trimmed}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (versions.length === 0) {
|
|
||||||
throw new Error("No version data found in NDJSON file");
|
|
||||||
}
|
|
||||||
|
|
||||||
cachedVersionData = versions;
|
|
||||||
return versions;
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function getLatestVersion(): Promise<string> {
|
|
||||||
const versions = await fetchVersionData();
|
|
||||||
// The NDJSON file lists versions in order, newest first
|
|
||||||
const latestVersion = versions[0]?.version;
|
|
||||||
if (!latestVersion) {
|
|
||||||
throw new Error("No versions found in NDJSON data");
|
|
||||||
}
|
|
||||||
core.debug(`Latest version from NDJSON: ${latestVersion}`);
|
|
||||||
return latestVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function getAllVersions(): Promise<string[]> {
|
|
||||||
const versions = await fetchVersionData();
|
|
||||||
return versions.map((v) => v.version);
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ArtifactResult {
|
|
||||||
url: string;
|
|
||||||
sha256: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function getArtifact(
|
|
||||||
version: string,
|
|
||||||
arch: string,
|
|
||||||
platform: string,
|
|
||||||
): Promise<ArtifactResult | undefined> {
|
|
||||||
const versions = await fetchVersionData();
|
|
||||||
const versionData = versions.find((v) => v.version === version);
|
|
||||||
if (!versionData) {
|
|
||||||
core.debug(`Version ${version} not found in NDJSON data`);
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The NDJSON artifact platform format is like "x86_64-apple-darwin"
|
|
||||||
// We need to match against arch-platform
|
|
||||||
const targetPlatform = `${arch}-${platform}`;
|
|
||||||
const artifact = versionData.artifacts.find(
|
|
||||||
(a) => a.platform === targetPlatform,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!artifact) {
|
|
||||||
core.debug(
|
|
||||||
`Artifact for ${targetPlatform} not found in version ${version}. Available platforms: ${versionData.artifacts.map((a) => a.platform).join(", ")}`,
|
|
||||||
);
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
sha256: artifact.sha256,
|
|
||||||
url: artifact.url,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export function clearCache(): void {
|
|
||||||
cachedVersionData = null;
|
|
||||||
}
|
|
||||||
@@ -59,23 +59,40 @@ async function saveCache(): Promise<void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const actualCachePath = getUvCachePath();
|
const actualCachePath = getUvCachePath();
|
||||||
await saveCacheToKey(
|
if (!fs.existsSync(actualCachePath)) {
|
||||||
cacheKey,
|
if (ignoreNothingToCache) {
|
||||||
actualCachePath,
|
core.info(
|
||||||
STATE_CACHE_MATCHED_KEY,
|
"No cacheable uv cache paths were found. Ignoring because ignore-nothing-to-cache is enabled.",
|
||||||
"uv cache",
|
);
|
||||||
`Cache path ${actualCachePath} does not exist on disk. This likely indicates that there are no dependencies to cache. Consider disabling the cache input if it is not needed.`,
|
} else {
|
||||||
);
|
throw new Error(
|
||||||
|
`Cache path ${actualCachePath} does not exist on disk. This likely indicates that there are no dependencies to cache. Consider disabling the cache input if it is not needed.`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
await saveCacheToKey(
|
||||||
|
cacheKey,
|
||||||
|
actualCachePath,
|
||||||
|
STATE_CACHE_MATCHED_KEY,
|
||||||
|
"uv cache",
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cachePython) {
|
if (cachePython) {
|
||||||
|
if (!fs.existsSync(pythonDir)) {
|
||||||
|
core.warning(
|
||||||
|
`Python cache path ${pythonDir} does not exist on disk. Skipping Python cache save because no managed Python installation was found. If you want uv to install managed Python instead of using a system interpreter, set UV_PYTHON_PREFERENCE=only-managed.`,
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const pythonCacheKey = `${cacheKey}-python`;
|
const pythonCacheKey = `${cacheKey}-python`;
|
||||||
await saveCacheToKey(
|
await saveCacheToKey(
|
||||||
pythonCacheKey,
|
pythonCacheKey,
|
||||||
pythonDir,
|
pythonDir,
|
||||||
STATE_PYTHON_CACHE_MATCHED_KEY,
|
STATE_PYTHON_CACHE_MATCHED_KEY,
|
||||||
"Python cache",
|
"Python cache",
|
||||||
`Python cache path ${pythonDir} does not exist on disk. This likely indicates that there are no Python installations to cache. Consider disabling the cache input if it is not needed.`,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -119,7 +136,6 @@ async function saveCacheToKey(
|
|||||||
cachePath: string,
|
cachePath: string,
|
||||||
stateKey: string,
|
stateKey: string,
|
||||||
cacheName: string,
|
cacheName: string,
|
||||||
pathNotExistErrorMessage: string,
|
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
const matchedKey = core.getState(stateKey);
|
const matchedKey = core.getState(stateKey);
|
||||||
|
|
||||||
@@ -131,26 +147,8 @@ async function saveCacheToKey(
|
|||||||
}
|
}
|
||||||
|
|
||||||
core.info(`Including ${cacheName} path: ${cachePath}`);
|
core.info(`Including ${cacheName} path: ${cachePath}`);
|
||||||
if (!fs.existsSync(cachePath) && !ignoreNothingToCache) {
|
await cache.saveCache([cachePath], cacheKey);
|
||||||
throw new Error(pathNotExistErrorMessage);
|
core.info(`${cacheName} saved with key: ${cacheKey}`);
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
await cache.saveCache([cachePath], cacheKey);
|
|
||||||
core.info(`${cacheName} saved with key: ${cacheKey}`);
|
|
||||||
} catch (e) {
|
|
||||||
if (
|
|
||||||
e instanceof Error &&
|
|
||||||
e.message ===
|
|
||||||
"Path Validation Error: Path(s) specified in the action for caching do(es) not exist, hence no cache is being saved."
|
|
||||||
) {
|
|
||||||
core.info(
|
|
||||||
`No cacheable ${cacheName} paths were found. Ignoring because ignore-nothing-to-save is enabled.`,
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
run();
|
run();
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import * as exec from "@actions/exec";
|
|||||||
import { restoreCache } from "./cache/restore-cache";
|
import { restoreCache } from "./cache/restore-cache";
|
||||||
import {
|
import {
|
||||||
downloadVersionFromManifest,
|
downloadVersionFromManifest,
|
||||||
downloadVersionFromNdjson,
|
|
||||||
resolveVersion,
|
resolveVersion,
|
||||||
tryGetFromToolCache,
|
tryGetFromToolCache,
|
||||||
} from "./download/download-version";
|
} from "./download/download-version";
|
||||||
@@ -25,6 +24,7 @@ import {
|
|||||||
resolutionStrategy,
|
resolutionStrategy,
|
||||||
toolBinDir,
|
toolBinDir,
|
||||||
toolDir,
|
toolDir,
|
||||||
|
venvPath,
|
||||||
versionFile as versionFileInput,
|
versionFile as versionFileInput,
|
||||||
version as versionInput,
|
version as versionInput,
|
||||||
workingDirectory,
|
workingDirectory,
|
||||||
@@ -139,23 +139,14 @@ async function setupUv(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use the same source for download as we used for version resolution
|
const downloadVersionResult = await downloadVersionFromManifest(
|
||||||
const downloadVersionResult = manifestFile
|
manifestFile,
|
||||||
? await downloadVersionFromManifest(
|
platform,
|
||||||
manifestFile,
|
arch,
|
||||||
platform,
|
resolvedVersion,
|
||||||
arch,
|
checkSum,
|
||||||
resolvedVersion,
|
githubToken,
|
||||||
checkSum,
|
);
|
||||||
githubToken,
|
|
||||||
)
|
|
||||||
: await downloadVersionFromNdjson(
|
|
||||||
platform,
|
|
||||||
arch,
|
|
||||||
resolvedVersion,
|
|
||||||
checkSum,
|
|
||||||
githubToken,
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
uvDir: downloadVersionResult.cachedToolDir,
|
uvDir: downloadVersionResult.cachedToolDir,
|
||||||
@@ -167,7 +158,12 @@ async function determineVersion(
|
|||||||
manifestFile: string | undefined,
|
manifestFile: string | undefined,
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
if (versionInput !== "") {
|
if (versionInput !== "") {
|
||||||
return await resolveVersion(versionInput, manifestFile, resolutionStrategy);
|
return await resolveVersion(
|
||||||
|
versionInput,
|
||||||
|
manifestFile,
|
||||||
|
githubToken,
|
||||||
|
resolutionStrategy,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if (versionFileInput !== "") {
|
if (versionFileInput !== "") {
|
||||||
const versionFromFile = getUvVersionFromFile(versionFileInput);
|
const versionFromFile = getUvVersionFromFile(versionFileInput);
|
||||||
@@ -179,6 +175,7 @@ async function determineVersion(
|
|||||||
return await resolveVersion(
|
return await resolveVersion(
|
||||||
versionFromFile,
|
versionFromFile,
|
||||||
manifestFile,
|
manifestFile,
|
||||||
|
githubToken,
|
||||||
resolutionStrategy,
|
resolutionStrategy,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -196,6 +193,7 @@ async function determineVersion(
|
|||||||
return await resolveVersion(
|
return await resolveVersion(
|
||||||
versionFromUvToml || versionFromPyproject || "latest",
|
versionFromUvToml || versionFromPyproject || "latest",
|
||||||
manifestFile,
|
manifestFile,
|
||||||
|
githubToken,
|
||||||
resolutionStrategy,
|
resolutionStrategy,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -272,12 +270,16 @@ async function activateEnvironment(): Promise<void> {
|
|||||||
"UV_NO_MODIFY_PATH and activate-environment cannot be used together.",
|
"UV_NO_MODIFY_PATH and activate-environment cannot be used together.",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
const execArgs = ["venv", ".venv", "--directory", workingDirectory];
|
|
||||||
|
|
||||||
core.info("Activating python venv...");
|
core.info(`Creating and activating python venv at ${venvPath}...`);
|
||||||
await exec.exec("uv", execArgs);
|
await exec.exec("uv", [
|
||||||
|
"venv",
|
||||||
|
venvPath,
|
||||||
|
"--directory",
|
||||||
|
workingDirectory,
|
||||||
|
"--clear",
|
||||||
|
]);
|
||||||
|
|
||||||
const venvPath = path.resolve(`${workingDirectory}${path.sep}.venv`);
|
|
||||||
let venvBinPath = `${venvPath}${path.sep}bin`;
|
let venvBinPath = `${venvPath}${path.sep}bin`;
|
||||||
if (process.platform === "win32") {
|
if (process.platform === "win32") {
|
||||||
venvBinPath = `${venvPath}${path.sep}Scripts`;
|
venvBinPath = `${venvPath}${path.sep}Scripts`;
|
||||||
|
|||||||
@@ -1,116 +1,63 @@
|
|||||||
import { promises as fs } from "node:fs";
|
|
||||||
import * as core from "@actions/core";
|
import * as core from "@actions/core";
|
||||||
|
import type { Endpoints } from "@octokit/types";
|
||||||
import * as semver from "semver";
|
import * as semver from "semver";
|
||||||
import { updateChecksums } from "./download/checksum/update-known-checksums";
|
import { updateChecksums } from "./download/checksum/update-known-checksums";
|
||||||
import { getLatestKnownVersion } from "./download/version-manifest";
|
|
||||||
import {
|
import {
|
||||||
fetchVersionData,
|
getLatestKnownVersion,
|
||||||
getLatestVersion,
|
updateVersionManifest,
|
||||||
type NdjsonVersion,
|
} from "./download/version-manifest";
|
||||||
} from "./download/versions-client";
|
import { OWNER, REPO } from "./utils/constants";
|
||||||
|
import { Octokit } from "./utils/octokit";
|
||||||
|
|
||||||
interface ChecksumEntry {
|
type Release =
|
||||||
key: string;
|
Endpoints["GET /repos/{owner}/{repo}/releases"]["response"]["data"][number];
|
||||||
checksum: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ArtifactEntry {
|
|
||||||
version: string;
|
|
||||||
artifactName: string;
|
|
||||||
arch: string;
|
|
||||||
platform: string;
|
|
||||||
downloadUrl: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
function extractChecksumsFromNdjson(
|
|
||||||
versions: NdjsonVersion[],
|
|
||||||
): ChecksumEntry[] {
|
|
||||||
const checksums: ChecksumEntry[] = [];
|
|
||||||
|
|
||||||
for (const version of versions) {
|
|
||||||
for (const artifact of version.artifacts) {
|
|
||||||
// The platform field contains the target triple like "x86_64-apple-darwin"
|
|
||||||
const key = `${artifact.platform}-${version.version}`;
|
|
||||||
checksums.push({
|
|
||||||
checksum: artifact.sha256,
|
|
||||||
key,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return checksums;
|
|
||||||
}
|
|
||||||
|
|
||||||
function extractArtifactsFromNdjson(
|
|
||||||
versions: NdjsonVersion[],
|
|
||||||
): ArtifactEntry[] {
|
|
||||||
const artifacts: ArtifactEntry[] = [];
|
|
||||||
|
|
||||||
for (const version of versions) {
|
|
||||||
for (const artifact of version.artifacts) {
|
|
||||||
// The platform field contains the target triple like "x86_64-apple-darwin"
|
|
||||||
// Split into arch and platform (e.g., "x86_64-apple-darwin" -> ["x86_64", "apple-darwin"])
|
|
||||||
const parts = artifact.platform.split("-");
|
|
||||||
const arch = parts[0];
|
|
||||||
const platform = parts.slice(1).join("-");
|
|
||||||
|
|
||||||
// Construct artifact name from platform and archive format
|
|
||||||
const artifactName = `uv-${artifact.platform}.${artifact.archive_format}`;
|
|
||||||
|
|
||||||
artifacts.push({
|
|
||||||
arch,
|
|
||||||
artifactName,
|
|
||||||
downloadUrl: artifact.url,
|
|
||||||
platform,
|
|
||||||
version: version.version,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return artifacts;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function run(): Promise<void> {
|
async function run(): Promise<void> {
|
||||||
const checksumFilePath = process.argv.slice(2)[0];
|
const checksumFilePath = process.argv.slice(2)[0];
|
||||||
const versionsManifestFile = process.argv.slice(2)[1];
|
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 latestVersion = await getLatestVersion();
|
|
||||||
const latestKnownVersion = await getLatestKnownVersion(undefined);
|
const latestKnownVersion = await getLatestKnownVersion(undefined);
|
||||||
|
|
||||||
if (semver.lte(latestVersion, latestKnownVersion)) {
|
if (semver.lte(latestRelease.tag_name, latestKnownVersion)) {
|
||||||
core.info(
|
core.info(
|
||||||
`Latest release (${latestVersion}) is not newer than the latest known version (${latestKnownVersion}). Skipping update.`,
|
`Latest release (${latestRelease.tag_name}) is not newer than the latest known version (${latestKnownVersion}). Skipping update.`,
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const versions = await fetchVersionData();
|
const releases: Release[] = 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);
|
||||||
|
|
||||||
// Extract checksums from NDJSON
|
const artifactDownloadUrls: string[] = releases.flatMap((release) =>
|
||||||
const checksumEntries = extractChecksumsFromNdjson(versions);
|
release.assets
|
||||||
await updateChecksums(checksumFilePath, checksumEntries);
|
.filter((asset) => !asset.name.endsWith(".sha256"))
|
||||||
|
.map((asset) => asset.browser_download_url),
|
||||||
|
);
|
||||||
|
|
||||||
// Extract artifact URLs for version manifest
|
await updateVersionManifest(versionsManifestFile, artifactDownloadUrls);
|
||||||
const artifactEntries = extractArtifactsFromNdjson(versions);
|
|
||||||
await updateVersionManifestFromEntries(versionsManifestFile, artifactEntries);
|
|
||||||
|
|
||||||
core.setOutput("latest-version", latestVersion);
|
core.setOutput("latest-version", latestRelease.tag_name);
|
||||||
}
|
|
||||||
|
|
||||||
async function updateVersionManifestFromEntries(
|
|
||||||
filePath: string,
|
|
||||||
entries: ArtifactEntry[],
|
|
||||||
): Promise<void> {
|
|
||||||
const manifest = entries.map((entry) => ({
|
|
||||||
arch: entry.arch,
|
|
||||||
artifactName: entry.artifactName,
|
|
||||||
downloadUrl: entry.downloadUrl,
|
|
||||||
platform: entry.platform,
|
|
||||||
version: entry.version,
|
|
||||||
}));
|
|
||||||
|
|
||||||
core.debug(`Updating manifest-file: ${JSON.stringify(manifest)}`);
|
|
||||||
await fs.writeFile(filePath, JSON.stringify(manifest));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
run();
|
run();
|
||||||
|
|||||||
@@ -3,5 +3,3 @@ export const OWNER = "astral-sh";
|
|||||||
export const TOOL_CACHE_NAME = "uv";
|
export const TOOL_CACHE_NAME = "uv";
|
||||||
export const STATE_UV_PATH = "uv-path";
|
export const STATE_UV_PATH = "uv-path";
|
||||||
export const STATE_UV_VERSION = "uv-version";
|
export const STATE_UV_VERSION = "uv-version";
|
||||||
export const VERSIONS_NDJSON_URL =
|
|
||||||
"https://raw.githubusercontent.com/astral-sh/versions/main/v1/uv.ndjson";
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ export const version = core.getInput("version");
|
|||||||
export const versionFile = getVersionFile();
|
export const versionFile = getVersionFile();
|
||||||
export const pythonVersion = core.getInput("python-version");
|
export const pythonVersion = core.getInput("python-version");
|
||||||
export const activateEnvironment = core.getBooleanInput("activate-environment");
|
export const activateEnvironment = core.getBooleanInput("activate-environment");
|
||||||
|
export const venvPath = getVenvPath();
|
||||||
export const checkSum = core.getInput("checksum");
|
export const checkSum = core.getInput("checksum");
|
||||||
export const enableCache = getEnableCache();
|
export const enableCache = getEnableCache();
|
||||||
export const restoreCache = core.getInput("restore-cache") === "true";
|
export const restoreCache = core.getInput("restore-cache") === "true";
|
||||||
@@ -45,6 +46,18 @@ function getVersionFile(): string {
|
|||||||
return versionFileInput;
|
return versionFileInput;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getVenvPath(): string {
|
||||||
|
const venvPathInput = core.getInput("venv-path");
|
||||||
|
if (venvPathInput !== "") {
|
||||||
|
if (!activateEnvironment) {
|
||||||
|
core.warning("venv-path is only used when activate-environment is true");
|
||||||
|
}
|
||||||
|
const tildeExpanded = expandTilde(venvPathInput);
|
||||||
|
return normalizePath(resolveRelativePath(tildeExpanded));
|
||||||
|
}
|
||||||
|
return normalizePath(resolveRelativePath(".venv"));
|
||||||
|
}
|
||||||
|
|
||||||
function getEnableCache(): boolean {
|
function getEnableCache(): boolean {
|
||||||
const enableCacheInput = core.getInput("enable-cache");
|
const enableCacheInput = core.getInput("enable-cache");
|
||||||
if (enableCacheInput === "auto") {
|
if (enableCacheInput === "auto") {
|
||||||
@@ -194,6 +207,19 @@ function expandTilde(input: string): string {
|
|||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function normalizePath(inputPath: string): string {
|
||||||
|
const normalized = path.normalize(inputPath);
|
||||||
|
const root = path.parse(normalized).root;
|
||||||
|
|
||||||
|
// Remove any trailing path separators, except when the whole path is the root.
|
||||||
|
let trimmed = normalized;
|
||||||
|
while (trimmed.length > root.length && trimmed.endsWith(path.sep)) {
|
||||||
|
trimmed = trimmed.slice(0, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return trimmed;
|
||||||
|
}
|
||||||
|
|
||||||
function resolveRelativePath(inputPath: string): string {
|
function resolveRelativePath(inputPath: string): string {
|
||||||
const hasNegation = inputPath.startsWith("!");
|
const hasNegation = inputPath.startsWith("!");
|
||||||
const pathWithoutNegation = hasNegation ? inputPath.substring(1) : inputPath;
|
const pathWithoutNegation = hasNegation ? inputPath.substring(1) : inputPath;
|
||||||
|
|||||||
34
src/utils/octokit.ts
Normal file
34
src/utils/octokit.ts
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import type { OctokitOptions } from "@octokit/core";
|
||||||
|
import { Octokit as Core } from "@octokit/core";
|
||||||
|
import {
|
||||||
|
type PaginateInterface,
|
||||||
|
paginateRest,
|
||||||
|
} from "@octokit/plugin-paginate-rest";
|
||||||
|
import { legacyRestEndpointMethods } from "@octokit/plugin-rest-endpoint-methods";
|
||||||
|
import { fetch as customFetch } from "./fetch";
|
||||||
|
|
||||||
|
export type { RestEndpointMethodTypes } from "@octokit/plugin-rest-endpoint-methods";
|
||||||
|
|
||||||
|
const DEFAULTS = {
|
||||||
|
baseUrl: "https://api.github.com",
|
||||||
|
userAgent: "setup-uv",
|
||||||
|
};
|
||||||
|
|
||||||
|
const OctokitWithPlugins = Core.plugin(paginateRest, legacyRestEndpointMethods);
|
||||||
|
|
||||||
|
export const Octokit = OctokitWithPlugins.defaults(function buildDefaults(
|
||||||
|
options: OctokitOptions,
|
||||||
|
): OctokitOptions {
|
||||||
|
return {
|
||||||
|
...DEFAULTS,
|
||||||
|
...options,
|
||||||
|
request: {
|
||||||
|
fetch: customFetch,
|
||||||
|
...options.request,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
export type Octokit = InstanceType<typeof OctokitWithPlugins> & {
|
||||||
|
paginate: PaginateInterface;
|
||||||
|
};
|
||||||
@@ -1,4 +1,627 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.10.0/uv-aarch64-apple-darwin.tar.gz",
|
||||||
|
"platform": "apple-darwin",
|
||||||
|
"version": "0.10.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.10.0/uv-aarch64-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.10.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.10.0/uv-aarch64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.10.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.10.0/uv-aarch64-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.10.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "arm",
|
||||||
|
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.10.0/uv-arm-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-musleabihf",
|
||||||
|
"version": "0.10.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "armv7",
|
||||||
|
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.10.0/uv-armv7-unknown-linux-gnueabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnueabihf",
|
||||||
|
"version": "0.10.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "armv7",
|
||||||
|
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.10.0/uv-armv7-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-musleabihf",
|
||||||
|
"version": "0.10.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.10.0/uv-i686-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.10.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.10.0/uv-i686-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.10.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.10.0/uv-i686-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.10.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "powerpc64le",
|
||||||
|
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.10.0/uv-powerpc64le-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.10.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "riscv64gc",
|
||||||
|
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.10.0/uv-riscv64gc-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.10.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "s390x",
|
||||||
|
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.10.0/uv-s390x-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.10.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.10.0/uv-x86_64-apple-darwin.tar.gz",
|
||||||
|
"platform": "apple-darwin",
|
||||||
|
"version": "0.10.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.10.0/uv-x86_64-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.10.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.10.0/uv-x86_64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.10.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.10.0/uv-x86_64-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.10.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-aarch64-apple-darwin.tar.gz",
|
||||||
|
"platform": "apple-darwin",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-aarch64-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-aarch64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-aarch64-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "arm",
|
||||||
|
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-arm-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-musleabihf",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "armv7",
|
||||||
|
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-armv7-unknown-linux-gnueabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnueabihf",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "armv7",
|
||||||
|
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-armv7-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-musleabihf",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-i686-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-i686-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-i686-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "powerpc64",
|
||||||
|
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-powerpc64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "powerpc64le",
|
||||||
|
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-powerpc64le-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "riscv64gc",
|
||||||
|
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-riscv64gc-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "s390x",
|
||||||
|
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-s390x-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-x86_64-apple-darwin.tar.gz",
|
||||||
|
"platform": "apple-darwin",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-x86_64-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-x86_64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.30/uv-x86_64-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-aarch64-apple-darwin.tar.gz",
|
||||||
|
"platform": "apple-darwin",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-aarch64-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-aarch64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-aarch64-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "arm",
|
||||||
|
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-arm-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-musleabihf",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "armv7",
|
||||||
|
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-armv7-unknown-linux-gnueabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnueabihf",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "armv7",
|
||||||
|
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-armv7-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-musleabihf",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-i686-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-i686-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-i686-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "powerpc64",
|
||||||
|
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-powerpc64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "powerpc64le",
|
||||||
|
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-powerpc64le-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "riscv64gc",
|
||||||
|
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-riscv64gc-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "s390x",
|
||||||
|
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-s390x-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-x86_64-apple-darwin.tar.gz",
|
||||||
|
"platform": "apple-darwin",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-x86_64-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-x86_64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.29/uv-x86_64-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-aarch64-apple-darwin.tar.gz",
|
||||||
|
"platform": "apple-darwin",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-aarch64-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-aarch64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-aarch64-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "arm",
|
||||||
|
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-arm-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-musleabihf",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "armv7",
|
||||||
|
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-armv7-unknown-linux-gnueabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnueabihf",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "armv7",
|
||||||
|
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-armv7-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-musleabihf",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-i686-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-i686-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-i686-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "powerpc64",
|
||||||
|
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-powerpc64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "powerpc64le",
|
||||||
|
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-powerpc64le-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "riscv64gc",
|
||||||
|
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-riscv64gc-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "s390x",
|
||||||
|
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-s390x-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-x86_64-apple-darwin.tar.gz",
|
||||||
|
"platform": "apple-darwin",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-x86_64-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-x86_64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.28/uv-x86_64-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-aarch64-apple-darwin.tar.gz",
|
||||||
|
"platform": "apple-darwin",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-aarch64-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-aarch64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-aarch64-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "arm",
|
||||||
|
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-arm-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-musleabihf",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "armv7",
|
||||||
|
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-armv7-unknown-linux-gnueabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnueabihf",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "armv7",
|
||||||
|
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-armv7-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-musleabihf",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-i686-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-i686-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-i686-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "powerpc64",
|
||||||
|
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-powerpc64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "powerpc64le",
|
||||||
|
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-powerpc64le-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "riscv64gc",
|
||||||
|
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-riscv64gc-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "s390x",
|
||||||
|
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-s390x-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-x86_64-apple-darwin.tar.gz",
|
||||||
|
"platform": "apple-darwin",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-x86_64-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-x86_64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.27/uv-x86_64-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.27"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"arch": "aarch64",
|
"arch": "aarch64",
|
||||||
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
|
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
|
||||||
|
|||||||
Reference in New Issue
Block a user