mirror of https://github.com/actions/setup-python
Consume toolkit from npmjs (#12)
This commit is contained in:
parent
ae4917dae5
commit
24b4fa76d2
|
@ -1,2 +1,2 @@
|
||||||
!node_modules/
|
!node_modules/
|
||||||
__tests__/runner/*
|
__tests__/runner/*
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
{
|
{
|
||||||
"printWidth": 80,
|
"printWidth": 80,
|
||||||
"tabWidth": 2,
|
"tabWidth": 2,
|
||||||
"useTabs": false,
|
"useTabs": false,
|
||||||
"semi": true,
|
"semi": true,
|
||||||
"singleQuote": true,
|
"singleQuote": true,
|
||||||
"trailingComma": "none",
|
"trailingComma": "none",
|
||||||
"bracketSpacing": false,
|
"bracketSpacing": false,
|
||||||
"arrowParens": "avoid",
|
"arrowParens": "avoid",
|
||||||
"parser": "typescript"
|
"parser": "typescript"
|
||||||
}
|
}
|
42
LICENSE
42
LICENSE
|
@ -1,22 +1,22 @@
|
||||||
|
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2018 GitHub, Inc. and contributors
|
Copyright (c) 2018 GitHub, Inc. and contributors
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
in the Software without restriction, including without limitation the rights
|
in the Software without restriction, including without limitation the rights
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
furnished to do so, subject to the following conditions:
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
The above copyright notice and this permission notice shall be included in
|
||||||
all copies or substantial portions of the Software.
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
104
README.md
104
README.md
|
@ -1,52 +1,52 @@
|
||||||
# setup-python
|
# setup-python
|
||||||
|
|
||||||
<p align="left">
|
<p align="left">
|
||||||
<a href="https://github.com/actions/setup-python"><img alt="GitHub Actions status" src="https://github.com/actions/setup-python/workflows/Main%20workflow/badge.svg"></a>
|
<a href="https://github.com/actions/setup-python"><img alt="GitHub Actions status" src="https://github.com/actions/setup-python/workflows/Main%20workflow/badge.svg"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
This action sets up a python environment for use in actions by:
|
This action sets up a python environment for use in actions by:
|
||||||
|
|
||||||
- optionally installing a version of python and adding to PATH. Note that this action only uses versions of Python already installed in the cache. The action will fail if no matching versions are found.
|
- optionally installing a version of python and adding to PATH. Note that this action only uses versions of Python already installed in the cache. The action will fail if no matching versions are found.
|
||||||
- registering problem matchers for error output
|
- registering problem matchers for error output
|
||||||
|
|
||||||
# Usage
|
# Usage
|
||||||
|
|
||||||
See [action.yml](action.yml)
|
See [action.yml](action.yml)
|
||||||
|
|
||||||
Basic:
|
Basic:
|
||||||
```yaml
|
```yaml
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@master
|
- uses: actions/checkout@master
|
||||||
- uses: actions/setup-python@v1
|
- uses: actions/setup-python@v1
|
||||||
with:
|
with:
|
||||||
python-version: '3.x' # Version range or exact version of a Python version to use, using semvers version range syntax.
|
python-version: '3.x' # Version range or exact version of a Python version to use, using semvers version range syntax.
|
||||||
architecture: 'x64' # (x64 or x86)
|
architecture: 'x64' # (x64 or x86)
|
||||||
- run: python my_script.py
|
- run: python my_script.py
|
||||||
```
|
```
|
||||||
|
|
||||||
Matrix Testing:
|
Matrix Testing:
|
||||||
```yaml
|
```yaml
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-16.04
|
runs-on: ubuntu-16.04
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
python: [ '2.x', '3.x', 'pypy3' ]
|
python: [ '2.x', '3.x', 'pypy3' ]
|
||||||
name: Python ${{ matrix.python }} sample
|
name: Python ${{ matrix.python }} sample
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@master
|
- uses: actions/checkout@master
|
||||||
- name: Setup python
|
- name: Setup python
|
||||||
uses: actions/setup-python@v1
|
uses: actions/setup-python@v1
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python }}
|
python-version: ${{ matrix.python }}
|
||||||
architecture: x64
|
architecture: x64
|
||||||
- run: python my_script.py
|
- run: python my_script.py
|
||||||
```
|
```
|
||||||
|
|
||||||
# License
|
# License
|
||||||
|
|
||||||
The scripts and documentation in this project are released under the [MIT License](LICENSE)
|
The scripts and documentation in this project are released under the [MIT License](LICENSE)
|
||||||
|
|
||||||
# Contributions
|
# Contributions
|
||||||
|
|
||||||
Contributions are welcome! See [Contributor's Guide](docs/contributors.md)
|
Contributions are welcome! See [Contributor's Guide](docs/contributors.md)
|
||||||
|
|
|
@ -1,58 +1,58 @@
|
||||||
import io = require('@actions/io');
|
import io = require('@actions/io');
|
||||||
import fs = require('fs');
|
import fs = require('fs');
|
||||||
import path = require('path');
|
import path = require('path');
|
||||||
|
|
||||||
const toolDir = path.join(
|
const toolDir = path.join(
|
||||||
__dirname,
|
__dirname,
|
||||||
'runner',
|
'runner',
|
||||||
path.join(
|
path.join(
|
||||||
Math.random()
|
Math.random()
|
||||||
.toString(36)
|
.toString(36)
|
||||||
.substring(7)
|
.substring(7)
|
||||||
),
|
),
|
||||||
'tools'
|
'tools'
|
||||||
);
|
);
|
||||||
const tempDir = path.join(
|
const tempDir = path.join(
|
||||||
__dirname,
|
__dirname,
|
||||||
'runner',
|
'runner',
|
||||||
path.join(
|
path.join(
|
||||||
Math.random()
|
Math.random()
|
||||||
.toString(36)
|
.toString(36)
|
||||||
.substring(7)
|
.substring(7)
|
||||||
),
|
),
|
||||||
'temp'
|
'temp'
|
||||||
);
|
);
|
||||||
|
|
||||||
process.env['RUNNER_TOOL_CACHE'] = toolDir;
|
process.env['RUNNER_TOOL_CACHE'] = toolDir;
|
||||||
process.env['RUNNER_TEMP'] = tempDir;
|
process.env['RUNNER_TEMP'] = tempDir;
|
||||||
|
|
||||||
import * as finder from '../src/find-python';
|
import * as finder from '../src/find-python';
|
||||||
|
|
||||||
describe('Finder tests', () => {
|
describe('Finder tests', () => {
|
||||||
it('Finds Python if it is installed', async () => {
|
it('Finds Python if it is installed', async () => {
|
||||||
const pythonDir: string = path.join(toolDir, 'Python', '3.0.0', 'x64');
|
const pythonDir: string = path.join(toolDir, 'Python', '3.0.0', 'x64');
|
||||||
await io.mkdirP(pythonDir);
|
await io.mkdirP(pythonDir);
|
||||||
fs.writeFileSync(`${pythonDir}.complete`, 'hello');
|
fs.writeFileSync(`${pythonDir}.complete`, 'hello');
|
||||||
// This will throw if it doesn't find it in the cache (because no such version exists)
|
// This will throw if it doesn't find it in the cache (because no such version exists)
|
||||||
await finder.findPythonVersion('3.x', 'x64');
|
await finder.findPythonVersion('3.x', 'x64');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Errors if Python is not installed', async () => {
|
it('Errors if Python is not installed', async () => {
|
||||||
// This will throw if it doesn't find it in the cache (because no such version exists)
|
// This will throw if it doesn't find it in the cache (because no such version exists)
|
||||||
let thrown = false;
|
let thrown = false;
|
||||||
try {
|
try {
|
||||||
await finder.findPythonVersion('3.300000', 'x64');
|
await finder.findPythonVersion('3.300000', 'x64');
|
||||||
} catch {
|
} catch {
|
||||||
thrown = true;
|
thrown = true;
|
||||||
}
|
}
|
||||||
expect(thrown).toBeTruthy();
|
expect(thrown).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Finds PyPy if it is installed', async () => {
|
it('Finds PyPy if it is installed', async () => {
|
||||||
const pythonDir: string = path.join(toolDir, 'PyPy', '2.0.0', 'x64');
|
const pythonDir: string = path.join(toolDir, 'PyPy', '2.0.0', 'x64');
|
||||||
await io.mkdirP(pythonDir);
|
await io.mkdirP(pythonDir);
|
||||||
fs.writeFileSync(`${pythonDir}.complete`, 'hello');
|
fs.writeFileSync(`${pythonDir}.complete`, 'hello');
|
||||||
// This will throw if it doesn't find it in the cache (because no such version exists)
|
// This will throw if it doesn't find it in the cache (because no such version exists)
|
||||||
await finder.findPythonVersion('pypy2', 'x64');
|
await finder.findPythonVersion('pypy2', 'x64');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
32
action.yml
32
action.yml
|
@ -1,16 +1,16 @@
|
||||||
name: 'Setup Python environment'
|
name: 'Setup Python environment'
|
||||||
description: 'Setup a Python environment and add it to the PATH, additionally providing proxy support'
|
description: 'Setup a Python environment and add it to the PATH, additionally providing proxy support'
|
||||||
author: 'GitHub'
|
author: 'GitHub'
|
||||||
inputs:
|
inputs:
|
||||||
python-version:
|
python-version:
|
||||||
description: 'Version range or exact version of a Python version to use, using semvers version range syntax.'
|
description: 'Version range or exact version of a Python version to use, using semvers version range syntax.'
|
||||||
default: '3.x'
|
default: '3.x'
|
||||||
architecture:
|
architecture:
|
||||||
description: 'The target architecture (x86, x64) of the Python interpreter.'
|
description: 'The target architecture (x86, x64) of the Python interpreter.'
|
||||||
default: 'x64'
|
default: 'x64'
|
||||||
# Deprecated option, do not use. Will not be supported after October 1, 2019
|
# Deprecated option, do not use. Will not be supported after October 1, 2019
|
||||||
version:
|
version:
|
||||||
description: 'Deprecated. Use python-version instead. Will not be supported after October 1, 2019'
|
description: 'Deprecated. Use python-version instead. Will not be supported after October 1, 2019'
|
||||||
runs:
|
runs:
|
||||||
using: 'node12'
|
using: 'node12'
|
||||||
main: 'lib/setup-python.js'
|
main: 'lib/setup-python.js'
|
||||||
|
|
|
@ -1,22 +1,22 @@
|
||||||
# Contributors
|
# Contributors
|
||||||
|
|
||||||
### Checkin
|
### Checkin
|
||||||
|
|
||||||
- Do checkin source (src)
|
- Do checkin source (src)
|
||||||
- Do checkin build output (lib)
|
- Do checkin build output (lib)
|
||||||
- Do checkin runtime node_modules
|
- Do checkin runtime node_modules
|
||||||
- Do not checkin devDependency node_modules (husky can help see below)
|
- Do not checkin devDependency node_modules (husky can help see below)
|
||||||
|
|
||||||
### devDependencies
|
### devDependencies
|
||||||
|
|
||||||
In order to handle correctly checking in node_modules without devDependencies, we run [Husky](https://github.com/typicode/husky) before each commit.
|
In order to handle correctly checking in node_modules without devDependencies, we run [Husky](https://github.com/typicode/husky) before each commit.
|
||||||
This step ensures that formatting and checkin rules are followed and that devDependencies are excluded. To make sure Husky runs correctly, please use the following workflow:
|
This step ensures that formatting and checkin rules are followed and that devDependencies are excluded. To make sure Husky runs correctly, please use the following workflow:
|
||||||
|
|
||||||
```
|
```
|
||||||
npm install # installs all devDependencies including Husky
|
npm install # installs all devDependencies including Husky
|
||||||
git add abc.ext # Add the files you've changed. This should include files in src, lib, and node_modules (see above)
|
git add abc.ext # Add the files you've changed. This should include files in src, lib, and node_modules (see above)
|
||||||
git commit -m "Informative commit message" # Commit. This will run Husky
|
git commit -m "Informative commit message" # Commit. This will run Husky
|
||||||
```
|
```
|
||||||
|
|
||||||
During the commit step, Husky will take care of formatting all files with [Prettier](https://github.com/prettier/prettier) as well as pruning out devDependencies using `npm prune --production`.
|
During the commit step, Husky will take care of formatting all files with [Prettier](https://github.com/prettier/prettier) as well as pruning out devDependencies using `npm prune --production`.
|
||||||
It will also make sure these changes are appropriately included in your commit (no further work is needed)
|
It will also make sure these changes are appropriately included in your commit (no further work is needed)
|
|
@ -1,11 +1,11 @@
|
||||||
module.exports = {
|
module.exports = {
|
||||||
clearMocks: true,
|
clearMocks: true,
|
||||||
moduleFileExtensions: ['js', 'ts'],
|
moduleFileExtensions: ['js', 'ts'],
|
||||||
testEnvironment: 'node',
|
testEnvironment: 'node',
|
||||||
testMatch: ['**/*.test.ts'],
|
testMatch: ['**/*.test.ts'],
|
||||||
testRunner: 'jest-circus/runner',
|
testRunner: 'jest-circus/runner',
|
||||||
transform: {
|
transform: {
|
||||||
'^.+\\.ts$': 'ts-jest'
|
'^.+\\.ts$': 'ts-jest'
|
||||||
},
|
},
|
||||||
verbose: true
|
verbose: true
|
||||||
}
|
}
|
|
@ -1,159 +1,159 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||||
return new (P || (P = Promise))(function (resolve, reject) {
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
var __importStar = (this && this.__importStar) || function (mod) {
|
var __importStar = (this && this.__importStar) || function (mod) {
|
||||||
if (mod && mod.__esModule) return mod;
|
if (mod && mod.__esModule) return mod;
|
||||||
var result = {};
|
var result = {};
|
||||||
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
||||||
result["default"] = mod;
|
result["default"] = mod;
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const os = __importStar(require("os"));
|
const os = __importStar(require("os"));
|
||||||
const path = __importStar(require("path"));
|
const path = __importStar(require("path"));
|
||||||
const semver = __importStar(require("semver"));
|
const semver = __importStar(require("semver"));
|
||||||
let cacheDirectory = process.env['RUNNER_TOOLSDIRECTORY'] || '';
|
let cacheDirectory = process.env['RUNNER_TOOLSDIRECTORY'] || '';
|
||||||
if (!cacheDirectory) {
|
if (!cacheDirectory) {
|
||||||
let baseLocation;
|
let baseLocation;
|
||||||
if (process.platform === 'win32') {
|
if (process.platform === 'win32') {
|
||||||
// On windows use the USERPROFILE env variable
|
// On windows use the USERPROFILE env variable
|
||||||
baseLocation = process.env['USERPROFILE'] || 'C:\\';
|
baseLocation = process.env['USERPROFILE'] || 'C:\\';
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (process.platform === 'darwin') {
|
if (process.platform === 'darwin') {
|
||||||
baseLocation = '/Users';
|
baseLocation = '/Users';
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
baseLocation = '/home';
|
baseLocation = '/home';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cacheDirectory = path.join(baseLocation, 'actions', 'cache');
|
cacheDirectory = path.join(baseLocation, 'actions', 'cache');
|
||||||
}
|
}
|
||||||
const core = __importStar(require("@actions/core"));
|
const core = __importStar(require("@actions/core"));
|
||||||
const tc = __importStar(require("@actions/tool-cache"));
|
const tc = __importStar(require("@actions/tool-cache"));
|
||||||
const IS_WINDOWS = process.platform === 'win32';
|
const IS_WINDOWS = process.platform === 'win32';
|
||||||
// Python has "scripts" or "bin" directories where command-line tools that come with packages are installed.
|
// Python has "scripts" or "bin" directories where command-line tools that come with packages are installed.
|
||||||
// This is where pip is, along with anything that pip installs.
|
// This is where pip is, along with anything that pip installs.
|
||||||
// There is a seperate directory for `pip install --user`.
|
// There is a seperate directory for `pip install --user`.
|
||||||
//
|
//
|
||||||
// For reference, these directories are as follows:
|
// For reference, these directories are as follows:
|
||||||
// macOS / Linux:
|
// macOS / Linux:
|
||||||
// <sys.prefix>/bin (by default /usr/local/bin, but not on hosted agents -- see the `else`)
|
// <sys.prefix>/bin (by default /usr/local/bin, but not on hosted agents -- see the `else`)
|
||||||
// (--user) ~/.local/bin
|
// (--user) ~/.local/bin
|
||||||
// Windows:
|
// Windows:
|
||||||
// <Python installation dir>\Scripts
|
// <Python installation dir>\Scripts
|
||||||
// (--user) %APPDATA%\Python\PythonXY\Scripts
|
// (--user) %APPDATA%\Python\PythonXY\Scripts
|
||||||
// See https://docs.python.org/3/library/sysconfig.html
|
// See https://docs.python.org/3/library/sysconfig.html
|
||||||
function binDir(installDir) {
|
function binDir(installDir) {
|
||||||
if (IS_WINDOWS) {
|
if (IS_WINDOWS) {
|
||||||
return path.join(installDir, 'Scripts');
|
return path.join(installDir, 'Scripts');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return path.join(installDir, 'bin');
|
return path.join(installDir, 'bin');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Note on the tool cache layout for PyPy:
|
// Note on the tool cache layout for PyPy:
|
||||||
// PyPy has its own versioning scheme that doesn't follow the Python versioning scheme.
|
// PyPy has its own versioning scheme that doesn't follow the Python versioning scheme.
|
||||||
// A particular version of PyPy may contain one or more versions of the Python interpreter.
|
// A particular version of PyPy may contain one or more versions of the Python interpreter.
|
||||||
// For example, PyPy 7.0 contains Python 2.7, 3.5, and 3.6-alpha.
|
// For example, PyPy 7.0 contains Python 2.7, 3.5, and 3.6-alpha.
|
||||||
// We only care about the Python version, so we don't use the PyPy version for the tool cache.
|
// We only care about the Python version, so we don't use the PyPy version for the tool cache.
|
||||||
function usePyPy(majorVersion, architecture) {
|
function usePyPy(majorVersion, architecture) {
|
||||||
const findPyPy = tc.find.bind(undefined, 'PyPy', majorVersion.toString());
|
const findPyPy = tc.find.bind(undefined, 'PyPy', majorVersion.toString());
|
||||||
let installDir = findPyPy(architecture);
|
let installDir = findPyPy(architecture);
|
||||||
if (!installDir && IS_WINDOWS) {
|
if (!installDir && IS_WINDOWS) {
|
||||||
// PyPy only precompiles binaries for x86, but the architecture parameter defaults to x64.
|
// PyPy only precompiles binaries for x86, but the architecture parameter defaults to x64.
|
||||||
// On Hosted VS2017, we only install an x86 version.
|
// On Hosted VS2017, we only install an x86 version.
|
||||||
// Fall back to x86.
|
// Fall back to x86.
|
||||||
installDir = findPyPy('x86');
|
installDir = findPyPy('x86');
|
||||||
}
|
}
|
||||||
if (!installDir) {
|
if (!installDir) {
|
||||||
// PyPy not installed in $(Agent.ToolsDirectory)
|
// PyPy not installed in $(Agent.ToolsDirectory)
|
||||||
throw new Error(`PyPy ${majorVersion} not found`);
|
throw new Error(`PyPy ${majorVersion} not found`);
|
||||||
}
|
}
|
||||||
// For PyPy, Windows uses 'bin', not 'Scripts'.
|
// For PyPy, Windows uses 'bin', not 'Scripts'.
|
||||||
const _binDir = path.join(installDir, 'bin');
|
const _binDir = path.join(installDir, 'bin');
|
||||||
// On Linux and macOS, the Python interpreter is in 'bin'.
|
// On Linux and macOS, the Python interpreter is in 'bin'.
|
||||||
// On Windows, it is in the installation root.
|
// On Windows, it is in the installation root.
|
||||||
const pythonLocation = IS_WINDOWS ? installDir : _binDir;
|
const pythonLocation = IS_WINDOWS ? installDir : _binDir;
|
||||||
core.exportVariable('pythonLocation', pythonLocation);
|
core.exportVariable('pythonLocation', pythonLocation);
|
||||||
core.addPath(installDir);
|
core.addPath(installDir);
|
||||||
core.addPath(_binDir);
|
core.addPath(_binDir);
|
||||||
}
|
}
|
||||||
function useCpythonVersion(version, architecture) {
|
function useCpythonVersion(version, architecture) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
const desugaredVersionSpec = desugarDevVersion(version);
|
const desugaredVersionSpec = desugarDevVersion(version);
|
||||||
const semanticVersionSpec = pythonVersionToSemantic(desugaredVersionSpec);
|
const semanticVersionSpec = pythonVersionToSemantic(desugaredVersionSpec);
|
||||||
core.debug(`Semantic version spec of ${version} is ${semanticVersionSpec}`);
|
core.debug(`Semantic version spec of ${version} is ${semanticVersionSpec}`);
|
||||||
const installDir = tc.find('Python', semanticVersionSpec, architecture);
|
const installDir = tc.find('Python', semanticVersionSpec, architecture);
|
||||||
if (!installDir) {
|
if (!installDir) {
|
||||||
// Fail and list available versions
|
// Fail and list available versions
|
||||||
const x86Versions = tc
|
const x86Versions = tc
|
||||||
.findAllVersions('Python', 'x86')
|
.findAllVersions('Python', 'x86')
|
||||||
.map(s => `${s} (x86)`)
|
.map(s => `${s} (x86)`)
|
||||||
.join(os.EOL);
|
.join(os.EOL);
|
||||||
const x64Versions = tc
|
const x64Versions = tc
|
||||||
.findAllVersions('Python', 'x64')
|
.findAllVersions('Python', 'x64')
|
||||||
.map(s => `${s} (x64)`)
|
.map(s => `${s} (x64)`)
|
||||||
.join(os.EOL);
|
.join(os.EOL);
|
||||||
throw new Error([
|
throw new Error([
|
||||||
`Version ${version} with arch ${architecture} not found`,
|
`Version ${version} with arch ${architecture} not found`,
|
||||||
'Available versions:',
|
'Available versions:',
|
||||||
x86Versions,
|
x86Versions,
|
||||||
x64Versions
|
x64Versions
|
||||||
].join(os.EOL));
|
].join(os.EOL));
|
||||||
}
|
}
|
||||||
core.exportVariable('pythonLocation', installDir);
|
core.exportVariable('pythonLocation', installDir);
|
||||||
core.addPath(installDir);
|
core.addPath(installDir);
|
||||||
core.addPath(binDir(installDir));
|
core.addPath(binDir(installDir));
|
||||||
if (IS_WINDOWS) {
|
if (IS_WINDOWS) {
|
||||||
// Add --user directory
|
// Add --user directory
|
||||||
// `installDir` from tool cache should look like $AGENT_TOOLSDIRECTORY/Python/<semantic version>/x64/
|
// `installDir` from tool cache should look like $AGENT_TOOLSDIRECTORY/Python/<semantic version>/x64/
|
||||||
// So if `findLocalTool` succeeded above, we must have a conformant `installDir`
|
// So if `findLocalTool` succeeded above, we must have a conformant `installDir`
|
||||||
const version = path.basename(path.dirname(installDir));
|
const version = path.basename(path.dirname(installDir));
|
||||||
const major = semver.major(version);
|
const major = semver.major(version);
|
||||||
const minor = semver.minor(version);
|
const minor = semver.minor(version);
|
||||||
const userScriptsDir = path.join(process.env['APPDATA'] || '', 'Python', `Python${major}${minor}`, 'Scripts');
|
const userScriptsDir = path.join(process.env['APPDATA'] || '', 'Python', `Python${major}${minor}`, 'Scripts');
|
||||||
core.addPath(userScriptsDir);
|
core.addPath(userScriptsDir);
|
||||||
}
|
}
|
||||||
// On Linux and macOS, pip will create the --user directory and add it to PATH as needed.
|
// On Linux and macOS, pip will create the --user directory and add it to PATH as needed.
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
/** Convert versions like `3.8-dev` to a version like `>= 3.8.0-a0`. */
|
/** Convert versions like `3.8-dev` to a version like `>= 3.8.0-a0`. */
|
||||||
function desugarDevVersion(versionSpec) {
|
function desugarDevVersion(versionSpec) {
|
||||||
if (versionSpec.endsWith('-dev')) {
|
if (versionSpec.endsWith('-dev')) {
|
||||||
const versionRoot = versionSpec.slice(0, -'-dev'.length);
|
const versionRoot = versionSpec.slice(0, -'-dev'.length);
|
||||||
return `>= ${versionRoot}.0-a0`;
|
return `>= ${versionRoot}.0-a0`;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return versionSpec;
|
return versionSpec;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Python's prelease versions look like `3.7.0b2`.
|
* Python's prelease versions look like `3.7.0b2`.
|
||||||
* This is the one part of Python versioning that does not look like semantic versioning, which specifies `3.7.0-b2`.
|
* This is the one part of Python versioning that does not look like semantic versioning, which specifies `3.7.0-b2`.
|
||||||
* If the version spec contains prerelease versions, we need to convert them to the semantic version equivalent.
|
* If the version spec contains prerelease versions, we need to convert them to the semantic version equivalent.
|
||||||
*/
|
*/
|
||||||
function pythonVersionToSemantic(versionSpec) {
|
function pythonVersionToSemantic(versionSpec) {
|
||||||
const prereleaseVersion = /(\d+\.\d+\.\d+)((?:a|b|rc)\d*)/g;
|
const prereleaseVersion = /(\d+\.\d+\.\d+)((?:a|b|rc)\d*)/g;
|
||||||
return versionSpec.replace(prereleaseVersion, '$1-$2');
|
return versionSpec.replace(prereleaseVersion, '$1-$2');
|
||||||
}
|
}
|
||||||
exports.pythonVersionToSemantic = pythonVersionToSemantic;
|
exports.pythonVersionToSemantic = pythonVersionToSemantic;
|
||||||
function findPythonVersion(version, architecture) {
|
function findPythonVersion(version, architecture) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
switch (version.toUpperCase()) {
|
switch (version.toUpperCase()) {
|
||||||
case 'PYPY2':
|
case 'PYPY2':
|
||||||
return usePyPy(2, architecture);
|
return usePyPy(2, architecture);
|
||||||
case 'PYPY3':
|
case 'PYPY3':
|
||||||
return usePyPy(3, architecture);
|
return usePyPy(3, architecture);
|
||||||
default:
|
default:
|
||||||
return yield useCpythonVersion(version, architecture);
|
return yield useCpythonVersion(version, architecture);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.findPythonVersion = findPythonVersion;
|
exports.findPythonVersion = findPythonVersion;
|
||||||
|
|
|
@ -1,40 +1,40 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||||
return new (P || (P = Promise))(function (resolve, reject) {
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
var __importStar = (this && this.__importStar) || function (mod) {
|
var __importStar = (this && this.__importStar) || function (mod) {
|
||||||
if (mod && mod.__esModule) return mod;
|
if (mod && mod.__esModule) return mod;
|
||||||
var result = {};
|
var result = {};
|
||||||
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
||||||
result["default"] = mod;
|
result["default"] = mod;
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const core = __importStar(require("@actions/core"));
|
const core = __importStar(require("@actions/core"));
|
||||||
const finder = __importStar(require("./find-python"));
|
const finder = __importStar(require("./find-python"));
|
||||||
const path = __importStar(require("path"));
|
const path = __importStar(require("path"));
|
||||||
function run() {
|
function run() {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
try {
|
try {
|
||||||
let version = core.getInput('version');
|
let version = core.getInput('version');
|
||||||
if (!version) {
|
if (!version) {
|
||||||
version = core.getInput('python-version');
|
version = core.getInput('python-version');
|
||||||
}
|
}
|
||||||
if (version) {
|
if (version) {
|
||||||
const arch = core.getInput('architecture', { required: true });
|
const arch = core.getInput('architecture', { required: true });
|
||||||
yield finder.findPythonVersion(version, arch);
|
yield finder.findPythonVersion(version, arch);
|
||||||
}
|
}
|
||||||
const matchersPath = path.join(__dirname, '..', '.github');
|
const matchersPath = path.join(__dirname, '..', '.github');
|
||||||
console.log(`##[add-matcher]${path.join(matchersPath, 'python.json')}`);
|
console.log(`##[add-matcher]${path.join(matchersPath, 'python.json')}`);
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
core.setFailed(err.message);
|
core.setFailed(err.message);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
run();
|
run();
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
@IF EXIST "%~dp0\node.exe" (
|
@IF EXIST "%~dp0\node.exe" (
|
||||||
"%~dp0\node.exe" "%~dp0\..\semver\bin\semver.js" %*
|
"%~dp0\node.exe" "%~dp0\..\semver\bin\semver.js" %*
|
||||||
) ELSE (
|
) ELSE (
|
||||||
@SETLOCAL
|
@SETLOCAL
|
||||||
@SET PATHEXT=%PATHEXT:;.JS;=;%
|
@SET PATHEXT=%PATHEXT:;.JS;=;%
|
||||||
node "%~dp0\..\semver\bin\semver.js" %*
|
node "%~dp0\..\semver\bin\semver.js" %*
|
||||||
)
|
)
|
|
@ -1,7 +1,7 @@
|
||||||
@IF EXIST "%~dp0\node.exe" (
|
@IF EXIST "%~dp0\node.exe" (
|
||||||
"%~dp0\node.exe" "%~dp0\..\uuid\bin\uuid" %*
|
"%~dp0\node.exe" "%~dp0\..\uuid\bin\uuid" %*
|
||||||
) ELSE (
|
) ELSE (
|
||||||
@SETLOCAL
|
@SETLOCAL
|
||||||
@SET PATHEXT=%PATHEXT:;.JS;=;%
|
@SET PATHEXT=%PATHEXT:;.JS;=;%
|
||||||
node "%~dp0\..\uuid\bin\uuid" %*
|
node "%~dp0\..\uuid\bin\uuid" %*
|
||||||
)
|
)
|
|
@ -1,7 +1,81 @@
|
||||||
# `@actions/core`
|
# `@actions/core`
|
||||||
|
|
||||||
> Core functions for setting results, logging, registering secrets and exporting variables across actions
|
> Core functions for setting results, logging, registering secrets and exporting variables across actions
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
See [src/core.ts](src/core.ts).
|
#### Inputs/Outputs
|
||||||
|
|
||||||
|
You can use this library to get inputs or set outputs:
|
||||||
|
|
||||||
|
```
|
||||||
|
const core = require('@actions/core');
|
||||||
|
|
||||||
|
const myInput = core.getInput('inputName', { required: true });
|
||||||
|
|
||||||
|
// Do stuff
|
||||||
|
|
||||||
|
core.setOutput('outputKey', 'outputVal');
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Exporting variables/secrets
|
||||||
|
|
||||||
|
You can also export variables and secrets for future steps. Variables get set in the environment automatically, while secrets must be scoped into the environment from a workflow using `{{ secret.FOO }}`. Secrets will also be masked from the logs:
|
||||||
|
|
||||||
|
```
|
||||||
|
const core = require('@actions/core');
|
||||||
|
|
||||||
|
// Do stuff
|
||||||
|
|
||||||
|
core.exportVariable('envVar', 'Val');
|
||||||
|
core.exportSecret('secretVar', variableWithSecretValue);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### PATH Manipulation
|
||||||
|
|
||||||
|
You can explicitly add items to the path for all remaining steps in a workflow:
|
||||||
|
|
||||||
|
```
|
||||||
|
const core = require('@actions/core');
|
||||||
|
|
||||||
|
core.addPath('pathToTool');
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Exit codes
|
||||||
|
|
||||||
|
You should use this library to set the failing exit code for your action:
|
||||||
|
|
||||||
|
```
|
||||||
|
const core = require('@actions/core');
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Do stuff
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
// setFailed logs the message and sets a failing exit code
|
||||||
|
core.setFailed(`Action failed with error ${err}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Logging
|
||||||
|
|
||||||
|
Finally, this library provides some utilities for logging:
|
||||||
|
|
||||||
|
```
|
||||||
|
const core = require('@actions/core');
|
||||||
|
|
||||||
|
const myInput = core.getInput('input');
|
||||||
|
try {
|
||||||
|
core.debug('Inside try block');
|
||||||
|
|
||||||
|
if (!myInput) {
|
||||||
|
core.warning('myInput wasnt set');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do stuff
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
core.error('Error ${err}, action may still succeed though');
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
interface CommandProperties {
|
interface CommandProperties {
|
||||||
[key: string]: string;
|
[key: string]: string;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Commands
|
* Commands
|
||||||
*
|
*
|
||||||
* Command Format:
|
* Command Format:
|
||||||
* ##[name key=value;key=value]message
|
* ##[name key=value;key=value]message
|
||||||
*
|
*
|
||||||
* Examples:
|
* Examples:
|
||||||
* ##[warning]This is the user warning message
|
* ##[warning]This is the user warning message
|
||||||
* ##[set-secret name=mypassword]definatelyNotAPassword!
|
* ##[set-secret name=mypassword]definatelyNotAPassword!
|
||||||
*/
|
*/
|
||||||
export declare function issueCommand(command: string, properties: CommandProperties, message: string): void;
|
export declare function issueCommand(command: string, properties: CommandProperties, message: string): void;
|
||||||
export declare function issue(name: string, message: string): void;
|
export declare function issue(name: string, message: string): void;
|
||||||
export {};
|
export {};
|
||||||
|
|
|
@ -1,66 +1,66 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const os = require("os");
|
const os = require("os");
|
||||||
/**
|
/**
|
||||||
* Commands
|
* Commands
|
||||||
*
|
*
|
||||||
* Command Format:
|
* Command Format:
|
||||||
* ##[name key=value;key=value]message
|
* ##[name key=value;key=value]message
|
||||||
*
|
*
|
||||||
* Examples:
|
* Examples:
|
||||||
* ##[warning]This is the user warning message
|
* ##[warning]This is the user warning message
|
||||||
* ##[set-secret name=mypassword]definatelyNotAPassword!
|
* ##[set-secret name=mypassword]definatelyNotAPassword!
|
||||||
*/
|
*/
|
||||||
function issueCommand(command, properties, message) {
|
function issueCommand(command, properties, message) {
|
||||||
const cmd = new Command(command, properties, message);
|
const cmd = new Command(command, properties, message);
|
||||||
process.stdout.write(cmd.toString() + os.EOL);
|
process.stdout.write(cmd.toString() + os.EOL);
|
||||||
}
|
}
|
||||||
exports.issueCommand = issueCommand;
|
exports.issueCommand = issueCommand;
|
||||||
function issue(name, message) {
|
function issue(name, message) {
|
||||||
issueCommand(name, {}, message);
|
issueCommand(name, {}, message);
|
||||||
}
|
}
|
||||||
exports.issue = issue;
|
exports.issue = issue;
|
||||||
const CMD_PREFIX = '##[';
|
const CMD_PREFIX = '##[';
|
||||||
class Command {
|
class Command {
|
||||||
constructor(command, properties, message) {
|
constructor(command, properties, message) {
|
||||||
if (!command) {
|
if (!command) {
|
||||||
command = 'missing.command';
|
command = 'missing.command';
|
||||||
}
|
}
|
||||||
this.command = command;
|
this.command = command;
|
||||||
this.properties = properties;
|
this.properties = properties;
|
||||||
this.message = message;
|
this.message = message;
|
||||||
}
|
}
|
||||||
toString() {
|
toString() {
|
||||||
let cmdStr = CMD_PREFIX + this.command;
|
let cmdStr = CMD_PREFIX + this.command;
|
||||||
if (this.properties && Object.keys(this.properties).length > 0) {
|
if (this.properties && Object.keys(this.properties).length > 0) {
|
||||||
cmdStr += ' ';
|
cmdStr += ' ';
|
||||||
for (const key in this.properties) {
|
for (const key in this.properties) {
|
||||||
if (this.properties.hasOwnProperty(key)) {
|
if (this.properties.hasOwnProperty(key)) {
|
||||||
const val = this.properties[key];
|
const val = this.properties[key];
|
||||||
if (val) {
|
if (val) {
|
||||||
// safely append the val - avoid blowing up when attempting to
|
// safely append the val - avoid blowing up when attempting to
|
||||||
// call .replace() if message is not a string for some reason
|
// call .replace() if message is not a string for some reason
|
||||||
cmdStr += `${key}=${escape(`${val || ''}`)};`;
|
cmdStr += `${key}=${escape(`${val || ''}`)};`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cmdStr += ']';
|
cmdStr += ']';
|
||||||
// safely append the message - avoid blowing up when attempting to
|
// safely append the message - avoid blowing up when attempting to
|
||||||
// call .replace() if message is not a string for some reason
|
// call .replace() if message is not a string for some reason
|
||||||
const message = `${this.message || ''}`;
|
const message = `${this.message || ''}`;
|
||||||
cmdStr += escapeData(message);
|
cmdStr += escapeData(message);
|
||||||
return cmdStr;
|
return cmdStr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function escapeData(s) {
|
function escapeData(s) {
|
||||||
return s.replace(/\r/g, '%0D').replace(/\n/g, '%0A');
|
return s.replace(/\r/g, '%0D').replace(/\n/g, '%0A');
|
||||||
}
|
}
|
||||||
function escape(s) {
|
function escape(s) {
|
||||||
return s
|
return s
|
||||||
.replace(/\r/g, '%0D')
|
.replace(/\r/g, '%0D')
|
||||||
.replace(/\n/g, '%0A')
|
.replace(/\n/g, '%0A')
|
||||||
.replace(/]/g, '%5D')
|
.replace(/]/g, '%5D')
|
||||||
.replace(/;/g, '%3B');
|
.replace(/;/g, '%3B');
|
||||||
}
|
}
|
||||||
//# sourceMappingURL=command.js.map
|
//# sourceMappingURL=command.js.map
|
|
@ -1,57 +1,73 @@
|
||||||
/**
|
/**
|
||||||
* Interface for getInput options
|
* Interface for getInput options
|
||||||
*/
|
*/
|
||||||
export interface InputOptions {
|
export interface InputOptions {
|
||||||
/** Optional. Whether the input is required. If required and not present, will throw. Defaults to false */
|
/** Optional. Whether the input is required. If required and not present, will throw. Defaults to false */
|
||||||
required?: boolean;
|
required?: boolean;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* sets env variable for this action and future actions in the job
|
* The code to exit an action
|
||||||
* @param name the name of the variable to set
|
*/
|
||||||
* @param val the value of the variable
|
export declare enum ExitCode {
|
||||||
*/
|
/**
|
||||||
export declare function exportVariable(name: string, val: string): void;
|
* A code indicating that the action was successful
|
||||||
/**
|
*/
|
||||||
* exports the variable and registers a secret which will get masked from logs
|
Success = 0,
|
||||||
* @param name the name of the variable to set
|
/**
|
||||||
* @param val value of the secret
|
* A code indicating that the action was a failure
|
||||||
*/
|
*/
|
||||||
export declare function exportSecret(name: string, val: string): void;
|
Failure = 1
|
||||||
/**
|
}
|
||||||
* Prepends inputPath to the PATH (for this action and future actions)
|
/**
|
||||||
* @param inputPath
|
* sets env variable for this action and future actions in the job
|
||||||
*/
|
* @param name the name of the variable to set
|
||||||
export declare function addPath(inputPath: string): void;
|
* @param val the value of the variable
|
||||||
/**
|
*/
|
||||||
* Gets the value of an input. The value is also trimmed.
|
export declare function exportVariable(name: string, val: string): void;
|
||||||
*
|
/**
|
||||||
* @param name name of the input to get
|
* exports the variable and registers a secret which will get masked from logs
|
||||||
* @param options optional. See InputOptions.
|
* @param name the name of the variable to set
|
||||||
* @returns string
|
* @param val value of the secret
|
||||||
*/
|
*/
|
||||||
export declare function getInput(name: string, options?: InputOptions): string;
|
export declare function exportSecret(name: string, val: string): void;
|
||||||
/**
|
/**
|
||||||
* Sets the action status to neutral
|
* Prepends inputPath to the PATH (for this action and future actions)
|
||||||
*/
|
* @param inputPath
|
||||||
export declare function setNeutral(): void;
|
*/
|
||||||
/**
|
export declare function addPath(inputPath: string): void;
|
||||||
* Sets the action status to failed.
|
/**
|
||||||
* When the action exits it will be with an exit code of 1
|
* Gets the value of an input. The value is also trimmed.
|
||||||
* @param message add error issue message
|
*
|
||||||
*/
|
* @param name name of the input to get
|
||||||
export declare function setFailed(message: string): void;
|
* @param options optional. See InputOptions.
|
||||||
/**
|
* @returns string
|
||||||
* Writes debug message to user log
|
*/
|
||||||
* @param message debug message
|
export declare function getInput(name: string, options?: InputOptions): string;
|
||||||
*/
|
/**
|
||||||
export declare function debug(message: string): void;
|
* Sets the value of an output.
|
||||||
/**
|
*
|
||||||
* Adds an error issue
|
* @param name name of the output to set
|
||||||
* @param message error issue message
|
* @param value value to store
|
||||||
*/
|
*/
|
||||||
export declare function error(message: string): void;
|
export declare function setOutput(name: string, value: string): void;
|
||||||
/**
|
/**
|
||||||
* Adds an warning issue
|
* Sets the action status to failed.
|
||||||
* @param message warning issue message
|
* When the action exits it will be with an exit code of 1
|
||||||
*/
|
* @param message add error issue message
|
||||||
export declare function warning(message: string): void;
|
*/
|
||||||
|
export declare function setFailed(message: string): void;
|
||||||
|
/**
|
||||||
|
* Writes debug message to user log
|
||||||
|
* @param message debug message
|
||||||
|
*/
|
||||||
|
export declare function debug(message: string): void;
|
||||||
|
/**
|
||||||
|
* Adds an error issue
|
||||||
|
* @param message error issue message
|
||||||
|
*/
|
||||||
|
export declare function error(message: string): void;
|
||||||
|
/**
|
||||||
|
* Adds an warning issue
|
||||||
|
* @param message warning issue message
|
||||||
|
*/
|
||||||
|
export declare function warning(message: string): void;
|
||||||
|
|
|
@ -1,100 +1,116 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const exit_1 = require("@actions/exit");
|
const command_1 = require("./command");
|
||||||
const command_1 = require("./command");
|
const path = require("path");
|
||||||
const path = require("path");
|
/**
|
||||||
//-----------------------------------------------------------------------
|
* The code to exit an action
|
||||||
// Variables
|
*/
|
||||||
//-----------------------------------------------------------------------
|
var ExitCode;
|
||||||
/**
|
(function (ExitCode) {
|
||||||
* sets env variable for this action and future actions in the job
|
/**
|
||||||
* @param name the name of the variable to set
|
* A code indicating that the action was successful
|
||||||
* @param val the value of the variable
|
*/
|
||||||
*/
|
ExitCode[ExitCode["Success"] = 0] = "Success";
|
||||||
function exportVariable(name, val) {
|
/**
|
||||||
process.env[name] = val;
|
* A code indicating that the action was a failure
|
||||||
command_1.issueCommand('set-env', { name }, val);
|
*/
|
||||||
}
|
ExitCode[ExitCode["Failure"] = 1] = "Failure";
|
||||||
exports.exportVariable = exportVariable;
|
})(ExitCode = exports.ExitCode || (exports.ExitCode = {}));
|
||||||
/**
|
//-----------------------------------------------------------------------
|
||||||
* exports the variable and registers a secret which will get masked from logs
|
// Variables
|
||||||
* @param name the name of the variable to set
|
//-----------------------------------------------------------------------
|
||||||
* @param val value of the secret
|
/**
|
||||||
*/
|
* sets env variable for this action and future actions in the job
|
||||||
function exportSecret(name, val) {
|
* @param name the name of the variable to set
|
||||||
exportVariable(name, val);
|
* @param val the value of the variable
|
||||||
command_1.issueCommand('set-secret', {}, val);
|
*/
|
||||||
}
|
function exportVariable(name, val) {
|
||||||
exports.exportSecret = exportSecret;
|
process.env[name] = val;
|
||||||
/**
|
command_1.issueCommand('set-env', { name }, val);
|
||||||
* Prepends inputPath to the PATH (for this action and future actions)
|
}
|
||||||
* @param inputPath
|
exports.exportVariable = exportVariable;
|
||||||
*/
|
/**
|
||||||
function addPath(inputPath) {
|
* exports the variable and registers a secret which will get masked from logs
|
||||||
command_1.issueCommand('add-path', {}, inputPath);
|
* @param name the name of the variable to set
|
||||||
process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;
|
* @param val value of the secret
|
||||||
}
|
*/
|
||||||
exports.addPath = addPath;
|
function exportSecret(name, val) {
|
||||||
/**
|
exportVariable(name, val);
|
||||||
* Gets the value of an input. The value is also trimmed.
|
command_1.issueCommand('set-secret', {}, val);
|
||||||
*
|
}
|
||||||
* @param name name of the input to get
|
exports.exportSecret = exportSecret;
|
||||||
* @param options optional. See InputOptions.
|
/**
|
||||||
* @returns string
|
* Prepends inputPath to the PATH (for this action and future actions)
|
||||||
*/
|
* @param inputPath
|
||||||
function getInput(name, options) {
|
*/
|
||||||
const val = process.env[`INPUT_${name.replace(' ', '_').toUpperCase()}`] || '';
|
function addPath(inputPath) {
|
||||||
if (options && options.required && !val) {
|
command_1.issueCommand('add-path', {}, inputPath);
|
||||||
throw new Error(`Input required and not supplied: ${name}`);
|
process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;
|
||||||
}
|
}
|
||||||
return val.trim();
|
exports.addPath = addPath;
|
||||||
}
|
/**
|
||||||
exports.getInput = getInput;
|
* Gets the value of an input. The value is also trimmed.
|
||||||
//-----------------------------------------------------------------------
|
*
|
||||||
// Results
|
* @param name name of the input to get
|
||||||
//-----------------------------------------------------------------------
|
* @param options optional. See InputOptions.
|
||||||
/**
|
* @returns string
|
||||||
* Sets the action status to neutral
|
*/
|
||||||
*/
|
function getInput(name, options) {
|
||||||
function setNeutral() {
|
const val = process.env[`INPUT_${name.replace(' ', '_').toUpperCase()}`] || '';
|
||||||
process.exitCode = exit_1.ExitCode.Neutral;
|
if (options && options.required && !val) {
|
||||||
}
|
throw new Error(`Input required and not supplied: ${name}`);
|
||||||
exports.setNeutral = setNeutral;
|
}
|
||||||
/**
|
return val.trim();
|
||||||
* Sets the action status to failed.
|
}
|
||||||
* When the action exits it will be with an exit code of 1
|
exports.getInput = getInput;
|
||||||
* @param message add error issue message
|
/**
|
||||||
*/
|
* Sets the value of an output.
|
||||||
function setFailed(message) {
|
*
|
||||||
process.exitCode = exit_1.ExitCode.Failure;
|
* @param name name of the output to set
|
||||||
error(message);
|
* @param value value to store
|
||||||
}
|
*/
|
||||||
exports.setFailed = setFailed;
|
function setOutput(name, value) {
|
||||||
//-----------------------------------------------------------------------
|
command_1.issueCommand('set-output', { name }, value);
|
||||||
// Logging Commands
|
}
|
||||||
//-----------------------------------------------------------------------
|
exports.setOutput = setOutput;
|
||||||
/**
|
//-----------------------------------------------------------------------
|
||||||
* Writes debug message to user log
|
// Results
|
||||||
* @param message debug message
|
//-----------------------------------------------------------------------
|
||||||
*/
|
/**
|
||||||
function debug(message) {
|
* Sets the action status to failed.
|
||||||
command_1.issueCommand('debug', {}, message);
|
* When the action exits it will be with an exit code of 1
|
||||||
}
|
* @param message add error issue message
|
||||||
exports.debug = debug;
|
*/
|
||||||
/**
|
function setFailed(message) {
|
||||||
* Adds an error issue
|
process.exitCode = ExitCode.Failure;
|
||||||
* @param message error issue message
|
error(message);
|
||||||
*/
|
}
|
||||||
function error(message) {
|
exports.setFailed = setFailed;
|
||||||
command_1.issue('error', message);
|
//-----------------------------------------------------------------------
|
||||||
}
|
// Logging Commands
|
||||||
exports.error = error;
|
//-----------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* Adds an warning issue
|
* Writes debug message to user log
|
||||||
* @param message warning issue message
|
* @param message debug message
|
||||||
*/
|
*/
|
||||||
function warning(message) {
|
function debug(message) {
|
||||||
command_1.issue('warning', message);
|
command_1.issueCommand('debug', {}, message);
|
||||||
}
|
}
|
||||||
exports.warning = warning;
|
exports.debug = debug;
|
||||||
|
/**
|
||||||
|
* Adds an error issue
|
||||||
|
* @param message error issue message
|
||||||
|
*/
|
||||||
|
function error(message) {
|
||||||
|
command_1.issue('error', message);
|
||||||
|
}
|
||||||
|
exports.error = error;
|
||||||
|
/**
|
||||||
|
* Adds an warning issue
|
||||||
|
* @param message warning issue message
|
||||||
|
*/
|
||||||
|
function warning(message) {
|
||||||
|
command_1.issue('warning', message);
|
||||||
|
}
|
||||||
|
exports.warning = warning;
|
||||||
//# sourceMappingURL=core.js.map
|
//# sourceMappingURL=core.js.map
|
|
@ -1 +1 @@
|
||||||
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":";;AAAA,wCAAsC;AACtC,uCAA6C;AAE7C,6BAA4B;AAU5B,yEAAyE;AACzE,YAAY;AACZ,yEAAyE;AAEzE;;;;GAIG;AACH,SAAgB,cAAc,CAAC,IAAY,EAAE,GAAW;IACtD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAA;IACvB,sBAAY,CAAC,SAAS,EAAE,EAAC,IAAI,EAAC,EAAE,GAAG,CAAC,CAAA;AACtC,CAAC;AAHD,wCAGC;AAED;;;;GAIG;AACH,SAAgB,YAAY,CAAC,IAAY,EAAE,GAAW;IACpD,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACzB,sBAAY,CAAC,YAAY,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;AACrC,CAAC;AAHD,oCAGC;AAED;;;GAGG;AACH,SAAgB,OAAO,CAAC,SAAiB;IACvC,sBAAY,CAAC,UAAU,EAAE,EAAE,EAAE,SAAS,CAAC,CAAA;IACvC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAA;AAC7E,CAAC;AAHD,0BAGC;AAED;;;;;;GAMG;AACH,SAAgB,QAAQ,CAAC,IAAY,EAAE,OAAsB;IAC3D,MAAM,GAAG,GACP,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,EAAE,CAAA;IACpE,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE;QACvC,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAA;KAC5D;IAED,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;AACnB,CAAC;AARD,4BAQC;AAED,yEAAyE;AACzE,UAAU;AACV,yEAAyE;AAEzE;;GAEG;AACH,SAAgB,UAAU;IACxB,OAAO,CAAC,QAAQ,GAAG,eAAQ,CAAC,OAAO,CAAA;AACrC,CAAC;AAFD,gCAEC;AAED;;;;GAIG;AACH,SAAgB,SAAS,CAAC,OAAe;IACvC,OAAO,CAAC,QAAQ,GAAG,eAAQ,CAAC,OAAO,CAAA;IACnC,KAAK,CAAC,OAAO,CAAC,CAAA;AAChB,CAAC;AAHD,8BAGC;AAED,yEAAyE;AACzE,mBAAmB;AACnB,yEAAyE;AAEzE;;;GAGG;AACH,SAAgB,KAAK,CAAC,OAAe;IACnC,sBAAY,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;AACpC,CAAC;AAFD,sBAEC;AAED;;;GAGG;AACH,SAAgB,KAAK,CAAC,OAAe;IACnC,eAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AACzB,CAAC;AAFD,sBAEC;AAED;;;GAGG;AACH,SAAgB,OAAO,CAAC,OAAe;IACrC,eAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AAC3B,CAAC;AAFD,0BAEC"}
|
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":";;AAAA,uCAA6C;AAE7C,6BAA4B;AAU5B;;GAEG;AACH,IAAY,QAUX;AAVD,WAAY,QAAQ;IAClB;;OAEG;IACH,6CAAW,CAAA;IAEX;;OAEG;IACH,6CAAW,CAAA;AACb,CAAC,EAVW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAUnB;AAED,yEAAyE;AACzE,YAAY;AACZ,yEAAyE;AAEzE;;;;GAIG;AACH,SAAgB,cAAc,CAAC,IAAY,EAAE,GAAW;IACtD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAA;IACvB,sBAAY,CAAC,SAAS,EAAE,EAAC,IAAI,EAAC,EAAE,GAAG,CAAC,CAAA;AACtC,CAAC;AAHD,wCAGC;AAED;;;;GAIG;AACH,SAAgB,YAAY,CAAC,IAAY,EAAE,GAAW;IACpD,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACzB,sBAAY,CAAC,YAAY,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;AACrC,CAAC;AAHD,oCAGC;AAED;;;GAGG;AACH,SAAgB,OAAO,CAAC,SAAiB;IACvC,sBAAY,CAAC,UAAU,EAAE,EAAE,EAAE,SAAS,CAAC,CAAA;IACvC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAA;AAC7E,CAAC;AAHD,0BAGC;AAED;;;;;;GAMG;AACH,SAAgB,QAAQ,CAAC,IAAY,EAAE,OAAsB;IAC3D,MAAM,GAAG,GACP,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,EAAE,CAAA;IACpE,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE;QACvC,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAA;KAC5D;IAED,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;AACnB,CAAC;AARD,4BAQC;AAED;;;;;GAKG;AACH,SAAgB,SAAS,CAAC,IAAY,EAAE,KAAa;IACnD,sBAAY,CAAC,YAAY,EAAE,EAAC,IAAI,EAAC,EAAE,KAAK,CAAC,CAAA;AAC3C,CAAC;AAFD,8BAEC;AAED,yEAAyE;AACzE,UAAU;AACV,yEAAyE;AAEzE;;;;GAIG;AACH,SAAgB,SAAS,CAAC,OAAe;IACvC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAA;IACnC,KAAK,CAAC,OAAO,CAAC,CAAA;AAChB,CAAC;AAHD,8BAGC;AAED,yEAAyE;AACzE,mBAAmB;AACnB,yEAAyE;AAEzE;;;GAGG;AACH,SAAgB,KAAK,CAAC,OAAe;IACnC,sBAAY,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;AACpC,CAAC;AAFD,sBAEC;AAED;;;GAGG;AACH,SAAgB,KAAK,CAAC,OAAe;IACnC,eAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AACzB,CAAC;AAFD,sBAEC;AAED;;;GAGG;AACH,SAAgB,OAAO,CAAC,OAAe;IACrC,eAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AAC3B,CAAC;AAFD,0BAEC"}
|
|
@ -1,36 +1,33 @@
|
||||||
{
|
{
|
||||||
"_from": "file:toolkit\\actions-core-0.0.0.tgz",
|
"_from": "@actions/core@^1.0.0",
|
||||||
"_id": "@actions/core@0.0.0",
|
"_id": "@actions/core@1.0.0",
|
||||||
"_inBundle": false,
|
"_inBundle": false,
|
||||||
"_integrity": "sha512-58ituSV1rzBMmmsWoFDnrnsT+Wm4kD/u9NgAGbPvZ7rQHWluYtD5bDbIsjDC6rKFuhqytkxDJPsF/TWBdgc/nA==",
|
"_integrity": "sha512-aMIlkx96XH4E/2YZtEOeyrYQfhlas9jIRkfGPqMwXD095Rdkzo4lB6ZmbxPQSzD+e1M+Xsm98ZhuSMYGv/AlqA==",
|
||||||
"_location": "/@actions/core",
|
"_location": "/@actions/core",
|
||||||
"_phantomChildren": {},
|
"_phantomChildren": {},
|
||||||
"_requested": {
|
"_requested": {
|
||||||
"type": "file",
|
"type": "range",
|
||||||
"where": "E:\\github\\setup-python",
|
"registry": true,
|
||||||
"raw": "@actions/core@file:toolkit/actions-core-0.0.0.tgz",
|
"raw": "@actions/core@^1.0.0",
|
||||||
"name": "@actions/core",
|
"name": "@actions/core",
|
||||||
"escapedName": "@actions%2fcore",
|
"escapedName": "@actions%2fcore",
|
||||||
"scope": "@actions",
|
"scope": "@actions",
|
||||||
"rawSpec": "file:toolkit/actions-core-0.0.0.tgz",
|
"rawSpec": "^1.0.0",
|
||||||
"saveSpec": "file:toolkit\\actions-core-0.0.0.tgz",
|
"saveSpec": null,
|
||||||
"fetchSpec": "E:\\github\\setup-python\\toolkit\\actions-core-0.0.0.tgz"
|
"fetchSpec": "^1.0.0"
|
||||||
},
|
},
|
||||||
"_requiredBy": [
|
"_requiredBy": [
|
||||||
"/",
|
"/",
|
||||||
"/@actions/tool-cache"
|
"/@actions/tool-cache"
|
||||||
],
|
],
|
||||||
"_resolved": "E:\\github\\setup-python\\toolkit\\actions-core-0.0.0.tgz",
|
"_resolved": "https://registry.npmjs.org/@actions/core/-/core-1.0.0.tgz",
|
||||||
"_shasum": "346d90a534fa6c5021bc2e1b732574fd2c66fc35",
|
"_shasum": "4a090a2e958cc300b9ea802331034d5faf42d239",
|
||||||
"_spec": "@actions/core@file:toolkit/actions-core-0.0.0.tgz",
|
"_spec": "@actions/core@^1.0.0",
|
||||||
"_where": "E:\\github\\setup-python",
|
"_where": "C:\\Users\\damccorm\\Documents\\setup-python",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/actions/toolkit/issues"
|
"url": "https://github.com/actions/toolkit/issues"
|
||||||
},
|
},
|
||||||
"bundleDependencies": false,
|
"bundleDependencies": false,
|
||||||
"dependencies": {
|
|
||||||
"@actions/exit": "^0.0.0"
|
|
||||||
},
|
|
||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"description": "Actions core lib",
|
"description": "Actions core lib",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
@ -43,6 +40,7 @@
|
||||||
"files": [
|
"files": [
|
||||||
"lib"
|
"lib"
|
||||||
],
|
],
|
||||||
|
"gitHead": "a40bce7c8d382aa3dbadaa327acbc696e9390e55",
|
||||||
"homepage": "https://github.com/actions/toolkit/tree/master/packages/core",
|
"homepage": "https://github.com/actions/toolkit/tree/master/packages/core",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"core",
|
"core",
|
||||||
|
@ -62,5 +60,5 @@
|
||||||
"test": "echo \"Error: run tests from root\" && exit 1",
|
"test": "echo \"Error: run tests from root\" && exit 1",
|
||||||
"tsc": "tsc"
|
"tsc": "tsc"
|
||||||
},
|
},
|
||||||
"version": "0.0.0"
|
"version": "1.0.0"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,60 @@
|
||||||
# `@actions/exec`
|
# `@actions/exec`
|
||||||
|
|
||||||
> Functions necessary for running tools on the command line
|
## Usage
|
||||||
|
|
||||||
## Usage
|
#### Basic
|
||||||
|
|
||||||
See [src/exec.ts](src/exec.ts).
|
You can use this package to execute your tools on the command line in a cross platform way:
|
||||||
|
|
||||||
|
```
|
||||||
|
const exec = require('@actions/exec');
|
||||||
|
|
||||||
|
await exec.exec('node index.js');
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Args
|
||||||
|
|
||||||
|
You can also pass in arg arrays:
|
||||||
|
|
||||||
|
```
|
||||||
|
const exec = require('@actions/exec');
|
||||||
|
|
||||||
|
await exec.exec('node', ['index.js', 'foo=bar']);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Output/options
|
||||||
|
|
||||||
|
Capture output or specify [other options](https://github.com/actions/toolkit/blob/d9347d4ab99fd507c0b9104b2cf79fb44fcc827d/packages/exec/src/interfaces.ts#L5):
|
||||||
|
|
||||||
|
```
|
||||||
|
const exec = require('@actions/exec');
|
||||||
|
|
||||||
|
const myOutput = '';
|
||||||
|
const myError = '';
|
||||||
|
|
||||||
|
const options = {};
|
||||||
|
options.listeners = {
|
||||||
|
stdout: (data: Buffer) => {
|
||||||
|
myOutput += data.toString();
|
||||||
|
},
|
||||||
|
stderr: (data: Buffer) => {
|
||||||
|
myError += data.toString();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
options.cwd = './lib';
|
||||||
|
|
||||||
|
await exec.exec('node', ['index.js', 'foo=bar'], options);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Exec tools not in the PATH
|
||||||
|
|
||||||
|
You can use it in conjunction with the `which` function from `@actions/io` to execute tools that are not in the PATH:
|
||||||
|
|
||||||
|
```
|
||||||
|
const exec = require('@actions/exec');
|
||||||
|
const io = require('@actions/io');
|
||||||
|
|
||||||
|
const pythonPath: string = await io.which('python', true)
|
||||||
|
|
||||||
|
await exec.exec(`"${pythonPath}"`, ['main.py']);
|
||||||
|
```
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import * as im from './interfaces';
|
import * as im from './interfaces';
|
||||||
/**
|
/**
|
||||||
* Exec a command.
|
* Exec a command.
|
||||||
* Output will be streamed to the live console.
|
* Output will be streamed to the live console.
|
||||||
* Returns promise with return code
|
* Returns promise with return code
|
||||||
*
|
*
|
||||||
* @param commandLine command to execute (can include additional args). Must be correctly escaped.
|
* @param commandLine command to execute (can include additional args). Must be correctly escaped.
|
||||||
* @param args optional arguments for tool. Escaping is handled by the lib.
|
* @param args optional arguments for tool. Escaping is handled by the lib.
|
||||||
* @param options optional exec options. See ExecOptions
|
* @param options optional exec options. See ExecOptions
|
||||||
* @returns Promise<number> exit code
|
* @returns Promise<number> exit code
|
||||||
*/
|
*/
|
||||||
export declare function exec(commandLine: string, args?: string[], options?: im.ExecOptions): Promise<number>;
|
export declare function exec(commandLine: string, args?: string[], options?: im.ExecOptions): Promise<number>;
|
||||||
|
|
|
@ -1,36 +1,36 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||||
return new (P || (P = Promise))(function (resolve, reject) {
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const tr = require("./toolrunner");
|
const tr = require("./toolrunner");
|
||||||
/**
|
/**
|
||||||
* Exec a command.
|
* Exec a command.
|
||||||
* Output will be streamed to the live console.
|
* Output will be streamed to the live console.
|
||||||
* Returns promise with return code
|
* Returns promise with return code
|
||||||
*
|
*
|
||||||
* @param commandLine command to execute (can include additional args). Must be correctly escaped.
|
* @param commandLine command to execute (can include additional args). Must be correctly escaped.
|
||||||
* @param args optional arguments for tool. Escaping is handled by the lib.
|
* @param args optional arguments for tool. Escaping is handled by the lib.
|
||||||
* @param options optional exec options. See ExecOptions
|
* @param options optional exec options. See ExecOptions
|
||||||
* @returns Promise<number> exit code
|
* @returns Promise<number> exit code
|
||||||
*/
|
*/
|
||||||
function exec(commandLine, args, options) {
|
function exec(commandLine, args, options) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
const commandArgs = tr.argStringToArray(commandLine);
|
const commandArgs = tr.argStringToArray(commandLine);
|
||||||
if (commandArgs.length === 0) {
|
if (commandArgs.length === 0) {
|
||||||
throw new Error(`Parameter 'commandLine' cannot be null or empty.`);
|
throw new Error(`Parameter 'commandLine' cannot be null or empty.`);
|
||||||
}
|
}
|
||||||
// Path to tool to execute should be first arg
|
// Path to tool to execute should be first arg
|
||||||
const toolPath = commandArgs[0];
|
const toolPath = commandArgs[0];
|
||||||
args = commandArgs.slice(1).concat(args || []);
|
args = commandArgs.slice(1).concat(args || []);
|
||||||
const runner = new tr.ToolRunner(toolPath, args, options);
|
const runner = new tr.ToolRunner(toolPath, args, options);
|
||||||
return runner.exec();
|
return runner.exec();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.exec = exec;
|
exports.exec = exec;
|
||||||
//# sourceMappingURL=exec.js.map
|
//# sourceMappingURL=exec.js.map
|
|
@ -1,35 +1,35 @@
|
||||||
/// <reference types="node" />
|
/// <reference types="node" />
|
||||||
import * as stream from 'stream';
|
import * as stream from 'stream';
|
||||||
/**
|
/**
|
||||||
* Interface for exec options
|
* Interface for exec options
|
||||||
*/
|
*/
|
||||||
export interface ExecOptions {
|
export interface ExecOptions {
|
||||||
/** optional working directory. defaults to current */
|
/** optional working directory. defaults to current */
|
||||||
cwd?: string;
|
cwd?: string;
|
||||||
/** optional envvar dictionary. defaults to current process's env */
|
/** optional envvar dictionary. defaults to current process's env */
|
||||||
env?: {
|
env?: {
|
||||||
[key: string]: string;
|
[key: string]: string;
|
||||||
};
|
};
|
||||||
/** optional. defaults to false */
|
/** optional. defaults to false */
|
||||||
silent?: boolean;
|
silent?: boolean;
|
||||||
/** optional out stream to use. Defaults to process.stdout */
|
/** optional out stream to use. Defaults to process.stdout */
|
||||||
outStream?: stream.Writable;
|
outStream?: stream.Writable;
|
||||||
/** optional err stream to use. Defaults to process.stderr */
|
/** optional err stream to use. Defaults to process.stderr */
|
||||||
errStream?: stream.Writable;
|
errStream?: stream.Writable;
|
||||||
/** optional. whether to skip quoting/escaping arguments if needed. defaults to false. */
|
/** optional. whether to skip quoting/escaping arguments if needed. defaults to false. */
|
||||||
windowsVerbatimArguments?: boolean;
|
windowsVerbatimArguments?: boolean;
|
||||||
/** optional. whether to fail if output to stderr. defaults to false */
|
/** optional. whether to fail if output to stderr. defaults to false */
|
||||||
failOnStdErr?: boolean;
|
failOnStdErr?: boolean;
|
||||||
/** optional. defaults to failing on non zero. ignore will not fail leaving it up to the caller */
|
/** optional. defaults to failing on non zero. ignore will not fail leaving it up to the caller */
|
||||||
ignoreReturnCode?: boolean;
|
ignoreReturnCode?: boolean;
|
||||||
/** optional. How long in ms to wait for STDIO streams to close after the exit event of the process before terminating. defaults to 10000 */
|
/** optional. How long in ms to wait for STDIO streams to close after the exit event of the process before terminating. defaults to 10000 */
|
||||||
delay?: number;
|
delay?: number;
|
||||||
/** optional. Listeners for output. Callback functions that will be called on these events */
|
/** optional. Listeners for output. Callback functions that will be called on these events */
|
||||||
listeners?: {
|
listeners?: {
|
||||||
stdout?: (data: Buffer) => void;
|
stdout?: (data: Buffer) => void;
|
||||||
stderr?: (data: Buffer) => void;
|
stderr?: (data: Buffer) => void;
|
||||||
stdline?: (data: string) => void;
|
stdline?: (data: string) => void;
|
||||||
errline?: (data: string) => void;
|
errline?: (data: string) => void;
|
||||||
debug?: (data: string) => void;
|
debug?: (data: string) => void;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
//# sourceMappingURL=interfaces.js.map
|
//# sourceMappingURL=interfaces.js.map
|
|
@ -1,37 +1,37 @@
|
||||||
/// <reference types="node" />
|
/// <reference types="node" />
|
||||||
import * as events from 'events';
|
import * as events from 'events';
|
||||||
import * as im from './interfaces';
|
import * as im from './interfaces';
|
||||||
export declare class ToolRunner extends events.EventEmitter {
|
export declare class ToolRunner extends events.EventEmitter {
|
||||||
constructor(toolPath: string, args?: string[], options?: im.ExecOptions);
|
constructor(toolPath: string, args?: string[], options?: im.ExecOptions);
|
||||||
private toolPath;
|
private toolPath;
|
||||||
private args;
|
private args;
|
||||||
private options;
|
private options;
|
||||||
private _debug;
|
private _debug;
|
||||||
private _getCommandString;
|
private _getCommandString;
|
||||||
private _processLineBuffer;
|
private _processLineBuffer;
|
||||||
private _getSpawnFileName;
|
private _getSpawnFileName;
|
||||||
private _getSpawnArgs;
|
private _getSpawnArgs;
|
||||||
private _endsWith;
|
private _endsWith;
|
||||||
private _isCmdFile;
|
private _isCmdFile;
|
||||||
private _windowsQuoteCmdArg;
|
private _windowsQuoteCmdArg;
|
||||||
private _uvQuoteCmdArg;
|
private _uvQuoteCmdArg;
|
||||||
private _cloneExecOptions;
|
private _cloneExecOptions;
|
||||||
private _getSpawnOptions;
|
private _getSpawnOptions;
|
||||||
/**
|
/**
|
||||||
* Exec a tool.
|
* Exec a tool.
|
||||||
* Output will be streamed to the live console.
|
* Output will be streamed to the live console.
|
||||||
* Returns promise with return code
|
* Returns promise with return code
|
||||||
*
|
*
|
||||||
* @param tool path to tool to exec
|
* @param tool path to tool to exec
|
||||||
* @param options optional exec options. See ExecOptions
|
* @param options optional exec options. See ExecOptions
|
||||||
* @returns number
|
* @returns number
|
||||||
*/
|
*/
|
||||||
exec(): Promise<number>;
|
exec(): Promise<number>;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Convert an arg string to an array of args. Handles escaping
|
* Convert an arg string to an array of args. Handles escaping
|
||||||
*
|
*
|
||||||
* @param argString string of arguments
|
* @param argString string of arguments
|
||||||
* @returns string[] array of arguments
|
* @returns string[] array of arguments
|
||||||
*/
|
*/
|
||||||
export declare function argStringToArray(argString: string): string[];
|
export declare function argStringToArray(argString: string): string[];
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,29 +1,28 @@
|
||||||
{
|
{
|
||||||
"_from": "file:toolkit\\actions-exec-0.0.0.tgz",
|
"_from": "@actions/exec@^1.0.0",
|
||||||
"_id": "@actions/exec@0.0.0",
|
"_id": "@actions/exec@1.0.0",
|
||||||
"_inBundle": false,
|
"_inBundle": false,
|
||||||
"_integrity": "sha512-HHObusC4p1RElxIlrrN0sY/cweBYl+jKm3J/XWHPQZMipgJXB/dkVhUfl4KqH3Vim7oM2KjCGSfn+vTYrqVH3A==",
|
"_integrity": "sha512-nquH0+XKng+Ll7rZfCojN7NWSbnGh+ltwUJhzfbLkmOJgxocGX2/yXcZLMyT9fa7+tByEow/NSTrBExNlEj9fw==",
|
||||||
"_location": "/@actions/exec",
|
"_location": "/@actions/exec",
|
||||||
"_phantomChildren": {},
|
"_phantomChildren": {},
|
||||||
"_requested": {
|
"_requested": {
|
||||||
"type": "file",
|
"type": "range",
|
||||||
"where": "E:\\github\\setup-python",
|
"registry": true,
|
||||||
"raw": "@actions/exec@file:toolkit/actions-exec-0.0.0.tgz",
|
"raw": "@actions/exec@^1.0.0",
|
||||||
"name": "@actions/exec",
|
"name": "@actions/exec",
|
||||||
"escapedName": "@actions%2fexec",
|
"escapedName": "@actions%2fexec",
|
||||||
"scope": "@actions",
|
"scope": "@actions",
|
||||||
"rawSpec": "file:toolkit/actions-exec-0.0.0.tgz",
|
"rawSpec": "^1.0.0",
|
||||||
"saveSpec": "file:toolkit\\actions-exec-0.0.0.tgz",
|
"saveSpec": null,
|
||||||
"fetchSpec": "E:\\github\\setup-python\\toolkit\\actions-exec-0.0.0.tgz"
|
"fetchSpec": "^1.0.0"
|
||||||
},
|
},
|
||||||
"_requiredBy": [
|
"_requiredBy": [
|
||||||
"/",
|
|
||||||
"/@actions/tool-cache"
|
"/@actions/tool-cache"
|
||||||
],
|
],
|
||||||
"_resolved": "E:\\github\\setup-python\\toolkit\\actions-exec-0.0.0.tgz",
|
"_resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.0.0.tgz",
|
||||||
"_shasum": "341d868fe6c4123ded20db9c2106b7b8c16e1d73",
|
"_shasum": "70c8b698c9baa02965c07da5f0b185ca56f0a955",
|
||||||
"_spec": "@actions/exec@file:toolkit/actions-exec-0.0.0.tgz",
|
"_spec": "@actions/exec@^1.0.0",
|
||||||
"_where": "E:\\github\\setup-python",
|
"_where": "C:\\Users\\damccorm\\Documents\\setup-python\\node_modules\\@actions\\tool-cache",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/actions/toolkit/issues"
|
"url": "https://github.com/actions/toolkit/issues"
|
||||||
},
|
},
|
||||||
|
@ -31,7 +30,7 @@
|
||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"description": "Actions exec lib",
|
"description": "Actions exec lib",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@actions/io": "^0.0.0"
|
"@actions/io": "^1.0.0"
|
||||||
},
|
},
|
||||||
"directories": {
|
"directories": {
|
||||||
"lib": "lib",
|
"lib": "lib",
|
||||||
|
@ -40,6 +39,7 @@
|
||||||
"files": [
|
"files": [
|
||||||
"lib"
|
"lib"
|
||||||
],
|
],
|
||||||
|
"gitHead": "a40bce7c8d382aa3dbadaa327acbc696e9390e55",
|
||||||
"homepage": "https://github.com/actions/toolkit/tree/master/packages/exec",
|
"homepage": "https://github.com/actions/toolkit/tree/master/packages/exec",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"exec",
|
"exec",
|
||||||
|
@ -59,5 +59,5 @@
|
||||||
"test": "echo \"Error: run tests from root\" && exit 1",
|
"test": "echo \"Error: run tests from root\" && exit 1",
|
||||||
"tsc": "tsc"
|
"tsc": "tsc"
|
||||||
},
|
},
|
||||||
"version": "0.0.0"
|
"version": "1.0.0"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
Copyright 2019 GitHub
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
@ -1,7 +0,0 @@
|
||||||
# `@actions/exit`
|
|
||||||
|
|
||||||
> TODO: description
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
See [src/exit.ts](src/exit.ts).
|
|
|
@ -1,29 +0,0 @@
|
||||||
/**
|
|
||||||
* The code to exit an action
|
|
||||||
*/
|
|
||||||
export declare enum ExitCode {
|
|
||||||
/**
|
|
||||||
* A code indicating that the action was successful
|
|
||||||
*/
|
|
||||||
Success = 0,
|
|
||||||
/**
|
|
||||||
* A code indicating that the action was a failure
|
|
||||||
*/
|
|
||||||
Failure = 1,
|
|
||||||
/**
|
|
||||||
* A code indicating that the action is complete, but neither succeeded nor failed
|
|
||||||
*/
|
|
||||||
Neutral = 78
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Exit the action as a success.
|
|
||||||
*/
|
|
||||||
export declare function success(): void;
|
|
||||||
/**
|
|
||||||
* Exit the action as a failure.
|
|
||||||
*/
|
|
||||||
export declare function failure(): void;
|
|
||||||
/**
|
|
||||||
* Exit the action neither a success or a failure
|
|
||||||
*/
|
|
||||||
export declare function neutral(): void;
|
|
|
@ -1,44 +0,0 @@
|
||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
/**
|
|
||||||
* The code to exit an action
|
|
||||||
*/
|
|
||||||
var ExitCode;
|
|
||||||
(function (ExitCode) {
|
|
||||||
/**
|
|
||||||
* A code indicating that the action was successful
|
|
||||||
*/
|
|
||||||
ExitCode[ExitCode["Success"] = 0] = "Success";
|
|
||||||
/**
|
|
||||||
* A code indicating that the action was a failure
|
|
||||||
*/
|
|
||||||
ExitCode[ExitCode["Failure"] = 1] = "Failure";
|
|
||||||
/**
|
|
||||||
* A code indicating that the action is complete, but neither succeeded nor failed
|
|
||||||
*/
|
|
||||||
ExitCode[ExitCode["Neutral"] = 78] = "Neutral";
|
|
||||||
})(ExitCode = exports.ExitCode || (exports.ExitCode = {}));
|
|
||||||
// TODO: These exit codes may not behave as expected on the new runtime, due to
|
|
||||||
// complexities of async logging and sync exiting.
|
|
||||||
/**
|
|
||||||
* Exit the action as a success.
|
|
||||||
*/
|
|
||||||
function success() {
|
|
||||||
process.exit(ExitCode.Success);
|
|
||||||
}
|
|
||||||
exports.success = success;
|
|
||||||
/**
|
|
||||||
* Exit the action as a failure.
|
|
||||||
*/
|
|
||||||
function failure() {
|
|
||||||
process.exit(ExitCode.Failure);
|
|
||||||
}
|
|
||||||
exports.failure = failure;
|
|
||||||
/**
|
|
||||||
* Exit the action neither a success or a failure
|
|
||||||
*/
|
|
||||||
function neutral() {
|
|
||||||
process.exit(ExitCode.Neutral);
|
|
||||||
}
|
|
||||||
exports.neutral = neutral;
|
|
||||||
//# sourceMappingURL=exit.js.map
|
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"exit.js","sourceRoot":"","sources":["../src/exit.ts"],"names":[],"mappings":";;AAAA;;GAEG;AACH,IAAY,QAeX;AAfD,WAAY,QAAQ;IAClB;;OAEG;IACH,6CAAW,CAAA;IAEX;;OAEG;IACH,6CAAW,CAAA;IAEX;;OAEG;IACH,8CAAY,CAAA;AACd,CAAC,EAfW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAenB;AAED,+EAA+E;AAC/E,kDAAkD;AAElD;;GAEG;AACH,SAAgB,OAAO;IACrB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;AAChC,CAAC;AAFD,0BAEC;AAED;;GAEG;AACH,SAAgB,OAAO;IACrB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;AAChC,CAAC;AAFD,0BAEC;AAED;;GAEG;AACH,SAAgB,OAAO;IACrB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;AAChC,CAAC;AAFD,0BAEC"}
|
|
|
@ -1,61 +0,0 @@
|
||||||
{
|
|
||||||
"_from": "file:toolkit\\actions-exit-0.0.0.tgz",
|
|
||||||
"_id": "@actions/exit@0.0.0",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-vQdxFWM0/AERkC79mQ886SqPmV4joWhrSF7hiSTiJoKkE9eTjrKV5WQtp7SXv6OntrQkKX+ZjgdGpv+0rvJRCw==",
|
|
||||||
"_location": "/@actions/exit",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "file",
|
|
||||||
"where": "E:\\github\\setup-python",
|
|
||||||
"raw": "@actions/exit@file:toolkit/actions-exit-0.0.0.tgz",
|
|
||||||
"name": "@actions/exit",
|
|
||||||
"escapedName": "@actions%2fexit",
|
|
||||||
"scope": "@actions",
|
|
||||||
"rawSpec": "file:toolkit/actions-exit-0.0.0.tgz",
|
|
||||||
"saveSpec": "file:toolkit\\actions-exit-0.0.0.tgz",
|
|
||||||
"fetchSpec": "E:\\github\\setup-python\\toolkit\\actions-exit-0.0.0.tgz"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/",
|
|
||||||
"/@actions/core"
|
|
||||||
],
|
|
||||||
"_resolved": "E:\\github\\setup-python\\toolkit\\actions-exit-0.0.0.tgz",
|
|
||||||
"_shasum": "d47c8c61b45750ae49fea3061e3419a547b2a48f",
|
|
||||||
"_spec": "@actions/exit@file:toolkit/actions-exit-0.0.0.tgz",
|
|
||||||
"_where": "E:\\github\\setup-python",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/actions/toolkit/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "Functions for safely exiting from GitHub Actions",
|
|
||||||
"directories": {
|
|
||||||
"lib": "lib",
|
|
||||||
"test": "__tests__"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"lib"
|
|
||||||
],
|
|
||||||
"homepage": "https://github.com/actions/toolkit/tree/master/packages/exit",
|
|
||||||
"keywords": [
|
|
||||||
"github",
|
|
||||||
"actions",
|
|
||||||
"toolkit"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"main": "lib/exit.js",
|
|
||||||
"name": "@actions/exit",
|
|
||||||
"publishConfig": {
|
|
||||||
"access": "public"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/actions/toolkit.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: run tests from root\" && exit 1",
|
|
||||||
"tsc": "tsc"
|
|
||||||
},
|
|
||||||
"version": "0.0.0"
|
|
||||||
}
|
|
|
@ -1,49 +1,53 @@
|
||||||
# `@actions/io`
|
# `@actions/io`
|
||||||
|
|
||||||
> Core functions for cli filesystem scenarios
|
> Core functions for cli filesystem scenarios
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
```
|
#### mkdir -p
|
||||||
/**
|
|
||||||
* Copies a file or folder.
|
Recursively make a directory. Follows rules specified in [man mkdir](https://linux.die.net/man/1/mkdir) with the `-p` option specified:
|
||||||
*
|
|
||||||
* @param source source path
|
```
|
||||||
* @param dest destination path
|
const io = require('@actions/io');
|
||||||
* @param options optional. See CopyOptions.
|
|
||||||
*/
|
await io.mkdirP('path/to/make');
|
||||||
export function cp(source: string, dest: string, options?: CopyOptions): Promise<void>
|
```
|
||||||
|
|
||||||
/**
|
#### cp/mv
|
||||||
* Remove a path recursively with force
|
|
||||||
*
|
Copy or move files or folders. Follows rules specified in [man cp](https://linux.die.net/man/1/cp) and [man mv](https://linux.die.net/man/1/mv):
|
||||||
* @param path path to remove
|
|
||||||
*/
|
```
|
||||||
export function rmRF(path: string): Promise<void>
|
const io = require('@actions/io');
|
||||||
|
|
||||||
/**
|
// Recursive must be true for directories
|
||||||
* Make a directory. Creates the full path with folders in between
|
const options = { recursive: true, force: false }
|
||||||
*
|
|
||||||
* @param p path to create
|
await io.cp('path/to/directory', 'path/to/dest', options);
|
||||||
* @returns Promise<void>
|
await io.mv('path/to/file', 'path/to/dest');
|
||||||
*/
|
```
|
||||||
export function mkdirP(p: string): Promise<void>
|
|
||||||
|
#### rm -rf
|
||||||
/**
|
|
||||||
* Moves a path.
|
Remove a file or folder recursively. Follows rules specified in [man rm](https://linux.die.net/man/1/rm) with the `-r` and `-f` rules specified.
|
||||||
*
|
|
||||||
* @param source source path
|
```
|
||||||
* @param dest destination path
|
const io = require('@actions/io');
|
||||||
* @param options optional. See CopyOptions.
|
|
||||||
*/
|
await io.rmRF('path/to/directory');
|
||||||
export function mv(source: string, dest: string, options?: CopyOptions): Promise<void>
|
await io.rmRF('path/to/file');
|
||||||
|
```
|
||||||
/**
|
|
||||||
* Returns path of a tool had the tool actually been invoked. Resolves via paths.
|
#### which
|
||||||
*
|
|
||||||
* @param tool name of the tool
|
Get the path to a tool and resolves via paths. Follows the rules specified in [man which](https://linux.die.net/man/1/which).
|
||||||
* @param options optional. See WhichOptions.
|
|
||||||
* @returns Promise<string> path to tool
|
```
|
||||||
*/
|
const exec = require('@actions/exec');
|
||||||
export function which(tool: string, options?: WhichOptions): Promise<string>
|
const io = require('@actions/io');
|
||||||
```
|
|
||||||
|
const pythonPath: string = await io.which('python', true)
|
||||||
|
|
||||||
|
await exec.exec(`"${pythonPath}"`, ['main.py']);
|
||||||
|
```
|
||||||
|
|
|
@ -1,29 +1,29 @@
|
||||||
/// <reference types="node" />
|
/// <reference types="node" />
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
export declare const copyFile: typeof fs.promises.copyFile, lstat: typeof fs.promises.lstat, mkdir: typeof fs.promises.mkdir, readdir: typeof fs.promises.readdir, rmdir: typeof fs.promises.rmdir, stat: typeof fs.promises.stat, unlink: typeof fs.promises.unlink;
|
export declare const chmod: typeof fs.promises.chmod, copyFile: typeof fs.promises.copyFile, lstat: typeof fs.promises.lstat, mkdir: typeof fs.promises.mkdir, readdir: typeof fs.promises.readdir, readlink: typeof fs.promises.readlink, rename: typeof fs.promises.rename, rmdir: typeof fs.promises.rmdir, stat: typeof fs.promises.stat, symlink: typeof fs.promises.symlink, unlink: typeof fs.promises.unlink;
|
||||||
export declare const IS_WINDOWS: boolean;
|
export declare const IS_WINDOWS: boolean;
|
||||||
export declare function exists(fsPath: string): Promise<boolean>;
|
export declare function exists(fsPath: string): Promise<boolean>;
|
||||||
export declare function isDirectory(fsPath: string, useStat?: boolean): Promise<boolean>;
|
export declare function isDirectory(fsPath: string, useStat?: boolean): Promise<boolean>;
|
||||||
/**
|
/**
|
||||||
* On OSX/Linux, true if path starts with '/'. On Windows, true for paths like:
|
* On OSX/Linux, true if path starts with '/'. On Windows, true for paths like:
|
||||||
* \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases).
|
* \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases).
|
||||||
*/
|
*/
|
||||||
export declare function isRooted(p: string): boolean;
|
export declare function isRooted(p: string): boolean;
|
||||||
/**
|
/**
|
||||||
* Recursively create a directory at `fsPath`.
|
* Recursively create a directory at `fsPath`.
|
||||||
*
|
*
|
||||||
* This implementation is optimistic, meaning it attempts to create the full
|
* This implementation is optimistic, meaning it attempts to create the full
|
||||||
* path first, and backs up the path stack from there.
|
* path first, and backs up the path stack from there.
|
||||||
*
|
*
|
||||||
* @param fsPath The path to create
|
* @param fsPath The path to create
|
||||||
* @param maxDepth The maximum recursion depth
|
* @param maxDepth The maximum recursion depth
|
||||||
* @param depth The current recursion depth
|
* @param depth The current recursion depth
|
||||||
*/
|
*/
|
||||||
export declare function mkdirP(fsPath: string, maxDepth?: number, depth?: number): Promise<void>;
|
export declare function mkdirP(fsPath: string, maxDepth?: number, depth?: number): Promise<void>;
|
||||||
/**
|
/**
|
||||||
* Best effort attempt to determine whether a file exists and is executable.
|
* Best effort attempt to determine whether a file exists and is executable.
|
||||||
* @param filePath file path to check
|
* @param filePath file path to check
|
||||||
* @param extensions additional file extensions to try
|
* @param extensions additional file extensions to try
|
||||||
* @return if file exists and is executable, returns the file path. otherwise empty string.
|
* @return if file exists and is executable, returns the file path. otherwise empty string.
|
||||||
*/
|
*/
|
||||||
export declare function tryGetExecutablePath(filePath: string, extensions: string[]): Promise<string>;
|
export declare function tryGetExecutablePath(filePath: string, extensions: string[]): Promise<string>;
|
||||||
|
|
|
@ -1,194 +1,194 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||||
return new (P || (P = Promise))(function (resolve, reject) {
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
var _a;
|
var _a;
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const assert_1 = require("assert");
|
const assert_1 = require("assert");
|
||||||
const fs = require("fs");
|
const fs = require("fs");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
_a = fs.promises, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.readdir = _a.readdir, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.unlink = _a.unlink;
|
_a = fs.promises, exports.chmod = _a.chmod, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.readdir = _a.readdir, exports.readlink = _a.readlink, exports.rename = _a.rename, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.symlink = _a.symlink, exports.unlink = _a.unlink;
|
||||||
exports.IS_WINDOWS = process.platform === 'win32';
|
exports.IS_WINDOWS = process.platform === 'win32';
|
||||||
function exists(fsPath) {
|
function exists(fsPath) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
try {
|
try {
|
||||||
yield exports.stat(fsPath);
|
yield exports.stat(fsPath);
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
if (err.code === 'ENOENT') {
|
if (err.code === 'ENOENT') {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.exists = exists;
|
exports.exists = exists;
|
||||||
function isDirectory(fsPath, useStat = false) {
|
function isDirectory(fsPath, useStat = false) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
const stats = useStat ? yield exports.stat(fsPath) : yield exports.lstat(fsPath);
|
const stats = useStat ? yield exports.stat(fsPath) : yield exports.lstat(fsPath);
|
||||||
return stats.isDirectory();
|
return stats.isDirectory();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.isDirectory = isDirectory;
|
exports.isDirectory = isDirectory;
|
||||||
/**
|
/**
|
||||||
* On OSX/Linux, true if path starts with '/'. On Windows, true for paths like:
|
* On OSX/Linux, true if path starts with '/'. On Windows, true for paths like:
|
||||||
* \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases).
|
* \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases).
|
||||||
*/
|
*/
|
||||||
function isRooted(p) {
|
function isRooted(p) {
|
||||||
p = normalizeSeparators(p);
|
p = normalizeSeparators(p);
|
||||||
if (!p) {
|
if (!p) {
|
||||||
throw new Error('isRooted() parameter "p" cannot be empty');
|
throw new Error('isRooted() parameter "p" cannot be empty');
|
||||||
}
|
}
|
||||||
if (exports.IS_WINDOWS) {
|
if (exports.IS_WINDOWS) {
|
||||||
return (p.startsWith('\\') || /^[A-Z]:/i.test(p) // e.g. \ or \hello or \\hello
|
return (p.startsWith('\\') || /^[A-Z]:/i.test(p) // e.g. \ or \hello or \\hello
|
||||||
); // e.g. C: or C:\hello
|
); // e.g. C: or C:\hello
|
||||||
}
|
}
|
||||||
return p.startsWith('/');
|
return p.startsWith('/');
|
||||||
}
|
}
|
||||||
exports.isRooted = isRooted;
|
exports.isRooted = isRooted;
|
||||||
/**
|
/**
|
||||||
* Recursively create a directory at `fsPath`.
|
* Recursively create a directory at `fsPath`.
|
||||||
*
|
*
|
||||||
* This implementation is optimistic, meaning it attempts to create the full
|
* This implementation is optimistic, meaning it attempts to create the full
|
||||||
* path first, and backs up the path stack from there.
|
* path first, and backs up the path stack from there.
|
||||||
*
|
*
|
||||||
* @param fsPath The path to create
|
* @param fsPath The path to create
|
||||||
* @param maxDepth The maximum recursion depth
|
* @param maxDepth The maximum recursion depth
|
||||||
* @param depth The current recursion depth
|
* @param depth The current recursion depth
|
||||||
*/
|
*/
|
||||||
function mkdirP(fsPath, maxDepth = 1000, depth = 1) {
|
function mkdirP(fsPath, maxDepth = 1000, depth = 1) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
assert_1.ok(fsPath, 'a path argument must be provided');
|
assert_1.ok(fsPath, 'a path argument must be provided');
|
||||||
fsPath = path.resolve(fsPath);
|
fsPath = path.resolve(fsPath);
|
||||||
if (depth >= maxDepth)
|
if (depth >= maxDepth)
|
||||||
return exports.mkdir(fsPath);
|
return exports.mkdir(fsPath);
|
||||||
try {
|
try {
|
||||||
yield exports.mkdir(fsPath);
|
yield exports.mkdir(fsPath);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
switch (err.code) {
|
switch (err.code) {
|
||||||
case 'ENOENT': {
|
case 'ENOENT': {
|
||||||
yield mkdirP(path.dirname(fsPath), maxDepth, depth + 1);
|
yield mkdirP(path.dirname(fsPath), maxDepth, depth + 1);
|
||||||
yield exports.mkdir(fsPath);
|
yield exports.mkdir(fsPath);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
let stats;
|
let stats;
|
||||||
try {
|
try {
|
||||||
stats = yield exports.stat(fsPath);
|
stats = yield exports.stat(fsPath);
|
||||||
}
|
}
|
||||||
catch (err2) {
|
catch (err2) {
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
if (!stats.isDirectory())
|
if (!stats.isDirectory())
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.mkdirP = mkdirP;
|
exports.mkdirP = mkdirP;
|
||||||
/**
|
/**
|
||||||
* Best effort attempt to determine whether a file exists and is executable.
|
* Best effort attempt to determine whether a file exists and is executable.
|
||||||
* @param filePath file path to check
|
* @param filePath file path to check
|
||||||
* @param extensions additional file extensions to try
|
* @param extensions additional file extensions to try
|
||||||
* @return if file exists and is executable, returns the file path. otherwise empty string.
|
* @return if file exists and is executable, returns the file path. otherwise empty string.
|
||||||
*/
|
*/
|
||||||
function tryGetExecutablePath(filePath, extensions) {
|
function tryGetExecutablePath(filePath, extensions) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
let stats = undefined;
|
let stats = undefined;
|
||||||
try {
|
try {
|
||||||
// test file exists
|
// test file exists
|
||||||
stats = yield exports.stat(filePath);
|
stats = yield exports.stat(filePath);
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
if (err.code !== 'ENOENT') {
|
if (err.code !== 'ENOENT') {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`);
|
console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (stats && stats.isFile()) {
|
if (stats && stats.isFile()) {
|
||||||
if (exports.IS_WINDOWS) {
|
if (exports.IS_WINDOWS) {
|
||||||
// on Windows, test for valid extension
|
// on Windows, test for valid extension
|
||||||
const upperExt = path.extname(filePath).toUpperCase();
|
const upperExt = path.extname(filePath).toUpperCase();
|
||||||
if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) {
|
if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) {
|
||||||
return filePath;
|
return filePath;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (isUnixExecutable(stats)) {
|
if (isUnixExecutable(stats)) {
|
||||||
return filePath;
|
return filePath;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// try each extension
|
// try each extension
|
||||||
const originalFilePath = filePath;
|
const originalFilePath = filePath;
|
||||||
for (const extension of extensions) {
|
for (const extension of extensions) {
|
||||||
filePath = originalFilePath + extension;
|
filePath = originalFilePath + extension;
|
||||||
stats = undefined;
|
stats = undefined;
|
||||||
try {
|
try {
|
||||||
stats = yield exports.stat(filePath);
|
stats = yield exports.stat(filePath);
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
if (err.code !== 'ENOENT') {
|
if (err.code !== 'ENOENT') {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`);
|
console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (stats && stats.isFile()) {
|
if (stats && stats.isFile()) {
|
||||||
if (exports.IS_WINDOWS) {
|
if (exports.IS_WINDOWS) {
|
||||||
// preserve the case of the actual file (since an extension was appended)
|
// preserve the case of the actual file (since an extension was appended)
|
||||||
try {
|
try {
|
||||||
const directory = path.dirname(filePath);
|
const directory = path.dirname(filePath);
|
||||||
const upperName = path.basename(filePath).toUpperCase();
|
const upperName = path.basename(filePath).toUpperCase();
|
||||||
for (const actualName of yield exports.readdir(directory)) {
|
for (const actualName of yield exports.readdir(directory)) {
|
||||||
if (upperName === actualName.toUpperCase()) {
|
if (upperName === actualName.toUpperCase()) {
|
||||||
filePath = path.join(directory, actualName);
|
filePath = path.join(directory, actualName);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`);
|
console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`);
|
||||||
}
|
}
|
||||||
return filePath;
|
return filePath;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (isUnixExecutable(stats)) {
|
if (isUnixExecutable(stats)) {
|
||||||
return filePath;
|
return filePath;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return '';
|
return '';
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.tryGetExecutablePath = tryGetExecutablePath;
|
exports.tryGetExecutablePath = tryGetExecutablePath;
|
||||||
function normalizeSeparators(p) {
|
function normalizeSeparators(p) {
|
||||||
p = p || '';
|
p = p || '';
|
||||||
if (exports.IS_WINDOWS) {
|
if (exports.IS_WINDOWS) {
|
||||||
// convert slashes on Windows
|
// convert slashes on Windows
|
||||||
p = p.replace(/\//g, '\\');
|
p = p.replace(/\//g, '\\');
|
||||||
// remove redundant slashes
|
// remove redundant slashes
|
||||||
return p.replace(/\\\\+/g, '\\');
|
return p.replace(/\\\\+/g, '\\');
|
||||||
}
|
}
|
||||||
// remove redundant slashes
|
// remove redundant slashes
|
||||||
return p.replace(/\/\/+/g, '/');
|
return p.replace(/\/\/+/g, '/');
|
||||||
}
|
}
|
||||||
// on Mac/Linux, test the execute bit
|
// on Mac/Linux, test the execute bit
|
||||||
// R W X R W X R W X
|
// R W X R W X R W X
|
||||||
// 256 128 64 32 16 8 4 2 1
|
// 256 128 64 32 16 8 4 2 1
|
||||||
function isUnixExecutable(stats) {
|
function isUnixExecutable(stats) {
|
||||||
return ((stats.mode & 1) > 0 ||
|
return ((stats.mode & 1) > 0 ||
|
||||||
((stats.mode & 8) > 0 && stats.gid === process.getgid()) ||
|
((stats.mode & 8) > 0 && stats.gid === process.getgid()) ||
|
||||||
((stats.mode & 64) > 0 && stats.uid === process.getuid()));
|
((stats.mode & 64) > 0 && stats.uid === process.getuid()));
|
||||||
}
|
}
|
||||||
//# sourceMappingURL=io-util.js.map
|
//# sourceMappingURL=io-util.js.map
|
|
@ -1 +1 @@
|
||||||
{"version":3,"file":"io-util.js","sourceRoot":"","sources":["../src/io-util.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,mCAAyB;AACzB,yBAAwB;AACxB,6BAA4B;AAEf,gBAQE,iMAAA;AAEF,QAAA,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAA;AAEtD,SAAsB,MAAM,CAAC,MAAc;;QACzC,IAAI;YACF,MAAM,YAAI,CAAC,MAAM,CAAC,CAAA;SACnB;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACzB,OAAO,KAAK,CAAA;aACb;YAED,MAAM,GAAG,CAAA;SACV;QAED,OAAO,IAAI,CAAA;IACb,CAAC;CAAA;AAZD,wBAYC;AAED,SAAsB,WAAW,CAC/B,MAAc,EACd,UAAmB,KAAK;;QAExB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,YAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,aAAK,CAAC,MAAM,CAAC,CAAA;QAChE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAA;IAC5B,CAAC;CAAA;AAND,kCAMC;AAED;;;GAGG;AACH,SAAgB,QAAQ,CAAC,CAAS;IAChC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAA;IAC1B,IAAI,CAAC,CAAC,EAAE;QACN,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;KAC5D;IAED,IAAI,kBAAU,EAAE;QACd,OAAO,CACL,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,8BAA8B;SACxE,CAAA,CAAC,sBAAsB;KACzB;IAED,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AAC1B,CAAC;AAbD,4BAaC;AAED;;;;;;;;;GASG;AACH,SAAsB,MAAM,CAC1B,MAAc,EACd,WAAmB,IAAI,EACvB,QAAgB,CAAC;;QAEjB,WAAE,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAA;QAE9C,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAE7B,IAAI,KAAK,IAAI,QAAQ;YAAE,OAAO,aAAK,CAAC,MAAM,CAAC,CAAA;QAE3C,IAAI;YACF,MAAM,aAAK,CAAC,MAAM,CAAC,CAAA;YACnB,OAAM;SACP;QAAC,OAAO,GAAG,EAAE;YACZ,QAAQ,GAAG,CAAC,IAAI,EAAE;gBAChB,KAAK,QAAQ,CAAC,CAAC;oBACb,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;oBACvD,MAAM,aAAK,CAAC,MAAM,CAAC,CAAA;oBACnB,OAAM;iBACP;gBACD,OAAO,CAAC,CAAC;oBACP,IAAI,KAAe,CAAA;oBAEnB,IAAI;wBACF,KAAK,GAAG,MAAM,YAAI,CAAC,MAAM,CAAC,CAAA;qBAC3B;oBAAC,OAAO,IAAI,EAAE;wBACb,MAAM,GAAG,CAAA;qBACV;oBAED,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;wBAAE,MAAM,GAAG,CAAA;iBACpC;aACF;SACF;IACH,CAAC;CAAA;AAlCD,wBAkCC;AAED;;;;;GAKG;AACH,SAAsB,oBAAoB,CACxC,QAAgB,EAChB,UAAoB;;QAEpB,IAAI,KAAK,GAAyB,SAAS,CAAA;QAC3C,IAAI;YACF,mBAAmB;YACnB,KAAK,GAAG,MAAM,YAAI,CAAC,QAAQ,CAAC,CAAA;SAC7B;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACzB,sCAAsC;gBACtC,OAAO,CAAC,GAAG,CACT,uEAAuE,QAAQ,MAAM,GAAG,EAAE,CAC3F,CAAA;aACF;SACF;QACD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE;YAC3B,IAAI,kBAAU,EAAE;gBACd,uCAAuC;gBACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;gBACrD,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,EAAE;oBACpE,OAAO,QAAQ,CAAA;iBAChB;aACF;iBAAM;gBACL,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE;oBAC3B,OAAO,QAAQ,CAAA;iBAChB;aACF;SACF;QAED,qBAAqB;QACrB,MAAM,gBAAgB,GAAG,QAAQ,CAAA;QACjC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAClC,QAAQ,GAAG,gBAAgB,GAAG,SAAS,CAAA;YAEvC,KAAK,GAAG,SAAS,CAAA;YACjB,IAAI;gBACF,KAAK,GAAG,MAAM,YAAI,CAAC,QAAQ,CAAC,CAAA;aAC7B;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;oBACzB,sCAAsC;oBACtC,OAAO,CAAC,GAAG,CACT,uEAAuE,QAAQ,MAAM,GAAG,EAAE,CAC3F,CAAA;iBACF;aACF;YAED,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE;gBAC3B,IAAI,kBAAU,EAAE;oBACd,yEAAyE;oBACzE,IAAI;wBACF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;wBACxC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;wBACvD,KAAK,MAAM,UAAU,IAAI,MAAM,eAAO,CAAC,SAAS,CAAC,EAAE;4BACjD,IAAI,SAAS,KAAK,UAAU,CAAC,WAAW,EAAE,EAAE;gCAC1C,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;gCAC3C,MAAK;6BACN;yBACF;qBACF;oBAAC,OAAO,GAAG,EAAE;wBACZ,sCAAsC;wBACtC,OAAO,CAAC,GAAG,CACT,yEAAyE,QAAQ,MAAM,GAAG,EAAE,CAC7F,CAAA;qBACF;oBAED,OAAO,QAAQ,CAAA;iBAChB;qBAAM;oBACL,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE;wBAC3B,OAAO,QAAQ,CAAA;qBAChB;iBACF;aACF;SACF;QAED,OAAO,EAAE,CAAA;IACX,CAAC;CAAA;AA5ED,oDA4EC;AAED,SAAS,mBAAmB,CAAC,CAAS;IACpC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;IACX,IAAI,kBAAU,EAAE;QACd,6BAA6B;QAC7B,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAE1B,2BAA2B;QAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;KACjC;IAED,2BAA2B;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;AACjC,CAAC;AAED,qCAAqC;AACrC,6BAA6B;AAC7B,6BAA6B;AAC7B,SAAS,gBAAgB,CAAC,KAAe;IACvC,OAAO,CACL,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC;QACpB,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;QACxD,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAC1D,CAAA;AACH,CAAC"}
|
{"version":3,"file":"io-util.js","sourceRoot":"","sources":["../src/io-util.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,mCAAyB;AACzB,yBAAwB;AACxB,6BAA4B;AAEf,gBAYE,qTAAA;AAEF,QAAA,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAA;AAEtD,SAAsB,MAAM,CAAC,MAAc;;QACzC,IAAI;YACF,MAAM,YAAI,CAAC,MAAM,CAAC,CAAA;SACnB;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACzB,OAAO,KAAK,CAAA;aACb;YAED,MAAM,GAAG,CAAA;SACV;QAED,OAAO,IAAI,CAAA;IACb,CAAC;CAAA;AAZD,wBAYC;AAED,SAAsB,WAAW,CAC/B,MAAc,EACd,UAAmB,KAAK;;QAExB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,YAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,aAAK,CAAC,MAAM,CAAC,CAAA;QAChE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAA;IAC5B,CAAC;CAAA;AAND,kCAMC;AAED;;;GAGG;AACH,SAAgB,QAAQ,CAAC,CAAS;IAChC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAA;IAC1B,IAAI,CAAC,CAAC,EAAE;QACN,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;KAC5D;IAED,IAAI,kBAAU,EAAE;QACd,OAAO,CACL,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,8BAA8B;SACxE,CAAA,CAAC,sBAAsB;KACzB;IAED,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AAC1B,CAAC;AAbD,4BAaC;AAED;;;;;;;;;GASG;AACH,SAAsB,MAAM,CAC1B,MAAc,EACd,WAAmB,IAAI,EACvB,QAAgB,CAAC;;QAEjB,WAAE,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAA;QAE9C,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAE7B,IAAI,KAAK,IAAI,QAAQ;YAAE,OAAO,aAAK,CAAC,MAAM,CAAC,CAAA;QAE3C,IAAI;YACF,MAAM,aAAK,CAAC,MAAM,CAAC,CAAA;YACnB,OAAM;SACP;QAAC,OAAO,GAAG,EAAE;YACZ,QAAQ,GAAG,CAAC,IAAI,EAAE;gBAChB,KAAK,QAAQ,CAAC,CAAC;oBACb,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;oBACvD,MAAM,aAAK,CAAC,MAAM,CAAC,CAAA;oBACnB,OAAM;iBACP;gBACD,OAAO,CAAC,CAAC;oBACP,IAAI,KAAe,CAAA;oBAEnB,IAAI;wBACF,KAAK,GAAG,MAAM,YAAI,CAAC,MAAM,CAAC,CAAA;qBAC3B;oBAAC,OAAO,IAAI,EAAE;wBACb,MAAM,GAAG,CAAA;qBACV;oBAED,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;wBAAE,MAAM,GAAG,CAAA;iBACpC;aACF;SACF;IACH,CAAC;CAAA;AAlCD,wBAkCC;AAED;;;;;GAKG;AACH,SAAsB,oBAAoB,CACxC,QAAgB,EAChB,UAAoB;;QAEpB,IAAI,KAAK,GAAyB,SAAS,CAAA;QAC3C,IAAI;YACF,mBAAmB;YACnB,KAAK,GAAG,MAAM,YAAI,CAAC,QAAQ,CAAC,CAAA;SAC7B;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACzB,sCAAsC;gBACtC,OAAO,CAAC,GAAG,CACT,uEAAuE,QAAQ,MAAM,GAAG,EAAE,CAC3F,CAAA;aACF;SACF;QACD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE;YAC3B,IAAI,kBAAU,EAAE;gBACd,uCAAuC;gBACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;gBACrD,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,EAAE;oBACpE,OAAO,QAAQ,CAAA;iBAChB;aACF;iBAAM;gBACL,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE;oBAC3B,OAAO,QAAQ,CAAA;iBAChB;aACF;SACF;QAED,qBAAqB;QACrB,MAAM,gBAAgB,GAAG,QAAQ,CAAA;QACjC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAClC,QAAQ,GAAG,gBAAgB,GAAG,SAAS,CAAA;YAEvC,KAAK,GAAG,SAAS,CAAA;YACjB,IAAI;gBACF,KAAK,GAAG,MAAM,YAAI,CAAC,QAAQ,CAAC,CAAA;aAC7B;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;oBACzB,sCAAsC;oBACtC,OAAO,CAAC,GAAG,CACT,uEAAuE,QAAQ,MAAM,GAAG,EAAE,CAC3F,CAAA;iBACF;aACF;YAED,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE;gBAC3B,IAAI,kBAAU,EAAE;oBACd,yEAAyE;oBACzE,IAAI;wBACF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;wBACxC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;wBACvD,KAAK,MAAM,UAAU,IAAI,MAAM,eAAO,CAAC,SAAS,CAAC,EAAE;4BACjD,IAAI,SAAS,KAAK,UAAU,CAAC,WAAW,EAAE,EAAE;gCAC1C,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;gCAC3C,MAAK;6BACN;yBACF;qBACF;oBAAC,OAAO,GAAG,EAAE;wBACZ,sCAAsC;wBACtC,OAAO,CAAC,GAAG,CACT,yEAAyE,QAAQ,MAAM,GAAG,EAAE,CAC7F,CAAA;qBACF;oBAED,OAAO,QAAQ,CAAA;iBAChB;qBAAM;oBACL,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE;wBAC3B,OAAO,QAAQ,CAAA;qBAChB;iBACF;aACF;SACF;QAED,OAAO,EAAE,CAAA;IACX,CAAC;CAAA;AA5ED,oDA4EC;AAED,SAAS,mBAAmB,CAAC,CAAS;IACpC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;IACX,IAAI,kBAAU,EAAE;QACd,6BAA6B;QAC7B,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAE1B,2BAA2B;QAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;KACjC;IAED,2BAA2B;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;AACjC,CAAC;AAED,qCAAqC;AACrC,6BAA6B;AAC7B,6BAA6B;AAC7B,SAAS,gBAAgB,CAAC,KAAe;IACvC,OAAO,CACL,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC;QACpB,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;QACxD,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAC1D,CAAA;AACH,CAAC"}
|
|
@ -1,48 +1,56 @@
|
||||||
/**
|
/**
|
||||||
* Interface for cp/mv options
|
* Interface for cp/mv options
|
||||||
*/
|
*/
|
||||||
export interface CopyOptions {
|
export interface CopyOptions {
|
||||||
/** Optional. Whether to recursively copy all subdirectories. Defaults to false */
|
/** Optional. Whether to recursively copy all subdirectories. Defaults to false */
|
||||||
recursive?: boolean;
|
recursive?: boolean;
|
||||||
/** Optional. Whether to overwrite existing files in the destination. Defaults to true */
|
/** Optional. Whether to overwrite existing files in the destination. Defaults to true */
|
||||||
force?: boolean;
|
force?: boolean;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Copies a file or folder.
|
* Interface for cp/mv options
|
||||||
*
|
*/
|
||||||
* @param source source path
|
export interface MoveOptions {
|
||||||
* @param dest destination path
|
/** Optional. Whether to overwrite existing files in the destination. Defaults to true */
|
||||||
* @param options optional. See CopyOptions.
|
force?: boolean;
|
||||||
*/
|
}
|
||||||
export declare function cp(source: string, dest: string, options?: CopyOptions): Promise<void>;
|
/**
|
||||||
/**
|
* Copies a file or folder.
|
||||||
* Moves a path.
|
* Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js
|
||||||
*
|
*
|
||||||
* @param source source path
|
* @param source source path
|
||||||
* @param dest destination path
|
* @param dest destination path
|
||||||
* @param options optional. See CopyOptions.
|
* @param options optional. See CopyOptions.
|
||||||
*/
|
*/
|
||||||
export declare function mv(source: string, dest: string, options?: CopyOptions): Promise<void>;
|
export declare function cp(source: string, dest: string, options?: CopyOptions): Promise<void>;
|
||||||
/**
|
/**
|
||||||
* Remove a path recursively with force
|
* Moves a path.
|
||||||
*
|
*
|
||||||
* @param inputPath path to remove
|
* @param source source path
|
||||||
*/
|
* @param dest destination path
|
||||||
export declare function rmRF(inputPath: string): Promise<void>;
|
* @param options optional. See MoveOptions.
|
||||||
/**
|
*/
|
||||||
* Make a directory. Creates the full path with folders in between
|
export declare function mv(source: string, dest: string, options?: MoveOptions): Promise<void>;
|
||||||
* Will throw if it fails
|
/**
|
||||||
*
|
* Remove a path recursively with force
|
||||||
* @param fsPath path to create
|
*
|
||||||
* @returns Promise<void>
|
* @param inputPath path to remove
|
||||||
*/
|
*/
|
||||||
export declare function mkdirP(fsPath: string): Promise<void>;
|
export declare function rmRF(inputPath: string): Promise<void>;
|
||||||
/**
|
/**
|
||||||
* Returns path of a tool had the tool actually been invoked. Resolves via paths.
|
* Make a directory. Creates the full path with folders in between
|
||||||
* If you check and the tool does not exist, it will throw.
|
* Will throw if it fails
|
||||||
*
|
*
|
||||||
* @param tool name of the tool
|
* @param fsPath path to create
|
||||||
* @param check whether to check if tool exists
|
* @returns Promise<void>
|
||||||
* @returns Promise<string> path to tool
|
*/
|
||||||
*/
|
export declare function mkdirP(fsPath: string): Promise<void>;
|
||||||
export declare function which(tool: string, check?: boolean): Promise<string>;
|
/**
|
||||||
|
* Returns path of a tool had the tool actually been invoked. Resolves via paths.
|
||||||
|
* If you check and the tool does not exist, it will throw.
|
||||||
|
*
|
||||||
|
* @param tool name of the tool
|
||||||
|
* @param check whether to check if tool exists
|
||||||
|
* @returns Promise<string> path to tool
|
||||||
|
*/
|
||||||
|
export declare function which(tool: string, check?: boolean): Promise<string>;
|
||||||
|
|
|
@ -1,262 +1,289 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||||
return new (P || (P = Promise))(function (resolve, reject) {
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const childProcess = require("child_process");
|
const childProcess = require("child_process");
|
||||||
const fs = require("fs");
|
const path = require("path");
|
||||||
const path = require("path");
|
const util_1 = require("util");
|
||||||
const util_1 = require("util");
|
const ioUtil = require("./io-util");
|
||||||
const ioUtil = require("./io-util");
|
const exec = util_1.promisify(childProcess.exec);
|
||||||
const exec = util_1.promisify(childProcess.exec);
|
/**
|
||||||
/**
|
* Copies a file or folder.
|
||||||
* Copies a file or folder.
|
* Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js
|
||||||
*
|
*
|
||||||
* @param source source path
|
* @param source source path
|
||||||
* @param dest destination path
|
* @param dest destination path
|
||||||
* @param options optional. See CopyOptions.
|
* @param options optional. See CopyOptions.
|
||||||
*/
|
*/
|
||||||
function cp(source, dest, options = {}) {
|
function cp(source, dest, options = {}) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
yield move(source, dest, options, { deleteOriginal: false });
|
const { force, recursive } = readCopyOptions(options);
|
||||||
});
|
const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null;
|
||||||
}
|
// Dest is an existing file, but not forcing
|
||||||
exports.cp = cp;
|
if (destStat && destStat.isFile() && !force) {
|
||||||
/**
|
return;
|
||||||
* Moves a path.
|
}
|
||||||
*
|
// If dest is an existing directory, should copy inside.
|
||||||
* @param source source path
|
const newDest = destStat && destStat.isDirectory()
|
||||||
* @param dest destination path
|
? path.join(dest, path.basename(source))
|
||||||
* @param options optional. See CopyOptions.
|
: dest;
|
||||||
*/
|
if (!(yield ioUtil.exists(source))) {
|
||||||
function mv(source, dest, options = {}) {
|
throw new Error(`no such file or directory: ${source}`);
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
}
|
||||||
yield move(source, dest, options, { deleteOriginal: true });
|
const sourceStat = yield ioUtil.stat(source);
|
||||||
});
|
if (sourceStat.isDirectory()) {
|
||||||
}
|
if (!recursive) {
|
||||||
exports.mv = mv;
|
throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`);
|
||||||
/**
|
}
|
||||||
* Remove a path recursively with force
|
else {
|
||||||
*
|
yield cpDirRecursive(source, newDest, 0, force);
|
||||||
* @param inputPath path to remove
|
}
|
||||||
*/
|
}
|
||||||
function rmRF(inputPath) {
|
else {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
if (path.relative(source, newDest) === '') {
|
||||||
if (ioUtil.IS_WINDOWS) {
|
// a file cannot be copied to itself
|
||||||
// Node doesn't provide a delete operation, only an unlink function. This means that if the file is being used by another
|
throw new Error(`'${newDest}' and '${source}' are the same file`);
|
||||||
// program (e.g. antivirus), it won't be deleted. To address this, we shell out the work to rd/del.
|
}
|
||||||
try {
|
yield copyFile(source, newDest, force);
|
||||||
if (yield ioUtil.isDirectory(inputPath, true)) {
|
}
|
||||||
yield exec(`rd /s /q "${inputPath}"`);
|
});
|
||||||
}
|
}
|
||||||
else {
|
exports.cp = cp;
|
||||||
yield exec(`del /f /a "${inputPath}"`);
|
/**
|
||||||
}
|
* Moves a path.
|
||||||
}
|
*
|
||||||
catch (err) {
|
* @param source source path
|
||||||
// if you try to delete a file that doesn't exist, desired result is achieved
|
* @param dest destination path
|
||||||
// other errors are valid
|
* @param options optional. See MoveOptions.
|
||||||
if (err.code !== 'ENOENT')
|
*/
|
||||||
throw err;
|
function mv(source, dest, options = {}) {
|
||||||
}
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
// Shelling out fails to remove a symlink folder with missing source, this unlink catches that
|
if (yield ioUtil.exists(dest)) {
|
||||||
try {
|
let destExists = true;
|
||||||
yield ioUtil.unlink(inputPath);
|
if (yield ioUtil.isDirectory(dest)) {
|
||||||
}
|
// If dest is directory copy src into dest
|
||||||
catch (err) {
|
dest = path.join(dest, path.basename(source));
|
||||||
// if you try to delete a file that doesn't exist, desired result is achieved
|
destExists = yield ioUtil.exists(dest);
|
||||||
// other errors are valid
|
}
|
||||||
if (err.code !== 'ENOENT')
|
if (destExists) {
|
||||||
throw err;
|
if (options.force == null || options.force) {
|
||||||
}
|
yield rmRF(dest);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let isDir = false;
|
throw new Error('Destination already exists');
|
||||||
try {
|
}
|
||||||
isDir = yield ioUtil.isDirectory(inputPath);
|
}
|
||||||
}
|
}
|
||||||
catch (err) {
|
yield mkdirP(path.dirname(dest));
|
||||||
// if you try to delete a file that doesn't exist, desired result is achieved
|
yield ioUtil.rename(source, dest);
|
||||||
// other errors are valid
|
});
|
||||||
if (err.code !== 'ENOENT')
|
}
|
||||||
throw err;
|
exports.mv = mv;
|
||||||
return;
|
/**
|
||||||
}
|
* Remove a path recursively with force
|
||||||
if (isDir) {
|
*
|
||||||
yield exec(`rm -rf "${inputPath}"`);
|
* @param inputPath path to remove
|
||||||
}
|
*/
|
||||||
else {
|
function rmRF(inputPath) {
|
||||||
yield ioUtil.unlink(inputPath);
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
}
|
if (ioUtil.IS_WINDOWS) {
|
||||||
}
|
// Node doesn't provide a delete operation, only an unlink function. This means that if the file is being used by another
|
||||||
});
|
// program (e.g. antivirus), it won't be deleted. To address this, we shell out the work to rd/del.
|
||||||
}
|
try {
|
||||||
exports.rmRF = rmRF;
|
if (yield ioUtil.isDirectory(inputPath, true)) {
|
||||||
/**
|
yield exec(`rd /s /q "${inputPath}"`);
|
||||||
* Make a directory. Creates the full path with folders in between
|
}
|
||||||
* Will throw if it fails
|
else {
|
||||||
*
|
yield exec(`del /f /a "${inputPath}"`);
|
||||||
* @param fsPath path to create
|
}
|
||||||
* @returns Promise<void>
|
}
|
||||||
*/
|
catch (err) {
|
||||||
function mkdirP(fsPath) {
|
// if you try to delete a file that doesn't exist, desired result is achieved
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
// other errors are valid
|
||||||
yield ioUtil.mkdirP(fsPath);
|
if (err.code !== 'ENOENT')
|
||||||
});
|
throw err;
|
||||||
}
|
}
|
||||||
exports.mkdirP = mkdirP;
|
// Shelling out fails to remove a symlink folder with missing source, this unlink catches that
|
||||||
/**
|
try {
|
||||||
* Returns path of a tool had the tool actually been invoked. Resolves via paths.
|
yield ioUtil.unlink(inputPath);
|
||||||
* If you check and the tool does not exist, it will throw.
|
}
|
||||||
*
|
catch (err) {
|
||||||
* @param tool name of the tool
|
// if you try to delete a file that doesn't exist, desired result is achieved
|
||||||
* @param check whether to check if tool exists
|
// other errors are valid
|
||||||
* @returns Promise<string> path to tool
|
if (err.code !== 'ENOENT')
|
||||||
*/
|
throw err;
|
||||||
function which(tool, check) {
|
}
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
}
|
||||||
if (!tool) {
|
else {
|
||||||
throw new Error("parameter 'tool' is required");
|
let isDir = false;
|
||||||
}
|
try {
|
||||||
// recursive when check=true
|
isDir = yield ioUtil.isDirectory(inputPath);
|
||||||
if (check) {
|
}
|
||||||
const result = yield which(tool, false);
|
catch (err) {
|
||||||
if (!result) {
|
// if you try to delete a file that doesn't exist, desired result is achieved
|
||||||
if (ioUtil.IS_WINDOWS) {
|
// other errors are valid
|
||||||
throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`);
|
if (err.code !== 'ENOENT')
|
||||||
}
|
throw err;
|
||||||
else {
|
return;
|
||||||
throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`);
|
}
|
||||||
}
|
if (isDir) {
|
||||||
}
|
yield exec(`rm -rf "${inputPath}"`);
|
||||||
}
|
}
|
||||||
try {
|
else {
|
||||||
// build the list of extensions to try
|
yield ioUtil.unlink(inputPath);
|
||||||
const extensions = [];
|
}
|
||||||
if (ioUtil.IS_WINDOWS && process.env.PATHEXT) {
|
}
|
||||||
for (const extension of process.env.PATHEXT.split(path.delimiter)) {
|
});
|
||||||
if (extension) {
|
}
|
||||||
extensions.push(extension);
|
exports.rmRF = rmRF;
|
||||||
}
|
/**
|
||||||
}
|
* Make a directory. Creates the full path with folders in between
|
||||||
}
|
* Will throw if it fails
|
||||||
// if it's rooted, return it if exists. otherwise return empty.
|
*
|
||||||
if (ioUtil.isRooted(tool)) {
|
* @param fsPath path to create
|
||||||
const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions);
|
* @returns Promise<void>
|
||||||
if (filePath) {
|
*/
|
||||||
return filePath;
|
function mkdirP(fsPath) {
|
||||||
}
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
return '';
|
yield ioUtil.mkdirP(fsPath);
|
||||||
}
|
});
|
||||||
// if any path separators, return empty
|
}
|
||||||
if (tool.includes('/') || (ioUtil.IS_WINDOWS && tool.includes('\\'))) {
|
exports.mkdirP = mkdirP;
|
||||||
return '';
|
/**
|
||||||
}
|
* Returns path of a tool had the tool actually been invoked. Resolves via paths.
|
||||||
// build the list of directories
|
* If you check and the tool does not exist, it will throw.
|
||||||
//
|
*
|
||||||
// Note, technically "where" checks the current directory on Windows. From a task lib perspective,
|
* @param tool name of the tool
|
||||||
// it feels like we should not do this. Checking the current directory seems like more of a use
|
* @param check whether to check if tool exists
|
||||||
// case of a shell, and the which() function exposed by the task lib should strive for consistency
|
* @returns Promise<string> path to tool
|
||||||
// across platforms.
|
*/
|
||||||
const directories = [];
|
function which(tool, check) {
|
||||||
if (process.env.PATH) {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
for (const p of process.env.PATH.split(path.delimiter)) {
|
if (!tool) {
|
||||||
if (p) {
|
throw new Error("parameter 'tool' is required");
|
||||||
directories.push(p);
|
}
|
||||||
}
|
// recursive when check=true
|
||||||
}
|
if (check) {
|
||||||
}
|
const result = yield which(tool, false);
|
||||||
// return the first match
|
if (!result) {
|
||||||
for (const directory of directories) {
|
if (ioUtil.IS_WINDOWS) {
|
||||||
const filePath = yield ioUtil.tryGetExecutablePath(directory + path.sep + tool, extensions);
|
throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`);
|
||||||
if (filePath) {
|
}
|
||||||
return filePath;
|
else {
|
||||||
}
|
throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`);
|
||||||
}
|
}
|
||||||
return '';
|
}
|
||||||
}
|
}
|
||||||
catch (err) {
|
try {
|
||||||
throw new Error(`which failed with message ${err.message}`);
|
// build the list of extensions to try
|
||||||
}
|
const extensions = [];
|
||||||
});
|
if (ioUtil.IS_WINDOWS && process.env.PATHEXT) {
|
||||||
}
|
for (const extension of process.env.PATHEXT.split(path.delimiter)) {
|
||||||
exports.which = which;
|
if (extension) {
|
||||||
// Copies contents of source into dest, making any necessary folders along the way.
|
extensions.push(extension);
|
||||||
// Deletes the original copy if deleteOriginal is true
|
}
|
||||||
function copyDirectoryContents(source, dest, force, deleteOriginal = false) {
|
}
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
}
|
||||||
if (yield ioUtil.isDirectory(source)) {
|
// if it's rooted, return it if exists. otherwise return empty.
|
||||||
if (yield ioUtil.exists(dest)) {
|
if (ioUtil.isRooted(tool)) {
|
||||||
if (!(yield ioUtil.isDirectory(dest))) {
|
const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions);
|
||||||
throw new Error(`${dest} is not a directory`);
|
if (filePath) {
|
||||||
}
|
return filePath;
|
||||||
}
|
}
|
||||||
else {
|
return '';
|
||||||
yield mkdirP(dest);
|
}
|
||||||
}
|
// if any path separators, return empty
|
||||||
// Copy all child files, and directories recursively
|
if (tool.includes('/') || (ioUtil.IS_WINDOWS && tool.includes('\\'))) {
|
||||||
const sourceChildren = yield ioUtil.readdir(source);
|
return '';
|
||||||
for (const newSource of sourceChildren) {
|
}
|
||||||
const newDest = path.join(dest, path.basename(newSource));
|
// build the list of directories
|
||||||
yield copyDirectoryContents(path.resolve(source, newSource), newDest, force, deleteOriginal);
|
//
|
||||||
}
|
// Note, technically "where" checks the current directory on Windows. From a task lib perspective,
|
||||||
if (deleteOriginal) {
|
// it feels like we should not do this. Checking the current directory seems like more of a use
|
||||||
yield ioUtil.rmdir(source);
|
// case of a shell, and the which() function exposed by the task lib should strive for consistency
|
||||||
}
|
// across platforms.
|
||||||
}
|
const directories = [];
|
||||||
else {
|
if (process.env.PATH) {
|
||||||
if (force) {
|
for (const p of process.env.PATH.split(path.delimiter)) {
|
||||||
yield ioUtil.copyFile(source, dest);
|
if (p) {
|
||||||
}
|
directories.push(p);
|
||||||
else {
|
}
|
||||||
yield ioUtil.copyFile(source, dest, fs.constants.COPYFILE_EXCL);
|
}
|
||||||
}
|
}
|
||||||
if (deleteOriginal) {
|
// return the first match
|
||||||
yield ioUtil.unlink(source);
|
for (const directory of directories) {
|
||||||
}
|
const filePath = yield ioUtil.tryGetExecutablePath(directory + path.sep + tool, extensions);
|
||||||
}
|
if (filePath) {
|
||||||
});
|
return filePath;
|
||||||
}
|
}
|
||||||
function move(source, dest, options = {}, moveOptions) {
|
}
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return '';
|
||||||
const { force, recursive } = readCopyOptions(options);
|
}
|
||||||
if (yield ioUtil.isDirectory(source)) {
|
catch (err) {
|
||||||
if (!recursive) {
|
throw new Error(`which failed with message ${err.message}`);
|
||||||
throw new Error(`non-recursive cp failed, ${source} is a directory`);
|
}
|
||||||
}
|
});
|
||||||
// If directory exists, move source inside it. Otherwise, create it and move contents of source inside.
|
}
|
||||||
if (yield ioUtil.exists(dest)) {
|
exports.which = which;
|
||||||
if (!(yield ioUtil.isDirectory(dest))) {
|
function readCopyOptions(options) {
|
||||||
throw new Error(`${dest} is not a directory`);
|
const force = options.force == null ? true : options.force;
|
||||||
}
|
const recursive = Boolean(options.recursive);
|
||||||
dest = path.join(dest, path.basename(source));
|
return { force, recursive };
|
||||||
}
|
}
|
||||||
yield copyDirectoryContents(source, dest, force, moveOptions.deleteOriginal);
|
function cpDirRecursive(sourceDir, destDir, currentDepth, force) {
|
||||||
}
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
else {
|
// Ensure there is not a run away recursive copy
|
||||||
if ((yield ioUtil.exists(dest)) && (yield ioUtil.isDirectory(dest))) {
|
if (currentDepth >= 255)
|
||||||
dest = path.join(dest, path.basename(source));
|
return;
|
||||||
}
|
currentDepth++;
|
||||||
if (force) {
|
yield mkdirP(destDir);
|
||||||
yield ioUtil.copyFile(source, dest);
|
const files = yield ioUtil.readdir(sourceDir);
|
||||||
}
|
for (const fileName of files) {
|
||||||
else {
|
const srcFile = `${sourceDir}/${fileName}`;
|
||||||
yield ioUtil.copyFile(source, dest, fs.constants.COPYFILE_EXCL);
|
const destFile = `${destDir}/${fileName}`;
|
||||||
}
|
const srcFileStat = yield ioUtil.lstat(srcFile);
|
||||||
if (moveOptions.deleteOriginal) {
|
if (srcFileStat.isDirectory()) {
|
||||||
yield ioUtil.unlink(source);
|
// Recurse
|
||||||
}
|
yield cpDirRecursive(srcFile, destFile, currentDepth, force);
|
||||||
}
|
}
|
||||||
});
|
else {
|
||||||
}
|
yield copyFile(srcFile, destFile, force);
|
||||||
function readCopyOptions(options) {
|
}
|
||||||
const force = options.force == null ? true : options.force;
|
}
|
||||||
const recursive = Boolean(options.recursive);
|
// Change the mode for the newly created directory
|
||||||
return { force, recursive };
|
yield ioUtil.chmod(destDir, (yield ioUtil.stat(sourceDir)).mode);
|
||||||
}
|
});
|
||||||
|
}
|
||||||
|
// Buffered file copy
|
||||||
|
function copyFile(srcFile, destFile, force) {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
if ((yield ioUtil.lstat(srcFile)).isSymbolicLink()) {
|
||||||
|
// unlink/re-link it
|
||||||
|
try {
|
||||||
|
yield ioUtil.lstat(destFile);
|
||||||
|
yield ioUtil.unlink(destFile);
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
// Try to override file permission
|
||||||
|
if (e.code === 'EPERM') {
|
||||||
|
yield ioUtil.chmod(destFile, '0666');
|
||||||
|
yield ioUtil.unlink(destFile);
|
||||||
|
}
|
||||||
|
// other errors = it doesn't exist, no work to do
|
||||||
|
}
|
||||||
|
// Copy over symlink
|
||||||
|
const symlinkFull = yield ioUtil.readlink(srcFile);
|
||||||
|
yield ioUtil.symlink(symlinkFull, destFile, ioUtil.IS_WINDOWS ? 'junction' : null);
|
||||||
|
}
|
||||||
|
else if (!(yield ioUtil.exists(destFile)) || force) {
|
||||||
|
yield ioUtil.copyFile(srcFile, destFile);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
//# sourceMappingURL=io.js.map
|
//# sourceMappingURL=io.js.map
|
File diff suppressed because one or more lines are too long
|
@ -1,29 +1,29 @@
|
||||||
{
|
{
|
||||||
"_from": "file:toolkit\\actions-io-0.0.0.tgz",
|
"_from": "@actions/io@^1.0.0",
|
||||||
"_id": "@actions/io@0.0.0",
|
"_id": "@actions/io@1.0.0",
|
||||||
"_inBundle": false,
|
"_inBundle": false,
|
||||||
"_integrity": "sha512-BArfobXB/b6RjR4i/+P4UcdaqR2tPjEb2WzZf9GdKiSARQn7d301pKOZAqxA+0N11X07Lk46t/txeUBcrCNbeg==",
|
"_integrity": "sha512-ezrJSRdqtXtdx1WXlfYL85+40F7gB39jCK9P0jZVODW3W6xUYmu6ZOEc/UmmElUwhRyDRm1R4yNZu1Joq2kuQg==",
|
||||||
"_location": "/@actions/io",
|
"_location": "/@actions/io",
|
||||||
"_phantomChildren": {},
|
"_phantomChildren": {},
|
||||||
"_requested": {
|
"_requested": {
|
||||||
"type": "file",
|
"type": "range",
|
||||||
"where": "E:\\github\\setup-python",
|
"registry": true,
|
||||||
"raw": "@actions/io@file:toolkit/actions-io-0.0.0.tgz",
|
"raw": "@actions/io@^1.0.0",
|
||||||
"name": "@actions/io",
|
"name": "@actions/io",
|
||||||
"escapedName": "@actions%2fio",
|
"escapedName": "@actions%2fio",
|
||||||
"scope": "@actions",
|
"scope": "@actions",
|
||||||
"rawSpec": "file:toolkit/actions-io-0.0.0.tgz",
|
"rawSpec": "^1.0.0",
|
||||||
"saveSpec": "file:toolkit\\actions-io-0.0.0.tgz",
|
"saveSpec": null,
|
||||||
"fetchSpec": "E:\\github\\setup-python\\toolkit\\actions-io-0.0.0.tgz"
|
"fetchSpec": "^1.0.0"
|
||||||
},
|
},
|
||||||
"_requiredBy": [
|
"_requiredBy": [
|
||||||
"/",
|
"#DEV:/",
|
||||||
"/@actions/tool-cache"
|
"/@actions/tool-cache"
|
||||||
],
|
],
|
||||||
"_resolved": "E:\\github\\setup-python\\toolkit\\actions-io-0.0.0.tgz",
|
"_resolved": "https://registry.npmjs.org/@actions/io/-/io-1.0.0.tgz",
|
||||||
"_shasum": "1e8f0faca6b39215bebacedf473e5bb0716e39bf",
|
"_shasum": "379454174660623bb5b3bce0be8b9e2285a62bcb",
|
||||||
"_spec": "@actions/io@file:toolkit/actions-io-0.0.0.tgz",
|
"_spec": "@actions/io@^1.0.0",
|
||||||
"_where": "E:\\github\\setup-python",
|
"_where": "C:\\Users\\damccorm\\Documents\\setup-python\\node_modules\\@actions\\tool-cache",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/actions/toolkit/issues"
|
"url": "https://github.com/actions/toolkit/issues"
|
||||||
},
|
},
|
||||||
|
@ -37,6 +37,7 @@
|
||||||
"files": [
|
"files": [
|
||||||
"lib"
|
"lib"
|
||||||
],
|
],
|
||||||
|
"gitHead": "a40bce7c8d382aa3dbadaa327acbc696e9390e55",
|
||||||
"homepage": "https://github.com/actions/toolkit/tree/master/packages/io",
|
"homepage": "https://github.com/actions/toolkit/tree/master/packages/io",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"io",
|
"io",
|
||||||
|
@ -56,5 +57,5 @@
|
||||||
"test": "echo \"Error: run tests from root\" && exit 1",
|
"test": "echo \"Error: run tests from root\" && exit 1",
|
||||||
"tsc": "tsc"
|
"tsc": "tsc"
|
||||||
},
|
},
|
||||||
"version": "0.0.0"
|
"version": "1.0.0"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,82 @@
|
||||||
# `@actions/tool-cache`
|
# `@actions/tool-cache`
|
||||||
|
|
||||||
> Functions necessary for downloading and caching tools.
|
> Functions necessary for downloading and caching tools.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
See [src/tool-cache.ts](src/tool-cache.ts).
|
#### Download
|
||||||
|
|
||||||
|
You can use this to download tools (or other files) from a download URL:
|
||||||
|
|
||||||
|
```
|
||||||
|
const tc = require('@actions/tool-cache');
|
||||||
|
|
||||||
|
const node12Path = await tc.downloadTool('http://nodejs.org/dist/v12.7.0/node-v12.7.0-linux-x64.tar.gz');
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Extract
|
||||||
|
|
||||||
|
These can then be extracted in platform specific ways:
|
||||||
|
|
||||||
|
```
|
||||||
|
const tc = require('@actions/tool-cache');
|
||||||
|
|
||||||
|
if (process.platform === 'win32') {
|
||||||
|
tc.downloadTool('http://nodejs.org/dist/v12.7.0/node-v12.7.0-win-x64.zip');
|
||||||
|
const node12ExtractedFolder = await tc.extractZip(node12Path, 'path/to/extract/to');
|
||||||
|
|
||||||
|
// Or alternately
|
||||||
|
tc.downloadTool('http://nodejs.org/dist/v12.7.0/node-v12.7.0-win-x64.7z');
|
||||||
|
const node12ExtractedFolder = await tc.extract7z(node12Path, 'path/to/extract/to');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const node12Path = await tc.downloadTool('http://nodejs.org/dist/v12.7.0/node-v12.7.0-linux-x64.tar.gz');
|
||||||
|
const node12ExtractedFolder = await tc.extractTar(node12Path, 'path/to/extract/to');
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Cache
|
||||||
|
|
||||||
|
Finally, you can cache these directories in our tool-cache. This is useful if you want to switch back and forth between versions of a tool, or save a tool between runs for private runners (private runners are still in development but are on the roadmap).
|
||||||
|
|
||||||
|
You'll often want to add it to the path as part of this step:
|
||||||
|
|
||||||
|
```
|
||||||
|
const tc = require('@actions/tool-cache');
|
||||||
|
const core = require('@actions/core');
|
||||||
|
|
||||||
|
const node12Path = await tc.downloadTool('http://nodejs.org/dist/v12.7.0/node-v12.7.0-linux-x64.tar.gz');
|
||||||
|
const node12ExtractedFolder = await tc.extractTar(node12Path, 'path/to/extract/to');
|
||||||
|
|
||||||
|
const cachedPath = await tc.cacheDir(node12ExtractedFolder, 'node', '12.7.0');
|
||||||
|
core.addPath(cachedPath);
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also cache files for reuse.
|
||||||
|
|
||||||
|
```
|
||||||
|
const tc = require('@actions/tool-cache');
|
||||||
|
|
||||||
|
tc.cacheFile('path/to/exe', 'destFileName.exe', 'myExeName', '1.1.0');
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Find
|
||||||
|
|
||||||
|
Finally, you can find directories and files you've previously cached:
|
||||||
|
|
||||||
|
```
|
||||||
|
const tc = require('@actions/tool-cache');
|
||||||
|
const core = require('@actions/core');
|
||||||
|
|
||||||
|
const nodeDirectory = tc.find('node', '12.x', 'x64');
|
||||||
|
core.addPath(nodeDirectory);
|
||||||
|
```
|
||||||
|
|
||||||
|
You can even find all cached versions of a tool:
|
||||||
|
|
||||||
|
```
|
||||||
|
const tc = require('@actions/tool-cache');
|
||||||
|
|
||||||
|
const allNodeVersions = tc.findAllVersions('node');
|
||||||
|
console.log(`Versions of node available: ${allNodeVersions}`);
|
||||||
|
```
|
||||||
|
|
|
@ -1,78 +1,78 @@
|
||||||
export declare class HTTPError extends Error {
|
export declare class HTTPError extends Error {
|
||||||
readonly httpStatusCode: number | undefined;
|
readonly httpStatusCode: number | undefined;
|
||||||
constructor(httpStatusCode: number | undefined);
|
constructor(httpStatusCode: number | undefined);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Download a tool from an url and stream it into a file
|
* Download a tool from an url and stream it into a file
|
||||||
*
|
*
|
||||||
* @param url url of tool to download
|
* @param url url of tool to download
|
||||||
* @returns path to downloaded tool
|
* @returns path to downloaded tool
|
||||||
*/
|
*/
|
||||||
export declare function downloadTool(url: string): Promise<string>;
|
export declare function downloadTool(url: string): Promise<string>;
|
||||||
/**
|
/**
|
||||||
* Extract a .7z file
|
* Extract a .7z file
|
||||||
*
|
*
|
||||||
* @param file path to the .7z file
|
* @param file path to the .7z file
|
||||||
* @param dest destination directory. Optional.
|
* @param dest destination directory. Optional.
|
||||||
* @param _7zPath path to 7zr.exe. Optional, for long path support. Most .7z archives do not have this
|
* @param _7zPath path to 7zr.exe. Optional, for long path support. Most .7z archives do not have this
|
||||||
* problem. If your .7z archive contains very long paths, you can pass the path to 7zr.exe which will
|
* problem. If your .7z archive contains very long paths, you can pass the path to 7zr.exe which will
|
||||||
* gracefully handle long paths. By default 7zdec.exe is used because it is a very small program and is
|
* gracefully handle long paths. By default 7zdec.exe is used because it is a very small program and is
|
||||||
* bundled with the tool lib. However it does not support long paths. 7zr.exe is the reduced command line
|
* bundled with the tool lib. However it does not support long paths. 7zr.exe is the reduced command line
|
||||||
* interface, it is smaller than the full command line interface, and it does support long paths. At the
|
* interface, it is smaller than the full command line interface, and it does support long paths. At the
|
||||||
* time of this writing, it is freely available from the LZMA SDK that is available on the 7zip website.
|
* time of this writing, it is freely available from the LZMA SDK that is available on the 7zip website.
|
||||||
* Be sure to check the current license agreement. If 7zr.exe is bundled with your action, then the path
|
* Be sure to check the current license agreement. If 7zr.exe is bundled with your action, then the path
|
||||||
* to 7zr.exe can be pass to this function.
|
* to 7zr.exe can be pass to this function.
|
||||||
* @returns path to the destination directory
|
* @returns path to the destination directory
|
||||||
*/
|
*/
|
||||||
export declare function extract7z(file: string, dest?: string, _7zPath?: string): Promise<string>;
|
export declare function extract7z(file: string, dest?: string, _7zPath?: string): Promise<string>;
|
||||||
/**
|
/**
|
||||||
* Extract a tar
|
* Extract a tar
|
||||||
*
|
*
|
||||||
* @param file path to the tar
|
* @param file path to the tar
|
||||||
* @param dest destination directory. Optional.
|
* @param dest destination directory. Optional.
|
||||||
* @returns path to the destination directory
|
* @returns path to the destination directory
|
||||||
*/
|
*/
|
||||||
export declare function extractTar(file: string, dest?: string): Promise<string>;
|
export declare function extractTar(file: string, dest?: string): Promise<string>;
|
||||||
/**
|
/**
|
||||||
* Extract a zip
|
* Extract a zip
|
||||||
*
|
*
|
||||||
* @param file path to the zip
|
* @param file path to the zip
|
||||||
* @param dest destination directory. Optional.
|
* @param dest destination directory. Optional.
|
||||||
* @returns path to the destination directory
|
* @returns path to the destination directory
|
||||||
*/
|
*/
|
||||||
export declare function extractZip(file: string, dest?: string): Promise<string>;
|
export declare function extractZip(file: string, dest?: string): Promise<string>;
|
||||||
/**
|
/**
|
||||||
* Caches a directory and installs it into the tool cacheDir
|
* Caches a directory and installs it into the tool cacheDir
|
||||||
*
|
*
|
||||||
* @param sourceDir the directory to cache into tools
|
* @param sourceDir the directory to cache into tools
|
||||||
* @param tool tool name
|
* @param tool tool name
|
||||||
* @param version version of the tool. semver format
|
* @param version version of the tool. semver format
|
||||||
* @param arch architecture of the tool. Optional. Defaults to machine architecture
|
* @param arch architecture of the tool. Optional. Defaults to machine architecture
|
||||||
*/
|
*/
|
||||||
export declare function cacheDir(sourceDir: string, tool: string, version: string, arch?: string): Promise<string>;
|
export declare function cacheDir(sourceDir: string, tool: string, version: string, arch?: string): Promise<string>;
|
||||||
/**
|
/**
|
||||||
* Caches a downloaded file (GUID) and installs it
|
* Caches a downloaded file (GUID) and installs it
|
||||||
* into the tool cache with a given targetName
|
* into the tool cache with a given targetName
|
||||||
*
|
*
|
||||||
* @param sourceFile the file to cache into tools. Typically a result of downloadTool which is a guid.
|
* @param sourceFile the file to cache into tools. Typically a result of downloadTool which is a guid.
|
||||||
* @param targetFile the name of the file name in the tools directory
|
* @param targetFile the name of the file name in the tools directory
|
||||||
* @param tool tool name
|
* @param tool tool name
|
||||||
* @param version version of the tool. semver format
|
* @param version version of the tool. semver format
|
||||||
* @param arch architecture of the tool. Optional. Defaults to machine architecture
|
* @param arch architecture of the tool. Optional. Defaults to machine architecture
|
||||||
*/
|
*/
|
||||||
export declare function cacheFile(sourceFile: string, targetFile: string, tool: string, version: string, arch?: string): Promise<string>;
|
export declare function cacheFile(sourceFile: string, targetFile: string, tool: string, version: string, arch?: string): Promise<string>;
|
||||||
/**
|
/**
|
||||||
* Finds the path to a tool version in the local installed tool cache
|
* Finds the path to a tool version in the local installed tool cache
|
||||||
*
|
*
|
||||||
* @param toolName name of the tool
|
* @param toolName name of the tool
|
||||||
* @param versionSpec version of the tool
|
* @param versionSpec version of the tool
|
||||||
* @param arch optional arch. defaults to arch of computer
|
* @param arch optional arch. defaults to arch of computer
|
||||||
*/
|
*/
|
||||||
export declare function find(toolName: string, versionSpec: string, arch?: string): string;
|
export declare function find(toolName: string, versionSpec: string, arch?: string): string;
|
||||||
/**
|
/**
|
||||||
* Finds the paths to all versions of a tool that are installed in the local tool cache
|
* Finds the paths to all versions of a tool that are installed in the local tool cache
|
||||||
*
|
*
|
||||||
* @param toolName name of the tool
|
* @param toolName name of the tool
|
||||||
* @param arch optional arch. defaults to arch of computer
|
* @param arch optional arch. defaults to arch of computer
|
||||||
*/
|
*/
|
||||||
export declare function findAllVersions(toolName: string, arch?: string): string[];
|
export declare function findAllVersions(toolName: string, arch?: string): string[];
|
||||||
|
|
|
@ -1,436 +1,436 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||||
return new (P || (P = Promise))(function (resolve, reject) {
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const core = require("@actions/core");
|
const core = require("@actions/core");
|
||||||
const io = require("@actions/io");
|
const io = require("@actions/io");
|
||||||
const fs = require("fs");
|
const fs = require("fs");
|
||||||
const os = require("os");
|
const os = require("os");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
const httpm = require("typed-rest-client/HttpClient");
|
const httpm = require("typed-rest-client/HttpClient");
|
||||||
const semver = require("semver");
|
const semver = require("semver");
|
||||||
const uuidV4 = require("uuid/v4");
|
const uuidV4 = require("uuid/v4");
|
||||||
const exec_1 = require("@actions/exec/lib/exec");
|
const exec_1 = require("@actions/exec/lib/exec");
|
||||||
const assert_1 = require("assert");
|
const assert_1 = require("assert");
|
||||||
class HTTPError extends Error {
|
class HTTPError extends Error {
|
||||||
constructor(httpStatusCode) {
|
constructor(httpStatusCode) {
|
||||||
super(`Unexpected HTTP response: ${httpStatusCode}`);
|
super(`Unexpected HTTP response: ${httpStatusCode}`);
|
||||||
this.httpStatusCode = httpStatusCode;
|
this.httpStatusCode = httpStatusCode;
|
||||||
Object.setPrototypeOf(this, new.target.prototype);
|
Object.setPrototypeOf(this, new.target.prototype);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
exports.HTTPError = HTTPError;
|
exports.HTTPError = HTTPError;
|
||||||
const IS_WINDOWS = process.platform === 'win32';
|
const IS_WINDOWS = process.platform === 'win32';
|
||||||
const userAgent = 'actions/tool-cache';
|
const userAgent = 'actions/tool-cache';
|
||||||
// On load grab temp directory and cache directory and remove them from env (currently don't want to expose this)
|
// On load grab temp directory and cache directory and remove them from env (currently don't want to expose this)
|
||||||
let tempDirectory = process.env['RUNNER_TEMP'] || '';
|
let tempDirectory = process.env['RUNNER_TEMP'] || '';
|
||||||
let cacheRoot = process.env['RUNNER_TOOL_CACHE'] || '';
|
let cacheRoot = process.env['RUNNER_TOOL_CACHE'] || '';
|
||||||
// If directories not found, place them in common temp locations
|
// If directories not found, place them in common temp locations
|
||||||
if (!tempDirectory || !cacheRoot) {
|
if (!tempDirectory || !cacheRoot) {
|
||||||
let baseLocation;
|
let baseLocation;
|
||||||
if (IS_WINDOWS) {
|
if (IS_WINDOWS) {
|
||||||
// On windows use the USERPROFILE env variable
|
// On windows use the USERPROFILE env variable
|
||||||
baseLocation = process.env['USERPROFILE'] || 'C:\\';
|
baseLocation = process.env['USERPROFILE'] || 'C:\\';
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (process.platform === 'darwin') {
|
if (process.platform === 'darwin') {
|
||||||
baseLocation = '/Users';
|
baseLocation = '/Users';
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
baseLocation = '/home';
|
baseLocation = '/home';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!tempDirectory) {
|
if (!tempDirectory) {
|
||||||
tempDirectory = path.join(baseLocation, 'actions', 'temp');
|
tempDirectory = path.join(baseLocation, 'actions', 'temp');
|
||||||
}
|
}
|
||||||
if (!cacheRoot) {
|
if (!cacheRoot) {
|
||||||
cacheRoot = path.join(baseLocation, 'actions', 'cache');
|
cacheRoot = path.join(baseLocation, 'actions', 'cache');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Download a tool from an url and stream it into a file
|
* Download a tool from an url and stream it into a file
|
||||||
*
|
*
|
||||||
* @param url url of tool to download
|
* @param url url of tool to download
|
||||||
* @returns path to downloaded tool
|
* @returns path to downloaded tool
|
||||||
*/
|
*/
|
||||||
function downloadTool(url) {
|
function downloadTool(url) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
// Wrap in a promise so that we can resolve from within stream callbacks
|
// Wrap in a promise so that we can resolve from within stream callbacks
|
||||||
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
||||||
try {
|
try {
|
||||||
const http = new httpm.HttpClient(userAgent, [], {
|
const http = new httpm.HttpClient(userAgent, [], {
|
||||||
allowRetries: true,
|
allowRetries: true,
|
||||||
maxRetries: 3
|
maxRetries: 3
|
||||||
});
|
});
|
||||||
const destPath = path.join(tempDirectory, uuidV4());
|
const destPath = path.join(tempDirectory, uuidV4());
|
||||||
yield io.mkdirP(tempDirectory);
|
yield io.mkdirP(tempDirectory);
|
||||||
core.debug(`Downloading ${url}`);
|
core.debug(`Downloading ${url}`);
|
||||||
core.debug(`Downloading ${destPath}`);
|
core.debug(`Downloading ${destPath}`);
|
||||||
if (fs.existsSync(destPath)) {
|
if (fs.existsSync(destPath)) {
|
||||||
throw new Error(`Destination file path ${destPath} already exists`);
|
throw new Error(`Destination file path ${destPath} already exists`);
|
||||||
}
|
}
|
||||||
const response = yield http.get(url);
|
const response = yield http.get(url);
|
||||||
if (response.message.statusCode !== 200) {
|
if (response.message.statusCode !== 200) {
|
||||||
const err = new HTTPError(response.message.statusCode);
|
const err = new HTTPError(response.message.statusCode);
|
||||||
core.debug(`Failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`);
|
core.debug(`Failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`);
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
const file = fs.createWriteStream(destPath);
|
const file = fs.createWriteStream(destPath);
|
||||||
file.on('open', () => __awaiter(this, void 0, void 0, function* () {
|
file.on('open', () => __awaiter(this, void 0, void 0, function* () {
|
||||||
try {
|
try {
|
||||||
const stream = response.message.pipe(file);
|
const stream = response.message.pipe(file);
|
||||||
stream.on('close', () => {
|
stream.on('close', () => {
|
||||||
core.debug('download complete');
|
core.debug('download complete');
|
||||||
resolve(destPath);
|
resolve(destPath);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
core.debug(`Failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`);
|
core.debug(`Failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`);
|
||||||
reject(err);
|
reject(err);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
file.on('error', err => {
|
file.on('error', err => {
|
||||||
file.end();
|
file.end();
|
||||||
reject(err);
|
reject(err);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
reject(err);
|
reject(err);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.downloadTool = downloadTool;
|
exports.downloadTool = downloadTool;
|
||||||
/**
|
/**
|
||||||
* Extract a .7z file
|
* Extract a .7z file
|
||||||
*
|
*
|
||||||
* @param file path to the .7z file
|
* @param file path to the .7z file
|
||||||
* @param dest destination directory. Optional.
|
* @param dest destination directory. Optional.
|
||||||
* @param _7zPath path to 7zr.exe. Optional, for long path support. Most .7z archives do not have this
|
* @param _7zPath path to 7zr.exe. Optional, for long path support. Most .7z archives do not have this
|
||||||
* problem. If your .7z archive contains very long paths, you can pass the path to 7zr.exe which will
|
* problem. If your .7z archive contains very long paths, you can pass the path to 7zr.exe which will
|
||||||
* gracefully handle long paths. By default 7zdec.exe is used because it is a very small program and is
|
* gracefully handle long paths. By default 7zdec.exe is used because it is a very small program and is
|
||||||
* bundled with the tool lib. However it does not support long paths. 7zr.exe is the reduced command line
|
* bundled with the tool lib. However it does not support long paths. 7zr.exe is the reduced command line
|
||||||
* interface, it is smaller than the full command line interface, and it does support long paths. At the
|
* interface, it is smaller than the full command line interface, and it does support long paths. At the
|
||||||
* time of this writing, it is freely available from the LZMA SDK that is available on the 7zip website.
|
* time of this writing, it is freely available from the LZMA SDK that is available on the 7zip website.
|
||||||
* Be sure to check the current license agreement. If 7zr.exe is bundled with your action, then the path
|
* Be sure to check the current license agreement. If 7zr.exe is bundled with your action, then the path
|
||||||
* to 7zr.exe can be pass to this function.
|
* to 7zr.exe can be pass to this function.
|
||||||
* @returns path to the destination directory
|
* @returns path to the destination directory
|
||||||
*/
|
*/
|
||||||
function extract7z(file, dest, _7zPath) {
|
function extract7z(file, dest, _7zPath) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
assert_1.ok(IS_WINDOWS, 'extract7z() not supported on current OS');
|
assert_1.ok(IS_WINDOWS, 'extract7z() not supported on current OS');
|
||||||
assert_1.ok(file, 'parameter "file" is required');
|
assert_1.ok(file, 'parameter "file" is required');
|
||||||
dest = dest || (yield _createExtractFolder(dest));
|
dest = dest || (yield _createExtractFolder(dest));
|
||||||
const originalCwd = process.cwd();
|
const originalCwd = process.cwd();
|
||||||
process.chdir(dest);
|
process.chdir(dest);
|
||||||
if (_7zPath) {
|
if (_7zPath) {
|
||||||
try {
|
try {
|
||||||
const args = [
|
const args = [
|
||||||
'x',
|
'x',
|
||||||
'-bb1',
|
'-bb1',
|
||||||
'-bd',
|
'-bd',
|
||||||
'-sccUTF-8',
|
'-sccUTF-8',
|
||||||
file
|
file
|
||||||
];
|
];
|
||||||
const options = {
|
const options = {
|
||||||
silent: true
|
silent: true
|
||||||
};
|
};
|
||||||
yield exec_1.exec(`"${_7zPath}"`, args, options);
|
yield exec_1.exec(`"${_7zPath}"`, args, options);
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
process.chdir(originalCwd);
|
process.chdir(originalCwd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const escapedScript = path
|
const escapedScript = path
|
||||||
.join(__dirname, '..', 'scripts', 'Invoke-7zdec.ps1')
|
.join(__dirname, '..', 'scripts', 'Invoke-7zdec.ps1')
|
||||||
.replace(/'/g, "''")
|
.replace(/'/g, "''")
|
||||||
.replace(/"|\n|\r/g, ''); // double-up single quotes, remove double quotes and newlines
|
.replace(/"|\n|\r/g, ''); // double-up single quotes, remove double quotes and newlines
|
||||||
const escapedFile = file.replace(/'/g, "''").replace(/"|\n|\r/g, '');
|
const escapedFile = file.replace(/'/g, "''").replace(/"|\n|\r/g, '');
|
||||||
const escapedTarget = dest.replace(/'/g, "''").replace(/"|\n|\r/g, '');
|
const escapedTarget = dest.replace(/'/g, "''").replace(/"|\n|\r/g, '');
|
||||||
const command = `& '${escapedScript}' -Source '${escapedFile}' -Target '${escapedTarget}'`;
|
const command = `& '${escapedScript}' -Source '${escapedFile}' -Target '${escapedTarget}'`;
|
||||||
const args = [
|
const args = [
|
||||||
'-NoLogo',
|
'-NoLogo',
|
||||||
'-Sta',
|
'-Sta',
|
||||||
'-NoProfile',
|
'-NoProfile',
|
||||||
'-NonInteractive',
|
'-NonInteractive',
|
||||||
'-ExecutionPolicy',
|
'-ExecutionPolicy',
|
||||||
'Unrestricted',
|
'Unrestricted',
|
||||||
'-Command',
|
'-Command',
|
||||||
command
|
command
|
||||||
];
|
];
|
||||||
const options = {
|
const options = {
|
||||||
silent: true
|
silent: true
|
||||||
};
|
};
|
||||||
try {
|
try {
|
||||||
const powershellPath = yield io.which('powershell', true);
|
const powershellPath = yield io.which('powershell', true);
|
||||||
yield exec_1.exec(`"${powershellPath}"`, args, options);
|
yield exec_1.exec(`"${powershellPath}"`, args, options);
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
process.chdir(originalCwd);
|
process.chdir(originalCwd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return dest;
|
return dest;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.extract7z = extract7z;
|
exports.extract7z = extract7z;
|
||||||
/**
|
/**
|
||||||
* Extract a tar
|
* Extract a tar
|
||||||
*
|
*
|
||||||
* @param file path to the tar
|
* @param file path to the tar
|
||||||
* @param dest destination directory. Optional.
|
* @param dest destination directory. Optional.
|
||||||
* @returns path to the destination directory
|
* @returns path to the destination directory
|
||||||
*/
|
*/
|
||||||
function extractTar(file, dest) {
|
function extractTar(file, dest) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
if (!file) {
|
if (!file) {
|
||||||
throw new Error("parameter 'file' is required");
|
throw new Error("parameter 'file' is required");
|
||||||
}
|
}
|
||||||
dest = dest || (yield _createExtractFolder(dest));
|
dest = dest || (yield _createExtractFolder(dest));
|
||||||
const tarPath = yield io.which('tar', true);
|
const tarPath = yield io.which('tar', true);
|
||||||
yield exec_1.exec(`"${tarPath}"`, ['xzC', dest, '-f', file]);
|
yield exec_1.exec(`"${tarPath}"`, ['xzC', dest, '-f', file]);
|
||||||
return dest;
|
return dest;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.extractTar = extractTar;
|
exports.extractTar = extractTar;
|
||||||
/**
|
/**
|
||||||
* Extract a zip
|
* Extract a zip
|
||||||
*
|
*
|
||||||
* @param file path to the zip
|
* @param file path to the zip
|
||||||
* @param dest destination directory. Optional.
|
* @param dest destination directory. Optional.
|
||||||
* @returns path to the destination directory
|
* @returns path to the destination directory
|
||||||
*/
|
*/
|
||||||
function extractZip(file, dest) {
|
function extractZip(file, dest) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
if (!file) {
|
if (!file) {
|
||||||
throw new Error("parameter 'file' is required");
|
throw new Error("parameter 'file' is required");
|
||||||
}
|
}
|
||||||
dest = dest || (yield _createExtractFolder(dest));
|
dest = dest || (yield _createExtractFolder(dest));
|
||||||
if (IS_WINDOWS) {
|
if (IS_WINDOWS) {
|
||||||
yield extractZipWin(file, dest);
|
yield extractZipWin(file, dest);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
yield extractZipNix(file, dest);
|
yield extractZipNix(file, dest);
|
||||||
}
|
}
|
||||||
return dest;
|
return dest;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.extractZip = extractZip;
|
exports.extractZip = extractZip;
|
||||||
function extractZipWin(file, dest) {
|
function extractZipWin(file, dest) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
// build the powershell command
|
// build the powershell command
|
||||||
const escapedFile = file.replace(/'/g, "''").replace(/"|\n|\r/g, ''); // double-up single quotes, remove double quotes and newlines
|
const escapedFile = file.replace(/'/g, "''").replace(/"|\n|\r/g, ''); // double-up single quotes, remove double quotes and newlines
|
||||||
const escapedDest = dest.replace(/'/g, "''").replace(/"|\n|\r/g, '');
|
const escapedDest = dest.replace(/'/g, "''").replace(/"|\n|\r/g, '');
|
||||||
const command = `$ErrorActionPreference = 'Stop' ; try { Add-Type -AssemblyName System.IO.Compression.FileSystem } catch { } ; [System.IO.Compression.ZipFile]::ExtractToDirectory('${escapedFile}', '${escapedDest}')`;
|
const command = `$ErrorActionPreference = 'Stop' ; try { Add-Type -AssemblyName System.IO.Compression.FileSystem } catch { } ; [System.IO.Compression.ZipFile]::ExtractToDirectory('${escapedFile}', '${escapedDest}')`;
|
||||||
// run powershell
|
// run powershell
|
||||||
const powershellPath = yield io.which('powershell');
|
const powershellPath = yield io.which('powershell');
|
||||||
const args = [
|
const args = [
|
||||||
'-NoLogo',
|
'-NoLogo',
|
||||||
'-Sta',
|
'-Sta',
|
||||||
'-NoProfile',
|
'-NoProfile',
|
||||||
'-NonInteractive',
|
'-NonInteractive',
|
||||||
'-ExecutionPolicy',
|
'-ExecutionPolicy',
|
||||||
'Unrestricted',
|
'Unrestricted',
|
||||||
'-Command',
|
'-Command',
|
||||||
command
|
command
|
||||||
];
|
];
|
||||||
yield exec_1.exec(`"${powershellPath}"`, args);
|
yield exec_1.exec(`"${powershellPath}"`, args);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function extractZipNix(file, dest) {
|
function extractZipNix(file, dest) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
const unzipPath = path.join(__dirname, '..', 'scripts', 'externals', 'unzip');
|
const unzipPath = path.join(__dirname, '..', 'scripts', 'externals', 'unzip');
|
||||||
yield exec_1.exec(`"${unzipPath}"`, [file], { cwd: dest });
|
yield exec_1.exec(`"${unzipPath}"`, [file], { cwd: dest });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Caches a directory and installs it into the tool cacheDir
|
* Caches a directory and installs it into the tool cacheDir
|
||||||
*
|
*
|
||||||
* @param sourceDir the directory to cache into tools
|
* @param sourceDir the directory to cache into tools
|
||||||
* @param tool tool name
|
* @param tool tool name
|
||||||
* @param version version of the tool. semver format
|
* @param version version of the tool. semver format
|
||||||
* @param arch architecture of the tool. Optional. Defaults to machine architecture
|
* @param arch architecture of the tool. Optional. Defaults to machine architecture
|
||||||
*/
|
*/
|
||||||
function cacheDir(sourceDir, tool, version, arch) {
|
function cacheDir(sourceDir, tool, version, arch) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
version = semver.clean(version) || version;
|
version = semver.clean(version) || version;
|
||||||
arch = arch || os.arch();
|
arch = arch || os.arch();
|
||||||
core.debug(`Caching tool ${tool} ${version} ${arch}`);
|
core.debug(`Caching tool ${tool} ${version} ${arch}`);
|
||||||
core.debug(`source dir: ${sourceDir}`);
|
core.debug(`source dir: ${sourceDir}`);
|
||||||
if (!fs.statSync(sourceDir).isDirectory()) {
|
if (!fs.statSync(sourceDir).isDirectory()) {
|
||||||
throw new Error('sourceDir is not a directory');
|
throw new Error('sourceDir is not a directory');
|
||||||
}
|
}
|
||||||
// Create the tool dir
|
// Create the tool dir
|
||||||
const destPath = yield _createToolPath(tool, version, arch);
|
const destPath = yield _createToolPath(tool, version, arch);
|
||||||
// copy each child item. do not move. move can fail on Windows
|
// copy each child item. do not move. move can fail on Windows
|
||||||
// due to anti-virus software having an open handle on a file.
|
// due to anti-virus software having an open handle on a file.
|
||||||
for (const itemName of fs.readdirSync(sourceDir)) {
|
for (const itemName of fs.readdirSync(sourceDir)) {
|
||||||
const s = path.join(sourceDir, itemName);
|
const s = path.join(sourceDir, itemName);
|
||||||
yield io.cp(s, destPath, { recursive: true });
|
yield io.cp(s, destPath, { recursive: true });
|
||||||
}
|
}
|
||||||
// write .complete
|
// write .complete
|
||||||
_completeToolPath(tool, version, arch);
|
_completeToolPath(tool, version, arch);
|
||||||
return destPath;
|
return destPath;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.cacheDir = cacheDir;
|
exports.cacheDir = cacheDir;
|
||||||
/**
|
/**
|
||||||
* Caches a downloaded file (GUID) and installs it
|
* Caches a downloaded file (GUID) and installs it
|
||||||
* into the tool cache with a given targetName
|
* into the tool cache with a given targetName
|
||||||
*
|
*
|
||||||
* @param sourceFile the file to cache into tools. Typically a result of downloadTool which is a guid.
|
* @param sourceFile the file to cache into tools. Typically a result of downloadTool which is a guid.
|
||||||
* @param targetFile the name of the file name in the tools directory
|
* @param targetFile the name of the file name in the tools directory
|
||||||
* @param tool tool name
|
* @param tool tool name
|
||||||
* @param version version of the tool. semver format
|
* @param version version of the tool. semver format
|
||||||
* @param arch architecture of the tool. Optional. Defaults to machine architecture
|
* @param arch architecture of the tool. Optional. Defaults to machine architecture
|
||||||
*/
|
*/
|
||||||
function cacheFile(sourceFile, targetFile, tool, version, arch) {
|
function cacheFile(sourceFile, targetFile, tool, version, arch) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
version = semver.clean(version) || version;
|
version = semver.clean(version) || version;
|
||||||
arch = arch || os.arch();
|
arch = arch || os.arch();
|
||||||
core.debug(`Caching tool ${tool} ${version} ${arch}`);
|
core.debug(`Caching tool ${tool} ${version} ${arch}`);
|
||||||
core.debug(`source file: ${sourceFile}`);
|
core.debug(`source file: ${sourceFile}`);
|
||||||
if (!fs.statSync(sourceFile).isFile()) {
|
if (!fs.statSync(sourceFile).isFile()) {
|
||||||
throw new Error('sourceFile is not a file');
|
throw new Error('sourceFile is not a file');
|
||||||
}
|
}
|
||||||
// create the tool dir
|
// create the tool dir
|
||||||
const destFolder = yield _createToolPath(tool, version, arch);
|
const destFolder = yield _createToolPath(tool, version, arch);
|
||||||
// copy instead of move. move can fail on Windows due to
|
// copy instead of move. move can fail on Windows due to
|
||||||
// anti-virus software having an open handle on a file.
|
// anti-virus software having an open handle on a file.
|
||||||
const destPath = path.join(destFolder, targetFile);
|
const destPath = path.join(destFolder, targetFile);
|
||||||
core.debug(`destination file ${destPath}`);
|
core.debug(`destination file ${destPath}`);
|
||||||
yield io.cp(sourceFile, destPath);
|
yield io.cp(sourceFile, destPath);
|
||||||
// write .complete
|
// write .complete
|
||||||
_completeToolPath(tool, version, arch);
|
_completeToolPath(tool, version, arch);
|
||||||
return destFolder;
|
return destFolder;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.cacheFile = cacheFile;
|
exports.cacheFile = cacheFile;
|
||||||
/**
|
/**
|
||||||
* Finds the path to a tool version in the local installed tool cache
|
* Finds the path to a tool version in the local installed tool cache
|
||||||
*
|
*
|
||||||
* @param toolName name of the tool
|
* @param toolName name of the tool
|
||||||
* @param versionSpec version of the tool
|
* @param versionSpec version of the tool
|
||||||
* @param arch optional arch. defaults to arch of computer
|
* @param arch optional arch. defaults to arch of computer
|
||||||
*/
|
*/
|
||||||
function find(toolName, versionSpec, arch) {
|
function find(toolName, versionSpec, arch) {
|
||||||
if (!toolName) {
|
if (!toolName) {
|
||||||
throw new Error('toolName parameter is required');
|
throw new Error('toolName parameter is required');
|
||||||
}
|
}
|
||||||
if (!versionSpec) {
|
if (!versionSpec) {
|
||||||
throw new Error('versionSpec parameter is required');
|
throw new Error('versionSpec parameter is required');
|
||||||
}
|
}
|
||||||
arch = arch || os.arch();
|
arch = arch || os.arch();
|
||||||
// attempt to resolve an explicit version
|
// attempt to resolve an explicit version
|
||||||
if (!_isExplicitVersion(versionSpec)) {
|
if (!_isExplicitVersion(versionSpec)) {
|
||||||
const localVersions = findAllVersions(toolName, arch);
|
const localVersions = findAllVersions(toolName, arch);
|
||||||
const match = _evaluateVersions(localVersions, versionSpec);
|
const match = _evaluateVersions(localVersions, versionSpec);
|
||||||
versionSpec = match;
|
versionSpec = match;
|
||||||
}
|
}
|
||||||
// check for the explicit version in the cache
|
// check for the explicit version in the cache
|
||||||
let toolPath = '';
|
let toolPath = '';
|
||||||
if (versionSpec) {
|
if (versionSpec) {
|
||||||
versionSpec = semver.clean(versionSpec) || '';
|
versionSpec = semver.clean(versionSpec) || '';
|
||||||
const cachePath = path.join(cacheRoot, toolName, versionSpec, arch);
|
const cachePath = path.join(cacheRoot, toolName, versionSpec, arch);
|
||||||
core.debug(`checking cache: ${cachePath}`);
|
core.debug(`checking cache: ${cachePath}`);
|
||||||
if (fs.existsSync(cachePath) && fs.existsSync(`${cachePath}.complete`)) {
|
if (fs.existsSync(cachePath) && fs.existsSync(`${cachePath}.complete`)) {
|
||||||
core.debug(`Found tool in cache ${toolName} ${versionSpec} ${arch}`);
|
core.debug(`Found tool in cache ${toolName} ${versionSpec} ${arch}`);
|
||||||
toolPath = cachePath;
|
toolPath = cachePath;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
core.debug('not found');
|
core.debug('not found');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return toolPath;
|
return toolPath;
|
||||||
}
|
}
|
||||||
exports.find = find;
|
exports.find = find;
|
||||||
/**
|
/**
|
||||||
* Finds the paths to all versions of a tool that are installed in the local tool cache
|
* Finds the paths to all versions of a tool that are installed in the local tool cache
|
||||||
*
|
*
|
||||||
* @param toolName name of the tool
|
* @param toolName name of the tool
|
||||||
* @param arch optional arch. defaults to arch of computer
|
* @param arch optional arch. defaults to arch of computer
|
||||||
*/
|
*/
|
||||||
function findAllVersions(toolName, arch) {
|
function findAllVersions(toolName, arch) {
|
||||||
const versions = [];
|
const versions = [];
|
||||||
arch = arch || os.arch();
|
arch = arch || os.arch();
|
||||||
const toolPath = path.join(cacheRoot, toolName);
|
const toolPath = path.join(cacheRoot, toolName);
|
||||||
if (fs.existsSync(toolPath)) {
|
if (fs.existsSync(toolPath)) {
|
||||||
const children = fs.readdirSync(toolPath);
|
const children = fs.readdirSync(toolPath);
|
||||||
for (const child of children) {
|
for (const child of children) {
|
||||||
if (_isExplicitVersion(child)) {
|
if (_isExplicitVersion(child)) {
|
||||||
const fullPath = path.join(toolPath, child, arch || '');
|
const fullPath = path.join(toolPath, child, arch || '');
|
||||||
if (fs.existsSync(fullPath) && fs.existsSync(`${fullPath}.complete`)) {
|
if (fs.existsSync(fullPath) && fs.existsSync(`${fullPath}.complete`)) {
|
||||||
versions.push(child);
|
versions.push(child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return versions;
|
return versions;
|
||||||
}
|
}
|
||||||
exports.findAllVersions = findAllVersions;
|
exports.findAllVersions = findAllVersions;
|
||||||
function _createExtractFolder(dest) {
|
function _createExtractFolder(dest) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
if (!dest) {
|
if (!dest) {
|
||||||
// create a temp dir
|
// create a temp dir
|
||||||
dest = path.join(tempDirectory, uuidV4());
|
dest = path.join(tempDirectory, uuidV4());
|
||||||
}
|
}
|
||||||
yield io.mkdirP(dest);
|
yield io.mkdirP(dest);
|
||||||
return dest;
|
return dest;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function _createToolPath(tool, version, arch) {
|
function _createToolPath(tool, version, arch) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
const folderPath = path.join(cacheRoot, tool, semver.clean(version) || version, arch || '');
|
const folderPath = path.join(cacheRoot, tool, semver.clean(version) || version, arch || '');
|
||||||
core.debug(`destination ${folderPath}`);
|
core.debug(`destination ${folderPath}`);
|
||||||
const markerPath = `${folderPath}.complete`;
|
const markerPath = `${folderPath}.complete`;
|
||||||
yield io.rmRF(folderPath);
|
yield io.rmRF(folderPath);
|
||||||
yield io.rmRF(markerPath);
|
yield io.rmRF(markerPath);
|
||||||
yield io.mkdirP(folderPath);
|
yield io.mkdirP(folderPath);
|
||||||
return folderPath;
|
return folderPath;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function _completeToolPath(tool, version, arch) {
|
function _completeToolPath(tool, version, arch) {
|
||||||
const folderPath = path.join(cacheRoot, tool, semver.clean(version) || version, arch || '');
|
const folderPath = path.join(cacheRoot, tool, semver.clean(version) || version, arch || '');
|
||||||
const markerPath = `${folderPath}.complete`;
|
const markerPath = `${folderPath}.complete`;
|
||||||
fs.writeFileSync(markerPath, '');
|
fs.writeFileSync(markerPath, '');
|
||||||
core.debug('finished caching tool');
|
core.debug('finished caching tool');
|
||||||
}
|
}
|
||||||
function _isExplicitVersion(versionSpec) {
|
function _isExplicitVersion(versionSpec) {
|
||||||
const c = semver.clean(versionSpec) || '';
|
const c = semver.clean(versionSpec) || '';
|
||||||
core.debug(`isExplicit: ${c}`);
|
core.debug(`isExplicit: ${c}`);
|
||||||
const valid = semver.valid(c) != null;
|
const valid = semver.valid(c) != null;
|
||||||
core.debug(`explicit? ${valid}`);
|
core.debug(`explicit? ${valid}`);
|
||||||
return valid;
|
return valid;
|
||||||
}
|
}
|
||||||
function _evaluateVersions(versions, versionSpec) {
|
function _evaluateVersions(versions, versionSpec) {
|
||||||
let version = '';
|
let version = '';
|
||||||
core.debug(`evaluating ${versions.length} versions`);
|
core.debug(`evaluating ${versions.length} versions`);
|
||||||
versions = versions.sort((a, b) => {
|
versions = versions.sort((a, b) => {
|
||||||
if (semver.gt(a, b)) {
|
if (semver.gt(a, b)) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
});
|
});
|
||||||
for (let i = versions.length - 1; i >= 0; i--) {
|
for (let i = versions.length - 1; i >= 0; i--) {
|
||||||
const potential = versions[i];
|
const potential = versions[i];
|
||||||
const satisfied = semver.satisfies(potential, versionSpec);
|
const satisfied = semver.satisfies(potential, versionSpec);
|
||||||
if (satisfied) {
|
if (satisfied) {
|
||||||
version = potential;
|
version = potential;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (version) {
|
if (version) {
|
||||||
core.debug(`matched: ${version}`);
|
core.debug(`matched: ${version}`);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
core.debug('match not found');
|
core.debug('match not found');
|
||||||
}
|
}
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
//# sourceMappingURL=tool-cache.js.map
|
//# sourceMappingURL=tool-cache.js.map
|
|
@ -1,36 +1,36 @@
|
||||||
{
|
{
|
||||||
"_from": "file:toolkit\\actions-tool-cache-0.0.0.tgz",
|
"_from": "@actions/tool-cache@^1.0.0",
|
||||||
"_id": "@actions/tool-cache@0.0.0",
|
"_id": "@actions/tool-cache@1.0.0",
|
||||||
"_inBundle": false,
|
"_inBundle": false,
|
||||||
"_integrity": "sha512-CCJjXKGfqR34oo1mgKpUk63g3fcoIq+aNJBZ7b73aWGot0ddju2cefJrKjhEun4FI7gYsLYg+ayAUnbFwkGd4Q==",
|
"_integrity": "sha512-l3zT0IfDfi5Ik5aMpnXqGHGATxN8xa9ls4ue+X/CBXpPhRMRZS4vcuh5Q9T98WAGbkysRCfhpbksTPHIcKnNwQ==",
|
||||||
"_location": "/@actions/tool-cache",
|
"_location": "/@actions/tool-cache",
|
||||||
"_phantomChildren": {},
|
"_phantomChildren": {},
|
||||||
"_requested": {
|
"_requested": {
|
||||||
"type": "file",
|
"type": "range",
|
||||||
"where": "E:\\github\\setup-python",
|
"registry": true,
|
||||||
"raw": "@actions/tool-cache@file:toolkit/actions-tool-cache-0.0.0.tgz",
|
"raw": "@actions/tool-cache@^1.0.0",
|
||||||
"name": "@actions/tool-cache",
|
"name": "@actions/tool-cache",
|
||||||
"escapedName": "@actions%2ftool-cache",
|
"escapedName": "@actions%2ftool-cache",
|
||||||
"scope": "@actions",
|
"scope": "@actions",
|
||||||
"rawSpec": "file:toolkit/actions-tool-cache-0.0.0.tgz",
|
"rawSpec": "^1.0.0",
|
||||||
"saveSpec": "file:toolkit\\actions-tool-cache-0.0.0.tgz",
|
"saveSpec": null,
|
||||||
"fetchSpec": "E:\\github\\setup-python\\toolkit\\actions-tool-cache-0.0.0.tgz"
|
"fetchSpec": "^1.0.0"
|
||||||
},
|
},
|
||||||
"_requiredBy": [
|
"_requiredBy": [
|
||||||
"/"
|
"/"
|
||||||
],
|
],
|
||||||
"_resolved": "E:\\github\\setup-python\\toolkit\\actions-tool-cache-0.0.0.tgz",
|
"_resolved": "https://registry.npmjs.org/@actions/tool-cache/-/tool-cache-1.0.0.tgz",
|
||||||
"_shasum": "223a115ab2782ba0a7ad4a0a829030b9cb84eade",
|
"_shasum": "a9ac414bd2e0bf1f5f0302f029193c418d344c09",
|
||||||
"_spec": "@actions/tool-cache@file:toolkit/actions-tool-cache-0.0.0.tgz",
|
"_spec": "@actions/tool-cache@^1.0.0",
|
||||||
"_where": "E:\\github\\setup-python",
|
"_where": "C:\\Users\\damccorm\\Documents\\setup-python",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/actions/toolkit/issues"
|
"url": "https://github.com/actions/toolkit/issues"
|
||||||
},
|
},
|
||||||
"bundleDependencies": false,
|
"bundleDependencies": false,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^0.0.0",
|
"@actions/core": "^1.0.0",
|
||||||
"@actions/exec": "^0.0.0",
|
"@actions/exec": "^1.0.0",
|
||||||
"@actions/io": "^0.0.0",
|
"@actions/io": "^1.0.0",
|
||||||
"semver": "^6.1.0",
|
"semver": "^6.1.0",
|
||||||
"typed-rest-client": "^1.4.0",
|
"typed-rest-client": "^1.4.0",
|
||||||
"uuid": "^3.3.2"
|
"uuid": "^3.3.2"
|
||||||
|
@ -51,6 +51,7 @@
|
||||||
"lib",
|
"lib",
|
||||||
"scripts"
|
"scripts"
|
||||||
],
|
],
|
||||||
|
"gitHead": "a40bce7c8d382aa3dbadaa327acbc696e9390e55",
|
||||||
"homepage": "https://github.com/actions/toolkit/tree/master/packages/exec",
|
"homepage": "https://github.com/actions/toolkit/tree/master/packages/exec",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"exec",
|
"exec",
|
||||||
|
@ -70,5 +71,5 @@
|
||||||
"test": "echo \"Error: run tests from root\" && exit 1",
|
"test": "echo \"Error: run tests from root\" && exit 1",
|
||||||
"tsc": "tsc"
|
"tsc": "tsc"
|
||||||
},
|
},
|
||||||
"version": "0.0.0"
|
"version": "1.0.0"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,60 +1,60 @@
|
||||||
[CmdletBinding()]
|
[CmdletBinding()]
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory = $true)]
|
[Parameter(Mandatory = $true)]
|
||||||
[string]$Source,
|
[string]$Source,
|
||||||
|
|
||||||
[Parameter(Mandatory = $true)]
|
[Parameter(Mandatory = $true)]
|
||||||
[string]$Target)
|
[string]$Target)
|
||||||
|
|
||||||
# This script translates the output from 7zdec into UTF8. Node has limited
|
# This script translates the output from 7zdec into UTF8. Node has limited
|
||||||
# built-in support for encodings.
|
# built-in support for encodings.
|
||||||
#
|
#
|
||||||
# 7zdec uses the system default code page. The system default code page varies
|
# 7zdec uses the system default code page. The system default code page varies
|
||||||
# depending on the locale configuration. On an en-US box, the system default code
|
# depending on the locale configuration. On an en-US box, the system default code
|
||||||
# page is Windows-1252.
|
# page is Windows-1252.
|
||||||
#
|
#
|
||||||
# Note, on a typical en-US box, testing with the 'ç' character is a good way to
|
# Note, on a typical en-US box, testing with the 'ç' character is a good way to
|
||||||
# determine whether data is passed correctly between processes. This is because
|
# determine whether data is passed correctly between processes. This is because
|
||||||
# the 'ç' character has a different code point across each of the common encodings
|
# the 'ç' character has a different code point across each of the common encodings
|
||||||
# on a typical en-US box, i.e.
|
# on a typical en-US box, i.e.
|
||||||
# 1) the default console-output code page (IBM437)
|
# 1) the default console-output code page (IBM437)
|
||||||
# 2) the system default code page (i.e. CP_ACP) (Windows-1252)
|
# 2) the system default code page (i.e. CP_ACP) (Windows-1252)
|
||||||
# 3) UTF8
|
# 3) UTF8
|
||||||
|
|
||||||
$ErrorActionPreference = 'Stop'
|
$ErrorActionPreference = 'Stop'
|
||||||
|
|
||||||
# Redefine the wrapper over STDOUT to use UTF8. Node expects UTF8 by default.
|
# Redefine the wrapper over STDOUT to use UTF8. Node expects UTF8 by default.
|
||||||
$stdout = [System.Console]::OpenStandardOutput()
|
$stdout = [System.Console]::OpenStandardOutput()
|
||||||
$utf8 = New-Object System.Text.UTF8Encoding($false) # do not emit BOM
|
$utf8 = New-Object System.Text.UTF8Encoding($false) # do not emit BOM
|
||||||
$writer = New-Object System.IO.StreamWriter($stdout, $utf8)
|
$writer = New-Object System.IO.StreamWriter($stdout, $utf8)
|
||||||
[System.Console]::SetOut($writer)
|
[System.Console]::SetOut($writer)
|
||||||
|
|
||||||
# All subsequent output must be written using [System.Console]::WriteLine(). In
|
# All subsequent output must be written using [System.Console]::WriteLine(). In
|
||||||
# PowerShell 4, Write-Host and Out-Default do not consider the updated stream writer.
|
# PowerShell 4, Write-Host and Out-Default do not consider the updated stream writer.
|
||||||
|
|
||||||
Set-Location -LiteralPath $Target
|
Set-Location -LiteralPath $Target
|
||||||
|
|
||||||
# Print the ##command.
|
# Print the ##command.
|
||||||
$_7zdec = Join-Path -Path "$PSScriptRoot" -ChildPath "externals/7zdec.exe"
|
$_7zdec = Join-Path -Path "$PSScriptRoot" -ChildPath "externals/7zdec.exe"
|
||||||
[System.Console]::WriteLine("##[command]$_7zdec x `"$Source`"")
|
[System.Console]::WriteLine("##[command]$_7zdec x `"$Source`"")
|
||||||
|
|
||||||
# The $OutputEncoding variable instructs PowerShell how to interpret the output
|
# The $OutputEncoding variable instructs PowerShell how to interpret the output
|
||||||
# from the external command.
|
# from the external command.
|
||||||
$OutputEncoding = [System.Text.Encoding]::Default
|
$OutputEncoding = [System.Text.Encoding]::Default
|
||||||
|
|
||||||
# Note, the output from 7zdec.exe needs to be iterated over. Otherwise PowerShell.exe
|
# Note, the output from 7zdec.exe needs to be iterated over. Otherwise PowerShell.exe
|
||||||
# will launch the external command in such a way that it inherits the streams.
|
# will launch the external command in such a way that it inherits the streams.
|
||||||
& $_7zdec x $Source 2>&1 |
|
& $_7zdec x $Source 2>&1 |
|
||||||
ForEach-Object {
|
ForEach-Object {
|
||||||
if ($_ -is [System.Management.Automation.ErrorRecord]) {
|
if ($_ -is [System.Management.Automation.ErrorRecord]) {
|
||||||
[System.Console]::WriteLine($_.Exception.Message)
|
[System.Console]::WriteLine($_.Exception.Message)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
[System.Console]::WriteLine($_)
|
[System.Console]::WriteLine($_)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
[System.Console]::WriteLine("##[debug]7zdec.exe exit code '$LASTEXITCODE'")
|
[System.Console]::WriteLine("##[debug]7zdec.exe exit code '$LASTEXITCODE'")
|
||||||
[System.Console]::Out.Flush()
|
[System.Console]::Out.Flush()
|
||||||
if ($LASTEXITCODE -ne 0) {
|
if ($LASTEXITCODE -ne 0) {
|
||||||
exit $LASTEXITCODE
|
exit $LASTEXITCODE
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load Diff
98
package.json
98
package.json
|
@ -1,50 +1,48 @@
|
||||||
{
|
{
|
||||||
"name": "setup-python",
|
"name": "setup-python",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Setup python action",
|
"description": "Setup python action",
|
||||||
"main": "lib/setup-python.js",
|
"main": "lib/setup-python.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "tsc",
|
"build": "tsc",
|
||||||
"format": "prettier --write **/*.ts",
|
"format": "prettier --write **/*.ts",
|
||||||
"format-check": "prettier --check **/*.ts",
|
"format-check": "prettier --check **/*.ts",
|
||||||
"test": "jest"
|
"test": "jest"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git+https://github.com/actions/ssetup-python.git"
|
"url": "git+https://github.com/actions/ssetup-python.git"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"actions",
|
"actions",
|
||||||
"node",
|
"node",
|
||||||
"setup"
|
"setup"
|
||||||
],
|
],
|
||||||
"author": "GitHub",
|
"author": "GitHub",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/exit": "file:toolkit/actions-exit-0.0.0.tgz",
|
"@actions/core": "^1.0.0",
|
||||||
"@actions/core": "file:toolkit/actions-core-0.0.0.tgz",
|
"@actions/tool-cache": "^1.0.0",
|
||||||
"@actions/io": "file:toolkit/actions-io-0.0.0.tgz",
|
"semver": "^6.1.1"
|
||||||
"@actions/exec": "file:toolkit/actions-exec-0.0.0.tgz",
|
},
|
||||||
"@actions/tool-cache": "file:toolkit/actions-tool-cache-0.0.0.tgz",
|
"devDependencies": {
|
||||||
"semver": "^6.1.1"
|
"@actions/io": "^1.0.0",
|
||||||
},
|
"@types/jest": "^24.0.13",
|
||||||
"devDependencies": {
|
"@types/node": "^12.0.4",
|
||||||
"@types/jest": "^24.0.13",
|
"@types/semver": "^6.0.0",
|
||||||
"@types/node": "^12.0.4",
|
"husky": "^2.3.0",
|
||||||
"@types/semver": "^6.0.0",
|
"jest": "^24.8.0",
|
||||||
"husky": "^2.3.0",
|
"jest-circus": "^24.7.1",
|
||||||
"jest": "^24.8.0",
|
"prettier": "^1.17.1",
|
||||||
"jest-circus": "^24.7.1",
|
"ts-jest": "^24.0.2",
|
||||||
"prettier": "^1.17.1",
|
"typescript": "^3.5.1"
|
||||||
"ts-jest": "^24.0.2",
|
},
|
||||||
"typescript": "^3.5.1"
|
"husky": {
|
||||||
},
|
"skipCI": true,
|
||||||
"husky": {
|
"hooks": {
|
||||||
"skipCI": true,
|
"pre-commit": "npm run build && npm run format",
|
||||||
"hooks": {
|
"post-commit": "npm prune --production && git add node_modules/* && git commit -m \"Husky commit correct node modules\""
|
||||||
"pre-commit": "npm run build && npm run format",
|
}
|
||||||
"post-commit": "npm prune --production && git add node_modules/* && git commit -m \"Husky commit correct node modules\""
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,172 +1,172 @@
|
||||||
import * as os from 'os';
|
import * as os from 'os';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
|
|
||||||
import * as semver from 'semver';
|
import * as semver from 'semver';
|
||||||
|
|
||||||
let cacheDirectory = process.env['RUNNER_TOOLSDIRECTORY'] || '';
|
let cacheDirectory = process.env['RUNNER_TOOLSDIRECTORY'] || '';
|
||||||
|
|
||||||
if (!cacheDirectory) {
|
if (!cacheDirectory) {
|
||||||
let baseLocation;
|
let baseLocation;
|
||||||
if (process.platform === 'win32') {
|
if (process.platform === 'win32') {
|
||||||
// On windows use the USERPROFILE env variable
|
// On windows use the USERPROFILE env variable
|
||||||
baseLocation = process.env['USERPROFILE'] || 'C:\\';
|
baseLocation = process.env['USERPROFILE'] || 'C:\\';
|
||||||
} else {
|
} else {
|
||||||
if (process.platform === 'darwin') {
|
if (process.platform === 'darwin') {
|
||||||
baseLocation = '/Users';
|
baseLocation = '/Users';
|
||||||
} else {
|
} else {
|
||||||
baseLocation = '/home';
|
baseLocation = '/home';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cacheDirectory = path.join(baseLocation, 'actions', 'cache');
|
cacheDirectory = path.join(baseLocation, 'actions', 'cache');
|
||||||
}
|
}
|
||||||
|
|
||||||
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';
|
||||||
|
|
||||||
const IS_WINDOWS = process.platform === 'win32';
|
const IS_WINDOWS = process.platform === 'win32';
|
||||||
|
|
||||||
// Python has "scripts" or "bin" directories where command-line tools that come with packages are installed.
|
// Python has "scripts" or "bin" directories where command-line tools that come with packages are installed.
|
||||||
// This is where pip is, along with anything that pip installs.
|
// This is where pip is, along with anything that pip installs.
|
||||||
// There is a seperate directory for `pip install --user`.
|
// There is a seperate directory for `pip install --user`.
|
||||||
//
|
//
|
||||||
// For reference, these directories are as follows:
|
// For reference, these directories are as follows:
|
||||||
// macOS / Linux:
|
// macOS / Linux:
|
||||||
// <sys.prefix>/bin (by default /usr/local/bin, but not on hosted agents -- see the `else`)
|
// <sys.prefix>/bin (by default /usr/local/bin, but not on hosted agents -- see the `else`)
|
||||||
// (--user) ~/.local/bin
|
// (--user) ~/.local/bin
|
||||||
// Windows:
|
// Windows:
|
||||||
// <Python installation dir>\Scripts
|
// <Python installation dir>\Scripts
|
||||||
// (--user) %APPDATA%\Python\PythonXY\Scripts
|
// (--user) %APPDATA%\Python\PythonXY\Scripts
|
||||||
// See https://docs.python.org/3/library/sysconfig.html
|
// See https://docs.python.org/3/library/sysconfig.html
|
||||||
|
|
||||||
function binDir(installDir: string): string {
|
function binDir(installDir: string): string {
|
||||||
if (IS_WINDOWS) {
|
if (IS_WINDOWS) {
|
||||||
return path.join(installDir, 'Scripts');
|
return path.join(installDir, 'Scripts');
|
||||||
} else {
|
} else {
|
||||||
return path.join(installDir, 'bin');
|
return path.join(installDir, 'bin');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note on the tool cache layout for PyPy:
|
// Note on the tool cache layout for PyPy:
|
||||||
// PyPy has its own versioning scheme that doesn't follow the Python versioning scheme.
|
// PyPy has its own versioning scheme that doesn't follow the Python versioning scheme.
|
||||||
// A particular version of PyPy may contain one or more versions of the Python interpreter.
|
// A particular version of PyPy may contain one or more versions of the Python interpreter.
|
||||||
// For example, PyPy 7.0 contains Python 2.7, 3.5, and 3.6-alpha.
|
// For example, PyPy 7.0 contains Python 2.7, 3.5, and 3.6-alpha.
|
||||||
// We only care about the Python version, so we don't use the PyPy version for the tool cache.
|
// We only care about the Python version, so we don't use the PyPy version for the tool cache.
|
||||||
function usePyPy(majorVersion: 2 | 3, architecture: string): void {
|
function usePyPy(majorVersion: 2 | 3, architecture: string): void {
|
||||||
const findPyPy = tc.find.bind(undefined, 'PyPy', majorVersion.toString());
|
const findPyPy = tc.find.bind(undefined, 'PyPy', majorVersion.toString());
|
||||||
let installDir: string | null = findPyPy(architecture);
|
let installDir: string | null = findPyPy(architecture);
|
||||||
|
|
||||||
if (!installDir && IS_WINDOWS) {
|
if (!installDir && IS_WINDOWS) {
|
||||||
// PyPy only precompiles binaries for x86, but the architecture parameter defaults to x64.
|
// PyPy only precompiles binaries for x86, but the architecture parameter defaults to x64.
|
||||||
// On Hosted VS2017, we only install an x86 version.
|
// On Hosted VS2017, we only install an x86 version.
|
||||||
// Fall back to x86.
|
// Fall back to x86.
|
||||||
installDir = findPyPy('x86');
|
installDir = findPyPy('x86');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!installDir) {
|
if (!installDir) {
|
||||||
// PyPy not installed in $(Agent.ToolsDirectory)
|
// PyPy not installed in $(Agent.ToolsDirectory)
|
||||||
throw new Error(`PyPy ${majorVersion} not found`);
|
throw new Error(`PyPy ${majorVersion} not found`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// For PyPy, Windows uses 'bin', not 'Scripts'.
|
// For PyPy, Windows uses 'bin', not 'Scripts'.
|
||||||
const _binDir = path.join(installDir, 'bin');
|
const _binDir = path.join(installDir, 'bin');
|
||||||
|
|
||||||
// On Linux and macOS, the Python interpreter is in 'bin'.
|
// On Linux and macOS, the Python interpreter is in 'bin'.
|
||||||
// On Windows, it is in the installation root.
|
// On Windows, it is in the installation root.
|
||||||
const pythonLocation = IS_WINDOWS ? installDir : _binDir;
|
const pythonLocation = IS_WINDOWS ? installDir : _binDir;
|
||||||
core.exportVariable('pythonLocation', pythonLocation);
|
core.exportVariable('pythonLocation', pythonLocation);
|
||||||
|
|
||||||
core.addPath(installDir);
|
core.addPath(installDir);
|
||||||
core.addPath(_binDir);
|
core.addPath(_binDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function useCpythonVersion(
|
async function useCpythonVersion(
|
||||||
version: string,
|
version: string,
|
||||||
architecture: string
|
architecture: string
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
const desugaredVersionSpec = desugarDevVersion(version);
|
const desugaredVersionSpec = desugarDevVersion(version);
|
||||||
const semanticVersionSpec = pythonVersionToSemantic(desugaredVersionSpec);
|
const semanticVersionSpec = pythonVersionToSemantic(desugaredVersionSpec);
|
||||||
core.debug(`Semantic version spec of ${version} is ${semanticVersionSpec}`);
|
core.debug(`Semantic version spec of ${version} is ${semanticVersionSpec}`);
|
||||||
|
|
||||||
const installDir: string | null = tc.find(
|
const installDir: string | null = tc.find(
|
||||||
'Python',
|
'Python',
|
||||||
semanticVersionSpec,
|
semanticVersionSpec,
|
||||||
architecture
|
architecture
|
||||||
);
|
);
|
||||||
if (!installDir) {
|
if (!installDir) {
|
||||||
// Fail and list available versions
|
// Fail and list available versions
|
||||||
const x86Versions = tc
|
const x86Versions = tc
|
||||||
.findAllVersions('Python', 'x86')
|
.findAllVersions('Python', 'x86')
|
||||||
.map(s => `${s} (x86)`)
|
.map(s => `${s} (x86)`)
|
||||||
.join(os.EOL);
|
.join(os.EOL);
|
||||||
|
|
||||||
const x64Versions = tc
|
const x64Versions = tc
|
||||||
.findAllVersions('Python', 'x64')
|
.findAllVersions('Python', 'x64')
|
||||||
.map(s => `${s} (x64)`)
|
.map(s => `${s} (x64)`)
|
||||||
.join(os.EOL);
|
.join(os.EOL);
|
||||||
|
|
||||||
throw new Error(
|
throw new Error(
|
||||||
[
|
[
|
||||||
`Version ${version} with arch ${architecture} not found`,
|
`Version ${version} with arch ${architecture} not found`,
|
||||||
'Available versions:',
|
'Available versions:',
|
||||||
x86Versions,
|
x86Versions,
|
||||||
x64Versions
|
x64Versions
|
||||||
].join(os.EOL)
|
].join(os.EOL)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
core.exportVariable('pythonLocation', installDir);
|
core.exportVariable('pythonLocation', installDir);
|
||||||
core.addPath(installDir);
|
core.addPath(installDir);
|
||||||
core.addPath(binDir(installDir));
|
core.addPath(binDir(installDir));
|
||||||
|
|
||||||
if (IS_WINDOWS) {
|
if (IS_WINDOWS) {
|
||||||
// Add --user directory
|
// Add --user directory
|
||||||
// `installDir` from tool cache should look like $AGENT_TOOLSDIRECTORY/Python/<semantic version>/x64/
|
// `installDir` from tool cache should look like $AGENT_TOOLSDIRECTORY/Python/<semantic version>/x64/
|
||||||
// So if `findLocalTool` succeeded above, we must have a conformant `installDir`
|
// So if `findLocalTool` succeeded above, we must have a conformant `installDir`
|
||||||
const version = path.basename(path.dirname(installDir));
|
const version = path.basename(path.dirname(installDir));
|
||||||
const major = semver.major(version);
|
const major = semver.major(version);
|
||||||
const minor = semver.minor(version);
|
const minor = semver.minor(version);
|
||||||
|
|
||||||
const userScriptsDir = path.join(
|
const userScriptsDir = path.join(
|
||||||
process.env['APPDATA'] || '',
|
process.env['APPDATA'] || '',
|
||||||
'Python',
|
'Python',
|
||||||
`Python${major}${minor}`,
|
`Python${major}${minor}`,
|
||||||
'Scripts'
|
'Scripts'
|
||||||
);
|
);
|
||||||
core.addPath(userScriptsDir);
|
core.addPath(userScriptsDir);
|
||||||
}
|
}
|
||||||
// On Linux and macOS, pip will create the --user directory and add it to PATH as needed.
|
// On Linux and macOS, pip will create the --user directory and add it to PATH as needed.
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Convert versions like `3.8-dev` to a version like `>= 3.8.0-a0`. */
|
/** Convert versions like `3.8-dev` to a version like `>= 3.8.0-a0`. */
|
||||||
function desugarDevVersion(versionSpec: string) {
|
function desugarDevVersion(versionSpec: string) {
|
||||||
if (versionSpec.endsWith('-dev')) {
|
if (versionSpec.endsWith('-dev')) {
|
||||||
const versionRoot = versionSpec.slice(0, -'-dev'.length);
|
const versionRoot = versionSpec.slice(0, -'-dev'.length);
|
||||||
return `>= ${versionRoot}.0-a0`;
|
return `>= ${versionRoot}.0-a0`;
|
||||||
} else {
|
} else {
|
||||||
return versionSpec;
|
return versionSpec;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Python's prelease versions look like `3.7.0b2`.
|
* Python's prelease versions look like `3.7.0b2`.
|
||||||
* This is the one part of Python versioning that does not look like semantic versioning, which specifies `3.7.0-b2`.
|
* This is the one part of Python versioning that does not look like semantic versioning, which specifies `3.7.0-b2`.
|
||||||
* If the version spec contains prerelease versions, we need to convert them to the semantic version equivalent.
|
* If the version spec contains prerelease versions, we need to convert them to the semantic version equivalent.
|
||||||
*/
|
*/
|
||||||
export function pythonVersionToSemantic(versionSpec: string) {
|
export function pythonVersionToSemantic(versionSpec: string) {
|
||||||
const prereleaseVersion = /(\d+\.\d+\.\d+)((?:a|b|rc)\d*)/g;
|
const prereleaseVersion = /(\d+\.\d+\.\d+)((?:a|b|rc)\d*)/g;
|
||||||
return versionSpec.replace(prereleaseVersion, '$1-$2');
|
return versionSpec.replace(prereleaseVersion, '$1-$2');
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function findPythonVersion(
|
export async function findPythonVersion(
|
||||||
version: string,
|
version: string,
|
||||||
architecture: string
|
architecture: string
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
switch (version.toUpperCase()) {
|
switch (version.toUpperCase()) {
|
||||||
case 'PYPY2':
|
case 'PYPY2':
|
||||||
return usePyPy(2, architecture);
|
return usePyPy(2, architecture);
|
||||||
case 'PYPY3':
|
case 'PYPY3':
|
||||||
return usePyPy(3, architecture);
|
return usePyPy(3, architecture);
|
||||||
default:
|
default:
|
||||||
return await useCpythonVersion(version, architecture);
|
return await useCpythonVersion(version, architecture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,22 +1,22 @@
|
||||||
import * as core from '@actions/core';
|
import * as core from '@actions/core';
|
||||||
import * as finder from './find-python';
|
import * as finder from './find-python';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
|
|
||||||
async function run() {
|
async function run() {
|
||||||
try {
|
try {
|
||||||
let version = core.getInput('version');
|
let version = core.getInput('version');
|
||||||
if (!version) {
|
if (!version) {
|
||||||
version = core.getInput('python-version');
|
version = core.getInput('python-version');
|
||||||
}
|
}
|
||||||
if (version) {
|
if (version) {
|
||||||
const arch: string = core.getInput('architecture', {required: true});
|
const arch: string = core.getInput('architecture', {required: true});
|
||||||
await finder.findPythonVersion(version, arch);
|
await finder.findPythonVersion(version, arch);
|
||||||
}
|
}
|
||||||
const matchersPath = path.join(__dirname, '..', '.github');
|
const matchersPath = path.join(__dirname, '..', '.github');
|
||||||
console.log(`##[add-matcher]${path.join(matchersPath, 'python.json')}`);
|
console.log(`##[add-matcher]${path.join(matchersPath, 'python.json')}`);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
core.setFailed(err.message);
|
core.setFailed(err.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
run();
|
run();
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
126
tsconfig.json
126
tsconfig.json
|
@ -1,63 +1,63 @@
|
||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
/* Basic Options */
|
/* Basic Options */
|
||||||
// "incremental": true, /* Enable incremental compilation */
|
// "incremental": true, /* Enable incremental compilation */
|
||||||
"target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
|
"target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
|
||||||
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
|
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
|
||||||
// "allowJs": true, /* Allow javascript files to be compiled. */
|
// "allowJs": true, /* Allow javascript files to be compiled. */
|
||||||
// "checkJs": true, /* Report errors in .js files. */
|
// "checkJs": true, /* Report errors in .js files. */
|
||||||
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
|
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
|
||||||
// "declaration": true, /* Generates corresponding '.d.ts' file. */
|
// "declaration": true, /* Generates corresponding '.d.ts' file. */
|
||||||
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
|
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
|
||||||
// "sourceMap": true, /* Generates corresponding '.map' file. */
|
// "sourceMap": true, /* Generates corresponding '.map' file. */
|
||||||
// "outFile": "./", /* Concatenate and emit output to single file. */
|
// "outFile": "./", /* Concatenate and emit output to single file. */
|
||||||
"outDir": "./lib", /* Redirect output structure to the directory. */
|
"outDir": "./lib", /* Redirect output structure to the directory. */
|
||||||
"rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
|
"rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
|
||||||
// "composite": true, /* Enable project compilation */
|
// "composite": true, /* Enable project compilation */
|
||||||
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
|
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
|
||||||
// "removeComments": true, /* Do not emit comments to output. */
|
// "removeComments": true, /* Do not emit comments to output. */
|
||||||
// "noEmit": true, /* Do not emit outputs. */
|
// "noEmit": true, /* Do not emit outputs. */
|
||||||
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
|
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
|
||||||
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
|
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
|
||||||
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
|
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
|
||||||
|
|
||||||
/* Strict Type-Checking Options */
|
/* Strict Type-Checking Options */
|
||||||
"strict": true, /* Enable all strict type-checking options. */
|
"strict": true, /* Enable all strict type-checking options. */
|
||||||
// "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
|
// "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
|
||||||
// "strictNullChecks": true, /* Enable strict null checks. */
|
// "strictNullChecks": true, /* Enable strict null checks. */
|
||||||
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
|
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
|
||||||
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
|
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
|
||||||
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
|
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
|
||||||
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
|
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
|
||||||
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
|
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
|
||||||
|
|
||||||
/* Additional Checks */
|
/* Additional Checks */
|
||||||
// "noUnusedLocals": true, /* Report errors on unused locals. */
|
// "noUnusedLocals": true, /* Report errors on unused locals. */
|
||||||
// "noUnusedParameters": true, /* Report errors on unused parameters. */
|
// "noUnusedParameters": true, /* Report errors on unused parameters. */
|
||||||
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
|
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
|
||||||
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
|
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
|
||||||
|
|
||||||
/* Module Resolution Options */
|
/* Module Resolution Options */
|
||||||
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
|
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
|
||||||
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
|
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
|
||||||
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
|
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
|
||||||
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
|
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
|
||||||
// "typeRoots": [], /* List of folders to include type definitions from. */
|
// "typeRoots": [], /* List of folders to include type definitions from. */
|
||||||
// "types": [], /* Type declaration files to be included in compilation. */
|
// "types": [], /* Type declaration files to be included in compilation. */
|
||||||
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
|
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
|
||||||
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
|
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
|
||||||
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
|
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
|
||||||
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
||||||
|
|
||||||
/* Source Map Options */
|
/* Source Map Options */
|
||||||
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
|
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
|
||||||
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
|
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
|
||||||
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
|
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
|
||||||
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
|
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
|
||||||
|
|
||||||
/* Experimental Options */
|
/* Experimental Options */
|
||||||
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
|
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
|
||||||
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
|
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
|
||||||
},
|
},
|
||||||
"exclude": ["node_modules", "**/*.test.ts"]
|
"exclude": ["node_modules", "**/*.test.ts"]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue