mirror of
https://github.com/julia-actions/setup-julia.git
synced 2026-02-16 04:56:53 +08:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
58ad1cdde7 |
1
.github/ISSUE_TEMPLATE/bug_report.md
vendored
1
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -3,6 +3,7 @@ name: Bug report
|
|||||||
about: Create a report to help us improve
|
about: Create a report to help us improve
|
||||||
title: "[BUG] "
|
title: "[BUG] "
|
||||||
labels: bug
|
labels: bug
|
||||||
|
assignees: SaschaMann
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
8
.github/dependabot.yml
vendored
8
.github/dependabot.yml
vendored
@@ -3,17 +3,15 @@ updates:
|
|||||||
- package-ecosystem: gitsubmodule
|
- package-ecosystem: gitsubmodule
|
||||||
directory: "/"
|
directory: "/"
|
||||||
schedule:
|
schedule:
|
||||||
interval: monthly
|
interval: daily
|
||||||
open-pull-requests-limit: 99
|
open-pull-requests-limit: 10
|
||||||
|
|
||||||
- package-ecosystem: 'github-actions'
|
- package-ecosystem: 'github-actions'
|
||||||
directory: '/'
|
directory: '/'
|
||||||
schedule:
|
schedule:
|
||||||
interval: 'monthly'
|
interval: 'daily'
|
||||||
open-pull-requests-limit: 99
|
|
||||||
|
|
||||||
- package-ecosystem: npm
|
- package-ecosystem: npm
|
||||||
directory: "/"
|
directory: "/"
|
||||||
schedule:
|
schedule:
|
||||||
interval: monthly
|
interval: monthly
|
||||||
open-pull-requests-limit: 99
|
|
||||||
|
|||||||
11
.github/scripts/common-tests.jl
vendored
11
.github/scripts/common-tests.jl
vendored
@@ -1,11 +0,0 @@
|
|||||||
if !occursin("hostedtoolcache", Sys.BINDIR)
|
|
||||||
error("the wrong julia is being used: $(Sys.BINDIR)")
|
|
||||||
end
|
|
||||||
if VERSION >= v"1.7.0" # pkgdir was introduced here, and before then mtime wasn't a problem so just skip
|
|
||||||
using Pkg
|
|
||||||
src = pkgdir(Pkg, "src", "Pkg.jl")
|
|
||||||
# mtime is when it's compressed, ctime is when the file is extracted
|
|
||||||
if mtime(src) >= ctime(src)
|
|
||||||
error("source mtime ($(mtime(src))) is not earlier than ctime ($(ctime(src)))")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
34
.github/workflows/backup.yml
vendored
Normal file
34
.github/workflows/backup.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
name: Backup
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '5 4 * * 0'
|
||||||
|
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
backup:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
timeout-minutes: 60
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Configure cache
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ env.GITHUB_WORKSPACE }}
|
||||||
|
~/.cache/restic
|
||||||
|
key: ${{ runner.os }}
|
||||||
|
|
||||||
|
- name: Install the correct Python version
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.x'
|
||||||
|
|
||||||
|
- name: Run backup action
|
||||||
|
uses: julia-actions/restic-action@main
|
||||||
|
env: # Options: https://restic.readthedocs.io/en/latest/040_backup.html#environment-variables
|
||||||
|
RESTIC_REPOSITORY: b2:${{ secrets.B2_BUCKET }}:${{ github.repository }}
|
||||||
|
RESTIC_PASSWORD: ${{ secrets.RESTIC_PASSWORD }}
|
||||||
|
B2_ACCOUNT_ID: ${{ secrets.B2_ACCOUNT_ID }}
|
||||||
|
B2_ACCOUNT_KEY: ${{ secrets.B2_ACCOUNT_KEY }}
|
||||||
6
.github/workflows/checkin.yml
vendored
6
.github/workflows/checkin.yml
vendored
@@ -12,11 +12,11 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 16
|
||||||
|
|
||||||
- name: "npm ci"
|
- name: "npm ci"
|
||||||
run: npm ci
|
run: npm ci
|
||||||
|
|||||||
8
.github/workflows/codeql-analysis.yml
vendored
8
.github/workflows/codeql-analysis.yml
vendored
@@ -42,11 +42,11 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v3
|
uses: github/codeql-action/init@v2
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
@@ -57,7 +57,7 @@ jobs:
|
|||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@v3
|
uses: github/codeql-action/autobuild@v2
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
# 📚 https://git.io/JvXDl
|
# 📚 https://git.io/JvXDl
|
||||||
@@ -71,4 +71,4 @@ jobs:
|
|||||||
# make release
|
# make release
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v3
|
uses: github/codeql-action/analyze@v2
|
||||||
|
|||||||
@@ -23,9 +23,9 @@ jobs:
|
|||||||
os: [ubuntu-latest, macOS-latest, windows-latest]
|
os: [ubuntu-latest, macOS-latest, windows-latest]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v3
|
||||||
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
|
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
|
||||||
with:
|
with:
|
||||||
node-version: 16
|
node-version: 16
|
||||||
@@ -44,5 +44,3 @@ jobs:
|
|||||||
version: ${{ matrix.julia-version }}
|
version: ${{ matrix.julia-version }}
|
||||||
- run: julia --version
|
- run: julia --version
|
||||||
- run: julia --compile=min -O0 -e 'import InteractiveUtils; InteractiveUtils.versioninfo()'
|
- run: julia --compile=min -O0 -e 'import InteractiveUtils; InteractiveUtils.versioninfo()'
|
||||||
- name: "Check that the correct julia is used and that archive mtimes are maintained"
|
|
||||||
run: julia --startup-file=no --color=yes ./.github/scripts/common-tests.jl
|
|
||||||
|
|||||||
@@ -19,19 +19,12 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
julia-version: [nightly, 1.10-nightly]
|
julia-version: [nightly, 1.10-nightly]
|
||||||
os:
|
os: [ubuntu-latest, macOS-latest, windows-latest]
|
||||||
- ubuntu-latest
|
|
||||||
- windows-latest
|
|
||||||
# - macos-11 # Intel
|
|
||||||
- macos-12 # Intel
|
|
||||||
- macos-13 # Intel
|
|
||||||
- macos-14 # Apple Silicon
|
|
||||||
- macos-latest # Currently Intel, but will probably point to Apple Silicon in the future
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v3
|
||||||
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
|
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
|
||||||
with:
|
with:
|
||||||
node-version: 16
|
node-version: 16
|
||||||
@@ -49,5 +42,3 @@ jobs:
|
|||||||
version: ${{ matrix.julia-version }}
|
version: ${{ matrix.julia-version }}
|
||||||
- run: julia --version
|
- run: julia --version
|
||||||
- run: julia --compile=min -O0 -e 'import InteractiveUtils; InteractiveUtils.versioninfo()'
|
- run: julia --compile=min -O0 -e 'import InteractiveUtils; InteractiveUtils.versioninfo()'
|
||||||
- name: "Check that the correct julia is used and that archive mtimes are maintained"
|
|
||||||
run: julia --startup-file=no --color=yes ./.github/scripts/common-tests.jl
|
|
||||||
|
|||||||
6
.github/workflows/example-builds-nightly.yml
vendored
6
.github/workflows/example-builds-nightly.yml
vendored
@@ -29,9 +29,9 @@ jobs:
|
|||||||
julia-arch: x86
|
julia-arch: x86
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v3
|
||||||
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
|
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
|
||||||
with:
|
with:
|
||||||
node-version: 16
|
node-version: 16
|
||||||
@@ -50,5 +50,3 @@ jobs:
|
|||||||
arch: ${{ matrix.julia-arch }}
|
arch: ${{ matrix.julia-arch }}
|
||||||
- run: julia --version
|
- run: julia --version
|
||||||
- run: julia --compile=min -O0 -e 'import InteractiveUtils; InteractiveUtils.versioninfo()'
|
- run: julia --compile=min -O0 -e 'import InteractiveUtils; InteractiveUtils.versioninfo()'
|
||||||
- name: "Check that the correct julia is used and that archive mtimes are maintained"
|
|
||||||
run: julia --startup-file=no --color=yes ./.github/scripts/common-tests.jl
|
|
||||||
|
|||||||
6
.github/workflows/example-builds.yml
vendored
6
.github/workflows/example-builds.yml
vendored
@@ -28,9 +28,9 @@ jobs:
|
|||||||
julia-arch: x86
|
julia-arch: x86
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v3
|
||||||
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
|
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
|
||||||
with:
|
with:
|
||||||
node-version: 16
|
node-version: 16
|
||||||
@@ -50,5 +50,3 @@ jobs:
|
|||||||
arch: ${{ matrix.julia-arch }}
|
arch: ${{ matrix.julia-arch }}
|
||||||
- run: julia --version
|
- run: julia --version
|
||||||
- run: julia --compile=min -O0 -e 'import InteractiveUtils; InteractiveUtils.versioninfo()'
|
- run: julia --compile=min -O0 -e 'import InteractiveUtils; InteractiveUtils.versioninfo()'
|
||||||
- name: "Check that the correct julia is used and that archive mtimes are maintained"
|
|
||||||
run: julia --startup-file=no --color=yes ./.github/scripts/common-tests.jl
|
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
node_modules/
|
node_modules/
|
||||||
__tests__/runner/*
|
__tests__/runner/*
|
||||||
|
!dist/
|
||||||
|
|||||||
71
README.md
71
README.md
@@ -22,7 +22,7 @@ This action sets up a Julia environment for use in actions by downloading a spec
|
|||||||
### Inputs
|
### Inputs
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: julia-actions/setup-julia@v2
|
- uses: julia-actions/setup-julia@v1
|
||||||
with:
|
with:
|
||||||
# The Julia version that will be installed and added as `julia` to the PATH.
|
# The Julia version that will be installed and added as `julia` to the PATH.
|
||||||
# See "Julia Versions" below for a list of valid values.
|
# See "Julia Versions" below for a list of valid values.
|
||||||
@@ -86,10 +86,10 @@ outputs:
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v1.0.0
|
||||||
- uses: julia-actions/setup-julia@v2
|
- uses: julia-actions/setup-julia@v1
|
||||||
with:
|
with:
|
||||||
version: '1.10'
|
version: 1.0.4
|
||||||
- run: julia -e 'println("Hello, World!")'
|
- run: julia -e 'println("Hello, World!")'
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -103,14 +103,14 @@ You can either specify specific Julia versions or version ranges. If you specify
|
|||||||
|
|
||||||
#### Examples
|
#### Examples
|
||||||
|
|
||||||
- `'1.2.0'` is a valid semver version. The action will try to download exactly this version. If it's not available, the build step will fail.
|
- `1.2.0` is a valid semver version. The action will try to download exactly this version. If it's not available, the build step will fail.
|
||||||
- `'1.0'` is a version range that will match the highest available Julia version that starts with `1.0`, e.g. `1.0.5`, excluding pre-releases.
|
- `1.0` is a version range that will match the highest available Julia version that starts with `1.0`, e.g. `1.0.5`, excluding pre-releases.
|
||||||
- `'^1.3.0-rc1'` is a **caret** version range that includes pre-releases of `1.3.0` starting at `rc1`. It matches all versions `≥ 1.3.0-rc1` and `< 2.0.0`.
|
- `^1.3.0-rc1` is a **caret** version range that includes pre-releases of `1.3.0` starting at `rc1`. It matches all versions `≥ 1.3.0-rc1` and `< 2.0.0`.
|
||||||
- `'~1.3.0-rc1'` is a **tilde** version range that includes pre-releases of `1.3.0` starting at `rc1`. It matches all versions `≥ 1.3.0-rc1` and `< 1.4.0`.
|
- `~1.3.0-rc1` is a **tilde** version range that includes pre-releases of `1.3.0` starting at `rc1`. It matches all versions `≥ 1.3.0-rc1` and `< 1.4.0`.
|
||||||
- `'^1.3.0-0'` is a **caret** version range that includes _all_ pre-releases of `1.3.0`. It matches all versions `≥ 1.3.0-` and `< 2.0.0`.
|
- `^1.3.0-0` is a **caret** version range that includes _all_ pre-releases of `1.3.0`. It matches all versions `≥ 1.3.0-` and `< 2.0.0`.
|
||||||
- `'~1.3.0-0'` is a **tilde** version range that includes _all_ pre-releases of `1.3.0`. It matches all versions `≥ 1.3.0-` and `< 1.4.0`.
|
- `~1.3.0-0` is a **tilde** version range that includes _all_ pre-releases of `1.3.0`. It matches all versions `≥ 1.3.0-` and `< 1.4.0`.
|
||||||
- `'nightly'` will install the latest nightly build.
|
- `nightly` will install the latest nightly build.
|
||||||
- `'1.7-nightly'` will install the latest nightly build for the upcoming 1.7 release. This version will only be available during certain phases of the Julia release cycle.
|
- `1.7-nightly` will install the latest nightly build for the upcoming 1.7 release. This version will only be available during certain phases of the Julia release cycle.
|
||||||
|
|
||||||
Internally the action uses node's semver package to resolve version ranges. Its [documentation](https://github.com/npm/node-semver#advanced-range-syntax) contains more details on the version range syntax. You can test what version will be selected for a given input in this JavaScript [REPL](https://repl.it/@SaschaMann/setup-julia-version-logic).
|
Internally the action uses node's semver package to resolve version ranges. Its [documentation](https://github.com/npm/node-semver#advanced-range-syntax) contains more details on the version range syntax. You can test what version will be selected for a given input in this JavaScript [REPL](https://repl.it/@SaschaMann/setup-julia-version-logic).
|
||||||
|
|
||||||
@@ -118,7 +118,7 @@ Internally the action uses node's semver package to resolve version ranges. Its
|
|||||||
|
|
||||||
There are two methods of including pre-releases in version matching:
|
There are two methods of including pre-releases in version matching:
|
||||||
|
|
||||||
1. Including the pre-release tag in the version itself, e.g. `'^1.3.0-rc1'`.
|
1. Including the pre-release tag in the version itself, e.g. `^1.3.0-rc1`.
|
||||||
2. Setting the input `include-all-prereleases` to `true`.
|
2. Setting the input `include-all-prereleases` to `true`.
|
||||||
|
|
||||||
These behave slightly differently.
|
These behave slightly differently.
|
||||||
@@ -133,7 +133,7 @@ With `include-all-prereleases: true`, it would match `1.3.0-rc1`, `1.3.0-rc2`, `
|
|||||||
If you want to run tests against the latest tagged version, no matter what version that is, you can use
|
If you want to run tests against the latest tagged version, no matter what version that is, you can use
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: julia-actions/setup-julia@v2
|
- uses: julia-actions/setup-julia@v1
|
||||||
with:
|
with:
|
||||||
version: '1'
|
version: '1'
|
||||||
include-all-prereleases: true
|
include-all-prereleases: true
|
||||||
@@ -159,9 +159,9 @@ jobs:
|
|||||||
os: [ubuntu-latest, windows-latest, macOS-latest]
|
os: [ubuntu-latest, windows-latest, macOS-latest]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v1.0.0
|
||||||
- name: "Set up Julia"
|
- name: "Set up Julia"
|
||||||
uses: julia-actions/setup-julia@v2
|
uses: julia-actions/setup-julia@v1
|
||||||
with:
|
with:
|
||||||
version: ${{ matrix.julia-version }}
|
version: ${{ matrix.julia-version }}
|
||||||
- run: julia -e 'println("Hello, World!")'
|
- run: julia -e 'println("Hello, World!")'
|
||||||
@@ -185,9 +185,9 @@ jobs:
|
|||||||
julia-arch: x86
|
julia-arch: x86
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v1.0.0
|
||||||
- name: "Set up Julia"
|
- name: "Set up Julia"
|
||||||
uses: julia-actions/setup-julia@v2
|
uses: julia-actions/setup-julia@v1
|
||||||
with:
|
with:
|
||||||
version: ${{ matrix.julia-version }}
|
version: ${{ matrix.julia-version }}
|
||||||
arch: ${{ matrix.julia-arch }}
|
arch: ${{ matrix.julia-arch }}
|
||||||
@@ -212,9 +212,9 @@ jobs:
|
|||||||
julia-arch: x86
|
julia-arch: x86
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v1.0.0
|
||||||
- name: "Set up Julia"
|
- name: "Set up Julia"
|
||||||
uses: julia-actions/setup-julia@v2
|
uses: julia-actions/setup-julia@v1
|
||||||
with:
|
with:
|
||||||
version: ${{ matrix.julia-version }}
|
version: ${{ matrix.julia-version }}
|
||||||
- run: julia -e 'println("Hello, World!")'
|
- run: julia -e 'println("Hello, World!")'
|
||||||
@@ -237,44 +237,23 @@ This action follows [GitHub's advice](https://help.github.com/en/articles/about-
|
|||||||
|
|
||||||
If you don't want to deal with updating the version of the action, similiarly to how Travis CI handles it, use `latest` or major version branches. [Dependabot](https://dependabot.com/) can also be used to automatically create Pull Requests to update actions used in your workflows.
|
If you don't want to deal with updating the version of the action, similiarly to how Travis CI handles it, use `latest` or major version branches. [Dependabot](https://dependabot.com/) can also be used to automatically create Pull Requests to update actions used in your workflows.
|
||||||
|
|
||||||
It's unlikely, but not impossible, that there will be breaking changes post-v2.0.0 unless a new major version of Julia is introduced.
|
It's unlikely, but not impossible, that there will be breaking changes post-v1.0.0 unless a new major version of Julia is introduced.
|
||||||
|
|
||||||
You can specify commits, branches or tags in your workflows as follows:
|
You can specify commits, branches or tags in your workflows as follows:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
steps:
|
steps:
|
||||||
- uses: julia-actions/setup-julia@f2258781c657ad9b4b88072c5eeaf9ec8c370874 # commit SHA of the tagged 2.0.0 commit
|
- uses: julia-actions/setup-julia@d3ce119a16594ea9e5d7974813970c73b6ab9e94 # commit SHA of the tagged 1.4.1 commit
|
||||||
- uses: julia-actions/setup-julia@latest # latest version tag (may break existing workflows)
|
- uses: julia-actions/setup-julia@latest # latest version tag (may break existing workflows)
|
||||||
- uses: julia-actions/setup-julia@v2 # major version tag
|
- uses: julia-actions/setup-julia@v1 # major version tag
|
||||||
- uses: julia-actions/setup-julia@v2.0 # minor version tag
|
- uses: julia-actions/setup-julia@v1.4 # minor version tag
|
||||||
- uses: julia-actions/setup-julia@v2.0.0 # specific version tag
|
- uses: julia-actions/setup-julia@v1.4.1 # specific version tag
|
||||||
```
|
```
|
||||||
|
|
||||||
If your workflow requires access to secrets, you should always pin it to a commit SHA instead of a tag.
|
If your workflow requires access to secrets, you should always pin it to a commit SHA instead of a tag.
|
||||||
This will protect you in case a bad actor gains access to the setup-julia repo.
|
This will protect you in case a bad actor gains access to the setup-julia repo.
|
||||||
You can find more information in [GitHub's security hardening guide](https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/security-hardening-for-github-actions#using-third-party-actions).
|
You can find more information in [GitHub's security hardening guide](https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/security-hardening-for-github-actions#using-third-party-actions).
|
||||||
|
|
||||||
## Using Dependabot version updates to keep your GitHub Actions up to date
|
|
||||||
|
|
||||||
We highly recommend that you set up Dependabot version updates on your repo to keep your GitHub Actions up to date.
|
|
||||||
|
|
||||||
To set up Dependabot version updates, create a file named `.github/dependabot.yml` in your repo with the following contents:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
version: 2
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: "github-actions"
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: "monthly"
|
|
||||||
open-pull-requests-limit: 99
|
|
||||||
labels:
|
|
||||||
- "dependencies"
|
|
||||||
- "github-actions"
|
|
||||||
```
|
|
||||||
|
|
||||||
For more details on Dependabot version updates, see the [GitHub Dependabot documentation](https://docs.github.com/en/code-security/dependabot/dependabot-version-updates).
|
|
||||||
|
|
||||||
## Debug logs
|
## Debug logs
|
||||||
|
|
||||||
You can enable [Step Debug Logs](https://github.com/actions/toolkit/blob/main/docs/action-debugging.md#step-debug-logs) for more detailed logs.
|
You can enable [Step Debug Logs](https://github.com/actions/toolkit/blob/main/docs/action-debugging.md#step-debug-logs) for more detailed logs.
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ outputs:
|
|||||||
julia-bindir:
|
julia-bindir:
|
||||||
description: 'Path to the directory containing the Julia executable. Equivalent to JULIA_BINDIR: https://docs.julialang.org/en/v1/manual/environment-variables/#JULIA_BINDIR'
|
description: 'Path to the directory containing the Julia executable. Equivalent to JULIA_BINDIR: https://docs.julialang.org/en/v1/manual/environment-variables/#JULIA_BINDIR'
|
||||||
runs:
|
runs:
|
||||||
using: 'node20'
|
using: 'node16'
|
||||||
main: 'dist/index.js'
|
main: 'dist/index.js'
|
||||||
branding:
|
branding:
|
||||||
icon: 'download'
|
icon: 'download'
|
||||||
|
|||||||
2
bin
2
bin
Submodule bin updated: 31b4b500a3...047c0c66bc
203
dist/index.js
vendored
203
dist/index.js
vendored
@@ -157,46 +157,16 @@ function getNightlyFileName(arch) {
|
|||||||
let fileExt1;
|
let fileExt1;
|
||||||
[fileExt1, ,] = getDesiredFileExts();
|
[fileExt1, ,] = getDesiredFileExts();
|
||||||
if (osPlat == 'win32') {
|
if (osPlat == 'win32') {
|
||||||
if (arch == 'x86') {
|
versionExt = arch == 'x64' ? '-win64' : '-win32';
|
||||||
versionExt = '-win32';
|
|
||||||
}
|
|
||||||
else if (arch == 'aarch64') {
|
|
||||||
throw new Error('Aarch64 Julia is not available on Windows');
|
|
||||||
}
|
|
||||||
else if (arch == 'x64') {
|
|
||||||
versionExt = '-win64';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new Error(`Architecture ${arch} is not supported on Windows`);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (osPlat == 'darwin') {
|
else if (osPlat == 'darwin') {
|
||||||
if (arch == 'x86') {
|
if (arch == 'x86') {
|
||||||
throw new Error('32-bit (x86) Julia is not available on macOS');
|
throw new Error('32-bit Julia is not available on macOS');
|
||||||
}
|
|
||||||
else if (arch == 'aarch64') {
|
|
||||||
versionExt = '-macaarch64';
|
|
||||||
}
|
|
||||||
else if (arch == 'x64') {
|
|
||||||
versionExt = '-mac64';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new Error(`Architecture ${arch} is not supported on macOS`);
|
|
||||||
}
|
}
|
||||||
|
versionExt = '-mac64';
|
||||||
}
|
}
|
||||||
else if (osPlat === 'linux') {
|
else if (osPlat === 'linux') {
|
||||||
if (arch == 'x86') {
|
versionExt = arch == 'x64' ? '-linux64' : '-linux32';
|
||||||
versionExt = '-linux32';
|
|
||||||
}
|
|
||||||
else if (arch == 'aarch64') {
|
|
||||||
versionExt = '-linux-aarch64';
|
|
||||||
}
|
|
||||||
else if (arch == 'x64') {
|
|
||||||
versionExt = '-linux64';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new Error(`Architecture ${arch} is not supported on Linux`);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw new Error(`Platform ${osPlat} is not supported`);
|
throw new Error(`Platform ${osPlat} is not supported`);
|
||||||
@@ -253,7 +223,7 @@ function getDownloadURL(fileInfo, version, arch) {
|
|||||||
return fileInfo.url;
|
return fileInfo.url;
|
||||||
}
|
}
|
||||||
exports.getDownloadURL = getDownloadURL;
|
exports.getDownloadURL = getDownloadURL;
|
||||||
function installJulia(dest, versionInfo, version, arch) {
|
function installJulia(versionInfo, version, arch) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
// Download Julia
|
// Download Julia
|
||||||
const fileInfo = getFileInfo(versionInfo, version, arch);
|
const fileInfo = getFileInfo(versionInfo, version, arch);
|
||||||
@@ -280,40 +250,39 @@ function installJulia(dest, versionInfo, version, arch) {
|
|||||||
else {
|
else {
|
||||||
core.debug('Skipping checksum check for nightly binaries.');
|
core.debug('Skipping checksum check for nightly binaries.');
|
||||||
}
|
}
|
||||||
|
const tempInstallDir = fs.mkdtempSync(`julia-${arch}-${version}-`);
|
||||||
// Install it
|
// Install it
|
||||||
switch (osPlat) {
|
switch (osPlat) {
|
||||||
case 'linux':
|
case 'linux':
|
||||||
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
||||||
yield exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', dest]);
|
yield exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', tempInstallDir]);
|
||||||
return dest;
|
return tempInstallDir;
|
||||||
case 'win32':
|
case 'win32':
|
||||||
if (fileInfo !== null && fileInfo.extension == 'exe') {
|
if (fileInfo !== null && fileInfo.extension == 'exe') {
|
||||||
if (version.endsWith('nightly') || semver.gtr(version, '1.3', { includePrerelease: true })) {
|
if (version.endsWith('nightly') || semver.gtr(version, '1.3', { includePrerelease: true })) {
|
||||||
// The installer changed in 1.4: https://github.com/JuliaLang/julia/blob/ef0c9108b12f3ae177c51037934351ffa703b0b5/NEWS.md#build-system-changes
|
// The installer changed in 1.4: https://github.com/JuliaLang/julia/blob/ef0c9108b12f3ae177c51037934351ffa703b0b5/NEWS.md#build-system-changes
|
||||||
yield exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/SILENT /dir=${path.join(process.cwd(), dest)}" -NoNewWindow -Wait`]);
|
yield exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/SILENT /dir=${path.join(process.cwd(), tempInstallDir)}" -NoNewWindow -Wait`]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
yield exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/S /D=${path.join(process.cwd(), dest)}" -NoNewWindow -Wait`]);
|
yield exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/S /D=${path.join(process.cwd(), tempInstallDir)}" -NoNewWindow -Wait`]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// This is the more common path. Using .tar.gz is much faster
|
// This is the more common path. Using .tar.gz is much faster
|
||||||
// don't use the Git bash provided tar. Issue #205
|
yield exec.exec('powershell', ['-Command', `tar xf ${juliaDownloadPath} --strip-components=1 -C ${tempInstallDir}`]);
|
||||||
// https://github.com/julia-actions/setup-julia/issues/205
|
|
||||||
yield exec.exec('powershell', ['-Command', `& "$env:WINDIR/System32/tar" xf ${juliaDownloadPath} --strip-components=1 -C ${dest}`]);
|
|
||||||
}
|
}
|
||||||
return dest;
|
return tempInstallDir;
|
||||||
case 'darwin':
|
case 'darwin':
|
||||||
if (fileInfo !== null && fileInfo.extension == 'dmg') {
|
if (fileInfo !== null && fileInfo.extension == 'dmg') {
|
||||||
core.debug(`Support for .dmg files is deprecated and may be removed in a future release`);
|
core.debug(`Support for .dmg files is deprecated and may be removed in a future release`);
|
||||||
yield exec.exec('hdiutil', ['attach', juliaDownloadPath]);
|
yield exec.exec('hdiutil', ['attach', juliaDownloadPath]);
|
||||||
yield exec.exec('/bin/bash', ['-c', `cp -a /Volumes/Julia-*/Julia-*.app/Contents/Resources/julia ${dest}`]);
|
yield exec.exec('/bin/bash', ['-c', `cp -a /Volumes/Julia-*/Julia-*.app/Contents/Resources/julia ${tempInstallDir}`]);
|
||||||
return path.join(dest, 'julia');
|
return path.join(tempInstallDir, 'julia');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
||||||
yield exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', dest]);
|
yield exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', tempInstallDir]);
|
||||||
return dest;
|
return tempInstallDir;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
throw new Error(`Platform ${osPlat} is not supported`);
|
throw new Error(`Platform ${osPlat} is not supported`);
|
||||||
@@ -459,18 +428,12 @@ function run() {
|
|||||||
juliaPath = tc.find('julia', version, arch);
|
juliaPath = tc.find('julia', version, arch);
|
||||||
if (!juliaPath) {
|
if (!juliaPath) {
|
||||||
core.debug(`could not find Julia ${arch}/${version} in cache`);
|
core.debug(`could not find Julia ${arch}/${version} in cache`);
|
||||||
// https://github.com/julia-actions/setup-julia/pull/196
|
const juliaInstallationPath = yield installer.installJulia(versionInfo, version, arch);
|
||||||
// we want julia to be installed with unmodified file mtimes
|
// Add it to cache
|
||||||
// but `tc.cacheDir` uses `cp` internally which destroys mtime
|
juliaPath = yield tc.cacheDir(juliaInstallationPath, 'julia', version, arch);
|
||||||
// and `tc` provides no API to get the tool directory alone
|
|
||||||
// so hack it by installing a empty directory then use the path it returns
|
|
||||||
// and extract the archives directly to that location
|
|
||||||
const emptyDir = fs.mkdtempSync('empty');
|
|
||||||
juliaPath = yield tc.cacheDir(emptyDir, 'julia', version, arch);
|
|
||||||
yield installer.installJulia(juliaPath, versionInfo, version, arch);
|
|
||||||
core.debug(`added Julia to cache: ${juliaPath}`);
|
core.debug(`added Julia to cache: ${juliaPath}`);
|
||||||
// Remove empty dir
|
// Remove temporary dir
|
||||||
fs.rmdirSync(emptyDir);
|
fs.rmSync(juliaInstallationPath, { recursive: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
core.debug(`using cached version of Julia: ${juliaPath}`);
|
core.debug(`using cached version of Julia: ${juliaPath}`);
|
||||||
@@ -1050,7 +1013,7 @@ class OidcClient {
|
|||||||
.catch(error => {
|
.catch(error => {
|
||||||
throw new Error(`Failed to get ID Token. \n
|
throw new Error(`Failed to get ID Token. \n
|
||||||
Error Code : ${error.statusCode}\n
|
Error Code : ${error.statusCode}\n
|
||||||
Error Message: ${error.message}`);
|
Error Message: ${error.result.message}`);
|
||||||
});
|
});
|
||||||
const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value;
|
const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value;
|
||||||
if (!id_token) {
|
if (!id_token) {
|
||||||
@@ -5059,11 +5022,8 @@ var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
|
|||||||
// Max safe segment length for coercion.
|
// Max safe segment length for coercion.
|
||||||
var MAX_SAFE_COMPONENT_LENGTH = 16
|
var MAX_SAFE_COMPONENT_LENGTH = 16
|
||||||
|
|
||||||
var MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6
|
|
||||||
|
|
||||||
// The actual regexps go on exports.re
|
// The actual regexps go on exports.re
|
||||||
var re = exports.re = []
|
var re = exports.re = []
|
||||||
var safeRe = exports.safeRe = []
|
|
||||||
var src = exports.src = []
|
var src = exports.src = []
|
||||||
var t = exports.tokens = {}
|
var t = exports.tokens = {}
|
||||||
var R = 0
|
var R = 0
|
||||||
@@ -5072,31 +5032,6 @@ function tok (n) {
|
|||||||
t[n] = R++
|
t[n] = R++
|
||||||
}
|
}
|
||||||
|
|
||||||
var LETTERDASHNUMBER = '[a-zA-Z0-9-]'
|
|
||||||
|
|
||||||
// Replace some greedy regex tokens to prevent regex dos issues. These regex are
|
|
||||||
// used internally via the safeRe object since all inputs in this library get
|
|
||||||
// normalized first to trim and collapse all extra whitespace. The original
|
|
||||||
// regexes are exported for userland consumption and lower level usage. A
|
|
||||||
// future breaking change could export the safer regex only with a note that
|
|
||||||
// all input should have extra whitespace removed.
|
|
||||||
var safeRegexReplacements = [
|
|
||||||
['\\s', 1],
|
|
||||||
['\\d', MAX_LENGTH],
|
|
||||||
[LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],
|
|
||||||
]
|
|
||||||
|
|
||||||
function makeSafeRe (value) {
|
|
||||||
for (var i = 0; i < safeRegexReplacements.length; i++) {
|
|
||||||
var token = safeRegexReplacements[i][0]
|
|
||||||
var max = safeRegexReplacements[i][1]
|
|
||||||
value = value
|
|
||||||
.split(token + '*').join(token + '{0,' + max + '}')
|
|
||||||
.split(token + '+').join(token + '{1,' + max + '}')
|
|
||||||
}
|
|
||||||
return value
|
|
||||||
}
|
|
||||||
|
|
||||||
// The following Regular Expressions can be used for tokenizing,
|
// The following Regular Expressions can be used for tokenizing,
|
||||||
// validating, and parsing SemVer version strings.
|
// validating, and parsing SemVer version strings.
|
||||||
|
|
||||||
@@ -5106,14 +5041,14 @@ function makeSafeRe (value) {
|
|||||||
tok('NUMERICIDENTIFIER')
|
tok('NUMERICIDENTIFIER')
|
||||||
src[t.NUMERICIDENTIFIER] = '0|[1-9]\\d*'
|
src[t.NUMERICIDENTIFIER] = '0|[1-9]\\d*'
|
||||||
tok('NUMERICIDENTIFIERLOOSE')
|
tok('NUMERICIDENTIFIERLOOSE')
|
||||||
src[t.NUMERICIDENTIFIERLOOSE] = '\\d+'
|
src[t.NUMERICIDENTIFIERLOOSE] = '[0-9]+'
|
||||||
|
|
||||||
// ## Non-numeric Identifier
|
// ## Non-numeric Identifier
|
||||||
// Zero or more digits, followed by a letter or hyphen, and then zero or
|
// Zero or more digits, followed by a letter or hyphen, and then zero or
|
||||||
// more letters, digits, or hyphens.
|
// more letters, digits, or hyphens.
|
||||||
|
|
||||||
tok('NONNUMERICIDENTIFIER')
|
tok('NONNUMERICIDENTIFIER')
|
||||||
src[t.NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-]' + LETTERDASHNUMBER + '*'
|
src[t.NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'
|
||||||
|
|
||||||
// ## Main Version
|
// ## Main Version
|
||||||
// Three dot-separated numeric identifiers.
|
// Three dot-separated numeric identifiers.
|
||||||
@@ -5155,7 +5090,7 @@ src[t.PRERELEASELOOSE] = '(?:-?(' + src[t.PRERELEASEIDENTIFIERLOOSE] +
|
|||||||
// Any combination of digits, letters, or hyphens.
|
// Any combination of digits, letters, or hyphens.
|
||||||
|
|
||||||
tok('BUILDIDENTIFIER')
|
tok('BUILDIDENTIFIER')
|
||||||
src[t.BUILDIDENTIFIER] = LETTERDASHNUMBER + '+'
|
src[t.BUILDIDENTIFIER] = '[0-9A-Za-z-]+'
|
||||||
|
|
||||||
// ## Build Metadata
|
// ## Build Metadata
|
||||||
// Plus sign, followed by one or more period-separated build metadata
|
// Plus sign, followed by one or more period-separated build metadata
|
||||||
@@ -5235,7 +5170,6 @@ src[t.COERCE] = '(^|[^\\d])' +
|
|||||||
'(?:$|[^\\d])'
|
'(?:$|[^\\d])'
|
||||||
tok('COERCERTL')
|
tok('COERCERTL')
|
||||||
re[t.COERCERTL] = new RegExp(src[t.COERCE], 'g')
|
re[t.COERCERTL] = new RegExp(src[t.COERCE], 'g')
|
||||||
safeRe[t.COERCERTL] = new RegExp(makeSafeRe(src[t.COERCE]), 'g')
|
|
||||||
|
|
||||||
// Tilde ranges.
|
// Tilde ranges.
|
||||||
// Meaning is "reasonably at or greater than"
|
// Meaning is "reasonably at or greater than"
|
||||||
@@ -5245,7 +5179,6 @@ src[t.LONETILDE] = '(?:~>?)'
|
|||||||
tok('TILDETRIM')
|
tok('TILDETRIM')
|
||||||
src[t.TILDETRIM] = '(\\s*)' + src[t.LONETILDE] + '\\s+'
|
src[t.TILDETRIM] = '(\\s*)' + src[t.LONETILDE] + '\\s+'
|
||||||
re[t.TILDETRIM] = new RegExp(src[t.TILDETRIM], 'g')
|
re[t.TILDETRIM] = new RegExp(src[t.TILDETRIM], 'g')
|
||||||
safeRe[t.TILDETRIM] = new RegExp(makeSafeRe(src[t.TILDETRIM]), 'g')
|
|
||||||
var tildeTrimReplace = '$1~'
|
var tildeTrimReplace = '$1~'
|
||||||
|
|
||||||
tok('TILDE')
|
tok('TILDE')
|
||||||
@@ -5261,7 +5194,6 @@ src[t.LONECARET] = '(?:\\^)'
|
|||||||
tok('CARETTRIM')
|
tok('CARETTRIM')
|
||||||
src[t.CARETTRIM] = '(\\s*)' + src[t.LONECARET] + '\\s+'
|
src[t.CARETTRIM] = '(\\s*)' + src[t.LONECARET] + '\\s+'
|
||||||
re[t.CARETTRIM] = new RegExp(src[t.CARETTRIM], 'g')
|
re[t.CARETTRIM] = new RegExp(src[t.CARETTRIM], 'g')
|
||||||
safeRe[t.CARETTRIM] = new RegExp(makeSafeRe(src[t.CARETTRIM]), 'g')
|
|
||||||
var caretTrimReplace = '$1^'
|
var caretTrimReplace = '$1^'
|
||||||
|
|
||||||
tok('CARET')
|
tok('CARET')
|
||||||
@@ -5283,7 +5215,6 @@ src[t.COMPARATORTRIM] = '(\\s*)' + src[t.GTLT] +
|
|||||||
|
|
||||||
// this one has to use the /g flag
|
// this one has to use the /g flag
|
||||||
re[t.COMPARATORTRIM] = new RegExp(src[t.COMPARATORTRIM], 'g')
|
re[t.COMPARATORTRIM] = new RegExp(src[t.COMPARATORTRIM], 'g')
|
||||||
safeRe[t.COMPARATORTRIM] = new RegExp(makeSafeRe(src[t.COMPARATORTRIM]), 'g')
|
|
||||||
var comparatorTrimReplace = '$1$2$3'
|
var comparatorTrimReplace = '$1$2$3'
|
||||||
|
|
||||||
// Something like `1.2.3 - 1.2.4`
|
// Something like `1.2.3 - 1.2.4`
|
||||||
@@ -5312,14 +5243,6 @@ for (var i = 0; i < R; i++) {
|
|||||||
debug(i, src[i])
|
debug(i, src[i])
|
||||||
if (!re[i]) {
|
if (!re[i]) {
|
||||||
re[i] = new RegExp(src[i])
|
re[i] = new RegExp(src[i])
|
||||||
|
|
||||||
// Replace all greedy whitespace to prevent regex dos issues. These regex are
|
|
||||||
// used internally via the safeRe object since all inputs in this library get
|
|
||||||
// normalized first to trim and collapse all extra whitespace. The original
|
|
||||||
// regexes are exported for userland consumption and lower level usage. A
|
|
||||||
// future breaking change could export the safer regex only with a note that
|
|
||||||
// all input should have extra whitespace removed.
|
|
||||||
safeRe[i] = new RegExp(makeSafeRe(src[i]))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5344,7 +5267,7 @@ function parse (version, options) {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
var r = options.loose ? safeRe[t.LOOSE] : safeRe[t.FULL]
|
var r = options.loose ? re[t.LOOSE] : re[t.FULL]
|
||||||
if (!r.test(version)) {
|
if (!r.test(version)) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
@@ -5399,7 +5322,7 @@ function SemVer (version, options) {
|
|||||||
this.options = options
|
this.options = options
|
||||||
this.loose = !!options.loose
|
this.loose = !!options.loose
|
||||||
|
|
||||||
var m = version.trim().match(options.loose ? safeRe[t.LOOSE] : safeRe[t.FULL])
|
var m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])
|
||||||
|
|
||||||
if (!m) {
|
if (!m) {
|
||||||
throw new TypeError('Invalid Version: ' + version)
|
throw new TypeError('Invalid Version: ' + version)
|
||||||
@@ -5844,7 +5767,6 @@ function Comparator (comp, options) {
|
|||||||
return new Comparator(comp, options)
|
return new Comparator(comp, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
comp = comp.trim().split(/\s+/).join(' ')
|
|
||||||
debug('comparator', comp, options)
|
debug('comparator', comp, options)
|
||||||
this.options = options
|
this.options = options
|
||||||
this.loose = !!options.loose
|
this.loose = !!options.loose
|
||||||
@@ -5861,7 +5783,7 @@ function Comparator (comp, options) {
|
|||||||
|
|
||||||
var ANY = {}
|
var ANY = {}
|
||||||
Comparator.prototype.parse = function (comp) {
|
Comparator.prototype.parse = function (comp) {
|
||||||
var r = this.options.loose ? safeRe[t.COMPARATORLOOSE] : safeRe[t.COMPARATOR]
|
var r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
|
||||||
var m = comp.match(r)
|
var m = comp.match(r)
|
||||||
|
|
||||||
if (!m) {
|
if (!m) {
|
||||||
@@ -5985,16 +5907,9 @@ function Range (range, options) {
|
|||||||
this.loose = !!options.loose
|
this.loose = !!options.loose
|
||||||
this.includePrerelease = !!options.includePrerelease
|
this.includePrerelease = !!options.includePrerelease
|
||||||
|
|
||||||
// First reduce all whitespace as much as possible so we do not have to rely
|
|
||||||
// on potentially slow regexes like \s*. This is then stored and used for
|
|
||||||
// future error messages as well.
|
|
||||||
this.raw = range
|
|
||||||
.trim()
|
|
||||||
.split(/\s+/)
|
|
||||||
.join(' ')
|
|
||||||
|
|
||||||
// First, split based on boolean or ||
|
// First, split based on boolean or ||
|
||||||
this.set = this.raw.split('||').map(function (range) {
|
this.raw = range
|
||||||
|
this.set = range.split(/\s*\|\|\s*/).map(function (range) {
|
||||||
return this.parseRange(range.trim())
|
return this.parseRange(range.trim())
|
||||||
}, this).filter(function (c) {
|
}, this).filter(function (c) {
|
||||||
// throw out any that are not relevant for whatever reason
|
// throw out any that are not relevant for whatever reason
|
||||||
@@ -6002,7 +5917,7 @@ function Range (range, options) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (!this.set.length) {
|
if (!this.set.length) {
|
||||||
throw new TypeError('Invalid SemVer Range: ' + this.raw)
|
throw new TypeError('Invalid SemVer Range: ' + range)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.format()
|
this.format()
|
||||||
@@ -6021,19 +5936,20 @@ Range.prototype.toString = function () {
|
|||||||
|
|
||||||
Range.prototype.parseRange = function (range) {
|
Range.prototype.parseRange = function (range) {
|
||||||
var loose = this.options.loose
|
var loose = this.options.loose
|
||||||
|
range = range.trim()
|
||||||
// `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
|
// `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
|
||||||
var hr = loose ? safeRe[t.HYPHENRANGELOOSE] : safeRe[t.HYPHENRANGE]
|
var hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]
|
||||||
range = range.replace(hr, hyphenReplace)
|
range = range.replace(hr, hyphenReplace)
|
||||||
debug('hyphen replace', range)
|
debug('hyphen replace', range)
|
||||||
// `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
|
// `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
|
||||||
range = range.replace(safeRe[t.COMPARATORTRIM], comparatorTrimReplace)
|
range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)
|
||||||
debug('comparator trim', range, safeRe[t.COMPARATORTRIM])
|
debug('comparator trim', range, re[t.COMPARATORTRIM])
|
||||||
|
|
||||||
// `~ 1.2.3` => `~1.2.3`
|
// `~ 1.2.3` => `~1.2.3`
|
||||||
range = range.replace(safeRe[t.TILDETRIM], tildeTrimReplace)
|
range = range.replace(re[t.TILDETRIM], tildeTrimReplace)
|
||||||
|
|
||||||
// `^ 1.2.3` => `^1.2.3`
|
// `^ 1.2.3` => `^1.2.3`
|
||||||
range = range.replace(safeRe[t.CARETTRIM], caretTrimReplace)
|
range = range.replace(re[t.CARETTRIM], caretTrimReplace)
|
||||||
|
|
||||||
// normalize spaces
|
// normalize spaces
|
||||||
range = range.split(/\s+/).join(' ')
|
range = range.split(/\s+/).join(' ')
|
||||||
@@ -6041,7 +5957,7 @@ Range.prototype.parseRange = function (range) {
|
|||||||
// At this point, the range is completely trimmed and
|
// At this point, the range is completely trimmed and
|
||||||
// ready to be split into comparators.
|
// ready to be split into comparators.
|
||||||
|
|
||||||
var compRe = loose ? safeRe[t.COMPARATORLOOSE] : safeRe[t.COMPARATOR]
|
var compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
|
||||||
var set = range.split(' ').map(function (comp) {
|
var set = range.split(' ').map(function (comp) {
|
||||||
return parseComparator(comp, this.options)
|
return parseComparator(comp, this.options)
|
||||||
}, this).join(' ').split(/\s+/)
|
}, this).join(' ').split(/\s+/)
|
||||||
@@ -6141,7 +6057,7 @@ function replaceTildes (comp, options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function replaceTilde (comp, options) {
|
function replaceTilde (comp, options) {
|
||||||
var r = options.loose ? safeRe[t.TILDELOOSE] : safeRe[t.TILDE]
|
var r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]
|
||||||
return comp.replace(r, function (_, M, m, p, pr) {
|
return comp.replace(r, function (_, M, m, p, pr) {
|
||||||
debug('tilde', comp, _, M, m, p, pr)
|
debug('tilde', comp, _, M, m, p, pr)
|
||||||
var ret
|
var ret
|
||||||
@@ -6182,7 +6098,7 @@ function replaceCarets (comp, options) {
|
|||||||
|
|
||||||
function replaceCaret (comp, options) {
|
function replaceCaret (comp, options) {
|
||||||
debug('caret', comp, options)
|
debug('caret', comp, options)
|
||||||
var r = options.loose ? safeRe[t.CARETLOOSE] : safeRe[t.CARET]
|
var r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]
|
||||||
return comp.replace(r, function (_, M, m, p, pr) {
|
return comp.replace(r, function (_, M, m, p, pr) {
|
||||||
debug('caret', comp, _, M, m, p, pr)
|
debug('caret', comp, _, M, m, p, pr)
|
||||||
var ret
|
var ret
|
||||||
@@ -6241,7 +6157,7 @@ function replaceXRanges (comp, options) {
|
|||||||
|
|
||||||
function replaceXRange (comp, options) {
|
function replaceXRange (comp, options) {
|
||||||
comp = comp.trim()
|
comp = comp.trim()
|
||||||
var r = options.loose ? safeRe[t.XRANGELOOSE] : safeRe[t.XRANGE]
|
var r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]
|
||||||
return comp.replace(r, function (ret, gtlt, M, m, p, pr) {
|
return comp.replace(r, function (ret, gtlt, M, m, p, pr) {
|
||||||
debug('xRange', comp, ret, gtlt, M, m, p, pr)
|
debug('xRange', comp, ret, gtlt, M, m, p, pr)
|
||||||
var xM = isX(M)
|
var xM = isX(M)
|
||||||
@@ -6316,7 +6232,7 @@ function replaceXRange (comp, options) {
|
|||||||
function replaceStars (comp, options) {
|
function replaceStars (comp, options) {
|
||||||
debug('replaceStars', comp, options)
|
debug('replaceStars', comp, options)
|
||||||
// Looseness is ignored here. star is always as loose as it gets!
|
// Looseness is ignored here. star is always as loose as it gets!
|
||||||
return comp.trim().replace(safeRe[t.STAR], '')
|
return comp.trim().replace(re[t.STAR], '')
|
||||||
}
|
}
|
||||||
|
|
||||||
// This function is passed to string.replace(re[t.HYPHENRANGE])
|
// This function is passed to string.replace(re[t.HYPHENRANGE])
|
||||||
@@ -6642,7 +6558,7 @@ function coerce (version, options) {
|
|||||||
|
|
||||||
var match = null
|
var match = null
|
||||||
if (!options.rtl) {
|
if (!options.rtl) {
|
||||||
match = version.match(safeRe[t.COERCE])
|
match = version.match(re[t.COERCE])
|
||||||
} else {
|
} else {
|
||||||
// Find the right-most coercible string that does not share
|
// Find the right-most coercible string that does not share
|
||||||
// a terminus with a more left-ward coercible string.
|
// a terminus with a more left-ward coercible string.
|
||||||
@@ -6653,17 +6569,17 @@ function coerce (version, options) {
|
|||||||
// Stop when we get a match that ends at the string end, since no
|
// Stop when we get a match that ends at the string end, since no
|
||||||
// coercible string can be more right-ward without the same terminus.
|
// coercible string can be more right-ward without the same terminus.
|
||||||
var next
|
var next
|
||||||
while ((next = safeRe[t.COERCERTL].exec(version)) &&
|
while ((next = re[t.COERCERTL].exec(version)) &&
|
||||||
(!match || match.index + match[0].length !== version.length)
|
(!match || match.index + match[0].length !== version.length)
|
||||||
) {
|
) {
|
||||||
if (!match ||
|
if (!match ||
|
||||||
next.index + next[0].length !== match.index + match[0].length) {
|
next.index + next[0].length !== match.index + match[0].length) {
|
||||||
match = next
|
match = next
|
||||||
}
|
}
|
||||||
safeRe[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length
|
re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length
|
||||||
}
|
}
|
||||||
// leave it in a clean state
|
// leave it in a clean state
|
||||||
safeRe[t.COERCERTL].lastIndex = -1
|
re[t.COERCERTL].lastIndex = -1
|
||||||
}
|
}
|
||||||
|
|
||||||
if (match === null) {
|
if (match === null) {
|
||||||
@@ -8128,43 +8044,35 @@ const coerce = (version, options) => {
|
|||||||
|
|
||||||
let match = null
|
let match = null
|
||||||
if (!options.rtl) {
|
if (!options.rtl) {
|
||||||
match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])
|
match = version.match(re[t.COERCE])
|
||||||
} else {
|
} else {
|
||||||
// Find the right-most coercible string that does not share
|
// Find the right-most coercible string that does not share
|
||||||
// a terminus with a more left-ward coercible string.
|
// a terminus with a more left-ward coercible string.
|
||||||
// Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'
|
// Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'
|
||||||
// With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'
|
|
||||||
//
|
//
|
||||||
// Walk through the string checking with a /g regexp
|
// Walk through the string checking with a /g regexp
|
||||||
// Manually set the index so as to pick up overlapping matches.
|
// Manually set the index so as to pick up overlapping matches.
|
||||||
// Stop when we get a match that ends at the string end, since no
|
// Stop when we get a match that ends at the string end, since no
|
||||||
// coercible string can be more right-ward without the same terminus.
|
// coercible string can be more right-ward without the same terminus.
|
||||||
const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]
|
|
||||||
let next
|
let next
|
||||||
while ((next = coerceRtlRegex.exec(version)) &&
|
while ((next = re[t.COERCERTL].exec(version)) &&
|
||||||
(!match || match.index + match[0].length !== version.length)
|
(!match || match.index + match[0].length !== version.length)
|
||||||
) {
|
) {
|
||||||
if (!match ||
|
if (!match ||
|
||||||
next.index + next[0].length !== match.index + match[0].length) {
|
next.index + next[0].length !== match.index + match[0].length) {
|
||||||
match = next
|
match = next
|
||||||
}
|
}
|
||||||
coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length
|
re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length
|
||||||
}
|
}
|
||||||
// leave it in a clean state
|
// leave it in a clean state
|
||||||
coerceRtlRegex.lastIndex = -1
|
re[t.COERCERTL].lastIndex = -1
|
||||||
}
|
}
|
||||||
|
|
||||||
if (match === null) {
|
if (match === null) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
const major = match[2]
|
return parse(`${match[2]}.${match[3] || '0'}.${match[4] || '0'}`, options)
|
||||||
const minor = match[3] || '0'
|
|
||||||
const patch = match[4] || '0'
|
|
||||||
const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''
|
|
||||||
const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''
|
|
||||||
|
|
||||||
return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)
|
|
||||||
}
|
}
|
||||||
module.exports = coerce
|
module.exports = coerce
|
||||||
|
|
||||||
@@ -8856,17 +8764,12 @@ createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`)
|
|||||||
|
|
||||||
// Coercion.
|
// Coercion.
|
||||||
// Extract anything that could conceivably be a part of a valid semver
|
// Extract anything that could conceivably be a part of a valid semver
|
||||||
createToken('COERCEPLAIN', `${'(^|[^\\d])' +
|
createToken('COERCE', `${'(^|[^\\d])' +
|
||||||
'(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +
|
'(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +
|
||||||
`(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +
|
`(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +
|
||||||
`(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)
|
`(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +
|
||||||
createToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\d])`)
|
|
||||||
createToken('COERCEFULL', src[t.COERCEPLAIN] +
|
|
||||||
`(?:${src[t.PRERELEASE]})?` +
|
|
||||||
`(?:${src[t.BUILD]})?` +
|
|
||||||
`(?:$|[^\\d])`)
|
`(?:$|[^\\d])`)
|
||||||
createToken('COERCERTL', src[t.COERCE], true)
|
createToken('COERCERTL', src[t.COERCE], true)
|
||||||
createToken('COERCERTLFULL', src[t.COERCEFULL], true)
|
|
||||||
|
|
||||||
// Tilde ranges.
|
// Tilde ranges.
|
||||||
// Meaning is "reasonably at or greater than"
|
// Meaning is "reasonably at or greater than"
|
||||||
|
|||||||
63
lib/installer.js
generated
63
lib/installer.js
generated
@@ -150,46 +150,16 @@ function getNightlyFileName(arch) {
|
|||||||
let fileExt1;
|
let fileExt1;
|
||||||
[fileExt1, ,] = getDesiredFileExts();
|
[fileExt1, ,] = getDesiredFileExts();
|
||||||
if (osPlat == 'win32') {
|
if (osPlat == 'win32') {
|
||||||
if (arch == 'x86') {
|
versionExt = arch == 'x64' ? '-win64' : '-win32';
|
||||||
versionExt = '-win32';
|
|
||||||
}
|
|
||||||
else if (arch == 'aarch64') {
|
|
||||||
throw new Error('Aarch64 Julia is not available on Windows');
|
|
||||||
}
|
|
||||||
else if (arch == 'x64') {
|
|
||||||
versionExt = '-win64';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new Error(`Architecture ${arch} is not supported on Windows`);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (osPlat == 'darwin') {
|
else if (osPlat == 'darwin') {
|
||||||
if (arch == 'x86') {
|
if (arch == 'x86') {
|
||||||
throw new Error('32-bit (x86) Julia is not available on macOS');
|
throw new Error('32-bit Julia is not available on macOS');
|
||||||
}
|
|
||||||
else if (arch == 'aarch64') {
|
|
||||||
versionExt = '-macaarch64';
|
|
||||||
}
|
|
||||||
else if (arch == 'x64') {
|
|
||||||
versionExt = '-mac64';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new Error(`Architecture ${arch} is not supported on macOS`);
|
|
||||||
}
|
}
|
||||||
|
versionExt = '-mac64';
|
||||||
}
|
}
|
||||||
else if (osPlat === 'linux') {
|
else if (osPlat === 'linux') {
|
||||||
if (arch == 'x86') {
|
versionExt = arch == 'x64' ? '-linux64' : '-linux32';
|
||||||
versionExt = '-linux32';
|
|
||||||
}
|
|
||||||
else if (arch == 'aarch64') {
|
|
||||||
versionExt = '-linux-aarch64';
|
|
||||||
}
|
|
||||||
else if (arch == 'x64') {
|
|
||||||
versionExt = '-linux64';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new Error(`Architecture ${arch} is not supported on Linux`);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw new Error(`Platform ${osPlat} is not supported`);
|
throw new Error(`Platform ${osPlat} is not supported`);
|
||||||
@@ -246,7 +216,7 @@ function getDownloadURL(fileInfo, version, arch) {
|
|||||||
return fileInfo.url;
|
return fileInfo.url;
|
||||||
}
|
}
|
||||||
exports.getDownloadURL = getDownloadURL;
|
exports.getDownloadURL = getDownloadURL;
|
||||||
function installJulia(dest, versionInfo, version, arch) {
|
function installJulia(versionInfo, version, arch) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
// Download Julia
|
// Download Julia
|
||||||
const fileInfo = getFileInfo(versionInfo, version, arch);
|
const fileInfo = getFileInfo(versionInfo, version, arch);
|
||||||
@@ -273,40 +243,39 @@ function installJulia(dest, versionInfo, version, arch) {
|
|||||||
else {
|
else {
|
||||||
core.debug('Skipping checksum check for nightly binaries.');
|
core.debug('Skipping checksum check for nightly binaries.');
|
||||||
}
|
}
|
||||||
|
const tempInstallDir = fs.mkdtempSync(`julia-${arch}-${version}-`);
|
||||||
// Install it
|
// Install it
|
||||||
switch (osPlat) {
|
switch (osPlat) {
|
||||||
case 'linux':
|
case 'linux':
|
||||||
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
||||||
yield exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', dest]);
|
yield exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', tempInstallDir]);
|
||||||
return dest;
|
return tempInstallDir;
|
||||||
case 'win32':
|
case 'win32':
|
||||||
if (fileInfo !== null && fileInfo.extension == 'exe') {
|
if (fileInfo !== null && fileInfo.extension == 'exe') {
|
||||||
if (version.endsWith('nightly') || semver.gtr(version, '1.3', { includePrerelease: true })) {
|
if (version.endsWith('nightly') || semver.gtr(version, '1.3', { includePrerelease: true })) {
|
||||||
// The installer changed in 1.4: https://github.com/JuliaLang/julia/blob/ef0c9108b12f3ae177c51037934351ffa703b0b5/NEWS.md#build-system-changes
|
// The installer changed in 1.4: https://github.com/JuliaLang/julia/blob/ef0c9108b12f3ae177c51037934351ffa703b0b5/NEWS.md#build-system-changes
|
||||||
yield exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/SILENT /dir=${path.join(process.cwd(), dest)}" -NoNewWindow -Wait`]);
|
yield exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/SILENT /dir=${path.join(process.cwd(), tempInstallDir)}" -NoNewWindow -Wait`]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
yield exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/S /D=${path.join(process.cwd(), dest)}" -NoNewWindow -Wait`]);
|
yield exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/S /D=${path.join(process.cwd(), tempInstallDir)}" -NoNewWindow -Wait`]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// This is the more common path. Using .tar.gz is much faster
|
// This is the more common path. Using .tar.gz is much faster
|
||||||
// don't use the Git bash provided tar. Issue #205
|
yield exec.exec('powershell', ['-Command', `tar xf ${juliaDownloadPath} --strip-components=1 -C ${tempInstallDir}`]);
|
||||||
// https://github.com/julia-actions/setup-julia/issues/205
|
|
||||||
yield exec.exec('powershell', ['-Command', `& "$env:WINDIR/System32/tar" xf ${juliaDownloadPath} --strip-components=1 -C ${dest}`]);
|
|
||||||
}
|
}
|
||||||
return dest;
|
return tempInstallDir;
|
||||||
case 'darwin':
|
case 'darwin':
|
||||||
if (fileInfo !== null && fileInfo.extension == 'dmg') {
|
if (fileInfo !== null && fileInfo.extension == 'dmg') {
|
||||||
core.debug(`Support for .dmg files is deprecated and may be removed in a future release`);
|
core.debug(`Support for .dmg files is deprecated and may be removed in a future release`);
|
||||||
yield exec.exec('hdiutil', ['attach', juliaDownloadPath]);
|
yield exec.exec('hdiutil', ['attach', juliaDownloadPath]);
|
||||||
yield exec.exec('/bin/bash', ['-c', `cp -a /Volumes/Julia-*/Julia-*.app/Contents/Resources/julia ${dest}`]);
|
yield exec.exec('/bin/bash', ['-c', `cp -a /Volumes/Julia-*/Julia-*.app/Contents/Resources/julia ${tempInstallDir}`]);
|
||||||
return path.join(dest, 'julia');
|
return path.join(tempInstallDir, 'julia');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
||||||
yield exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', dest]);
|
yield exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', tempInstallDir]);
|
||||||
return dest;
|
return tempInstallDir;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
throw new Error(`Platform ${osPlat} is not supported`);
|
throw new Error(`Platform ${osPlat} is not supported`);
|
||||||
|
|||||||
16
lib/setup-julia.js
generated
16
lib/setup-julia.js
generated
@@ -91,18 +91,12 @@ function run() {
|
|||||||
juliaPath = tc.find('julia', version, arch);
|
juliaPath = tc.find('julia', version, arch);
|
||||||
if (!juliaPath) {
|
if (!juliaPath) {
|
||||||
core.debug(`could not find Julia ${arch}/${version} in cache`);
|
core.debug(`could not find Julia ${arch}/${version} in cache`);
|
||||||
// https://github.com/julia-actions/setup-julia/pull/196
|
const juliaInstallationPath = yield installer.installJulia(versionInfo, version, arch);
|
||||||
// we want julia to be installed with unmodified file mtimes
|
// Add it to cache
|
||||||
// but `tc.cacheDir` uses `cp` internally which destroys mtime
|
juliaPath = yield tc.cacheDir(juliaInstallationPath, 'julia', version, arch);
|
||||||
// and `tc` provides no API to get the tool directory alone
|
|
||||||
// so hack it by installing a empty directory then use the path it returns
|
|
||||||
// and extract the archives directly to that location
|
|
||||||
const emptyDir = fs.mkdtempSync('empty');
|
|
||||||
juliaPath = yield tc.cacheDir(emptyDir, 'julia', version, arch);
|
|
||||||
yield installer.installJulia(juliaPath, versionInfo, version, arch);
|
|
||||||
core.debug(`added Julia to cache: ${juliaPath}`);
|
core.debug(`added Julia to cache: ${juliaPath}`);
|
||||||
// Remove empty dir
|
// Remove temporary dir
|
||||||
fs.rmdirSync(emptyDir);
|
fs.rmSync(juliaInstallationPath, { recursive: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
core.debug(`using cached version of Julia: ${juliaPath}`);
|
core.debug(`using cached version of Julia: ${juliaPath}`);
|
||||||
|
|||||||
1958
package-lock.json
generated
1958
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
30
package.json
30
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "setup-julia",
|
"name": "setup-julia",
|
||||||
"version": "2.1.0",
|
"version": "1.9.4",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "setup Julia action",
|
"description": "setup Julia action",
|
||||||
"main": "lib/setup-julia.js",
|
"main": "lib/setup-julia.js",
|
||||||
@@ -21,25 +21,25 @@
|
|||||||
"author": "Sascha Mann <git@mail.saschamann.eu>",
|
"author": "Sascha Mann <git@mail.saschamann.eu>",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.10.1",
|
"@actions/core": "^1.10.0",
|
||||||
"@actions/exec": "^1.1.1",
|
"@actions/exec": "^1.1.1",
|
||||||
"@actions/io": "^1.1.3",
|
"@actions/io": "^1.1.3",
|
||||||
"@actions/tool-cache": "^2.0.1",
|
"@actions/tool-cache": "^2.0.1",
|
||||||
"async-retry": "^1.3.3",
|
"async-retry": "^1.3.3",
|
||||||
"semver": "^7.6.0"
|
"semver": "^7.5.4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/async-retry": "^1.4.8",
|
"@types/async-retry": "^1.4.5",
|
||||||
"@types/jest": "^29.5.12",
|
"@types/jest": "^29.5.0",
|
||||||
"@types/node": "^20.12.8",
|
"@types/node": "^18.14.2",
|
||||||
"@types/retry": "^0.12.5",
|
"@types/retry": "^0.12.2",
|
||||||
"@types/semver": "^7.5.8",
|
"@types/semver": "^7.5.6",
|
||||||
"@vercel/ncc": "^0.38.1",
|
"@vercel/ncc": "^0.36.1",
|
||||||
"jest": "^29.7.0",
|
"jest": "^29.5.0",
|
||||||
"jest-circus": "^29.7.0",
|
"jest-circus": "^29.5.0",
|
||||||
"nock": "^13.5.4",
|
"nock": "^13.3.8",
|
||||||
"prettier": "^3.2.5",
|
"prettier": "^3.1.0",
|
||||||
"ts-jest": "^29.1.2",
|
"ts-jest": "^29.0.5",
|
||||||
"typescript": "^5.4.5"
|
"typescript": "^5.3.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -124,35 +124,14 @@ function getNightlyFileName(arch: string): string {
|
|||||||
[fileExt1, , ] = getDesiredFileExts()
|
[fileExt1, , ] = getDesiredFileExts()
|
||||||
|
|
||||||
if (osPlat == 'win32') {
|
if (osPlat == 'win32') {
|
||||||
if (arch == 'x86') {
|
versionExt = arch == 'x64' ? '-win64' : '-win32'
|
||||||
versionExt = '-win32'
|
|
||||||
} else if (arch == 'aarch64') {
|
|
||||||
throw new Error('Aarch64 Julia is not available on Windows')
|
|
||||||
} else if (arch == 'x64') {
|
|
||||||
versionExt = '-win64'
|
|
||||||
} else {
|
|
||||||
throw new Error(`Architecture ${arch} is not supported on Windows`)
|
|
||||||
}
|
|
||||||
} else if (osPlat == 'darwin') {
|
} else if (osPlat == 'darwin') {
|
||||||
if (arch == 'x86') {
|
if (arch == 'x86') {
|
||||||
throw new Error('32-bit (x86) Julia is not available on macOS')
|
throw new Error('32-bit Julia is not available on macOS')
|
||||||
} else if (arch == 'aarch64') {
|
|
||||||
versionExt = '-macaarch64'
|
|
||||||
} else if (arch == 'x64') {
|
|
||||||
versionExt = '-mac64'
|
|
||||||
} else {
|
|
||||||
throw new Error(`Architecture ${arch} is not supported on macOS`)
|
|
||||||
}
|
}
|
||||||
|
versionExt = '-mac64'
|
||||||
} else if (osPlat === 'linux') {
|
} else if (osPlat === 'linux') {
|
||||||
if (arch == 'x86') {
|
versionExt = arch == 'x64' ? '-linux64' : '-linux32'
|
||||||
versionExt = '-linux32'
|
|
||||||
} else if (arch == 'aarch64') {
|
|
||||||
versionExt = '-linux-aarch64'
|
|
||||||
} else if (arch == 'x64') {
|
|
||||||
versionExt = '-linux64'
|
|
||||||
} else {
|
|
||||||
throw new Error(`Architecture ${arch} is not supported on Linux`)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`Platform ${osPlat} is not supported`)
|
throw new Error(`Platform ${osPlat} is not supported`)
|
||||||
}
|
}
|
||||||
@@ -219,7 +198,7 @@ export function getDownloadURL(fileInfo, version: string, arch: string): string
|
|||||||
return fileInfo.url
|
return fileInfo.url
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function installJulia(dest: string, versionInfo, version: string, arch: string): Promise<string> {
|
export async function installJulia(versionInfo, version: string, arch: string): Promise<string> {
|
||||||
// Download Julia
|
// Download Julia
|
||||||
const fileInfo = getFileInfo(versionInfo, version, arch)
|
const fileInfo = getFileInfo(versionInfo, version, arch)
|
||||||
const downloadURL = getDownloadURL(fileInfo, version, arch)
|
const downloadURL = getDownloadURL(fileInfo, version, arch)
|
||||||
@@ -247,37 +226,37 @@ export async function installJulia(dest: string, versionInfo, version: string, a
|
|||||||
core.debug('Skipping checksum check for nightly binaries.')
|
core.debug('Skipping checksum check for nightly binaries.')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const tempInstallDir = fs.mkdtempSync(`julia-${arch}-${version}-`)
|
||||||
|
|
||||||
// Install it
|
// Install it
|
||||||
switch (osPlat) {
|
switch (osPlat) {
|
||||||
case 'linux':
|
case 'linux':
|
||||||
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
||||||
await exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', dest])
|
await exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', tempInstallDir])
|
||||||
return dest
|
return tempInstallDir
|
||||||
case 'win32':
|
case 'win32':
|
||||||
if (fileInfo !== null && fileInfo.extension == 'exe') {
|
if (fileInfo !== null && fileInfo.extension == 'exe') {
|
||||||
if (version.endsWith('nightly') || semver.gtr(version, '1.3', {includePrerelease: true})) {
|
if (version.endsWith('nightly') || semver.gtr(version, '1.3', {includePrerelease: true})) {
|
||||||
// The installer changed in 1.4: https://github.com/JuliaLang/julia/blob/ef0c9108b12f3ae177c51037934351ffa703b0b5/NEWS.md#build-system-changes
|
// The installer changed in 1.4: https://github.com/JuliaLang/julia/blob/ef0c9108b12f3ae177c51037934351ffa703b0b5/NEWS.md#build-system-changes
|
||||||
await exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/SILENT /dir=${path.join(process.cwd(), dest)}" -NoNewWindow -Wait`])
|
await exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/SILENT /dir=${path.join(process.cwd(), tempInstallDir)}" -NoNewWindow -Wait`])
|
||||||
} else {
|
} else {
|
||||||
await exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/S /D=${path.join(process.cwd(), dest)}" -NoNewWindow -Wait`])
|
await exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/S /D=${path.join(process.cwd(), tempInstallDir)}" -NoNewWindow -Wait`])
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// This is the more common path. Using .tar.gz is much faster
|
// This is the more common path. Using .tar.gz is much faster
|
||||||
// don't use the Git bash provided tar. Issue #205
|
await exec.exec('powershell', ['-Command', `tar xf ${juliaDownloadPath} --strip-components=1 -C ${tempInstallDir}`])
|
||||||
// https://github.com/julia-actions/setup-julia/issues/205
|
|
||||||
await exec.exec('powershell', ['-Command', `& "$env:WINDIR/System32/tar" xf ${juliaDownloadPath} --strip-components=1 -C ${dest}`])
|
|
||||||
}
|
}
|
||||||
return dest
|
return tempInstallDir
|
||||||
case 'darwin':
|
case 'darwin':
|
||||||
if (fileInfo !== null && fileInfo.extension == 'dmg') {
|
if (fileInfo !== null && fileInfo.extension == 'dmg') {
|
||||||
core.debug(`Support for .dmg files is deprecated and may be removed in a future release`)
|
core.debug(`Support for .dmg files is deprecated and may be removed in a future release`)
|
||||||
await exec.exec('hdiutil', ['attach', juliaDownloadPath])
|
await exec.exec('hdiutil', ['attach', juliaDownloadPath])
|
||||||
await exec.exec('/bin/bash', ['-c', `cp -a /Volumes/Julia-*/Julia-*.app/Contents/Resources/julia ${dest}`])
|
await exec.exec('/bin/bash', ['-c', `cp -a /Volumes/Julia-*/Julia-*.app/Contents/Resources/julia ${tempInstallDir}`])
|
||||||
return path.join(dest, 'julia')
|
return path.join(tempInstallDir, 'julia')
|
||||||
} else {
|
} else {
|
||||||
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
||||||
await exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', dest])
|
await exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', tempInstallDir])
|
||||||
return dest
|
return tempInstallDir
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
throw new Error(`Platform ${osPlat} is not supported`)
|
throw new Error(`Platform ${osPlat} is not supported`)
|
||||||
|
|||||||
@@ -69,21 +69,14 @@ async function run() {
|
|||||||
|
|
||||||
if (!juliaPath) {
|
if (!juliaPath) {
|
||||||
core.debug(`could not find Julia ${arch}/${version} in cache`)
|
core.debug(`could not find Julia ${arch}/${version} in cache`)
|
||||||
|
const juliaInstallationPath = await installer.installJulia(versionInfo, version, arch)
|
||||||
|
|
||||||
// https://github.com/julia-actions/setup-julia/pull/196
|
// Add it to cache
|
||||||
// we want julia to be installed with unmodified file mtimes
|
juliaPath = await tc.cacheDir(juliaInstallationPath, 'julia', version, arch)
|
||||||
// but `tc.cacheDir` uses `cp` internally which destroys mtime
|
|
||||||
// and `tc` provides no API to get the tool directory alone
|
|
||||||
// so hack it by installing a empty directory then use the path it returns
|
|
||||||
// and extract the archives directly to that location
|
|
||||||
const emptyDir = fs.mkdtempSync('empty')
|
|
||||||
juliaPath = await tc.cacheDir(emptyDir, 'julia', version, arch)
|
|
||||||
await installer.installJulia(juliaPath, versionInfo, version, arch)
|
|
||||||
|
|
||||||
core.debug(`added Julia to cache: ${juliaPath}`)
|
core.debug(`added Julia to cache: ${juliaPath}`)
|
||||||
|
|
||||||
// Remove empty dir
|
// Remove temporary dir
|
||||||
fs.rmdirSync(emptyDir)
|
fs.rmSync(juliaInstallationPath, {recursive: true})
|
||||||
} else {
|
} else {
|
||||||
core.debug(`using cached version of Julia: ${juliaPath}`)
|
core.debug(`using cached version of Julia: ${juliaPath}`)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user