From 9580326150d2ee14fdc290ab1d7d5fa11e64f3e6 Mon Sep 17 00:00:00 2001 From: Danny McCormick Date: Mon, 5 Aug 2019 14:46:03 -0400 Subject: [PATCH] Add correct tool-cache --- node_modules/.bin/shjs | 15 - node_modules/.bin/shjs.cmd | 7 - node_modules/@actions/exec/README.md | 12 +- node_modules/@actions/exec/lib/exec.d.ts | 24 +- node_modules/@actions/exec/lib/exec.js | 70 +- .../@actions/exec/lib/interfaces.d.ts | 70 +- node_modules/@actions/exec/lib/interfaces.js | 4 +- .../@actions/exec/lib/toolrunner.d.ts | 74 +- node_modules/@actions/exec/lib/toolrunner.js | 1144 ++++++++--------- node_modules/@actions/exit/LICENSE.md | 12 +- node_modules/@actions/exit/README.md | 12 +- node_modules/@actions/exit/lib/exit.d.ts | 58 +- node_modules/@actions/exit/lib/exit.js | 86 +- node_modules/@actions/io/README.md | 96 +- node_modules/@actions/io/lib/io-util.d.ts | 58 +- node_modules/@actions/io/lib/io-util.js | 386 +++--- node_modules/@actions/io/lib/io.d.ts | 96 +- node_modules/@actions/io/lib/io.js | 522 ++++---- node_modules/@actions/tool-cache/README.md | 89 +- .../@actions/tool-cache/lib/tool-cache.d.ts | 156 +-- .../@actions/tool-cache/lib/tool-cache.js | 873 +++++++------ .../@actions/tool-cache/lib/tool-cache.js.map | 2 +- node_modules/@actions/tool-cache/package.json | 6 +- .../tool-cache/scripts/Invoke-7zdec.ps1 | 118 +- node_modules/shelljs/.documentup.json | 6 - node_modules/shelljs/.jshintrc | 7 - node_modules/shelljs/.npmignore | 2 - node_modules/shelljs/.travis.yml | 5 - node_modules/shelljs/LICENSE | 26 - node_modules/shelljs/README.md | 569 -------- node_modules/shelljs/bin/shjs | 51 - node_modules/shelljs/global.js | 3 - node_modules/shelljs/make.js | 47 - node_modules/shelljs/package.json | 66 - node_modules/shelljs/scripts/generate-docs.js | 21 - node_modules/shelljs/scripts/run-tests.js | 50 - node_modules/shelljs/shell.js | 157 --- node_modules/shelljs/src/cat.js | 43 - node_modules/shelljs/src/cd.js | 19 - node_modules/shelljs/src/chmod.js | 208 --- node_modules/shelljs/src/common.js | 203 --- node_modules/shelljs/src/cp.js | 201 --- node_modules/shelljs/src/dirs.js | 191 --- node_modules/shelljs/src/echo.js | 20 - node_modules/shelljs/src/error.js | 10 - node_modules/shelljs/src/exec.js | 181 --- node_modules/shelljs/src/find.js | 51 - node_modules/shelljs/src/grep.js | 52 - node_modules/shelljs/src/ln.js | 53 - node_modules/shelljs/src/ls.js | 126 -- node_modules/shelljs/src/mkdir.js | 68 - node_modules/shelljs/src/mv.js | 80 -- node_modules/shelljs/src/popd.js | 1 - node_modules/shelljs/src/pushd.js | 1 - node_modules/shelljs/src/pwd.js | 11 - node_modules/shelljs/src/rm.js | 145 --- node_modules/shelljs/src/sed.js | 43 - node_modules/shelljs/src/tempdir.js | 56 - node_modules/shelljs/src/test.js | 85 -- node_modules/shelljs/src/to.js | 29 - node_modules/shelljs/src/toEnd.js | 29 - node_modules/shelljs/src/which.js | 83 -- package-lock.json | 8 +- package.json | 4 +- toolkit/actions-tool-cache-0.0.0.tgz | Bin 118504 -> 119066 bytes 65 files changed, 2024 insertions(+), 4977 deletions(-) delete mode 100644 node_modules/.bin/shjs delete mode 100644 node_modules/.bin/shjs.cmd delete mode 100644 node_modules/shelljs/.documentup.json delete mode 100644 node_modules/shelljs/.jshintrc delete mode 100644 node_modules/shelljs/.npmignore delete mode 100644 node_modules/shelljs/.travis.yml delete mode 100644 node_modules/shelljs/LICENSE delete mode 100644 node_modules/shelljs/README.md delete mode 100644 node_modules/shelljs/bin/shjs delete mode 100644 node_modules/shelljs/global.js delete mode 100644 node_modules/shelljs/make.js delete mode 100644 node_modules/shelljs/package.json delete mode 100644 node_modules/shelljs/scripts/generate-docs.js delete mode 100644 node_modules/shelljs/scripts/run-tests.js delete mode 100644 node_modules/shelljs/shell.js delete mode 100644 node_modules/shelljs/src/cat.js delete mode 100644 node_modules/shelljs/src/cd.js delete mode 100644 node_modules/shelljs/src/chmod.js delete mode 100644 node_modules/shelljs/src/common.js delete mode 100644 node_modules/shelljs/src/cp.js delete mode 100644 node_modules/shelljs/src/dirs.js delete mode 100644 node_modules/shelljs/src/echo.js delete mode 100644 node_modules/shelljs/src/error.js delete mode 100644 node_modules/shelljs/src/exec.js delete mode 100644 node_modules/shelljs/src/find.js delete mode 100644 node_modules/shelljs/src/grep.js delete mode 100644 node_modules/shelljs/src/ln.js delete mode 100644 node_modules/shelljs/src/ls.js delete mode 100644 node_modules/shelljs/src/mkdir.js delete mode 100644 node_modules/shelljs/src/mv.js delete mode 100644 node_modules/shelljs/src/popd.js delete mode 100644 node_modules/shelljs/src/pushd.js delete mode 100644 node_modules/shelljs/src/pwd.js delete mode 100644 node_modules/shelljs/src/rm.js delete mode 100644 node_modules/shelljs/src/sed.js delete mode 100644 node_modules/shelljs/src/tempdir.js delete mode 100644 node_modules/shelljs/src/test.js delete mode 100644 node_modules/shelljs/src/to.js delete mode 100644 node_modules/shelljs/src/toEnd.js delete mode 100644 node_modules/shelljs/src/which.js diff --git a/node_modules/.bin/shjs b/node_modules/.bin/shjs deleted file mode 100644 index 1d45691b..00000000 --- a/node_modules/.bin/shjs +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*) basedir=`cygpath -w "$basedir"`;; -esac - -if [ -x "$basedir/node" ]; then - "$basedir/node" "$basedir/../shelljs/bin/shjs" "$@" - ret=$? -else - node "$basedir/../shelljs/bin/shjs" "$@" - ret=$? -fi -exit $ret diff --git a/node_modules/.bin/shjs.cmd b/node_modules/.bin/shjs.cmd deleted file mode 100644 index 3d98b0bc..00000000 --- a/node_modules/.bin/shjs.cmd +++ /dev/null @@ -1,7 +0,0 @@ -@IF EXIST "%~dp0\node.exe" ( - "%~dp0\node.exe" "%~dp0\..\shelljs\bin\shjs" %* -) ELSE ( - @SETLOCAL - @SET PATHEXT=%PATHEXT:;.JS;=;% - node "%~dp0\..\shelljs\bin\shjs" %* -) \ No newline at end of file diff --git a/node_modules/@actions/exec/README.md b/node_modules/@actions/exec/README.md index 3529e500..354acdcb 100644 --- a/node_modules/@actions/exec/README.md +++ b/node_modules/@actions/exec/README.md @@ -1,7 +1,7 @@ -# `@actions/exec` - -> Functions necessary for running tools on the command line - -## Usage - +# `@actions/exec` + +> Functions necessary for running tools on the command line + +## Usage + See [src/exec.ts](src/exec.ts). \ No newline at end of file diff --git a/node_modules/@actions/exec/lib/exec.d.ts b/node_modules/@actions/exec/lib/exec.d.ts index 5c8f3b3e..8c64aae3 100644 --- a/node_modules/@actions/exec/lib/exec.d.ts +++ b/node_modules/@actions/exec/lib/exec.d.ts @@ -1,12 +1,12 @@ -import * as im from './interfaces'; -/** - * Exec a command. - * Output will be streamed to the live console. - * Returns promise with return code - * - * @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 options optional exec options. See ExecOptions - * @returns Promise exit code - */ -export declare function exec(commandLine: string, args?: string[], options?: im.ExecOptions): Promise; +import * as im from './interfaces'; +/** + * Exec a command. + * Output will be streamed to the live console. + * Returns promise with return code + * + * @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 options optional exec options. See ExecOptions + * @returns Promise exit code + */ +export declare function exec(commandLine: string, args?: string[], options?: im.ExecOptions): Promise; diff --git a/node_modules/@actions/exec/lib/exec.js b/node_modules/@actions/exec/lib/exec.js index e4679276..fadab335 100644 --- a/node_modules/@actions/exec/lib/exec.js +++ b/node_modules/@actions/exec/lib/exec.js @@ -1,36 +1,36 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - 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 step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const tr = require("./toolrunner"); -/** - * Exec a command. - * Output will be streamed to the live console. - * Returns promise with return code - * - * @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 options optional exec options. See ExecOptions - * @returns Promise exit code - */ -function exec(commandLine, args, options) { - return __awaiter(this, void 0, void 0, function* () { - const commandArgs = tr.argStringToArray(commandLine); - if (commandArgs.length === 0) { - throw new Error(`Parameter 'commandLine' cannot be null or empty.`); - } - // Path to tool to execute should be first arg - const toolPath = commandArgs[0]; - args = commandArgs.slice(1).concat(args || []); - const runner = new tr.ToolRunner(toolPath, args, options); - return runner.exec(); - }); -} -exports.exec = exec; +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + 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 step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const tr = require("./toolrunner"); +/** + * Exec a command. + * Output will be streamed to the live console. + * Returns promise with return code + * + * @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 options optional exec options. See ExecOptions + * @returns Promise exit code + */ +function exec(commandLine, args, options) { + return __awaiter(this, void 0, void 0, function* () { + const commandArgs = tr.argStringToArray(commandLine); + if (commandArgs.length === 0) { + throw new Error(`Parameter 'commandLine' cannot be null or empty.`); + } + // Path to tool to execute should be first arg + const toolPath = commandArgs[0]; + args = commandArgs.slice(1).concat(args || []); + const runner = new tr.ToolRunner(toolPath, args, options); + return runner.exec(); + }); +} +exports.exec = exec; //# sourceMappingURL=exec.js.map \ No newline at end of file diff --git a/node_modules/@actions/exec/lib/interfaces.d.ts b/node_modules/@actions/exec/lib/interfaces.d.ts index 0d7202af..18618237 100644 --- a/node_modules/@actions/exec/lib/interfaces.d.ts +++ b/node_modules/@actions/exec/lib/interfaces.d.ts @@ -1,35 +1,35 @@ -/// -import * as stream from 'stream'; -/** - * Interface for exec options - */ -export interface ExecOptions { - /** optional working directory. defaults to current */ - cwd?: string; - /** optional envvar dictionary. defaults to current process's env */ - env?: { - [key: string]: string; - }; - /** optional. defaults to false */ - silent?: boolean; - /** optional out stream to use. Defaults to process.stdout */ - outStream?: stream.Writable; - /** optional err stream to use. Defaults to process.stderr */ - errStream?: stream.Writable; - /** optional. whether to skip quoting/escaping arguments if needed. defaults to false. */ - windowsVerbatimArguments?: boolean; - /** optional. whether to fail if output to stderr. defaults to false */ - failOnStdErr?: boolean; - /** optional. defaults to failing on non zero. ignore will not fail leaving it up to the caller */ - 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 */ - delay?: number; - /** optional. Listeners for output. Callback functions that will be called on these events */ - listeners?: { - stdout?: (data: Buffer) => void; - stderr?: (data: Buffer) => void; - stdline?: (data: string) => void; - errline?: (data: string) => void; - debug?: (data: string) => void; - }; -} +/// +import * as stream from 'stream'; +/** + * Interface for exec options + */ +export interface ExecOptions { + /** optional working directory. defaults to current */ + cwd?: string; + /** optional envvar dictionary. defaults to current process's env */ + env?: { + [key: string]: string; + }; + /** optional. defaults to false */ + silent?: boolean; + /** optional out stream to use. Defaults to process.stdout */ + outStream?: stream.Writable; + /** optional err stream to use. Defaults to process.stderr */ + errStream?: stream.Writable; + /** optional. whether to skip quoting/escaping arguments if needed. defaults to false. */ + windowsVerbatimArguments?: boolean; + /** optional. whether to fail if output to stderr. defaults to false */ + failOnStdErr?: boolean; + /** optional. defaults to failing on non zero. ignore will not fail leaving it up to the caller */ + 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 */ + delay?: number; + /** optional. Listeners for output. Callback functions that will be called on these events */ + listeners?: { + stdout?: (data: Buffer) => void; + stderr?: (data: Buffer) => void; + stdline?: (data: string) => void; + errline?: (data: string) => void; + debug?: (data: string) => void; + }; +} diff --git a/node_modules/@actions/exec/lib/interfaces.js b/node_modules/@actions/exec/lib/interfaces.js index e979780f..db919115 100644 --- a/node_modules/@actions/exec/lib/interfaces.js +++ b/node_modules/@actions/exec/lib/interfaces.js @@ -1,3 +1,3 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=interfaces.js.map \ No newline at end of file diff --git a/node_modules/@actions/exec/lib/toolrunner.d.ts b/node_modules/@actions/exec/lib/toolrunner.d.ts index 71198dac..9bbbb1ea 100644 --- a/node_modules/@actions/exec/lib/toolrunner.d.ts +++ b/node_modules/@actions/exec/lib/toolrunner.d.ts @@ -1,37 +1,37 @@ -/// -import * as events from 'events'; -import * as im from './interfaces'; -export declare class ToolRunner extends events.EventEmitter { - constructor(toolPath: string, args?: string[], options?: im.ExecOptions); - private toolPath; - private args; - private options; - private _debug; - private _getCommandString; - private _processLineBuffer; - private _getSpawnFileName; - private _getSpawnArgs; - private _endsWith; - private _isCmdFile; - private _windowsQuoteCmdArg; - private _uvQuoteCmdArg; - private _cloneExecOptions; - private _getSpawnOptions; - /** - * Exec a tool. - * Output will be streamed to the live console. - * Returns promise with return code - * - * @param tool path to tool to exec - * @param options optional exec options. See ExecOptions - * @returns number - */ - exec(): Promise; -} -/** - * Convert an arg string to an array of args. Handles escaping - * - * @param argString string of arguments - * @returns string[] array of arguments - */ -export declare function argStringToArray(argString: string): string[]; +/// +import * as events from 'events'; +import * as im from './interfaces'; +export declare class ToolRunner extends events.EventEmitter { + constructor(toolPath: string, args?: string[], options?: im.ExecOptions); + private toolPath; + private args; + private options; + private _debug; + private _getCommandString; + private _processLineBuffer; + private _getSpawnFileName; + private _getSpawnArgs; + private _endsWith; + private _isCmdFile; + private _windowsQuoteCmdArg; + private _uvQuoteCmdArg; + private _cloneExecOptions; + private _getSpawnOptions; + /** + * Exec a tool. + * Output will be streamed to the live console. + * Returns promise with return code + * + * @param tool path to tool to exec + * @param options optional exec options. See ExecOptions + * @returns number + */ + exec(): Promise; +} +/** + * Convert an arg string to an array of args. Handles escaping + * + * @param argString string of arguments + * @returns string[] array of arguments + */ +export declare function argStringToArray(argString: string): string[]; diff --git a/node_modules/@actions/exec/lib/toolrunner.js b/node_modules/@actions/exec/lib/toolrunner.js index 6ed5a52a..901cbb57 100644 --- a/node_modules/@actions/exec/lib/toolrunner.js +++ b/node_modules/@actions/exec/lib/toolrunner.js @@ -1,573 +1,573 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - 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 step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const os = require("os"); -const events = require("events"); -const child = require("child_process"); -/* eslint-disable @typescript-eslint/unbound-method */ -const IS_WINDOWS = process.platform === 'win32'; -/* - * Class for running command line tools. Handles quoting and arg parsing in a platform agnostic way. - */ -class ToolRunner extends events.EventEmitter { - constructor(toolPath, args, options) { - super(); - if (!toolPath) { - throw new Error("Parameter 'toolPath' cannot be null or empty."); - } - this.toolPath = toolPath; - this.args = args || []; - this.options = options || {}; - } - _debug(message) { - if (this.options.listeners && this.options.listeners.debug) { - this.options.listeners.debug(message); - } - } - _getCommandString(options, noPrefix) { - const toolPath = this._getSpawnFileName(); - const args = this._getSpawnArgs(options); - let cmd = noPrefix ? '' : '[command]'; // omit prefix when piped to a second tool - if (IS_WINDOWS) { - // Windows + cmd file - if (this._isCmdFile()) { - cmd += toolPath; - for (const a of args) { - cmd += ` ${a}`; - } - } - // Windows + verbatim - else if (options.windowsVerbatimArguments) { - cmd += `"${toolPath}"`; - for (const a of args) { - cmd += ` ${a}`; - } - } - // Windows (regular) - else { - cmd += this._windowsQuoteCmdArg(toolPath); - for (const a of args) { - cmd += ` ${this._windowsQuoteCmdArg(a)}`; - } - } - } - else { - // OSX/Linux - this can likely be improved with some form of quoting. - // creating processes on Unix is fundamentally different than Windows. - // on Unix, execvp() takes an arg array. - cmd += toolPath; - for (const a of args) { - cmd += ` ${a}`; - } - } - return cmd; - } - _processLineBuffer(data, strBuffer, onLine) { - try { - let s = strBuffer + data.toString(); - let n = s.indexOf(os.EOL); - while (n > -1) { - const line = s.substring(0, n); - onLine(line); - // the rest of the string ... - s = s.substring(n + os.EOL.length); - n = s.indexOf(os.EOL); - } - strBuffer = s; - } - catch (err) { - // streaming lines to console is best effort. Don't fail a build. - this._debug(`error processing line. Failed with error ${err}`); - } - } - _getSpawnFileName() { - if (IS_WINDOWS) { - if (this._isCmdFile()) { - return process.env['COMSPEC'] || 'cmd.exe'; - } - } - return this.toolPath; - } - _getSpawnArgs(options) { - if (IS_WINDOWS) { - if (this._isCmdFile()) { - let argline = `/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`; - for (const a of this.args) { - argline += ' '; - argline += options.windowsVerbatimArguments - ? a - : this._windowsQuoteCmdArg(a); - } - argline += '"'; - return [argline]; - } - } - return this.args; - } - _endsWith(str, end) { - return str.endsWith(end); - } - _isCmdFile() { - const upperToolPath = this.toolPath.toUpperCase(); - return (this._endsWith(upperToolPath, '.CMD') || - this._endsWith(upperToolPath, '.BAT')); - } - _windowsQuoteCmdArg(arg) { - // for .exe, apply the normal quoting rules that libuv applies - if (!this._isCmdFile()) { - return this._uvQuoteCmdArg(arg); - } - // otherwise apply quoting rules specific to the cmd.exe command line parser. - // the libuv rules are generic and are not designed specifically for cmd.exe - // command line parser. - // - // for a detailed description of the cmd.exe command line parser, refer to - // http://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/7970912#7970912 - // need quotes for empty arg - if (!arg) { - return '""'; - } - // determine whether the arg needs to be quoted - const cmdSpecialChars = [ - ' ', - '\t', - '&', - '(', - ')', - '[', - ']', - '{', - '}', - '^', - '=', - ';', - '!', - "'", - '+', - ',', - '`', - '~', - '|', - '<', - '>', - '"' - ]; - let needsQuotes = false; - for (const char of arg) { - if (cmdSpecialChars.some(x => x === char)) { - needsQuotes = true; - break; - } - } - // short-circuit if quotes not needed - if (!needsQuotes) { - return arg; - } - // the following quoting rules are very similar to the rules that by libuv applies. - // - // 1) wrap the string in quotes - // - // 2) double-up quotes - i.e. " => "" - // - // this is different from the libuv quoting rules. libuv replaces " with \", which unfortunately - // doesn't work well with a cmd.exe command line. - // - // note, replacing " with "" also works well if the arg is passed to a downstream .NET console app. - // for example, the command line: - // foo.exe "myarg:""my val""" - // is parsed by a .NET console app into an arg array: - // [ "myarg:\"my val\"" ] - // which is the same end result when applying libuv quoting rules. although the actual - // command line from libuv quoting rules would look like: - // foo.exe "myarg:\"my val\"" - // - // 3) double-up slashes that preceed a quote, - // e.g. hello \world => "hello \world" - // hello\"world => "hello\\""world" - // hello\\"world => "hello\\\\""world" - // hello world\ => "hello world\\" - // - // technically this is not required for a cmd.exe command line, or the batch argument parser. - // the reasons for including this as a .cmd quoting rule are: - // - // a) this is optimized for the scenario where the argument is passed from the .cmd file to an - // external program. many programs (e.g. .NET console apps) rely on the slash-doubling rule. - // - // b) it's what we've been doing previously (by deferring to node default behavior) and we - // haven't heard any complaints about that aspect. - // - // note, a weakness of the quoting rules chosen here, is that % is not escaped. in fact, % cannot be - // escaped when used on the command line directly - even though within a .cmd file % can be escaped - // by using %%. - // - // the saving grace is, on the command line, %var% is left as-is if var is not defined. this contrasts - // the line parsing rules within a .cmd file, where if var is not defined it is replaced with nothing. - // - // one option that was explored was replacing % with ^% - i.e. %var% => ^%var^%. this hack would - // often work, since it is unlikely that var^ would exist, and the ^ character is removed when the - // variable is used. the problem, however, is that ^ is not removed when %* is used to pass the args - // to an external program. - // - // an unexplored potential solution for the % escaping problem, is to create a wrapper .cmd file. - // % can be escaped within a .cmd file. - let reverse = '"'; - let quoteHit = true; - for (let i = arg.length; i > 0; i--) { - // walk the string in reverse - reverse += arg[i - 1]; - if (quoteHit && arg[i - 1] === '\\') { - reverse += '\\'; // double the slash - } - else if (arg[i - 1] === '"') { - quoteHit = true; - reverse += '"'; // double the quote - } - else { - quoteHit = false; - } - } - reverse += '"'; - return reverse - .split('') - .reverse() - .join(''); - } - _uvQuoteCmdArg(arg) { - // Tool runner wraps child_process.spawn() and needs to apply the same quoting as - // Node in certain cases where the undocumented spawn option windowsVerbatimArguments - // is used. - // - // Since this function is a port of quote_cmd_arg from Node 4.x (technically, lib UV, - // see https://github.com/nodejs/node/blob/v4.x/deps/uv/src/win/process.c for details), - // pasting copyright notice from Node within this function: - // - // Copyright Joyent, Inc. and other Node contributors. All rights reserved. - // - // 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. - if (!arg) { - // Need double quotation for empty argument - return '""'; - } - if (!arg.includes(' ') && !arg.includes('\t') && !arg.includes('"')) { - // No quotation needed - return arg; - } - if (!arg.includes('"') && !arg.includes('\\')) { - // No embedded double quotes or backslashes, so I can just wrap - // quote marks around the whole thing. - return `"${arg}"`; - } - // Expected input/output: - // input : hello"world - // output: "hello\"world" - // input : hello""world - // output: "hello\"\"world" - // input : hello\world - // output: hello\world - // input : hello\\world - // output: hello\\world - // input : hello\"world - // output: "hello\\\"world" - // input : hello\\"world - // output: "hello\\\\\"world" - // input : hello world\ - // output: "hello world\\" - note the comment in libuv actually reads "hello world\" - // but it appears the comment is wrong, it should be "hello world\\" - let reverse = '"'; - let quoteHit = true; - for (let i = arg.length; i > 0; i--) { - // walk the string in reverse - reverse += arg[i - 1]; - if (quoteHit && arg[i - 1] === '\\') { - reverse += '\\'; - } - else if (arg[i - 1] === '"') { - quoteHit = true; - reverse += '\\'; - } - else { - quoteHit = false; - } - } - reverse += '"'; - return reverse - .split('') - .reverse() - .join(''); - } - _cloneExecOptions(options) { - options = options || {}; - const result = { - cwd: options.cwd || process.cwd(), - env: options.env || process.env, - silent: options.silent || false, - windowsVerbatimArguments: options.windowsVerbatimArguments || false, - failOnStdErr: options.failOnStdErr || false, - ignoreReturnCode: options.ignoreReturnCode || false, - delay: options.delay || 10000 - }; - result.outStream = options.outStream || process.stdout; - result.errStream = options.errStream || process.stderr; - return result; - } - _getSpawnOptions(options, toolPath) { - options = options || {}; - const result = {}; - result.cwd = options.cwd; - result.env = options.env; - result['windowsVerbatimArguments'] = - options.windowsVerbatimArguments || this._isCmdFile(); - if (options.windowsVerbatimArguments) { - result.argv0 = `"${toolPath}"`; - } - return result; - } - /** - * Exec a tool. - * Output will be streamed to the live console. - * Returns promise with return code - * - * @param tool path to tool to exec - * @param options optional exec options. See ExecOptions - * @returns number - */ - exec() { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => { - this._debug(`exec tool: ${this.toolPath}`); - this._debug('arguments:'); - for (const arg of this.args) { - this._debug(` ${arg}`); - } - const optionsNonNull = this._cloneExecOptions(this.options); - if (!optionsNonNull.silent && optionsNonNull.outStream) { - optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); - } - const state = new ExecState(optionsNonNull, this.toolPath); - state.on('debug', (message) => { - this._debug(message); - }); - const fileName = this._getSpawnFileName(); - const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName)); - const stdbuffer = ''; - if (cp.stdout) { - cp.stdout.on('data', (data) => { - if (this.options.listeners && this.options.listeners.stdout) { - this.options.listeners.stdout(data); - } - if (!optionsNonNull.silent && optionsNonNull.outStream) { - optionsNonNull.outStream.write(data); - } - this._processLineBuffer(data, stdbuffer, (line) => { - if (this.options.listeners && this.options.listeners.stdline) { - this.options.listeners.stdline(line); - } - }); - }); - } - const errbuffer = ''; - if (cp.stderr) { - cp.stderr.on('data', (data) => { - state.processStderr = true; - if (this.options.listeners && this.options.listeners.stderr) { - this.options.listeners.stderr(data); - } - if (!optionsNonNull.silent && - optionsNonNull.errStream && - optionsNonNull.outStream) { - const s = optionsNonNull.failOnStdErr - ? optionsNonNull.errStream - : optionsNonNull.outStream; - s.write(data); - } - this._processLineBuffer(data, errbuffer, (line) => { - if (this.options.listeners && this.options.listeners.errline) { - this.options.listeners.errline(line); - } - }); - }); - } - cp.on('error', (err) => { - state.processError = err.message; - state.processExited = true; - state.processClosed = true; - state.CheckComplete(); - }); - cp.on('exit', (code) => { - state.processExitCode = code; - state.processExited = true; - this._debug(`Exit code ${code} received from tool '${this.toolPath}'`); - state.CheckComplete(); - }); - cp.on('close', (code) => { - state.processExitCode = code; - state.processExited = true; - state.processClosed = true; - this._debug(`STDIO streams have closed for tool '${this.toolPath}'`); - state.CheckComplete(); - }); - state.on('done', (error, exitCode) => { - if (stdbuffer.length > 0) { - this.emit('stdline', stdbuffer); - } - if (errbuffer.length > 0) { - this.emit('errline', errbuffer); - } - cp.removeAllListeners(); - if (error) { - reject(error); - } - else { - resolve(exitCode); - } - }); - }); - }); - } -} -exports.ToolRunner = ToolRunner; -/** - * Convert an arg string to an array of args. Handles escaping - * - * @param argString string of arguments - * @returns string[] array of arguments - */ -function argStringToArray(argString) { - const args = []; - let inQuotes = false; - let escaped = false; - let arg = ''; - function append(c) { - // we only escape double quotes. - if (escaped && c !== '"') { - arg += '\\'; - } - arg += c; - escaped = false; - } - for (let i = 0; i < argString.length; i++) { - const c = argString.charAt(i); - if (c === '"') { - if (!escaped) { - inQuotes = !inQuotes; - } - else { - append(c); - } - continue; - } - if (c === '\\' && escaped) { - append(c); - continue; - } - if (c === '\\' && inQuotes) { - escaped = true; - continue; - } - if (c === ' ' && !inQuotes) { - if (arg.length > 0) { - args.push(arg); - arg = ''; - } - continue; - } - append(c); - } - if (arg.length > 0) { - args.push(arg.trim()); - } - return args; -} -exports.argStringToArray = argStringToArray; -class ExecState extends events.EventEmitter { - constructor(options, toolPath) { - super(); - this.processClosed = false; // tracks whether the process has exited and stdio is closed - this.processError = ''; - this.processExitCode = 0; - this.processExited = false; // tracks whether the process has exited - this.processStderr = false; // tracks whether stderr was written to - this.delay = 10000; // 10 seconds - this.done = false; - this.timeout = null; - if (!toolPath) { - throw new Error('toolPath must not be empty'); - } - this.options = options; - this.toolPath = toolPath; - if (options.delay) { - this.delay = options.delay; - } - } - CheckComplete() { - if (this.done) { - return; - } - if (this.processClosed) { - this._setResult(); - } - else if (this.processExited) { - this.timeout = setTimeout(ExecState.HandleTimeout, this.delay, this); - } - } - _debug(message) { - this.emit('debug', message); - } - _setResult() { - // determine whether there is an error - let error; - if (this.processExited) { - if (this.processError) { - error = new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`); - } - else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) { - error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`); - } - else if (this.processStderr && this.options.failOnStdErr) { - error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`); - } - } - // clear the timeout - if (this.timeout) { - clearTimeout(this.timeout); - this.timeout = null; - } - this.done = true; - this.emit('done', error, this.processExitCode); - } - static HandleTimeout(state) { - if (state.done) { - return; - } - if (!state.processClosed && state.processExited) { - const message = `The STDIO streams did not close within ${state.delay / - 1000} seconds of the exit event from process '${state.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`; - state._debug(message); - } - state._setResult(); - } -} +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + 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 step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const os = require("os"); +const events = require("events"); +const child = require("child_process"); +/* eslint-disable @typescript-eslint/unbound-method */ +const IS_WINDOWS = process.platform === 'win32'; +/* + * Class for running command line tools. Handles quoting and arg parsing in a platform agnostic way. + */ +class ToolRunner extends events.EventEmitter { + constructor(toolPath, args, options) { + super(); + if (!toolPath) { + throw new Error("Parameter 'toolPath' cannot be null or empty."); + } + this.toolPath = toolPath; + this.args = args || []; + this.options = options || {}; + } + _debug(message) { + if (this.options.listeners && this.options.listeners.debug) { + this.options.listeners.debug(message); + } + } + _getCommandString(options, noPrefix) { + const toolPath = this._getSpawnFileName(); + const args = this._getSpawnArgs(options); + let cmd = noPrefix ? '' : '[command]'; // omit prefix when piped to a second tool + if (IS_WINDOWS) { + // Windows + cmd file + if (this._isCmdFile()) { + cmd += toolPath; + for (const a of args) { + cmd += ` ${a}`; + } + } + // Windows + verbatim + else if (options.windowsVerbatimArguments) { + cmd += `"${toolPath}"`; + for (const a of args) { + cmd += ` ${a}`; + } + } + // Windows (regular) + else { + cmd += this._windowsQuoteCmdArg(toolPath); + for (const a of args) { + cmd += ` ${this._windowsQuoteCmdArg(a)}`; + } + } + } + else { + // OSX/Linux - this can likely be improved with some form of quoting. + // creating processes on Unix is fundamentally different than Windows. + // on Unix, execvp() takes an arg array. + cmd += toolPath; + for (const a of args) { + cmd += ` ${a}`; + } + } + return cmd; + } + _processLineBuffer(data, strBuffer, onLine) { + try { + let s = strBuffer + data.toString(); + let n = s.indexOf(os.EOL); + while (n > -1) { + const line = s.substring(0, n); + onLine(line); + // the rest of the string ... + s = s.substring(n + os.EOL.length); + n = s.indexOf(os.EOL); + } + strBuffer = s; + } + catch (err) { + // streaming lines to console is best effort. Don't fail a build. + this._debug(`error processing line. Failed with error ${err}`); + } + } + _getSpawnFileName() { + if (IS_WINDOWS) { + if (this._isCmdFile()) { + return process.env['COMSPEC'] || 'cmd.exe'; + } + } + return this.toolPath; + } + _getSpawnArgs(options) { + if (IS_WINDOWS) { + if (this._isCmdFile()) { + let argline = `/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`; + for (const a of this.args) { + argline += ' '; + argline += options.windowsVerbatimArguments + ? a + : this._windowsQuoteCmdArg(a); + } + argline += '"'; + return [argline]; + } + } + return this.args; + } + _endsWith(str, end) { + return str.endsWith(end); + } + _isCmdFile() { + const upperToolPath = this.toolPath.toUpperCase(); + return (this._endsWith(upperToolPath, '.CMD') || + this._endsWith(upperToolPath, '.BAT')); + } + _windowsQuoteCmdArg(arg) { + // for .exe, apply the normal quoting rules that libuv applies + if (!this._isCmdFile()) { + return this._uvQuoteCmdArg(arg); + } + // otherwise apply quoting rules specific to the cmd.exe command line parser. + // the libuv rules are generic and are not designed specifically for cmd.exe + // command line parser. + // + // for a detailed description of the cmd.exe command line parser, refer to + // http://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/7970912#7970912 + // need quotes for empty arg + if (!arg) { + return '""'; + } + // determine whether the arg needs to be quoted + const cmdSpecialChars = [ + ' ', + '\t', + '&', + '(', + ')', + '[', + ']', + '{', + '}', + '^', + '=', + ';', + '!', + "'", + '+', + ',', + '`', + '~', + '|', + '<', + '>', + '"' + ]; + let needsQuotes = false; + for (const char of arg) { + if (cmdSpecialChars.some(x => x === char)) { + needsQuotes = true; + break; + } + } + // short-circuit if quotes not needed + if (!needsQuotes) { + return arg; + } + // the following quoting rules are very similar to the rules that by libuv applies. + // + // 1) wrap the string in quotes + // + // 2) double-up quotes - i.e. " => "" + // + // this is different from the libuv quoting rules. libuv replaces " with \", which unfortunately + // doesn't work well with a cmd.exe command line. + // + // note, replacing " with "" also works well if the arg is passed to a downstream .NET console app. + // for example, the command line: + // foo.exe "myarg:""my val""" + // is parsed by a .NET console app into an arg array: + // [ "myarg:\"my val\"" ] + // which is the same end result when applying libuv quoting rules. although the actual + // command line from libuv quoting rules would look like: + // foo.exe "myarg:\"my val\"" + // + // 3) double-up slashes that preceed a quote, + // e.g. hello \world => "hello \world" + // hello\"world => "hello\\""world" + // hello\\"world => "hello\\\\""world" + // hello world\ => "hello world\\" + // + // technically this is not required for a cmd.exe command line, or the batch argument parser. + // the reasons for including this as a .cmd quoting rule are: + // + // a) this is optimized for the scenario where the argument is passed from the .cmd file to an + // external program. many programs (e.g. .NET console apps) rely on the slash-doubling rule. + // + // b) it's what we've been doing previously (by deferring to node default behavior) and we + // haven't heard any complaints about that aspect. + // + // note, a weakness of the quoting rules chosen here, is that % is not escaped. in fact, % cannot be + // escaped when used on the command line directly - even though within a .cmd file % can be escaped + // by using %%. + // + // the saving grace is, on the command line, %var% is left as-is if var is not defined. this contrasts + // the line parsing rules within a .cmd file, where if var is not defined it is replaced with nothing. + // + // one option that was explored was replacing % with ^% - i.e. %var% => ^%var^%. this hack would + // often work, since it is unlikely that var^ would exist, and the ^ character is removed when the + // variable is used. the problem, however, is that ^ is not removed when %* is used to pass the args + // to an external program. + // + // an unexplored potential solution for the % escaping problem, is to create a wrapper .cmd file. + // % can be escaped within a .cmd file. + let reverse = '"'; + let quoteHit = true; + for (let i = arg.length; i > 0; i--) { + // walk the string in reverse + reverse += arg[i - 1]; + if (quoteHit && arg[i - 1] === '\\') { + reverse += '\\'; // double the slash + } + else if (arg[i - 1] === '"') { + quoteHit = true; + reverse += '"'; // double the quote + } + else { + quoteHit = false; + } + } + reverse += '"'; + return reverse + .split('') + .reverse() + .join(''); + } + _uvQuoteCmdArg(arg) { + // Tool runner wraps child_process.spawn() and needs to apply the same quoting as + // Node in certain cases where the undocumented spawn option windowsVerbatimArguments + // is used. + // + // Since this function is a port of quote_cmd_arg from Node 4.x (technically, lib UV, + // see https://github.com/nodejs/node/blob/v4.x/deps/uv/src/win/process.c for details), + // pasting copyright notice from Node within this function: + // + // Copyright Joyent, Inc. and other Node contributors. All rights reserved. + // + // 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. + if (!arg) { + // Need double quotation for empty argument + return '""'; + } + if (!arg.includes(' ') && !arg.includes('\t') && !arg.includes('"')) { + // No quotation needed + return arg; + } + if (!arg.includes('"') && !arg.includes('\\')) { + // No embedded double quotes or backslashes, so I can just wrap + // quote marks around the whole thing. + return `"${arg}"`; + } + // Expected input/output: + // input : hello"world + // output: "hello\"world" + // input : hello""world + // output: "hello\"\"world" + // input : hello\world + // output: hello\world + // input : hello\\world + // output: hello\\world + // input : hello\"world + // output: "hello\\\"world" + // input : hello\\"world + // output: "hello\\\\\"world" + // input : hello world\ + // output: "hello world\\" - note the comment in libuv actually reads "hello world\" + // but it appears the comment is wrong, it should be "hello world\\" + let reverse = '"'; + let quoteHit = true; + for (let i = arg.length; i > 0; i--) { + // walk the string in reverse + reverse += arg[i - 1]; + if (quoteHit && arg[i - 1] === '\\') { + reverse += '\\'; + } + else if (arg[i - 1] === '"') { + quoteHit = true; + reverse += '\\'; + } + else { + quoteHit = false; + } + } + reverse += '"'; + return reverse + .split('') + .reverse() + .join(''); + } + _cloneExecOptions(options) { + options = options || {}; + const result = { + cwd: options.cwd || process.cwd(), + env: options.env || process.env, + silent: options.silent || false, + windowsVerbatimArguments: options.windowsVerbatimArguments || false, + failOnStdErr: options.failOnStdErr || false, + ignoreReturnCode: options.ignoreReturnCode || false, + delay: options.delay || 10000 + }; + result.outStream = options.outStream || process.stdout; + result.errStream = options.errStream || process.stderr; + return result; + } + _getSpawnOptions(options, toolPath) { + options = options || {}; + const result = {}; + result.cwd = options.cwd; + result.env = options.env; + result['windowsVerbatimArguments'] = + options.windowsVerbatimArguments || this._isCmdFile(); + if (options.windowsVerbatimArguments) { + result.argv0 = `"${toolPath}"`; + } + return result; + } + /** + * Exec a tool. + * Output will be streamed to the live console. + * Returns promise with return code + * + * @param tool path to tool to exec + * @param options optional exec options. See ExecOptions + * @returns number + */ + exec() { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => { + this._debug(`exec tool: ${this.toolPath}`); + this._debug('arguments:'); + for (const arg of this.args) { + this._debug(` ${arg}`); + } + const optionsNonNull = this._cloneExecOptions(this.options); + if (!optionsNonNull.silent && optionsNonNull.outStream) { + optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); + } + const state = new ExecState(optionsNonNull, this.toolPath); + state.on('debug', (message) => { + this._debug(message); + }); + const fileName = this._getSpawnFileName(); + const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName)); + const stdbuffer = ''; + if (cp.stdout) { + cp.stdout.on('data', (data) => { + if (this.options.listeners && this.options.listeners.stdout) { + this.options.listeners.stdout(data); + } + if (!optionsNonNull.silent && optionsNonNull.outStream) { + optionsNonNull.outStream.write(data); + } + this._processLineBuffer(data, stdbuffer, (line) => { + if (this.options.listeners && this.options.listeners.stdline) { + this.options.listeners.stdline(line); + } + }); + }); + } + const errbuffer = ''; + if (cp.stderr) { + cp.stderr.on('data', (data) => { + state.processStderr = true; + if (this.options.listeners && this.options.listeners.stderr) { + this.options.listeners.stderr(data); + } + if (!optionsNonNull.silent && + optionsNonNull.errStream && + optionsNonNull.outStream) { + const s = optionsNonNull.failOnStdErr + ? optionsNonNull.errStream + : optionsNonNull.outStream; + s.write(data); + } + this._processLineBuffer(data, errbuffer, (line) => { + if (this.options.listeners && this.options.listeners.errline) { + this.options.listeners.errline(line); + } + }); + }); + } + cp.on('error', (err) => { + state.processError = err.message; + state.processExited = true; + state.processClosed = true; + state.CheckComplete(); + }); + cp.on('exit', (code) => { + state.processExitCode = code; + state.processExited = true; + this._debug(`Exit code ${code} received from tool '${this.toolPath}'`); + state.CheckComplete(); + }); + cp.on('close', (code) => { + state.processExitCode = code; + state.processExited = true; + state.processClosed = true; + this._debug(`STDIO streams have closed for tool '${this.toolPath}'`); + state.CheckComplete(); + }); + state.on('done', (error, exitCode) => { + if (stdbuffer.length > 0) { + this.emit('stdline', stdbuffer); + } + if (errbuffer.length > 0) { + this.emit('errline', errbuffer); + } + cp.removeAllListeners(); + if (error) { + reject(error); + } + else { + resolve(exitCode); + } + }); + }); + }); + } +} +exports.ToolRunner = ToolRunner; +/** + * Convert an arg string to an array of args. Handles escaping + * + * @param argString string of arguments + * @returns string[] array of arguments + */ +function argStringToArray(argString) { + const args = []; + let inQuotes = false; + let escaped = false; + let arg = ''; + function append(c) { + // we only escape double quotes. + if (escaped && c !== '"') { + arg += '\\'; + } + arg += c; + escaped = false; + } + for (let i = 0; i < argString.length; i++) { + const c = argString.charAt(i); + if (c === '"') { + if (!escaped) { + inQuotes = !inQuotes; + } + else { + append(c); + } + continue; + } + if (c === '\\' && escaped) { + append(c); + continue; + } + if (c === '\\' && inQuotes) { + escaped = true; + continue; + } + if (c === ' ' && !inQuotes) { + if (arg.length > 0) { + args.push(arg); + arg = ''; + } + continue; + } + append(c); + } + if (arg.length > 0) { + args.push(arg.trim()); + } + return args; +} +exports.argStringToArray = argStringToArray; +class ExecState extends events.EventEmitter { + constructor(options, toolPath) { + super(); + this.processClosed = false; // tracks whether the process has exited and stdio is closed + this.processError = ''; + this.processExitCode = 0; + this.processExited = false; // tracks whether the process has exited + this.processStderr = false; // tracks whether stderr was written to + this.delay = 10000; // 10 seconds + this.done = false; + this.timeout = null; + if (!toolPath) { + throw new Error('toolPath must not be empty'); + } + this.options = options; + this.toolPath = toolPath; + if (options.delay) { + this.delay = options.delay; + } + } + CheckComplete() { + if (this.done) { + return; + } + if (this.processClosed) { + this._setResult(); + } + else if (this.processExited) { + this.timeout = setTimeout(ExecState.HandleTimeout, this.delay, this); + } + } + _debug(message) { + this.emit('debug', message); + } + _setResult() { + // determine whether there is an error + let error; + if (this.processExited) { + if (this.processError) { + error = new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`); + } + else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) { + error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`); + } + else if (this.processStderr && this.options.failOnStdErr) { + error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`); + } + } + // clear the timeout + if (this.timeout) { + clearTimeout(this.timeout); + this.timeout = null; + } + this.done = true; + this.emit('done', error, this.processExitCode); + } + static HandleTimeout(state) { + if (state.done) { + return; + } + if (!state.processClosed && state.processExited) { + const message = `The STDIO streams did not close within ${state.delay / + 1000} seconds of the exit event from process '${state.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`; + state._debug(message); + } + state._setResult(); + } +} //# sourceMappingURL=toolrunner.js.map \ No newline at end of file diff --git a/node_modules/@actions/exit/LICENSE.md b/node_modules/@actions/exit/LICENSE.md index 5b674fe8..e5a73f40 100644 --- a/node_modules/@actions/exit/LICENSE.md +++ b/node_modules/@actions/exit/LICENSE.md @@ -1,7 +1,7 @@ -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. - +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. \ No newline at end of file diff --git a/node_modules/@actions/exit/README.md b/node_modules/@actions/exit/README.md index 2a53c6ca..cbbe0eef 100644 --- a/node_modules/@actions/exit/README.md +++ b/node_modules/@actions/exit/README.md @@ -1,7 +1,7 @@ -# `@actions/exit` - -> TODO: description - -## Usage - +# `@actions/exit` + +> TODO: description + +## Usage + See [src/exit.ts](src/exit.ts). \ No newline at end of file diff --git a/node_modules/@actions/exit/lib/exit.d.ts b/node_modules/@actions/exit/lib/exit.d.ts index 22ebe162..a34305e5 100644 --- a/node_modules/@actions/exit/lib/exit.d.ts +++ b/node_modules/@actions/exit/lib/exit.d.ts @@ -1,29 +1,29 @@ -/** - * 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; +/** + * 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; diff --git a/node_modules/@actions/exit/lib/exit.js b/node_modules/@actions/exit/lib/exit.js index 6048c785..55caff26 100644 --- a/node_modules/@actions/exit/lib/exit.js +++ b/node_modules/@actions/exit/lib/exit.js @@ -1,44 +1,44 @@ -"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; +"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 \ No newline at end of file diff --git a/node_modules/@actions/io/README.md b/node_modules/@actions/io/README.md index 79b3f8db..e9b50d2f 100644 --- a/node_modules/@actions/io/README.md +++ b/node_modules/@actions/io/README.md @@ -1,49 +1,49 @@ -# `@actions/io` - -> Core functions for cli filesystem scenarios - -## Usage - -``` -/** - * Copies a file or folder. - * - * @param source source path - * @param dest destination path - * @param options optional. See CopyOptions. - */ -export function cp(source: string, dest: string, options?: CopyOptions): Promise - -/** - * Remove a path recursively with force - * - * @param path path to remove - */ -export function rmRF(path: string): Promise - -/** - * Make a directory. Creates the full path with folders in between - * - * @param p path to create - * @returns Promise - */ -export function mkdirP(p: string): Promise - -/** - * Moves a path. - * - * @param source source path - * @param dest destination path - * @param options optional. See CopyOptions. - */ -export function mv(source: string, dest: string, options?: CopyOptions): Promise - -/** - * Returns path of a tool had the tool actually been invoked. Resolves via paths. - * - * @param tool name of the tool - * @param options optional. See WhichOptions. - * @returns Promise path to tool - */ -export function which(tool: string, options?: WhichOptions): Promise +# `@actions/io` + +> Core functions for cli filesystem scenarios + +## Usage + +``` +/** + * Copies a file or folder. + * + * @param source source path + * @param dest destination path + * @param options optional. See CopyOptions. + */ +export function cp(source: string, dest: string, options?: CopyOptions): Promise + +/** + * Remove a path recursively with force + * + * @param path path to remove + */ +export function rmRF(path: string): Promise + +/** + * Make a directory. Creates the full path with folders in between + * + * @param p path to create + * @returns Promise + */ +export function mkdirP(p: string): Promise + +/** + * Moves a path. + * + * @param source source path + * @param dest destination path + * @param options optional. See CopyOptions. + */ +export function mv(source: string, dest: string, options?: CopyOptions): Promise + +/** + * Returns path of a tool had the tool actually been invoked. Resolves via paths. + * + * @param tool name of the tool + * @param options optional. See WhichOptions. + * @returns Promise path to tool + */ +export function which(tool: string, options?: WhichOptions): Promise ``` \ No newline at end of file diff --git a/node_modules/@actions/io/lib/io-util.d.ts b/node_modules/@actions/io/lib/io-util.d.ts index 73086d4b..0bd51f6e 100644 --- a/node_modules/@actions/io/lib/io-util.d.ts +++ b/node_modules/@actions/io/lib/io-util.d.ts @@ -1,29 +1,29 @@ -/// -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 IS_WINDOWS: boolean; -export declare function exists(fsPath: string): Promise; -export declare function isDirectory(fsPath: string, useStat?: boolean): Promise; -/** - * 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). - */ -export declare function isRooted(p: string): boolean; -/** - * Recursively create a directory at `fsPath`. - * - * This implementation is optimistic, meaning it attempts to create the full - * path first, and backs up the path stack from there. - * - * @param fsPath The path to create - * @param maxDepth The maximum recursion depth - * @param depth The current recursion depth - */ -export declare function mkdirP(fsPath: string, maxDepth?: number, depth?: number): Promise; -/** - * Best effort attempt to determine whether a file exists and is executable. - * @param filePath file path to check - * @param extensions additional file extensions to try - * @return if file exists and is executable, returns the file path. otherwise empty string. - */ -export declare function tryGetExecutablePath(filePath: string, extensions: string[]): Promise; +/// +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 IS_WINDOWS: boolean; +export declare function exists(fsPath: string): Promise; +export declare function isDirectory(fsPath: string, useStat?: boolean): Promise; +/** + * 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). + */ +export declare function isRooted(p: string): boolean; +/** + * Recursively create a directory at `fsPath`. + * + * This implementation is optimistic, meaning it attempts to create the full + * path first, and backs up the path stack from there. + * + * @param fsPath The path to create + * @param maxDepth The maximum recursion depth + * @param depth The current recursion depth + */ +export declare function mkdirP(fsPath: string, maxDepth?: number, depth?: number): Promise; +/** + * Best effort attempt to determine whether a file exists and is executable. + * @param filePath file path to check + * @param extensions additional file extensions to try + * @return if file exists and is executable, returns the file path. otherwise empty string. + */ +export declare function tryGetExecutablePath(filePath: string, extensions: string[]): Promise; diff --git a/node_modules/@actions/io/lib/io-util.js b/node_modules/@actions/io/lib/io-util.js index d686c5a4..fad16232 100644 --- a/node_modules/@actions/io/lib/io-util.js +++ b/node_modules/@actions/io/lib/io-util.js @@ -1,194 +1,194 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - 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 step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var _a; -Object.defineProperty(exports, "__esModule", { value: true }); -const assert_1 = require("assert"); -const fs = require("fs"); -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; -exports.IS_WINDOWS = process.platform === 'win32'; -function exists(fsPath) { - return __awaiter(this, void 0, void 0, function* () { - try { - yield exports.stat(fsPath); - } - catch (err) { - if (err.code === 'ENOENT') { - return false; - } - throw err; - } - return true; - }); -} -exports.exists = exists; -function isDirectory(fsPath, useStat = false) { - return __awaiter(this, void 0, void 0, function* () { - const stats = useStat ? yield exports.stat(fsPath) : yield exports.lstat(fsPath); - return stats.isDirectory(); - }); -} -exports.isDirectory = isDirectory; -/** - * 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). - */ -function isRooted(p) { - p = normalizeSeparators(p); - if (!p) { - throw new Error('isRooted() parameter "p" cannot be empty'); - } - if (exports.IS_WINDOWS) { - return (p.startsWith('\\') || /^[A-Z]:/i.test(p) // e.g. \ or \hello or \\hello - ); // e.g. C: or C:\hello - } - return p.startsWith('/'); -} -exports.isRooted = isRooted; -/** - * Recursively create a directory at `fsPath`. - * - * This implementation is optimistic, meaning it attempts to create the full - * path first, and backs up the path stack from there. - * - * @param fsPath The path to create - * @param maxDepth The maximum recursion depth - * @param depth The current recursion depth - */ -function mkdirP(fsPath, maxDepth = 1000, depth = 1) { - return __awaiter(this, void 0, void 0, function* () { - assert_1.ok(fsPath, 'a path argument must be provided'); - fsPath = path.resolve(fsPath); - if (depth >= maxDepth) - return exports.mkdir(fsPath); - try { - yield exports.mkdir(fsPath); - return; - } - catch (err) { - switch (err.code) { - case 'ENOENT': { - yield mkdirP(path.dirname(fsPath), maxDepth, depth + 1); - yield exports.mkdir(fsPath); - return; - } - default: { - let stats; - try { - stats = yield exports.stat(fsPath); - } - catch (err2) { - throw err; - } - if (!stats.isDirectory()) - throw err; - } - } - } - }); -} -exports.mkdirP = mkdirP; -/** - * Best effort attempt to determine whether a file exists and is executable. - * @param filePath file path to check - * @param extensions additional file extensions to try - * @return if file exists and is executable, returns the file path. otherwise empty string. - */ -function tryGetExecutablePath(filePath, extensions) { - return __awaiter(this, void 0, void 0, function* () { - let stats = undefined; - try { - // test file exists - stats = yield exports.stat(filePath); - } - catch (err) { - if (err.code !== 'ENOENT') { - // eslint-disable-next-line no-console - console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); - } - } - if (stats && stats.isFile()) { - if (exports.IS_WINDOWS) { - // on Windows, test for valid extension - const upperExt = path.extname(filePath).toUpperCase(); - if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) { - return filePath; - } - } - else { - if (isUnixExecutable(stats)) { - return filePath; - } - } - } - // try each extension - const originalFilePath = filePath; - for (const extension of extensions) { - filePath = originalFilePath + extension; - stats = undefined; - try { - stats = yield exports.stat(filePath); - } - catch (err) { - if (err.code !== 'ENOENT') { - // eslint-disable-next-line no-console - console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); - } - } - if (stats && stats.isFile()) { - if (exports.IS_WINDOWS) { - // preserve the case of the actual file (since an extension was appended) - try { - const directory = path.dirname(filePath); - const upperName = path.basename(filePath).toUpperCase(); - for (const actualName of yield exports.readdir(directory)) { - if (upperName === actualName.toUpperCase()) { - filePath = path.join(directory, actualName); - break; - } - } - } - catch (err) { - // eslint-disable-next-line no-console - console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`); - } - return filePath; - } - else { - if (isUnixExecutable(stats)) { - return filePath; - } - } - } - } - return ''; - }); -} -exports.tryGetExecutablePath = tryGetExecutablePath; -function normalizeSeparators(p) { - p = p || ''; - if (exports.IS_WINDOWS) { - // convert slashes on Windows - p = p.replace(/\//g, '\\'); - // remove redundant slashes - return p.replace(/\\\\+/g, '\\'); - } - // remove redundant slashes - return p.replace(/\/\/+/g, '/'); -} -// on Mac/Linux, test the execute bit -// R W X R W X R W X -// 256 128 64 32 16 8 4 2 1 -function isUnixExecutable(stats) { - return ((stats.mode & 1) > 0 || - ((stats.mode & 8) > 0 && stats.gid === process.getgid()) || - ((stats.mode & 64) > 0 && stats.uid === process.getuid())); -} +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + 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 step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +const assert_1 = require("assert"); +const fs = require("fs"); +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; +exports.IS_WINDOWS = process.platform === 'win32'; +function exists(fsPath) { + return __awaiter(this, void 0, void 0, function* () { + try { + yield exports.stat(fsPath); + } + catch (err) { + if (err.code === 'ENOENT') { + return false; + } + throw err; + } + return true; + }); +} +exports.exists = exists; +function isDirectory(fsPath, useStat = false) { + return __awaiter(this, void 0, void 0, function* () { + const stats = useStat ? yield exports.stat(fsPath) : yield exports.lstat(fsPath); + return stats.isDirectory(); + }); +} +exports.isDirectory = isDirectory; +/** + * 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). + */ +function isRooted(p) { + p = normalizeSeparators(p); + if (!p) { + throw new Error('isRooted() parameter "p" cannot be empty'); + } + if (exports.IS_WINDOWS) { + return (p.startsWith('\\') || /^[A-Z]:/i.test(p) // e.g. \ or \hello or \\hello + ); // e.g. C: or C:\hello + } + return p.startsWith('/'); +} +exports.isRooted = isRooted; +/** + * Recursively create a directory at `fsPath`. + * + * This implementation is optimistic, meaning it attempts to create the full + * path first, and backs up the path stack from there. + * + * @param fsPath The path to create + * @param maxDepth The maximum recursion depth + * @param depth The current recursion depth + */ +function mkdirP(fsPath, maxDepth = 1000, depth = 1) { + return __awaiter(this, void 0, void 0, function* () { + assert_1.ok(fsPath, 'a path argument must be provided'); + fsPath = path.resolve(fsPath); + if (depth >= maxDepth) + return exports.mkdir(fsPath); + try { + yield exports.mkdir(fsPath); + return; + } + catch (err) { + switch (err.code) { + case 'ENOENT': { + yield mkdirP(path.dirname(fsPath), maxDepth, depth + 1); + yield exports.mkdir(fsPath); + return; + } + default: { + let stats; + try { + stats = yield exports.stat(fsPath); + } + catch (err2) { + throw err; + } + if (!stats.isDirectory()) + throw err; + } + } + } + }); +} +exports.mkdirP = mkdirP; +/** + * Best effort attempt to determine whether a file exists and is executable. + * @param filePath file path to check + * @param extensions additional file extensions to try + * @return if file exists and is executable, returns the file path. otherwise empty string. + */ +function tryGetExecutablePath(filePath, extensions) { + return __awaiter(this, void 0, void 0, function* () { + let stats = undefined; + try { + // test file exists + stats = yield exports.stat(filePath); + } + catch (err) { + if (err.code !== 'ENOENT') { + // eslint-disable-next-line no-console + console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); + } + } + if (stats && stats.isFile()) { + if (exports.IS_WINDOWS) { + // on Windows, test for valid extension + const upperExt = path.extname(filePath).toUpperCase(); + if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) { + return filePath; + } + } + else { + if (isUnixExecutable(stats)) { + return filePath; + } + } + } + // try each extension + const originalFilePath = filePath; + for (const extension of extensions) { + filePath = originalFilePath + extension; + stats = undefined; + try { + stats = yield exports.stat(filePath); + } + catch (err) { + if (err.code !== 'ENOENT') { + // eslint-disable-next-line no-console + console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); + } + } + if (stats && stats.isFile()) { + if (exports.IS_WINDOWS) { + // preserve the case of the actual file (since an extension was appended) + try { + const directory = path.dirname(filePath); + const upperName = path.basename(filePath).toUpperCase(); + for (const actualName of yield exports.readdir(directory)) { + if (upperName === actualName.toUpperCase()) { + filePath = path.join(directory, actualName); + break; + } + } + } + catch (err) { + // eslint-disable-next-line no-console + console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`); + } + return filePath; + } + else { + if (isUnixExecutable(stats)) { + return filePath; + } + } + } + } + return ''; + }); +} +exports.tryGetExecutablePath = tryGetExecutablePath; +function normalizeSeparators(p) { + p = p || ''; + if (exports.IS_WINDOWS) { + // convert slashes on Windows + p = p.replace(/\//g, '\\'); + // remove redundant slashes + return p.replace(/\\\\+/g, '\\'); + } + // remove redundant slashes + return p.replace(/\/\/+/g, '/'); +} +// on Mac/Linux, test the execute bit +// R W X R W X R W X +// 256 128 64 32 16 8 4 2 1 +function isUnixExecutable(stats) { + return ((stats.mode & 1) > 0 || + ((stats.mode & 8) > 0 && stats.gid === process.getgid()) || + ((stats.mode & 64) > 0 && stats.uid === process.getuid())); +} //# sourceMappingURL=io-util.js.map \ No newline at end of file diff --git a/node_modules/@actions/io/lib/io.d.ts b/node_modules/@actions/io/lib/io.d.ts index 0116f6e9..f591cf52 100644 --- a/node_modules/@actions/io/lib/io.d.ts +++ b/node_modules/@actions/io/lib/io.d.ts @@ -1,48 +1,48 @@ -/** - * Interface for cp/mv options - */ -export interface CopyOptions { - /** Optional. Whether to recursively copy all subdirectories. Defaults to false */ - recursive?: boolean; - /** Optional. Whether to overwrite existing files in the destination. Defaults to true */ - force?: boolean; -} -/** - * Copies a file or folder. - * - * @param source source path - * @param dest destination path - * @param options optional. See CopyOptions. - */ -export declare function cp(source: string, dest: string, options?: CopyOptions): Promise; -/** - * Moves a path. - * - * @param source source path - * @param dest destination path - * @param options optional. See CopyOptions. - */ -export declare function mv(source: string, dest: string, options?: CopyOptions): Promise; -/** - * Remove a path recursively with force - * - * @param inputPath path to remove - */ -export declare function rmRF(inputPath: string): Promise; -/** - * Make a directory. Creates the full path with folders in between - * Will throw if it fails - * - * @param fsPath path to create - * @returns Promise - */ -export declare function mkdirP(fsPath: string): Promise; -/** - * 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 path to tool - */ -export declare function which(tool: string, check?: boolean): Promise; +/** + * Interface for cp/mv options + */ +export interface CopyOptions { + /** Optional. Whether to recursively copy all subdirectories. Defaults to false */ + recursive?: boolean; + /** Optional. Whether to overwrite existing files in the destination. Defaults to true */ + force?: boolean; +} +/** + * Copies a file or folder. + * + * @param source source path + * @param dest destination path + * @param options optional. See CopyOptions. + */ +export declare function cp(source: string, dest: string, options?: CopyOptions): Promise; +/** + * Moves a path. + * + * @param source source path + * @param dest destination path + * @param options optional. See CopyOptions. + */ +export declare function mv(source: string, dest: string, options?: CopyOptions): Promise; +/** + * Remove a path recursively with force + * + * @param inputPath path to remove + */ +export declare function rmRF(inputPath: string): Promise; +/** + * Make a directory. Creates the full path with folders in between + * Will throw if it fails + * + * @param fsPath path to create + * @returns Promise + */ +export declare function mkdirP(fsPath: string): Promise; +/** + * 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 path to tool + */ +export declare function which(tool: string, check?: boolean): Promise; diff --git a/node_modules/@actions/io/lib/io.js b/node_modules/@actions/io/lib/io.js index 4ce2d243..678e0e47 100644 --- a/node_modules/@actions/io/lib/io.js +++ b/node_modules/@actions/io/lib/io.js @@ -1,262 +1,262 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - 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 step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const childProcess = require("child_process"); -const fs = require("fs"); -const path = require("path"); -const util_1 = require("util"); -const ioUtil = require("./io-util"); -const exec = util_1.promisify(childProcess.exec); -/** - * Copies a file or folder. - * - * @param source source path - * @param dest destination path - * @param options optional. See CopyOptions. - */ -function cp(source, dest, options = {}) { - return __awaiter(this, void 0, void 0, function* () { - yield move(source, dest, options, { deleteOriginal: false }); - }); -} -exports.cp = cp; -/** - * Moves a path. - * - * @param source source path - * @param dest destination path - * @param options optional. See CopyOptions. - */ -function mv(source, dest, options = {}) { - return __awaiter(this, void 0, void 0, function* () { - yield move(source, dest, options, { deleteOriginal: true }); - }); -} -exports.mv = mv; -/** - * Remove a path recursively with force - * - * @param inputPath path to remove - */ -function rmRF(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 { - if (yield ioUtil.isDirectory(inputPath, true)) { - yield exec(`rd /s /q "${inputPath}"`); - } - else { - yield exec(`del /f /a "${inputPath}"`); - } - } - catch (err) { - // if you try to delete a file that doesn't exist, desired result is achieved - // other errors are valid - if (err.code !== 'ENOENT') - throw err; - } - // Shelling out fails to remove a symlink folder with missing source, this unlink catches that - try { - yield ioUtil.unlink(inputPath); - } - catch (err) { - // if you try to delete a file that doesn't exist, desired result is achieved - // other errors are valid - if (err.code !== 'ENOENT') - throw err; - } - } - else { - let isDir = false; - try { - isDir = yield ioUtil.isDirectory(inputPath); - } - catch (err) { - // if you try to delete a file that doesn't exist, desired result is achieved - // other errors are valid - if (err.code !== 'ENOENT') - throw err; - return; - } - if (isDir) { - yield exec(`rm -rf "${inputPath}"`); - } - else { - yield ioUtil.unlink(inputPath); - } - } - }); -} -exports.rmRF = rmRF; -/** - * Make a directory. Creates the full path with folders in between - * Will throw if it fails - * - * @param fsPath path to create - * @returns Promise - */ -function mkdirP(fsPath) { - return __awaiter(this, void 0, void 0, function* () { - yield ioUtil.mkdirP(fsPath); - }); -} -exports.mkdirP = mkdirP; -/** - * 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 path to tool - */ -function which(tool, check) { - return __awaiter(this, void 0, void 0, function* () { - if (!tool) { - throw new Error("parameter 'tool' is required"); - } - // recursive when check=true - if (check) { - const result = yield which(tool, false); - if (!result) { - if (ioUtil.IS_WINDOWS) { - 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.`); - } - 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.`); - } - } - } - try { - // 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)) { - if (extension) { - extensions.push(extension); - } - } - } - // if it's rooted, return it if exists. otherwise return empty. - if (ioUtil.isRooted(tool)) { - const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions); - if (filePath) { - return filePath; - } - return ''; - } - // if any path separators, return empty - if (tool.includes('/') || (ioUtil.IS_WINDOWS && tool.includes('\\'))) { - return ''; - } - // build the list of directories - // - // Note, technically "where" checks the current directory on Windows. From a task lib perspective, - // it feels like we should not do this. Checking the current directory seems like more of a use - // case of a shell, and the which() function exposed by the task lib should strive for consistency - // across platforms. - const directories = []; - if (process.env.PATH) { - for (const p of process.env.PATH.split(path.delimiter)) { - if (p) { - directories.push(p); - } - } - } - // return the first match - for (const directory of directories) { - const filePath = yield ioUtil.tryGetExecutablePath(directory + path.sep + tool, extensions); - if (filePath) { - return filePath; - } - } - return ''; - } - catch (err) { - throw new Error(`which failed with message ${err.message}`); - } - }); -} -exports.which = which; -// Copies contents of source into dest, making any necessary folders along the way. -// 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 (yield ioUtil.exists(dest)) { - if (!(yield ioUtil.isDirectory(dest))) { - throw new Error(`${dest} is not a directory`); - } - } - else { - yield mkdirP(dest); - } - // Copy all child files, and directories recursively - const sourceChildren = yield ioUtil.readdir(source); - for (const newSource of sourceChildren) { - const newDest = path.join(dest, path.basename(newSource)); - yield copyDirectoryContents(path.resolve(source, newSource), newDest, force, deleteOriginal); - } - if (deleteOriginal) { - yield ioUtil.rmdir(source); - } - } - else { - if (force) { - yield ioUtil.copyFile(source, dest); - } - else { - yield ioUtil.copyFile(source, dest, fs.constants.COPYFILE_EXCL); - } - if (deleteOriginal) { - yield ioUtil.unlink(source); - } - } - }); -} -function move(source, dest, options = {}, moveOptions) { - return __awaiter(this, void 0, void 0, function* () { - const { force, recursive } = readCopyOptions(options); - if (yield ioUtil.isDirectory(source)) { - if (!recursive) { - 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)) { - if (!(yield ioUtil.isDirectory(dest))) { - throw new Error(`${dest} is not a directory`); - } - dest = path.join(dest, path.basename(source)); - } - yield copyDirectoryContents(source, dest, force, moveOptions.deleteOriginal); - } - else { - if ((yield ioUtil.exists(dest)) && (yield ioUtil.isDirectory(dest))) { - dest = path.join(dest, path.basename(source)); - } - if (force) { - yield ioUtil.copyFile(source, dest); - } - else { - yield ioUtil.copyFile(source, dest, fs.constants.COPYFILE_EXCL); - } - if (moveOptions.deleteOriginal) { - yield ioUtil.unlink(source); - } - } - }); -} -function readCopyOptions(options) { - const force = options.force == null ? true : options.force; - const recursive = Boolean(options.recursive); - return { force, recursive }; -} +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + 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 step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const childProcess = require("child_process"); +const fs = require("fs"); +const path = require("path"); +const util_1 = require("util"); +const ioUtil = require("./io-util"); +const exec = util_1.promisify(childProcess.exec); +/** + * Copies a file or folder. + * + * @param source source path + * @param dest destination path + * @param options optional. See CopyOptions. + */ +function cp(source, dest, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + yield move(source, dest, options, { deleteOriginal: false }); + }); +} +exports.cp = cp; +/** + * Moves a path. + * + * @param source source path + * @param dest destination path + * @param options optional. See CopyOptions. + */ +function mv(source, dest, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + yield move(source, dest, options, { deleteOriginal: true }); + }); +} +exports.mv = mv; +/** + * Remove a path recursively with force + * + * @param inputPath path to remove + */ +function rmRF(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 { + if (yield ioUtil.isDirectory(inputPath, true)) { + yield exec(`rd /s /q "${inputPath}"`); + } + else { + yield exec(`del /f /a "${inputPath}"`); + } + } + catch (err) { + // if you try to delete a file that doesn't exist, desired result is achieved + // other errors are valid + if (err.code !== 'ENOENT') + throw err; + } + // Shelling out fails to remove a symlink folder with missing source, this unlink catches that + try { + yield ioUtil.unlink(inputPath); + } + catch (err) { + // if you try to delete a file that doesn't exist, desired result is achieved + // other errors are valid + if (err.code !== 'ENOENT') + throw err; + } + } + else { + let isDir = false; + try { + isDir = yield ioUtil.isDirectory(inputPath); + } + catch (err) { + // if you try to delete a file that doesn't exist, desired result is achieved + // other errors are valid + if (err.code !== 'ENOENT') + throw err; + return; + } + if (isDir) { + yield exec(`rm -rf "${inputPath}"`); + } + else { + yield ioUtil.unlink(inputPath); + } + } + }); +} +exports.rmRF = rmRF; +/** + * Make a directory. Creates the full path with folders in between + * Will throw if it fails + * + * @param fsPath path to create + * @returns Promise + */ +function mkdirP(fsPath) { + return __awaiter(this, void 0, void 0, function* () { + yield ioUtil.mkdirP(fsPath); + }); +} +exports.mkdirP = mkdirP; +/** + * 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 path to tool + */ +function which(tool, check) { + return __awaiter(this, void 0, void 0, function* () { + if (!tool) { + throw new Error("parameter 'tool' is required"); + } + // recursive when check=true + if (check) { + const result = yield which(tool, false); + if (!result) { + if (ioUtil.IS_WINDOWS) { + 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.`); + } + 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.`); + } + } + } + try { + // 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)) { + if (extension) { + extensions.push(extension); + } + } + } + // if it's rooted, return it if exists. otherwise return empty. + if (ioUtil.isRooted(tool)) { + const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions); + if (filePath) { + return filePath; + } + return ''; + } + // if any path separators, return empty + if (tool.includes('/') || (ioUtil.IS_WINDOWS && tool.includes('\\'))) { + return ''; + } + // build the list of directories + // + // Note, technically "where" checks the current directory on Windows. From a task lib perspective, + // it feels like we should not do this. Checking the current directory seems like more of a use + // case of a shell, and the which() function exposed by the task lib should strive for consistency + // across platforms. + const directories = []; + if (process.env.PATH) { + for (const p of process.env.PATH.split(path.delimiter)) { + if (p) { + directories.push(p); + } + } + } + // return the first match + for (const directory of directories) { + const filePath = yield ioUtil.tryGetExecutablePath(directory + path.sep + tool, extensions); + if (filePath) { + return filePath; + } + } + return ''; + } + catch (err) { + throw new Error(`which failed with message ${err.message}`); + } + }); +} +exports.which = which; +// Copies contents of source into dest, making any necessary folders along the way. +// 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 (yield ioUtil.exists(dest)) { + if (!(yield ioUtil.isDirectory(dest))) { + throw new Error(`${dest} is not a directory`); + } + } + else { + yield mkdirP(dest); + } + // Copy all child files, and directories recursively + const sourceChildren = yield ioUtil.readdir(source); + for (const newSource of sourceChildren) { + const newDest = path.join(dest, path.basename(newSource)); + yield copyDirectoryContents(path.resolve(source, newSource), newDest, force, deleteOriginal); + } + if (deleteOriginal) { + yield ioUtil.rmdir(source); + } + } + else { + if (force) { + yield ioUtil.copyFile(source, dest); + } + else { + yield ioUtil.copyFile(source, dest, fs.constants.COPYFILE_EXCL); + } + if (deleteOriginal) { + yield ioUtil.unlink(source); + } + } + }); +} +function move(source, dest, options = {}, moveOptions) { + return __awaiter(this, void 0, void 0, function* () { + const { force, recursive } = readCopyOptions(options); + if (yield ioUtil.isDirectory(source)) { + if (!recursive) { + 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)) { + if (!(yield ioUtil.isDirectory(dest))) { + throw new Error(`${dest} is not a directory`); + } + dest = path.join(dest, path.basename(source)); + } + yield copyDirectoryContents(source, dest, force, moveOptions.deleteOriginal); + } + else { + if ((yield ioUtil.exists(dest)) && (yield ioUtil.isDirectory(dest))) { + dest = path.join(dest, path.basename(source)); + } + if (force) { + yield ioUtil.copyFile(source, dest); + } + else { + yield ioUtil.copyFile(source, dest, fs.constants.COPYFILE_EXCL); + } + if (moveOptions.deleteOriginal) { + yield ioUtil.unlink(source); + } + } + }); +} +function readCopyOptions(options) { + const force = options.force == null ? true : options.force; + const recursive = Boolean(options.recursive); + return { force, recursive }; +} //# sourceMappingURL=io.js.map \ No newline at end of file diff --git a/node_modules/@actions/tool-cache/README.md b/node_modules/@actions/tool-cache/README.md index 97372063..56c53530 100644 --- a/node_modules/@actions/tool-cache/README.md +++ b/node_modules/@actions/tool-cache/README.md @@ -1,7 +1,82 @@ -# `@actions/tool-cache` - -> Functions necessary for downloading and caching tools. - -## Usage - -See [src/tool-cache.ts](src/tool-cache.ts). \ No newline at end of file +# `@actions/tool-cache` + +> Functions necessary for downloading and caching tools. + +## Usage + +#### 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}`); +``` diff --git a/node_modules/@actions/tool-cache/lib/tool-cache.d.ts b/node_modules/@actions/tool-cache/lib/tool-cache.d.ts index 2f66b063..877eb333 100644 --- a/node_modules/@actions/tool-cache/lib/tool-cache.d.ts +++ b/node_modules/@actions/tool-cache/lib/tool-cache.d.ts @@ -1,78 +1,78 @@ -export declare class HTTPError extends Error { - readonly httpStatusCode: number | undefined; - constructor(httpStatusCode: number | undefined); -} -/** - * Download a tool from an url and stream it into a file - * - * @param url url of tool to download - * @returns path to downloaded tool - */ -export declare function downloadTool(url: string): Promise; -/** - * Extract a .7z file - * - * @param file path to the .7z file - * @param dest destination directory. Optional. - * @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 - * 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 - * 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. - * 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. - * @returns path to the destination directory - */ -export declare function extract7z(file: string, dest?: string, _7zPath?: string): Promise; -/** - * Extract a tar - * - * @param file path to the tar - * @param dest destination directory. Optional. - * @returns path to the destination directory - */ -export declare function extractTar(file: string, dest?: string): Promise; -/** - * Extract a zip - * - * @param file path to the zip - * @param dest destination directory. Optional. - * @returns path to the destination directory - */ -export declare function extractZip(file: string, dest?: string): Promise; -/** - * Caches a directory and installs it into the tool cacheDir - * - * @param sourceDir the directory to cache into tools - * @param tool tool name - * @param version version of the tool. semver format - * @param arch architecture of the tool. Optional. Defaults to machine architecture - */ -export declare function cacheDir(sourceDir: string, tool: string, version: string, arch?: string): Promise; -/** - * Caches a downloaded file (GUID) and installs it - * 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 targetFile the name of the file name in the tools directory - * @param tool tool name - * @param version version of the tool. semver format - * @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; -/** - * Finds the path to a tool version in the local installed tool cache - * - * @param toolName name of the tool - * @param versionSpec version of the tool - * @param arch optional arch. defaults to arch of computer - */ -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 - * - * @param toolName name of the tool - * @param arch optional arch. defaults to arch of computer - */ -export declare function findAllVersions(toolName: string, arch?: string): string[]; +export declare class HTTPError extends Error { + readonly httpStatusCode: number | undefined; + constructor(httpStatusCode: number | undefined); +} +/** + * Download a tool from an url and stream it into a file + * + * @param url url of tool to download + * @returns path to downloaded tool + */ +export declare function downloadTool(url: string): Promise; +/** + * Extract a .7z file + * + * @param file path to the .7z file + * @param dest destination directory. Optional. + * @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 + * 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 + * 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. + * 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. + * @returns path to the destination directory + */ +export declare function extract7z(file: string, dest?: string, _7zPath?: string): Promise; +/** + * Extract a tar + * + * @param file path to the tar + * @param dest destination directory. Optional. + * @returns path to the destination directory + */ +export declare function extractTar(file: string, dest?: string): Promise; +/** + * Extract a zip + * + * @param file path to the zip + * @param dest destination directory. Optional. + * @returns path to the destination directory + */ +export declare function extractZip(file: string, dest?: string): Promise; +/** + * Caches a directory and installs it into the tool cacheDir + * + * @param sourceDir the directory to cache into tools + * @param tool tool name + * @param version version of the tool. semver format + * @param arch architecture of the tool. Optional. Defaults to machine architecture + */ +export declare function cacheDir(sourceDir: string, tool: string, version: string, arch?: string): Promise; +/** + * Caches a downloaded file (GUID) and installs it + * 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 targetFile the name of the file name in the tools directory + * @param tool tool name + * @param version version of the tool. semver format + * @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; +/** + * Finds the path to a tool version in the local installed tool cache + * + * @param toolName name of the tool + * @param versionSpec version of the tool + * @param arch optional arch. defaults to arch of computer + */ +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 + * + * @param toolName name of the tool + * @param arch optional arch. defaults to arch of computer + */ +export declare function findAllVersions(toolName: string, arch?: string): string[]; diff --git a/node_modules/@actions/tool-cache/lib/tool-cache.js b/node_modules/@actions/tool-cache/lib/tool-cache.js index b2dc2e4c..3c121652 100644 --- a/node_modules/@actions/tool-cache/lib/tool-cache.js +++ b/node_modules/@actions/tool-cache/lib/tool-cache.js @@ -1,437 +1,436 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - 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 step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const core = require("@actions/core"); -const io = require("@actions/io"); -const fs = require("fs"); -const os = require("os"); -const path = require("path"); -const httpm = require("typed-rest-client/HttpClient"); -const semver = require("semver"); -const shell = require("shelljs"); -const uuidV4 = require("uuid/v4"); -const exec_1 = require("@actions/exec/lib/exec"); -const assert_1 = require("assert"); -class HTTPError extends Error { - constructor(httpStatusCode) { - super(`Unexpected HTTP response: ${httpStatusCode}`); - this.httpStatusCode = httpStatusCode; - Object.setPrototypeOf(this, new.target.prototype); - } -} -exports.HTTPError = HTTPError; -const IS_WINDOWS = process.platform === 'win32'; -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) -let tempDirectory = process.env['RUNNER_TEMP'] || ''; -let cacheRoot = process.env['RUNNER_TOOL_CACHE'] || ''; -// If directories not found, place them in common temp locations -if (!tempDirectory || !cacheRoot) { - let baseLocation; - if (IS_WINDOWS) { - // On windows use the USERPROFILE env variable - baseLocation = process.env['USERPROFILE'] || 'C:\\'; - } - else { - if (process.platform === 'darwin') { - baseLocation = '/Users'; - } - else { - baseLocation = '/home'; - } - } - if (!tempDirectory) { - tempDirectory = path.join(baseLocation, 'actions', 'temp'); - } - if (!cacheRoot) { - cacheRoot = path.join(baseLocation, 'actions', 'cache'); - } -} -/** - * Download a tool from an url and stream it into a file - * - * @param url url of tool to download - * @returns path to downloaded tool - */ -function downloadTool(url) { - return __awaiter(this, void 0, void 0, function* () { - // 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* () { - try { - const http = new httpm.HttpClient(userAgent, [], { - allowRetries: true, - maxRetries: 3 - }); - const destPath = path.join(tempDirectory, uuidV4()); - yield io.mkdirP(tempDirectory); - core.debug(`Downloading ${url}`); - core.debug(`Downloading ${destPath}`); - if (fs.existsSync(destPath)) { - throw new Error(`Destination file path ${destPath} already exists`); - } - const response = yield http.get(url); - if (response.message.statusCode !== 200) { - const err = new HTTPError(response.message.statusCode); - core.debug(`Failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`); - throw err; - } - const file = fs.createWriteStream(destPath); - file.on('open', () => __awaiter(this, void 0, void 0, function* () { - try { - const stream = response.message.pipe(file); - stream.on('close', () => { - core.debug('download complete'); - resolve(destPath); - }); - } - catch (err) { - core.debug(`Failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`); - reject(err); - } - })); - file.on('error', err => { - file.end(); - reject(err); - }); - } - catch (err) { - reject(err); - } - })); - }); -} -exports.downloadTool = downloadTool; -/** - * Extract a .7z file - * - * @param file path to the .7z file - * @param dest destination directory. Optional. - * @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 - * 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 - * 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. - * 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. - * @returns path to the destination directory - */ -function extract7z(file, dest, _7zPath) { - return __awaiter(this, void 0, void 0, function* () { - assert_1.ok(IS_WINDOWS, 'extract7z() not supported on current OS'); - assert_1.ok(file, 'parameter "file" is required'); - dest = dest || (yield _createExtractFolder(dest)); - const originalCwd = process.cwd(); - process.chdir(dest); - if (_7zPath) { - try { - const args = [ - 'x', - '-bb1', - '-bd', - '-sccUTF-8', - file - ]; - const options = { - silent: true - }; - yield exec_1.exec(`"${_7zPath}"`, args, options); - } - finally { - process.chdir(originalCwd); - } - } - else { - const escapedScript = path - .join(__dirname, '..', 'scripts', 'Invoke-7zdec.ps1') - .replace(/'/g, "''") - .replace(/"|\n|\r/g, ''); // double-up single quotes, remove double quotes and newlines - const escapedFile = file.replace(/'/g, "''").replace(/"|\n|\r/g, ''); - const escapedTarget = dest.replace(/'/g, "''").replace(/"|\n|\r/g, ''); - const command = `& '${escapedScript}' -Source '${escapedFile}' -Target '${escapedTarget}'`; - const args = [ - '-NoLogo', - '-Sta', - '-NoProfile', - '-NonInteractive', - '-ExecutionPolicy', - 'Unrestricted', - '-Command', - command - ]; - const options = { - silent: true - }; - try { - const powershellPath = yield io.which('powershell', true); - yield exec_1.exec(`"${powershellPath}"`, args, options); - } - finally { - process.chdir(originalCwd); - } - } - return dest; - }); -} -exports.extract7z = extract7z; -/** - * Extract a tar - * - * @param file path to the tar - * @param dest destination directory. Optional. - * @returns path to the destination directory - */ -function extractTar(file, dest) { - return __awaiter(this, void 0, void 0, function* () { - if (!file) { - throw new Error("parameter 'file' is required"); - } - dest = dest || (yield _createExtractFolder(dest)); - const tarPath = yield io.which('tar', true); - yield exec_1.exec(`"${tarPath}"`, ['xzC', dest, '-f', file]); - return dest; - }); -} -exports.extractTar = extractTar; -/** - * Extract a zip - * - * @param file path to the zip - * @param dest destination directory. Optional. - * @returns path to the destination directory - */ -function extractZip(file, dest) { - return __awaiter(this, void 0, void 0, function* () { - if (!file) { - throw new Error("parameter 'file' is required"); - } - dest = dest || (yield _createExtractFolder(dest)); - if (IS_WINDOWS) { - yield extractZipWin(file, dest); - } - else { - yield extractZipNix(file, dest); - } - return dest; - }); -} -exports.extractZip = extractZip; -function extractZipWin(file, dest) { - return __awaiter(this, void 0, void 0, function* () { - // build the powershell command - 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 command = `$ErrorActionPreference = 'Stop' ; try { Add-Type -AssemblyName System.IO.Compression.FileSystem } catch { } ; [System.IO.Compression.ZipFile]::ExtractToDirectory('${escapedFile}', '${escapedDest}')`; - // run powershell - const powershellPath = yield io.which('powershell'); - const args = [ - '-NoLogo', - '-Sta', - '-NoProfile', - '-NonInteractive', - '-ExecutionPolicy', - 'Unrestricted', - '-Command', - command - ]; - yield exec_1.exec(`"${powershellPath}"`, args); - }); -} -function extractZipNix(file, dest) { - return __awaiter(this, void 0, void 0, function* () { - const unzipPath = path.join(__dirname, '..', 'scripts', 'externals', 'unzip'); - yield exec_1.exec(`"${unzipPath}"`, [file], { cwd: dest }); - }); -} -/** - * Caches a directory and installs it into the tool cacheDir - * - * @param sourceDir the directory to cache into tools - * @param tool tool name - * @param version version of the tool. semver format - * @param arch architecture of the tool. Optional. Defaults to machine architecture - */ -function cacheDir(sourceDir, tool, version, arch) { - return __awaiter(this, void 0, void 0, function* () { - version = semver.clean(version) || version; - arch = arch || os.arch(); - core.debug(`Caching tool ${tool} ${version} ${arch}`); - core.debug(`source dir: ${sourceDir}`); - if (!fs.statSync(sourceDir).isDirectory()) { - throw new Error('sourceDir is not a directory'); - } - // Create the tool dir - const destPath = yield _createToolPath(tool, version, arch); - // copy each child item. do not move. move can fail on Windows - // due to anti-virus software having an open handle on a file. - for (const itemName of fs.readdirSync(sourceDir)) { - const s = path.join(sourceDir, itemName); - shell.cp('-R', s, destPath); - } - // write .complete - _completeToolPath(tool, version, arch); - return destPath; - }); -} -exports.cacheDir = cacheDir; -/** - * Caches a downloaded file (GUID) and installs it - * 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 targetFile the name of the file name in the tools directory - * @param tool tool name - * @param version version of the tool. semver format - * @param arch architecture of the tool. Optional. Defaults to machine architecture - */ -function cacheFile(sourceFile, targetFile, tool, version, arch) { - return __awaiter(this, void 0, void 0, function* () { - version = semver.clean(version) || version; - arch = arch || os.arch(); - core.debug(`Caching tool ${tool} ${version} ${arch}`); - core.debug(`source file: ${sourceFile}`); - if (!fs.statSync(sourceFile).isFile()) { - throw new Error('sourceFile is not a file'); - } - // create the tool dir - const destFolder = yield _createToolPath(tool, version, arch); - // copy instead of move. move can fail on Windows due to - // anti-virus software having an open handle on a file. - const destPath = path.join(destFolder, targetFile); - core.debug(`destination file ${destPath}`); - yield io.cp(sourceFile, destPath); - // write .complete - _completeToolPath(tool, version, arch); - return destFolder; - }); -} -exports.cacheFile = cacheFile; -/** - * Finds the path to a tool version in the local installed tool cache - * - * @param toolName name of the tool - * @param versionSpec version of the tool - * @param arch optional arch. defaults to arch of computer - */ -function find(toolName, versionSpec, arch) { - if (!toolName) { - throw new Error('toolName parameter is required'); - } - if (!versionSpec) { - throw new Error('versionSpec parameter is required'); - } - arch = arch || os.arch(); - // attempt to resolve an explicit version - if (!_isExplicitVersion(versionSpec)) { - const localVersions = findAllVersions(toolName, arch); - const match = _evaluateVersions(localVersions, versionSpec); - versionSpec = match; - } - // check for the explicit version in the cache - let toolPath = ''; - if (versionSpec) { - versionSpec = semver.clean(versionSpec) || ''; - const cachePath = path.join(cacheRoot, toolName, versionSpec, arch); - core.debug(`checking cache: ${cachePath}`); - if (fs.existsSync(cachePath) && fs.existsSync(`${cachePath}.complete`)) { - core.debug(`Found tool in cache ${toolName} ${versionSpec} ${arch}`); - toolPath = cachePath; - } - else { - core.debug('not found'); - } - } - return toolPath; -} -exports.find = find; -/** - * Finds the paths to all versions of a tool that are installed in the local tool cache - * - * @param toolName name of the tool - * @param arch optional arch. defaults to arch of computer - */ -function findAllVersions(toolName, arch) { - const versions = []; - arch = arch || os.arch(); - const toolPath = path.join(cacheRoot, toolName); - if (fs.existsSync(toolPath)) { - const children = fs.readdirSync(toolPath); - for (const child of children) { - if (_isExplicitVersion(child)) { - const fullPath = path.join(toolPath, child, arch || ''); - if (fs.existsSync(fullPath) && fs.existsSync(`${fullPath}.complete`)) { - versions.push(child); - } - } - } - } - return versions; -} -exports.findAllVersions = findAllVersions; -function _createExtractFolder(dest) { - return __awaiter(this, void 0, void 0, function* () { - if (!dest) { - // create a temp dir - dest = path.join(tempDirectory, uuidV4()); - } - yield io.mkdirP(dest); - return dest; - }); -} -function _createToolPath(tool, version, arch) { - return __awaiter(this, void 0, void 0, function* () { - const folderPath = path.join(cacheRoot, tool, semver.clean(version) || version, arch || ''); - core.debug(`destination ${folderPath}`); - const markerPath = `${folderPath}.complete`; - yield io.rmRF(folderPath); - yield io.rmRF(markerPath); - yield io.mkdirP(folderPath); - return folderPath; - }); -} -function _completeToolPath(tool, version, arch) { - const folderPath = path.join(cacheRoot, tool, semver.clean(version) || version, arch || ''); - const markerPath = `${folderPath}.complete`; - fs.writeFileSync(markerPath, ''); - core.debug('finished caching tool'); -} -function _isExplicitVersion(versionSpec) { - const c = semver.clean(versionSpec) || ''; - core.debug(`isExplicit: ${c}`); - const valid = semver.valid(c) != null; - core.debug(`explicit? ${valid}`); - return valid; -} -function _evaluateVersions(versions, versionSpec) { - let version = ''; - core.debug(`evaluating ${versions.length} versions`); - versions = versions.sort((a, b) => { - if (semver.gt(a, b)) { - return 1; - } - return -1; - }); - for (let i = versions.length - 1; i >= 0; i--) { - const potential = versions[i]; - const satisfied = semver.satisfies(potential, versionSpec); - if (satisfied) { - version = potential; - break; - } - } - if (version) { - core.debug(`matched: ${version}`); - } - else { - core.debug('match not found'); - } - return version; -} -//# sourceMappingURL=tool-cache.js.map +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + 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 step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const core = require("@actions/core"); +const io = require("@actions/io"); +const fs = require("fs"); +const os = require("os"); +const path = require("path"); +const httpm = require("typed-rest-client/HttpClient"); +const semver = require("semver"); +const uuidV4 = require("uuid/v4"); +const exec_1 = require("@actions/exec/lib/exec"); +const assert_1 = require("assert"); +class HTTPError extends Error { + constructor(httpStatusCode) { + super(`Unexpected HTTP response: ${httpStatusCode}`); + this.httpStatusCode = httpStatusCode; + Object.setPrototypeOf(this, new.target.prototype); + } +} +exports.HTTPError = HTTPError; +const IS_WINDOWS = process.platform === 'win32'; +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) +let tempDirectory = process.env['RUNNER_TEMP'] || ''; +let cacheRoot = process.env['RUNNER_TOOL_CACHE'] || ''; +// If directories not found, place them in common temp locations +if (!tempDirectory || !cacheRoot) { + let baseLocation; + if (IS_WINDOWS) { + // On windows use the USERPROFILE env variable + baseLocation = process.env['USERPROFILE'] || 'C:\\'; + } + else { + if (process.platform === 'darwin') { + baseLocation = '/Users'; + } + else { + baseLocation = '/home'; + } + } + if (!tempDirectory) { + tempDirectory = path.join(baseLocation, 'actions', 'temp'); + } + if (!cacheRoot) { + cacheRoot = path.join(baseLocation, 'actions', 'cache'); + } +} +/** + * Download a tool from an url and stream it into a file + * + * @param url url of tool to download + * @returns path to downloaded tool + */ +function downloadTool(url) { + return __awaiter(this, void 0, void 0, function* () { + // 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* () { + try { + const http = new httpm.HttpClient(userAgent, [], { + allowRetries: true, + maxRetries: 3 + }); + const destPath = path.join(tempDirectory, uuidV4()); + yield io.mkdirP(tempDirectory); + core.debug(`Downloading ${url}`); + core.debug(`Downloading ${destPath}`); + if (fs.existsSync(destPath)) { + throw new Error(`Destination file path ${destPath} already exists`); + } + const response = yield http.get(url); + if (response.message.statusCode !== 200) { + const err = new HTTPError(response.message.statusCode); + core.debug(`Failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`); + throw err; + } + const file = fs.createWriteStream(destPath); + file.on('open', () => __awaiter(this, void 0, void 0, function* () { + try { + const stream = response.message.pipe(file); + stream.on('close', () => { + core.debug('download complete'); + resolve(destPath); + }); + } + catch (err) { + core.debug(`Failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`); + reject(err); + } + })); + file.on('error', err => { + file.end(); + reject(err); + }); + } + catch (err) { + reject(err); + } + })); + }); +} +exports.downloadTool = downloadTool; +/** + * Extract a .7z file + * + * @param file path to the .7z file + * @param dest destination directory. Optional. + * @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 + * 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 + * 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. + * 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. + * @returns path to the destination directory + */ +function extract7z(file, dest, _7zPath) { + return __awaiter(this, void 0, void 0, function* () { + assert_1.ok(IS_WINDOWS, 'extract7z() not supported on current OS'); + assert_1.ok(file, 'parameter "file" is required'); + dest = dest || (yield _createExtractFolder(dest)); + const originalCwd = process.cwd(); + process.chdir(dest); + if (_7zPath) { + try { + const args = [ + 'x', + '-bb1', + '-bd', + '-sccUTF-8', + file + ]; + const options = { + silent: true + }; + yield exec_1.exec(`"${_7zPath}"`, args, options); + } + finally { + process.chdir(originalCwd); + } + } + else { + const escapedScript = path + .join(__dirname, '..', 'scripts', 'Invoke-7zdec.ps1') + .replace(/'/g, "''") + .replace(/"|\n|\r/g, ''); // double-up single quotes, remove double quotes and newlines + const escapedFile = file.replace(/'/g, "''").replace(/"|\n|\r/g, ''); + const escapedTarget = dest.replace(/'/g, "''").replace(/"|\n|\r/g, ''); + const command = `& '${escapedScript}' -Source '${escapedFile}' -Target '${escapedTarget}'`; + const args = [ + '-NoLogo', + '-Sta', + '-NoProfile', + '-NonInteractive', + '-ExecutionPolicy', + 'Unrestricted', + '-Command', + command + ]; + const options = { + silent: true + }; + try { + const powershellPath = yield io.which('powershell', true); + yield exec_1.exec(`"${powershellPath}"`, args, options); + } + finally { + process.chdir(originalCwd); + } + } + return dest; + }); +} +exports.extract7z = extract7z; +/** + * Extract a tar + * + * @param file path to the tar + * @param dest destination directory. Optional. + * @returns path to the destination directory + */ +function extractTar(file, dest) { + return __awaiter(this, void 0, void 0, function* () { + if (!file) { + throw new Error("parameter 'file' is required"); + } + dest = dest || (yield _createExtractFolder(dest)); + const tarPath = yield io.which('tar', true); + yield exec_1.exec(`"${tarPath}"`, ['xzC', dest, '-f', file]); + return dest; + }); +} +exports.extractTar = extractTar; +/** + * Extract a zip + * + * @param file path to the zip + * @param dest destination directory. Optional. + * @returns path to the destination directory + */ +function extractZip(file, dest) { + return __awaiter(this, void 0, void 0, function* () { + if (!file) { + throw new Error("parameter 'file' is required"); + } + dest = dest || (yield _createExtractFolder(dest)); + if (IS_WINDOWS) { + yield extractZipWin(file, dest); + } + else { + yield extractZipNix(file, dest); + } + return dest; + }); +} +exports.extractZip = extractZip; +function extractZipWin(file, dest) { + return __awaiter(this, void 0, void 0, function* () { + // build the powershell command + 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 command = `$ErrorActionPreference = 'Stop' ; try { Add-Type -AssemblyName System.IO.Compression.FileSystem } catch { } ; [System.IO.Compression.ZipFile]::ExtractToDirectory('${escapedFile}', '${escapedDest}')`; + // run powershell + const powershellPath = yield io.which('powershell'); + const args = [ + '-NoLogo', + '-Sta', + '-NoProfile', + '-NonInteractive', + '-ExecutionPolicy', + 'Unrestricted', + '-Command', + command + ]; + yield exec_1.exec(`"${powershellPath}"`, args); + }); +} +function extractZipNix(file, dest) { + return __awaiter(this, void 0, void 0, function* () { + const unzipPath = path.join(__dirname, '..', 'scripts', 'externals', 'unzip'); + yield exec_1.exec(`"${unzipPath}"`, [file], { cwd: dest }); + }); +} +/** + * Caches a directory and installs it into the tool cacheDir + * + * @param sourceDir the directory to cache into tools + * @param tool tool name + * @param version version of the tool. semver format + * @param arch architecture of the tool. Optional. Defaults to machine architecture + */ +function cacheDir(sourceDir, tool, version, arch) { + return __awaiter(this, void 0, void 0, function* () { + version = semver.clean(version) || version; + arch = arch || os.arch(); + core.debug(`Caching tool ${tool} ${version} ${arch}`); + core.debug(`source dir: ${sourceDir}`); + if (!fs.statSync(sourceDir).isDirectory()) { + throw new Error('sourceDir is not a directory'); + } + // Create the tool dir + const destPath = yield _createToolPath(tool, version, arch); + // copy each child item. do not move. move can fail on Windows + // due to anti-virus software having an open handle on a file. + for (const itemName of fs.readdirSync(sourceDir)) { + const s = path.join(sourceDir, itemName); + yield io.cp(s, destPath, { recursive: true }); + } + // write .complete + _completeToolPath(tool, version, arch); + return destPath; + }); +} +exports.cacheDir = cacheDir; +/** + * Caches a downloaded file (GUID) and installs it + * 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 targetFile the name of the file name in the tools directory + * @param tool tool name + * @param version version of the tool. semver format + * @param arch architecture of the tool. Optional. Defaults to machine architecture + */ +function cacheFile(sourceFile, targetFile, tool, version, arch) { + return __awaiter(this, void 0, void 0, function* () { + version = semver.clean(version) || version; + arch = arch || os.arch(); + core.debug(`Caching tool ${tool} ${version} ${arch}`); + core.debug(`source file: ${sourceFile}`); + if (!fs.statSync(sourceFile).isFile()) { + throw new Error('sourceFile is not a file'); + } + // create the tool dir + const destFolder = yield _createToolPath(tool, version, arch); + // copy instead of move. move can fail on Windows due to + // anti-virus software having an open handle on a file. + const destPath = path.join(destFolder, targetFile); + core.debug(`destination file ${destPath}`); + yield io.cp(sourceFile, destPath); + // write .complete + _completeToolPath(tool, version, arch); + return destFolder; + }); +} +exports.cacheFile = cacheFile; +/** + * Finds the path to a tool version in the local installed tool cache + * + * @param toolName name of the tool + * @param versionSpec version of the tool + * @param arch optional arch. defaults to arch of computer + */ +function find(toolName, versionSpec, arch) { + if (!toolName) { + throw new Error('toolName parameter is required'); + } + if (!versionSpec) { + throw new Error('versionSpec parameter is required'); + } + arch = arch || os.arch(); + // attempt to resolve an explicit version + if (!_isExplicitVersion(versionSpec)) { + const localVersions = findAllVersions(toolName, arch); + const match = _evaluateVersions(localVersions, versionSpec); + versionSpec = match; + } + // check for the explicit version in the cache + let toolPath = ''; + if (versionSpec) { + versionSpec = semver.clean(versionSpec) || ''; + const cachePath = path.join(cacheRoot, toolName, versionSpec, arch); + core.debug(`checking cache: ${cachePath}`); + if (fs.existsSync(cachePath) && fs.existsSync(`${cachePath}.complete`)) { + core.debug(`Found tool in cache ${toolName} ${versionSpec} ${arch}`); + toolPath = cachePath; + } + else { + core.debug('not found'); + } + } + return toolPath; +} +exports.find = find; +/** + * Finds the paths to all versions of a tool that are installed in the local tool cache + * + * @param toolName name of the tool + * @param arch optional arch. defaults to arch of computer + */ +function findAllVersions(toolName, arch) { + const versions = []; + arch = arch || os.arch(); + const toolPath = path.join(cacheRoot, toolName); + if (fs.existsSync(toolPath)) { + const children = fs.readdirSync(toolPath); + for (const child of children) { + if (_isExplicitVersion(child)) { + const fullPath = path.join(toolPath, child, arch || ''); + if (fs.existsSync(fullPath) && fs.existsSync(`${fullPath}.complete`)) { + versions.push(child); + } + } + } + } + return versions; +} +exports.findAllVersions = findAllVersions; +function _createExtractFolder(dest) { + return __awaiter(this, void 0, void 0, function* () { + if (!dest) { + // create a temp dir + dest = path.join(tempDirectory, uuidV4()); + } + yield io.mkdirP(dest); + return dest; + }); +} +function _createToolPath(tool, version, arch) { + return __awaiter(this, void 0, void 0, function* () { + const folderPath = path.join(cacheRoot, tool, semver.clean(version) || version, arch || ''); + core.debug(`destination ${folderPath}`); + const markerPath = `${folderPath}.complete`; + yield io.rmRF(folderPath); + yield io.rmRF(markerPath); + yield io.mkdirP(folderPath); + return folderPath; + }); +} +function _completeToolPath(tool, version, arch) { + const folderPath = path.join(cacheRoot, tool, semver.clean(version) || version, arch || ''); + const markerPath = `${folderPath}.complete`; + fs.writeFileSync(markerPath, ''); + core.debug('finished caching tool'); +} +function _isExplicitVersion(versionSpec) { + const c = semver.clean(versionSpec) || ''; + core.debug(`isExplicit: ${c}`); + const valid = semver.valid(c) != null; + core.debug(`explicit? ${valid}`); + return valid; +} +function _evaluateVersions(versions, versionSpec) { + let version = ''; + core.debug(`evaluating ${versions.length} versions`); + versions = versions.sort((a, b) => { + if (semver.gt(a, b)) { + return 1; + } + return -1; + }); + for (let i = versions.length - 1; i >= 0; i--) { + const potential = versions[i]; + const satisfied = semver.satisfies(potential, versionSpec); + if (satisfied) { + version = potential; + break; + } + } + if (version) { + core.debug(`matched: ${version}`); + } + else { + core.debug('match not found'); + } + return version; +} +//# sourceMappingURL=tool-cache.js.map \ No newline at end of file diff --git a/node_modules/@actions/tool-cache/lib/tool-cache.js.map b/node_modules/@actions/tool-cache/lib/tool-cache.js.map index 55017746..0c4f30b9 100644 --- a/node_modules/@actions/tool-cache/lib/tool-cache.js.map +++ b/node_modules/@actions/tool-cache/lib/tool-cache.js.map @@ -1 +1 @@ -{"version":3,"file":"tool-cache.js","sourceRoot":"","sources":["../src/tool-cache.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"tool-cache.js","sourceRoot":"","sources":["../src/tool-cache.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@actions/tool-cache/package.json b/node_modules/@actions/tool-cache/package.json index aee6aeaa..76ca4745 100644 --- a/node_modules/@actions/tool-cache/package.json +++ b/node_modules/@actions/tool-cache/package.json @@ -2,7 +2,7 @@ "_from": "file:toolkit\\actions-tool-cache-0.0.0.tgz", "_id": "@actions/tool-cache@0.0.0", "_inBundle": false, - "_integrity": "sha512-R08MGFekNLkf1ofh5wi8QVgmFyPgkKC+Cp8FRE1n6zOpHbUWv3QGa6eR6z+2ESuGCstOPtbq/tRgZsSusItm9Q==", + "_integrity": "sha512-33oYAVRdp6MWNT7Yca0//SmOsvpE7FpFfNA/LzwjIZdLucHaO6V67dqZ5p81CTBncrZal+O5kE9B8qSk0rhipg==", "_location": "/@actions/tool-cache", "_phantomChildren": {}, "_requested": { @@ -17,10 +17,11 @@ "fetchSpec": "C:\\Users\\Administrator\\Documents\\setup-node\\toolkit\\actions-tool-cache-0.0.0.tgz" }, "_requiredBy": [ + "#USER", "/" ], "_resolved": "C:\\Users\\Administrator\\Documents\\setup-node\\toolkit\\actions-tool-cache-0.0.0.tgz", - "_shasum": "e4ffe745db46f47e512db20e80f8ad25910e41d1", + "_shasum": "ce9e7d81ebb138911d20b9f74c8aa6120caac9b1", "_spec": "@actions/tool-cache@file:toolkit/actions-tool-cache-0.0.0.tgz", "_where": "C:\\Users\\Administrator\\Documents\\setup-node", "bugs": { @@ -32,7 +33,6 @@ "@actions/exec": "^0.0.0", "@actions/io": "^0.0.0", "semver": "^6.1.0", - "shelljs": "^0.3.0", "typed-rest-client": "^1.4.0", "uuid": "^3.3.2" }, diff --git a/node_modules/@actions/tool-cache/scripts/Invoke-7zdec.ps1 b/node_modules/@actions/tool-cache/scripts/Invoke-7zdec.ps1 index ee3822d0..8b39bb4d 100644 --- a/node_modules/@actions/tool-cache/scripts/Invoke-7zdec.ps1 +++ b/node_modules/@actions/tool-cache/scripts/Invoke-7zdec.ps1 @@ -1,60 +1,60 @@ -[CmdletBinding()] -param( - [Parameter(Mandatory = $true)] - [string]$Source, - - [Parameter(Mandatory = $true)] - [string]$Target) - -# This script translates the output from 7zdec into UTF8. Node has limited -# built-in support for encodings. -# -# 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 -# page is Windows-1252. -# -# 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 -# the 'ç' character has a different code point across each of the common encodings -# on a typical en-US box, i.e. -# 1) the default console-output code page (IBM437) -# 2) the system default code page (i.e. CP_ACP) (Windows-1252) -# 3) UTF8 - -$ErrorActionPreference = 'Stop' - -# Redefine the wrapper over STDOUT to use UTF8. Node expects UTF8 by default. -$stdout = [System.Console]::OpenStandardOutput() -$utf8 = New-Object System.Text.UTF8Encoding($false) # do not emit BOM -$writer = New-Object System.IO.StreamWriter($stdout, $utf8) -[System.Console]::SetOut($writer) - -# 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. - -Set-Location -LiteralPath $Target - -# Print the ##command. -$_7zdec = Join-Path -Path "$PSScriptRoot" -ChildPath "externals/7zdec.exe" -[System.Console]::WriteLine("##[command]$_7zdec x `"$Source`"") - -# The $OutputEncoding variable instructs PowerShell how to interpret the output -# from the external command. -$OutputEncoding = [System.Text.Encoding]::Default - -# 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. -& $_7zdec x $Source 2>&1 | - ForEach-Object { - if ($_ -is [System.Management.Automation.ErrorRecord]) { - [System.Console]::WriteLine($_.Exception.Message) - } - else { - [System.Console]::WriteLine($_) - } - } -[System.Console]::WriteLine("##[debug]7zdec.exe exit code '$LASTEXITCODE'") -[System.Console]::Out.Flush() -if ($LASTEXITCODE -ne 0) { - exit $LASTEXITCODE +[CmdletBinding()] +param( + [Parameter(Mandatory = $true)] + [string]$Source, + + [Parameter(Mandatory = $true)] + [string]$Target) + +# This script translates the output from 7zdec into UTF8. Node has limited +# built-in support for encodings. +# +# 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 +# page is Windows-1252. +# +# 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 +# the 'ç' character has a different code point across each of the common encodings +# on a typical en-US box, i.e. +# 1) the default console-output code page (IBM437) +# 2) the system default code page (i.e. CP_ACP) (Windows-1252) +# 3) UTF8 + +$ErrorActionPreference = 'Stop' + +# Redefine the wrapper over STDOUT to use UTF8. Node expects UTF8 by default. +$stdout = [System.Console]::OpenStandardOutput() +$utf8 = New-Object System.Text.UTF8Encoding($false) # do not emit BOM +$writer = New-Object System.IO.StreamWriter($stdout, $utf8) +[System.Console]::SetOut($writer) + +# 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. + +Set-Location -LiteralPath $Target + +# Print the ##command. +$_7zdec = Join-Path -Path "$PSScriptRoot" -ChildPath "externals/7zdec.exe" +[System.Console]::WriteLine("##[command]$_7zdec x `"$Source`"") + +# The $OutputEncoding variable instructs PowerShell how to interpret the output +# from the external command. +$OutputEncoding = [System.Text.Encoding]::Default + +# 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. +& $_7zdec x $Source 2>&1 | + ForEach-Object { + if ($_ -is [System.Management.Automation.ErrorRecord]) { + [System.Console]::WriteLine($_.Exception.Message) + } + else { + [System.Console]::WriteLine($_) + } + } +[System.Console]::WriteLine("##[debug]7zdec.exe exit code '$LASTEXITCODE'") +[System.Console]::Out.Flush() +if ($LASTEXITCODE -ne 0) { + exit $LASTEXITCODE } \ No newline at end of file diff --git a/node_modules/shelljs/.documentup.json b/node_modules/shelljs/.documentup.json deleted file mode 100644 index 57fe3011..00000000 --- a/node_modules/shelljs/.documentup.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "ShellJS", - "twitter": [ - "r2r" - ] -} diff --git a/node_modules/shelljs/.jshintrc b/node_modules/shelljs/.jshintrc deleted file mode 100644 index a80c559a..00000000 --- a/node_modules/shelljs/.jshintrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "loopfunc": true, - "sub": true, - "undef": true, - "unused": true, - "node": true -} \ No newline at end of file diff --git a/node_modules/shelljs/.npmignore b/node_modules/shelljs/.npmignore deleted file mode 100644 index 6b20c38a..00000000 --- a/node_modules/shelljs/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -test/ -tmp/ \ No newline at end of file diff --git a/node_modules/shelljs/.travis.yml b/node_modules/shelljs/.travis.yml deleted file mode 100644 index 99cdc743..00000000 --- a/node_modules/shelljs/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" - - "0.11" diff --git a/node_modules/shelljs/LICENSE b/node_modules/shelljs/LICENSE deleted file mode 100644 index 1b35ee9f..00000000 --- a/node_modules/shelljs/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2012, Artur Adib -All rights reserved. - -You may use this project under the terms of the New BSD license as follows: - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Artur Adib nor the - names of the contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/shelljs/README.md b/node_modules/shelljs/README.md deleted file mode 100644 index 51358bd3..00000000 --- a/node_modules/shelljs/README.md +++ /dev/null @@ -1,569 +0,0 @@ -# ShellJS - Unix shell commands for Node.js [![Build Status](https://secure.travis-ci.org/arturadib/shelljs.png)](http://travis-ci.org/arturadib/shelljs) - -ShellJS is a portable **(Windows/Linux/OS X)** implementation of Unix shell commands on top of the Node.js API. You can use it to eliminate your shell script's dependency on Unix while still keeping its familiar and powerful commands. You can also install it globally so you can run it from outside Node projects - say goodbye to those gnarly Bash scripts! - -The project is [unit-tested](http://travis-ci.org/arturadib/shelljs) and battled-tested in projects like: - -+ [PDF.js](http://github.com/mozilla/pdf.js) - Firefox's next-gen PDF reader -+ [Firebug](http://getfirebug.com/) - Firefox's infamous debugger -+ [JSHint](http://jshint.com) - Most popular JavaScript linter -+ [Zepto](http://zeptojs.com) - jQuery-compatible JavaScript library for modern browsers -+ [Yeoman](http://yeoman.io/) - Web application stack and development tool -+ [Deployd.com](http://deployd.com) - Open source PaaS for quick API backend generation - -and [many more](https://npmjs.org/browse/depended/shelljs). - -## Installing - -Via npm: - -```bash -$ npm install [-g] shelljs -``` - -If the global option `-g` is specified, the binary `shjs` will be installed. This makes it possible to -run ShellJS scripts much like any shell script from the command line, i.e. without requiring a `node_modules` folder: - -```bash -$ shjs my_script -``` - -You can also just copy `shell.js` into your project's directory, and `require()` accordingly. - - -## Examples - -### JavaScript - -```javascript -require('shelljs/global'); - -if (!which('git')) { - echo('Sorry, this script requires git'); - exit(1); -} - -// Copy files to release dir -mkdir('-p', 'out/Release'); -cp('-R', 'stuff/*', 'out/Release'); - -// Replace macros in each .js file -cd('lib'); -ls('*.js').forEach(function(file) { - sed('-i', 'BUILD_VERSION', 'v0.1.2', file); - sed('-i', /.*REMOVE_THIS_LINE.*\n/, '', file); - sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file); -}); -cd('..'); - -// Run external tool synchronously -if (exec('git commit -am "Auto-commit"').code !== 0) { - echo('Error: Git commit failed'); - exit(1); -} -``` - -### CoffeeScript - -```coffeescript -require 'shelljs/global' - -if not which 'git' - echo 'Sorry, this script requires git' - exit 1 - -# Copy files to release dir -mkdir '-p', 'out/Release' -cp '-R', 'stuff/*', 'out/Release' - -# Replace macros in each .js file -cd 'lib' -for file in ls '*.js' - sed '-i', 'BUILD_VERSION', 'v0.1.2', file - sed '-i', /.*REMOVE_THIS_LINE.*\n/, '', file - sed '-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat 'macro.js', file -cd '..' - -# Run external tool synchronously -if (exec 'git commit -am "Auto-commit"').code != 0 - echo 'Error: Git commit failed' - exit 1 -``` - -## Global vs. Local - -The example above uses the convenience script `shelljs/global` to reduce verbosity. If polluting your global namespace is not desirable, simply require `shelljs`. - -Example: - -```javascript -var shell = require('shelljs'); -shell.echo('hello world'); -``` - -## Make tool - -A convenience script `shelljs/make` is also provided to mimic the behavior of a Unix Makefile. In this case all shell objects are global, and command line arguments will cause the script to execute only the corresponding function in the global `target` object. To avoid redundant calls, target functions are executed only once per script. - -Example (CoffeeScript): - -```coffeescript -require 'shelljs/make' - -target.all = -> - target.bundle() - target.docs() - -target.bundle = -> - cd __dirname - mkdir 'build' - cd 'lib' - (cat '*.js').to '../build/output.js' - -target.docs = -> - cd __dirname - mkdir 'docs' - cd 'lib' - for file in ls '*.js' - text = grep '//@', file # extract special comments - text.replace '//@', '' # remove comment tags - text.to 'docs/my_docs.md' -``` - -To run the target `all`, call the above script without arguments: `$ node make`. To run the target `docs`: `$ node make docs`, and so on. - - - - - - -## Command reference - - -All commands run synchronously, unless otherwise stated. - - -### cd('dir') -Changes to directory `dir` for the duration of the script - - -### pwd() -Returns the current directory. - - -### ls([options ,] path [,path ...]) -### ls([options ,] path_array) -Available options: - -+ `-R`: recursive -+ `-A`: all files (include files beginning with `.`, except for `.` and `..`) - -Examples: - -```javascript -ls('projs/*.js'); -ls('-R', '/users/me', '/tmp'); -ls('-R', ['/users/me', '/tmp']); // same as above -``` - -Returns array of files in the given path, or in current directory if no path provided. - - -### find(path [,path ...]) -### find(path_array) -Examples: - -```javascript -find('src', 'lib'); -find(['src', 'lib']); // same as above -find('.').filter(function(file) { return file.match(/\.js$/); }); -``` - -Returns array of all files (however deep) in the given paths. - -The main difference from `ls('-R', path)` is that the resulting file names -include the base directories, e.g. `lib/resources/file1` instead of just `file1`. - - -### cp([options ,] source [,source ...], dest) -### cp([options ,] source_array, dest) -Available options: - -+ `-f`: force -+ `-r, -R`: recursive - -Examples: - -```javascript -cp('file1', 'dir1'); -cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp'); -cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above -``` - -Copies files. The wildcard `*` is accepted. - - -### rm([options ,] file [, file ...]) -### rm([options ,] file_array) -Available options: - -+ `-f`: force -+ `-r, -R`: recursive - -Examples: - -```javascript -rm('-rf', '/tmp/*'); -rm('some_file.txt', 'another_file.txt'); -rm(['some_file.txt', 'another_file.txt']); // same as above -``` - -Removes files. The wildcard `*` is accepted. - - -### mv(source [, source ...], dest') -### mv(source_array, dest') -Available options: - -+ `f`: force - -Examples: - -```javascript -mv('-f', 'file', 'dir/'); -mv('file1', 'file2', 'dir/'); -mv(['file1', 'file2'], 'dir/'); // same as above -``` - -Moves files. The wildcard `*` is accepted. - - -### mkdir([options ,] dir [, dir ...]) -### mkdir([options ,] dir_array) -Available options: - -+ `p`: full path (will create intermediate dirs if necessary) - -Examples: - -```javascript -mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g'); -mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above -``` - -Creates directories. - - -### test(expression) -Available expression primaries: - -+ `'-b', 'path'`: true if path is a block device -+ `'-c', 'path'`: true if path is a character device -+ `'-d', 'path'`: true if path is a directory -+ `'-e', 'path'`: true if path exists -+ `'-f', 'path'`: true if path is a regular file -+ `'-L', 'path'`: true if path is a symboilc link -+ `'-p', 'path'`: true if path is a pipe (FIFO) -+ `'-S', 'path'`: true if path is a socket - -Examples: - -```javascript -if (test('-d', path)) { /* do something with dir */ }; -if (!test('-f', path)) continue; // skip if it's a regular file -``` - -Evaluates expression using the available primaries and returns corresponding value. - - -### cat(file [, file ...]) -### cat(file_array) - -Examples: - -```javascript -var str = cat('file*.txt'); -var str = cat('file1', 'file2'); -var str = cat(['file1', 'file2']); // same as above -``` - -Returns a string containing the given file, or a concatenated string -containing the files if more than one file is given (a new line character is -introduced between each file). Wildcard `*` accepted. - - -### 'string'.to(file) - -Examples: - -```javascript -cat('input.txt').to('output.txt'); -``` - -Analogous to the redirection operator `>` in Unix, but works with JavaScript strings (such as -those returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will overwrite any existing file!_ - - -### 'string'.toEnd(file) - -Examples: - -```javascript -cat('input.txt').toEnd('output.txt'); -``` - -Analogous to the redirect-and-append operator `>>` in Unix, but works with JavaScript strings (such as -those returned by `cat`, `grep`, etc). - - -### sed([options ,] search_regex, replacement, file) -Available options: - -+ `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_ - -Examples: - -```javascript -sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); -sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); -``` - -Reads an input string from `file` and performs a JavaScript `replace()` on the input -using the given search regex and replacement string or function. Returns the new string after replacement. - - -### grep([options ,] regex_filter, file [, file ...]) -### grep([options ,] regex_filter, file_array) -Available options: - -+ `-v`: Inverse the sense of the regex and print the lines not matching the criteria. - -Examples: - -```javascript -grep('-v', 'GLOBAL_VARIABLE', '*.js'); -grep('GLOBAL_VARIABLE', '*.js'); -``` - -Reads input string from given files and returns a string containing all lines of the -file that match the given `regex_filter`. Wildcard `*` accepted. - - -### which(command) - -Examples: - -```javascript -var nodeExec = which('node'); -``` - -Searches for `command` in the system's PATH. On Windows looks for `.exe`, `.cmd`, and `.bat` extensions. -Returns string containing the absolute path to the command. - - -### echo(string [,string ...]) - -Examples: - -```javascript -echo('hello world'); -var str = echo('hello world'); -``` - -Prints string to stdout, and returns string with additional utility methods -like `.to()`. - - -### pushd([options,] [dir | '-N' | '+N']) - -Available options: - -+ `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. - -Arguments: - -+ `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`. -+ `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. -+ `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. - -Examples: - -```javascript -// process.cwd() === '/usr' -pushd('/etc'); // Returns /etc /usr -pushd('+1'); // Returns /usr /etc -``` - -Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack. - -### popd([options,] ['-N' | '+N']) - -Available options: - -+ `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. - -Arguments: - -+ `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero. -+ `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero. - -Examples: - -```javascript -echo(process.cwd()); // '/usr' -pushd('/etc'); // '/etc /usr' -echo(process.cwd()); // '/etc' -popd(); // '/usr' -echo(process.cwd()); // '/usr' -``` - -When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack. - -### dirs([options | '+N' | '-N']) - -Available options: - -+ `-c`: Clears the directory stack by deleting all of the elements. - -Arguments: - -+ `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero. -+ `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero. - -Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified. - -See also: pushd, popd - - -### ln(options, source, dest) -### ln(source, dest) -Available options: - -+ `s`: symlink -+ `f`: force - -Examples: - -```javascript -ln('file', 'newlink'); -ln('-sf', 'file', 'existing'); -``` - -Links source to dest. Use -f to force the link, should dest already exist. - - -### exit(code) -Exits the current process with the given exit code. - -### env['VAR_NAME'] -Object containing environment variables (both getter and setter). Shortcut to process.env. - -### exec(command [, options] [, callback]) -Available options (all `false` by default): - -+ `async`: Asynchronous execution. Defaults to true if a callback is provided. -+ `silent`: Do not echo program output to console. - -Examples: - -```javascript -var version = exec('node --version', {silent:true}).output; - -var child = exec('some_long_running_process', {async:true}); -child.stdout.on('data', function(data) { - /* ... do something with data ... */ -}); - -exec('some_long_running_process', function(code, output) { - console.log('Exit code:', code); - console.log('Program output:', output); -}); -``` - -Executes the given `command` _synchronously_, unless otherwise specified. -When in synchronous mode returns the object `{ code:..., output:... }`, containing the program's -`output` (stdout + stderr) and its exit `code`. Otherwise returns the child process object, and -the `callback` gets the arguments `(code, output)`. - -**Note:** For long-lived processes, it's best to run `exec()` asynchronously as -the current synchronous implementation uses a lot of CPU. This should be getting -fixed soon. - - -### chmod(octal_mode || octal_string, file) -### chmod(symbolic_mode, file) - -Available options: - -+ `-v`: output a diagnostic for every file processed -+ `-c`: like verbose but report only when a change is made -+ `-R`: change files and directories recursively - -Examples: - -```javascript -chmod(755, '/Users/brandon'); -chmod('755', '/Users/brandon'); // same as above -chmod('u+x', '/Users/brandon'); -``` - -Alters the permissions of a file or directory by either specifying the -absolute permissions in octal form or expressing the changes in symbols. -This command tries to mimic the POSIX behavior as much as possible. -Notable exceptions: - -+ In symbolic modes, 'a-r' and '-r' are identical. No consideration is - given to the umask. -+ There is no "quiet" option since default behavior is to run silent. - - -## Non-Unix commands - - -### tempdir() - -Examples: - -```javascript -var tmp = tempdir(); // "/tmp" for most *nix platforms -``` - -Searches and returns string containing a writeable, platform-dependent temporary directory. -Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). - - -### error() -Tests if error occurred in the last command. Returns `null` if no error occurred, -otherwise returns string explaining the error - - -## Configuration - - -### config.silent -Example: - -```javascript -var silentState = config.silent; // save old silent state -config.silent = true; -/* ... */ -config.silent = silentState; // restore old silent state -``` - -Suppresses all command output if `true`, except for `echo()` calls. -Default is `false`. - -### config.fatal -Example: - -```javascript -config.fatal = true; -cp('this_file_does_not_exist', '/dev/null'); // dies here -/* more commands... */ -``` - -If `true` the script will die on errors. Default is `false`. diff --git a/node_modules/shelljs/bin/shjs b/node_modules/shelljs/bin/shjs deleted file mode 100644 index d239a7ad..00000000 --- a/node_modules/shelljs/bin/shjs +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env node -require('../global'); - -if (process.argv.length < 3) { - console.log('ShellJS: missing argument (script name)'); - console.log(); - process.exit(1); -} - -var args, - scriptName = process.argv[2]; -env['NODE_PATH'] = __dirname + '/../..'; - -if (!scriptName.match(/\.js/) && !scriptName.match(/\.coffee/)) { - if (test('-f', scriptName + '.js')) - scriptName += '.js'; - if (test('-f', scriptName + '.coffee')) - scriptName += '.coffee'; -} - -if (!test('-f', scriptName)) { - console.log('ShellJS: script not found ('+scriptName+')'); - console.log(); - process.exit(1); -} - -args = process.argv.slice(3); - -for (var i = 0, l = args.length; i < l; i++) { - if (args[i][0] !== "-"){ - args[i] = '"' + args[i] + '"'; // fixes arguments with multiple words - } -} - -if (scriptName.match(/\.coffee$/)) { - // - // CoffeeScript - // - if (which('coffee')) { - exec('coffee ' + scriptName + ' ' + args.join(' '), { async: true }); - } else { - console.log('ShellJS: CoffeeScript interpreter not found'); - console.log(); - process.exit(1); - } -} else { - // - // JavaScript - // - exec('node ' + scriptName + ' ' + args.join(' '), { async: true }); -} diff --git a/node_modules/shelljs/global.js b/node_modules/shelljs/global.js deleted file mode 100644 index 97f0033c..00000000 --- a/node_modules/shelljs/global.js +++ /dev/null @@ -1,3 +0,0 @@ -var shell = require('./shell.js'); -for (var cmd in shell) - global[cmd] = shell[cmd]; diff --git a/node_modules/shelljs/make.js b/node_modules/shelljs/make.js deleted file mode 100644 index 53e5e812..00000000 --- a/node_modules/shelljs/make.js +++ /dev/null @@ -1,47 +0,0 @@ -require('./global'); - -global.config.fatal = true; -global.target = {}; - -// This ensures we only execute the script targets after the entire script has -// been evaluated -var args = process.argv.slice(2); -setTimeout(function() { - var t; - - if (args.length === 1 && args[0] === '--help') { - console.log('Available targets:'); - for (t in global.target) - console.log(' ' + t); - return; - } - - // Wrap targets to prevent duplicate execution - for (t in global.target) { - (function(t, oldTarget){ - - // Wrap it - global.target[t] = function(force) { - if (oldTarget.done && !force) - return; - oldTarget.done = true; - return oldTarget.apply(oldTarget, arguments); - }; - - })(t, global.target[t]); - } - - // Execute desired targets - if (args.length > 0) { - args.forEach(function(arg) { - if (arg in global.target) - global.target[arg](); - else { - console.log('no such target: ' + arg); - } - }); - } else if ('all' in global.target) { - global.target.all(); - } - -}, 0); diff --git a/node_modules/shelljs/package.json b/node_modules/shelljs/package.json deleted file mode 100644 index 0e9c35dc..00000000 --- a/node_modules/shelljs/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "_from": "shelljs@^0.3.0", - "_id": "shelljs@0.3.0", - "_inBundle": false, - "_integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "_location": "/shelljs", - "_phantomChildren": {}, - "_requested": { - "type": "range", - "registry": true, - "raw": "shelljs@^0.3.0", - "name": "shelljs", - "escapedName": "shelljs", - "rawSpec": "^0.3.0", - "saveSpec": null, - "fetchSpec": "^0.3.0" - }, - "_requiredBy": [ - "/@actions/tool-cache" - ], - "_resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "_shasum": "3596e6307a781544f591f37da618360f31db57b1", - "_spec": "shelljs@^0.3.0", - "_where": "C:\\Users\\Administrator\\Documents\\setup-node\\toolkit\\actions-tool-cache-0.0.0.tgz", - "author": { - "name": "Artur Adib", - "email": "aadib@mozilla.com" - }, - "bin": { - "shjs": "./bin/shjs" - }, - "bugs": { - "url": "https://github.com/arturadib/shelljs/issues" - }, - "bundleDependencies": false, - "dependencies": {}, - "deprecated": false, - "description": "Portable Unix shell commands for Node.js", - "devDependencies": { - "jshint": "~2.1.11" - }, - "engines": { - "node": ">=0.8.0" - }, - "homepage": "http://github.com/arturadib/shelljs", - "keywords": [ - "unix", - "shell", - "makefile", - "make", - "jake", - "synchronous" - ], - "license": "BSD*", - "main": "./shell.js", - "name": "shelljs", - "optionalDependencies": {}, - "repository": { - "type": "git", - "url": "git://github.com/arturadib/shelljs.git" - }, - "scripts": { - "test": "node scripts/run-tests" - }, - "version": "0.3.0" -} diff --git a/node_modules/shelljs/scripts/generate-docs.js b/node_modules/shelljs/scripts/generate-docs.js deleted file mode 100644 index 532fed9f..00000000 --- a/node_modules/shelljs/scripts/generate-docs.js +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env node -require('../global'); - -echo('Appending docs to README.md'); - -cd(__dirname + '/..'); - -// Extract docs from shell.js -var docs = grep('//@', 'shell.js'); - -docs = docs.replace(/\/\/\@include (.+)/g, function(match, path) { - var file = path.match('.js$') ? path : path+'.js'; - return grep('//@', file); -}); - -// Remove '//@' -docs = docs.replace(/\/\/\@ ?/g, ''); -// Append docs to README -sed('-i', /## Command reference(.|\n)*/, '## Command reference\n\n' + docs, 'README.md'); - -echo('All done.'); diff --git a/node_modules/shelljs/scripts/run-tests.js b/node_modules/shelljs/scripts/run-tests.js deleted file mode 100644 index f9d31e06..00000000 --- a/node_modules/shelljs/scripts/run-tests.js +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env node -require('../global'); - -var path = require('path'); - -var failed = false; - -// -// Lint -// -JSHINT_BIN = './node_modules/jshint/bin/jshint'; -cd(__dirname + '/..'); - -if (!test('-f', JSHINT_BIN)) { - echo('JSHint not found. Run `npm install` in the root dir first.'); - exit(1); -} - -if (exec(JSHINT_BIN + ' *.js test/*.js').code !== 0) { - failed = true; - echo('*** JSHINT FAILED! (return code != 0)'); - echo(); -} else { - echo('All JSHint tests passed'); - echo(); -} - -// -// Unit tests -// -cd(__dirname + '/../test'); -ls('*.js').forEach(function(file) { - echo('Running test:', file); - if (exec('node ' + file).code !== 123) { // 123 avoids false positives (e.g. premature exit) - failed = true; - echo('*** TEST FAILED! (missing exit code "123")'); - echo(); - } -}); - -if (failed) { - echo(); - echo('*******************************************************'); - echo('WARNING: Some tests did not pass!'); - echo('*******************************************************'); - exit(1); -} else { - echo(); - echo('All tests passed.'); -} diff --git a/node_modules/shelljs/shell.js b/node_modules/shelljs/shell.js deleted file mode 100644 index 54402c79..00000000 --- a/node_modules/shelljs/shell.js +++ /dev/null @@ -1,157 +0,0 @@ -// -// ShellJS -// Unix shell commands on top of Node's API -// -// Copyright (c) 2012 Artur Adib -// http://github.com/arturadib/shelljs -// - -var common = require('./src/common'); - - -//@ -//@ All commands run synchronously, unless otherwise stated. -//@ - -//@include ./src/cd -var _cd = require('./src/cd'); -exports.cd = common.wrap('cd', _cd); - -//@include ./src/pwd -var _pwd = require('./src/pwd'); -exports.pwd = common.wrap('pwd', _pwd); - -//@include ./src/ls -var _ls = require('./src/ls'); -exports.ls = common.wrap('ls', _ls); - -//@include ./src/find -var _find = require('./src/find'); -exports.find = common.wrap('find', _find); - -//@include ./src/cp -var _cp = require('./src/cp'); -exports.cp = common.wrap('cp', _cp); - -//@include ./src/rm -var _rm = require('./src/rm'); -exports.rm = common.wrap('rm', _rm); - -//@include ./src/mv -var _mv = require('./src/mv'); -exports.mv = common.wrap('mv', _mv); - -//@include ./src/mkdir -var _mkdir = require('./src/mkdir'); -exports.mkdir = common.wrap('mkdir', _mkdir); - -//@include ./src/test -var _test = require('./src/test'); -exports.test = common.wrap('test', _test); - -//@include ./src/cat -var _cat = require('./src/cat'); -exports.cat = common.wrap('cat', _cat); - -//@include ./src/to -var _to = require('./src/to'); -String.prototype.to = common.wrap('to', _to); - -//@include ./src/toEnd -var _toEnd = require('./src/toEnd'); -String.prototype.toEnd = common.wrap('toEnd', _toEnd); - -//@include ./src/sed -var _sed = require('./src/sed'); -exports.sed = common.wrap('sed', _sed); - -//@include ./src/grep -var _grep = require('./src/grep'); -exports.grep = common.wrap('grep', _grep); - -//@include ./src/which -var _which = require('./src/which'); -exports.which = common.wrap('which', _which); - -//@include ./src/echo -var _echo = require('./src/echo'); -exports.echo = _echo; // don't common.wrap() as it could parse '-options' - -//@include ./src/dirs -var _dirs = require('./src/dirs').dirs; -exports.dirs = common.wrap("dirs", _dirs); -var _pushd = require('./src/dirs').pushd; -exports.pushd = common.wrap('pushd', _pushd); -var _popd = require('./src/dirs').popd; -exports.popd = common.wrap("popd", _popd); - -//@include ./src/ln -var _ln = require('./src/ln'); -exports.ln = common.wrap('ln', _ln); - -//@ -//@ ### exit(code) -//@ Exits the current process with the given exit code. -exports.exit = process.exit; - -//@ -//@ ### env['VAR_NAME'] -//@ Object containing environment variables (both getter and setter). Shortcut to process.env. -exports.env = process.env; - -//@include ./src/exec -var _exec = require('./src/exec'); -exports.exec = common.wrap('exec', _exec, {notUnix:true}); - -//@include ./src/chmod -var _chmod = require('./src/chmod'); -exports.chmod = common.wrap('chmod', _chmod); - - - -//@ -//@ ## Non-Unix commands -//@ - -//@include ./src/tempdir -var _tempDir = require('./src/tempdir'); -exports.tempdir = common.wrap('tempdir', _tempDir); - - -//@include ./src/error -var _error = require('./src/error'); -exports.error = _error; - - - -//@ -//@ ## Configuration -//@ - -exports.config = common.config; - -//@ -//@ ### config.silent -//@ Example: -//@ -//@ ```javascript -//@ var silentState = config.silent; // save old silent state -//@ config.silent = true; -//@ /* ... */ -//@ config.silent = silentState; // restore old silent state -//@ ``` -//@ -//@ Suppresses all command output if `true`, except for `echo()` calls. -//@ Default is `false`. - -//@ -//@ ### config.fatal -//@ Example: -//@ -//@ ```javascript -//@ config.fatal = true; -//@ cp('this_file_does_not_exist', '/dev/null'); // dies here -//@ /* more commands... */ -//@ ``` -//@ -//@ If `true` the script will die on errors. Default is `false`. diff --git a/node_modules/shelljs/src/cat.js b/node_modules/shelljs/src/cat.js deleted file mode 100644 index f6f4d254..00000000 --- a/node_modules/shelljs/src/cat.js +++ /dev/null @@ -1,43 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -//@ -//@ ### cat(file [, file ...]) -//@ ### cat(file_array) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var str = cat('file*.txt'); -//@ var str = cat('file1', 'file2'); -//@ var str = cat(['file1', 'file2']); // same as above -//@ ``` -//@ -//@ Returns a string containing the given file, or a concatenated string -//@ containing the files if more than one file is given (a new line character is -//@ introduced between each file). Wildcard `*` accepted. -function _cat(options, files) { - var cat = ''; - - if (!files) - common.error('no paths given'); - - if (typeof files === 'string') - files = [].slice.call(arguments, 1); - // if it's array leave it as it is - - files = common.expand(files); - - files.forEach(function(file) { - if (!fs.existsSync(file)) - common.error('no such file or directory: ' + file); - - cat += fs.readFileSync(file, 'utf8') + '\n'; - }); - - if (cat[cat.length-1] === '\n') - cat = cat.substring(0, cat.length-1); - - return common.ShellString(cat); -} -module.exports = _cat; diff --git a/node_modules/shelljs/src/cd.js b/node_modules/shelljs/src/cd.js deleted file mode 100644 index 230f4326..00000000 --- a/node_modules/shelljs/src/cd.js +++ /dev/null @@ -1,19 +0,0 @@ -var fs = require('fs'); -var common = require('./common'); - -//@ -//@ ### cd('dir') -//@ Changes to directory `dir` for the duration of the script -function _cd(options, dir) { - if (!dir) - common.error('directory not specified'); - - if (!fs.existsSync(dir)) - common.error('no such file or directory: ' + dir); - - if (!fs.statSync(dir).isDirectory()) - common.error('not a directory: ' + dir); - - process.chdir(dir); -} -module.exports = _cd; diff --git a/node_modules/shelljs/src/chmod.js b/node_modules/shelljs/src/chmod.js deleted file mode 100644 index f2888930..00000000 --- a/node_modules/shelljs/src/chmod.js +++ /dev/null @@ -1,208 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); -var path = require('path'); - -var PERMS = (function (base) { - return { - OTHER_EXEC : base.EXEC, - OTHER_WRITE : base.WRITE, - OTHER_READ : base.READ, - - GROUP_EXEC : base.EXEC << 3, - GROUP_WRITE : base.WRITE << 3, - GROUP_READ : base.READ << 3, - - OWNER_EXEC : base.EXEC << 6, - OWNER_WRITE : base.WRITE << 6, - OWNER_READ : base.READ << 6, - - // Literal octal numbers are apparently not allowed in "strict" javascript. Using parseInt is - // the preferred way, else a jshint warning is thrown. - STICKY : parseInt('01000', 8), - SETGID : parseInt('02000', 8), - SETUID : parseInt('04000', 8), - - TYPE_MASK : parseInt('0770000', 8) - }; -})({ - EXEC : 1, - WRITE : 2, - READ : 4 -}); - -//@ -//@ ### chmod(octal_mode || octal_string, file) -//@ ### chmod(symbolic_mode, file) -//@ -//@ Available options: -//@ -//@ + `-v`: output a diagnostic for every file processed//@ -//@ + `-c`: like verbose but report only when a change is made//@ -//@ + `-R`: change files and directories recursively//@ -//@ -//@ Examples: -//@ -//@ ```javascript -//@ chmod(755, '/Users/brandon'); -//@ chmod('755', '/Users/brandon'); // same as above -//@ chmod('u+x', '/Users/brandon'); -//@ ``` -//@ -//@ Alters the permissions of a file or directory by either specifying the -//@ absolute permissions in octal form or expressing the changes in symbols. -//@ This command tries to mimic the POSIX behavior as much as possible. -//@ Notable exceptions: -//@ -//@ + In symbolic modes, 'a-r' and '-r' are identical. No consideration is -//@ given to the umask. -//@ + There is no "quiet" option since default behavior is to run silent. -function _chmod(options, mode, filePattern) { - if (!filePattern) { - if (options.length > 0 && options.charAt(0) === '-') { - // Special case where the specified file permissions started with - to subtract perms, which - // get picked up by the option parser as command flags. - // If we are down by one argument and options starts with -, shift everything over. - filePattern = mode; - mode = options; - options = ''; - } - else { - common.error('You must specify a file.'); - } - } - - options = common.parseOptions(options, { - 'R': 'recursive', - 'c': 'changes', - 'v': 'verbose' - }); - - if (typeof filePattern === 'string') { - filePattern = [ filePattern ]; - } - - var files; - - if (options.recursive) { - files = []; - common.expand(filePattern).forEach(function addFile(expandedFile) { - var stat = fs.lstatSync(expandedFile); - - if (!stat.isSymbolicLink()) { - files.push(expandedFile); - - if (stat.isDirectory()) { // intentionally does not follow symlinks. - fs.readdirSync(expandedFile).forEach(function (child) { - addFile(expandedFile + '/' + child); - }); - } - } - }); - } - else { - files = common.expand(filePattern); - } - - files.forEach(function innerChmod(file) { - file = path.resolve(file); - if (!fs.existsSync(file)) { - common.error('File not found: ' + file); - } - - // When recursing, don't follow symlinks. - if (options.recursive && fs.lstatSync(file).isSymbolicLink()) { - return; - } - - var perms = fs.statSync(file).mode; - var type = perms & PERMS.TYPE_MASK; - - var newPerms = perms; - - if (isNaN(parseInt(mode, 8))) { - // parse options - mode.split(',').forEach(function (symbolicMode) { - /*jshint regexdash:true */ - var pattern = /([ugoa]*)([=\+-])([rwxXst]*)/i; - var matches = pattern.exec(symbolicMode); - - if (matches) { - var applyTo = matches[1]; - var operator = matches[2]; - var change = matches[3]; - - var changeOwner = applyTo.indexOf('u') != -1 || applyTo === 'a' || applyTo === ''; - var changeGroup = applyTo.indexOf('g') != -1 || applyTo === 'a' || applyTo === ''; - var changeOther = applyTo.indexOf('o') != -1 || applyTo === 'a' || applyTo === ''; - - var changeRead = change.indexOf('r') != -1; - var changeWrite = change.indexOf('w') != -1; - var changeExec = change.indexOf('x') != -1; - var changeSticky = change.indexOf('t') != -1; - var changeSetuid = change.indexOf('s') != -1; - - var mask = 0; - if (changeOwner) { - mask |= (changeRead ? PERMS.OWNER_READ : 0) + (changeWrite ? PERMS.OWNER_WRITE : 0) + (changeExec ? PERMS.OWNER_EXEC : 0) + (changeSetuid ? PERMS.SETUID : 0); - } - if (changeGroup) { - mask |= (changeRead ? PERMS.GROUP_READ : 0) + (changeWrite ? PERMS.GROUP_WRITE : 0) + (changeExec ? PERMS.GROUP_EXEC : 0) + (changeSetuid ? PERMS.SETGID : 0); - } - if (changeOther) { - mask |= (changeRead ? PERMS.OTHER_READ : 0) + (changeWrite ? PERMS.OTHER_WRITE : 0) + (changeExec ? PERMS.OTHER_EXEC : 0); - } - - // Sticky bit is special - it's not tied to user, group or other. - if (changeSticky) { - mask |= PERMS.STICKY; - } - - switch (operator) { - case '+': - newPerms |= mask; - break; - - case '-': - newPerms &= ~mask; - break; - - case '=': - newPerms = type + mask; - - // According to POSIX, when using = to explicitly set the permissions, setuid and setgid can never be cleared. - if (fs.statSync(file).isDirectory()) { - newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms; - } - break; - } - - if (options.verbose) { - log(file + ' -> ' + newPerms.toString(8)); - } - - if (perms != newPerms) { - if (!options.verbose && options.changes) { - log(file + ' -> ' + newPerms.toString(8)); - } - fs.chmodSync(file, newPerms); - } - } - else { - common.error('Invalid symbolic mode change: ' + symbolicMode); - } - }); - } - else { - // they gave us a full number - newPerms = type + parseInt(mode, 8); - - // POSIX rules are that setuid and setgid can only be added using numeric form, but not cleared. - if (fs.statSync(file).isDirectory()) { - newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms; - } - - fs.chmodSync(file, newPerms); - } - }); -} -module.exports = _chmod; diff --git a/node_modules/shelljs/src/common.js b/node_modules/shelljs/src/common.js deleted file mode 100644 index d8c23129..00000000 --- a/node_modules/shelljs/src/common.js +++ /dev/null @@ -1,203 +0,0 @@ -var os = require('os'); -var fs = require('fs'); -var _ls = require('./ls'); - -// Module globals -var config = { - silent: false, - fatal: false -}; -exports.config = config; - -var state = { - error: null, - currentCmd: 'shell.js', - tempDir: null -}; -exports.state = state; - -var platform = os.type().match(/^Win/) ? 'win' : 'unix'; -exports.platform = platform; - -function log() { - if (!config.silent) - console.log.apply(this, arguments); -} -exports.log = log; - -// Shows error message. Throws unless _continue or config.fatal are true -function error(msg, _continue) { - if (state.error === null) - state.error = ''; - state.error += state.currentCmd + ': ' + msg + '\n'; - - if (msg.length > 0) - log(state.error); - - if (config.fatal) - process.exit(1); - - if (!_continue) - throw ''; -} -exports.error = error; - -// In the future, when Proxies are default, we can add methods like `.to()` to primitive strings. -// For now, this is a dummy function to bookmark places we need such strings -function ShellString(str) { - return str; -} -exports.ShellString = ShellString; - -// Returns {'alice': true, 'bob': false} when passed a dictionary, e.g.: -// parseOptions('-a', {'a':'alice', 'b':'bob'}); -function parseOptions(str, map) { - if (!map) - error('parseOptions() internal error: no map given'); - - // All options are false by default - var options = {}; - for (var letter in map) - options[map[letter]] = false; - - if (!str) - return options; // defaults - - if (typeof str !== 'string') - error('parseOptions() internal error: wrong str'); - - // e.g. match[1] = 'Rf' for str = '-Rf' - var match = str.match(/^\-(.+)/); - if (!match) - return options; - - // e.g. chars = ['R', 'f'] - var chars = match[1].split(''); - - chars.forEach(function(c) { - if (c in map) - options[map[c]] = true; - else - error('option not recognized: '+c); - }); - - return options; -} -exports.parseOptions = parseOptions; - -// Expands wildcards with matching (ie. existing) file names. -// For example: -// expand(['file*.js']) = ['file1.js', 'file2.js', ...] -// (if the files 'file1.js', 'file2.js', etc, exist in the current dir) -function expand(list) { - var expanded = []; - list.forEach(function(listEl) { - // Wildcard present on directory names ? - if(listEl.search(/\*[^\/]*\//) > -1 || listEl.search(/\*\*[^\/]*\//) > -1) { - var match = listEl.match(/^([^*]+\/|)(.*)/); - var root = match[1]; - var rest = match[2]; - var restRegex = rest.replace(/\*\*/g, ".*").replace(/\*/g, "[^\\/]*"); - restRegex = new RegExp(restRegex); - - _ls('-R', root).filter(function (e) { - return restRegex.test(e); - }).forEach(function(file) { - expanded.push(file); - }); - } - // Wildcard present on file names ? - else if (listEl.search(/\*/) > -1) { - _ls('', listEl).forEach(function(file) { - expanded.push(file); - }); - } else { - expanded.push(listEl); - } - }); - return expanded; -} -exports.expand = expand; - -// Normalizes _unlinkSync() across platforms to match Unix behavior, i.e. -// file can be unlinked even if it's read-only, see https://github.com/joyent/node/issues/3006 -function unlinkSync(file) { - try { - fs.unlinkSync(file); - } catch(e) { - // Try to override file permission - if (e.code === 'EPERM') { - fs.chmodSync(file, '0666'); - fs.unlinkSync(file); - } else { - throw e; - } - } -} -exports.unlinkSync = unlinkSync; - -// e.g. 'shelljs_a5f185d0443ca...' -function randomFileName() { - function randomHash(count) { - if (count === 1) - return parseInt(16*Math.random(), 10).toString(16); - else { - var hash = ''; - for (var i=0; i and/or '); - } else if (arguments.length > 3) { - sources = [].slice.call(arguments, 1, arguments.length - 1); - dest = arguments[arguments.length - 1]; - } else if (typeof sources === 'string') { - sources = [sources]; - } else if ('length' in sources) { - sources = sources; // no-op for array - } else { - common.error('invalid arguments'); - } - - var exists = fs.existsSync(dest), - stats = exists && fs.statSync(dest); - - // Dest is not existing dir, but multiple sources given - if ((!exists || !stats.isDirectory()) && sources.length > 1) - common.error('dest is not a directory (too many sources)'); - - // Dest is an existing file, but no -f given - if (exists && stats.isFile() && !options.force) - common.error('dest file already exists: ' + dest); - - if (options.recursive) { - // Recursive allows the shortcut syntax "sourcedir/" for "sourcedir/*" - // (see Github issue #15) - sources.forEach(function(src, i) { - if (src[src.length - 1] === '/') - sources[i] += '*'; - }); - - // Create dest - try { - fs.mkdirSync(dest, parseInt('0777', 8)); - } catch (e) { - // like Unix's cp, keep going even if we can't create dest dir - } - } - - sources = common.expand(sources); - - sources.forEach(function(src) { - if (!fs.existsSync(src)) { - common.error('no such file or directory: '+src, true); - return; // skip file - } - - // If here, src exists - if (fs.statSync(src).isDirectory()) { - if (!options.recursive) { - // Non-Recursive - common.log(src + ' is a directory (not copied)'); - } else { - // Recursive - // 'cp /a/source dest' should create 'source' in 'dest' - var newDest = path.join(dest, path.basename(src)), - checkDir = fs.statSync(src); - try { - fs.mkdirSync(newDest, checkDir.mode); - } catch (e) { - //if the directory already exists, that's okay - if (e.code !== 'EEXIST') throw e; - } - - cpdirSyncRecursive(src, newDest, {force: options.force}); - } - return; // done with dir - } - - // If here, src is a file - - // When copying to '/path/dir': - // thisDest = '/path/dir/file1' - var thisDest = dest; - if (fs.existsSync(dest) && fs.statSync(dest).isDirectory()) - thisDest = path.normalize(dest + '/' + path.basename(src)); - - if (fs.existsSync(thisDest) && !options.force) { - common.error('dest file already exists: ' + thisDest, true); - return; // skip file - } - - copyFileSync(src, thisDest); - }); // forEach(src) -} -module.exports = _cp; diff --git a/node_modules/shelljs/src/dirs.js b/node_modules/shelljs/src/dirs.js deleted file mode 100644 index 58fae8b3..00000000 --- a/node_modules/shelljs/src/dirs.js +++ /dev/null @@ -1,191 +0,0 @@ -var common = require('./common'); -var _cd = require('./cd'); -var path = require('path'); - -// Pushd/popd/dirs internals -var _dirStack = []; - -function _isStackIndex(index) { - return (/^[\-+]\d+$/).test(index); -} - -function _parseStackIndex(index) { - if (_isStackIndex(index)) { - if (Math.abs(index) < _dirStack.length + 1) { // +1 for pwd - return (/^-/).test(index) ? Number(index) - 1 : Number(index); - } else { - common.error(index + ': directory stack index out of range'); - } - } else { - common.error(index + ': invalid number'); - } -} - -function _actualDirStack() { - return [process.cwd()].concat(_dirStack); -} - -//@ -//@ ### pushd([options,] [dir | '-N' | '+N']) -//@ -//@ Available options: -//@ -//@ + `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. -//@ -//@ Arguments: -//@ -//@ + `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`. -//@ + `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. -//@ + `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. -//@ -//@ Examples: -//@ -//@ ```javascript -//@ // process.cwd() === '/usr' -//@ pushd('/etc'); // Returns /etc /usr -//@ pushd('+1'); // Returns /usr /etc -//@ ``` -//@ -//@ Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack. -function _pushd(options, dir) { - if (_isStackIndex(options)) { - dir = options; - options = ''; - } - - options = common.parseOptions(options, { - 'n' : 'no-cd' - }); - - var dirs = _actualDirStack(); - - if (dir === '+0') { - return dirs; // +0 is a noop - } else if (!dir) { - if (dirs.length > 1) { - dirs = dirs.splice(1, 1).concat(dirs); - } else { - return common.error('no other directory'); - } - } else if (_isStackIndex(dir)) { - var n = _parseStackIndex(dir); - dirs = dirs.slice(n).concat(dirs.slice(0, n)); - } else { - if (options['no-cd']) { - dirs.splice(1, 0, dir); - } else { - dirs.unshift(dir); - } - } - - if (options['no-cd']) { - dirs = dirs.slice(1); - } else { - dir = path.resolve(dirs.shift()); - _cd('', dir); - } - - _dirStack = dirs; - return _dirs(''); -} -exports.pushd = _pushd; - -//@ -//@ ### popd([options,] ['-N' | '+N']) -//@ -//@ Available options: -//@ -//@ + `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. -//@ -//@ Arguments: -//@ -//@ + `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero. -//@ + `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero. -//@ -//@ Examples: -//@ -//@ ```javascript -//@ echo(process.cwd()); // '/usr' -//@ pushd('/etc'); // '/etc /usr' -//@ echo(process.cwd()); // '/etc' -//@ popd(); // '/usr' -//@ echo(process.cwd()); // '/usr' -//@ ``` -//@ -//@ When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack. -function _popd(options, index) { - if (_isStackIndex(options)) { - index = options; - options = ''; - } - - options = common.parseOptions(options, { - 'n' : 'no-cd' - }); - - if (!_dirStack.length) { - return common.error('directory stack empty'); - } - - index = _parseStackIndex(index || '+0'); - - if (options['no-cd'] || index > 0 || _dirStack.length + index === 0) { - index = index > 0 ? index - 1 : index; - _dirStack.splice(index, 1); - } else { - var dir = path.resolve(_dirStack.shift()); - _cd('', dir); - } - - return _dirs(''); -} -exports.popd = _popd; - -//@ -//@ ### dirs([options | '+N' | '-N']) -//@ -//@ Available options: -//@ -//@ + `-c`: Clears the directory stack by deleting all of the elements. -//@ -//@ Arguments: -//@ -//@ + `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero. -//@ + `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero. -//@ -//@ Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified. -//@ -//@ See also: pushd, popd -function _dirs(options, index) { - if (_isStackIndex(options)) { - index = options; - options = ''; - } - - options = common.parseOptions(options, { - 'c' : 'clear' - }); - - if (options['clear']) { - _dirStack = []; - return _dirStack; - } - - var stack = _actualDirStack(); - - if (index) { - index = _parseStackIndex(index); - - if (index < 0) { - index = stack.length + index; - } - - common.log(stack[index]); - return stack[index]; - } - - common.log(stack.join(' ')); - - return stack; -} -exports.dirs = _dirs; diff --git a/node_modules/shelljs/src/echo.js b/node_modules/shelljs/src/echo.js deleted file mode 100644 index 760ea840..00000000 --- a/node_modules/shelljs/src/echo.js +++ /dev/null @@ -1,20 +0,0 @@ -var common = require('./common'); - -//@ -//@ ### echo(string [,string ...]) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ echo('hello world'); -//@ var str = echo('hello world'); -//@ ``` -//@ -//@ Prints string to stdout, and returns string with additional utility methods -//@ like `.to()`. -function _echo() { - var messages = [].slice.call(arguments, 0); - console.log.apply(this, messages); - return common.ShellString(messages.join(' ')); -} -module.exports = _echo; diff --git a/node_modules/shelljs/src/error.js b/node_modules/shelljs/src/error.js deleted file mode 100644 index cca3efb6..00000000 --- a/node_modules/shelljs/src/error.js +++ /dev/null @@ -1,10 +0,0 @@ -var common = require('./common'); - -//@ -//@ ### error() -//@ Tests if error occurred in the last command. Returns `null` if no error occurred, -//@ otherwise returns string explaining the error -function error() { - return common.state.error; -}; -module.exports = error; diff --git a/node_modules/shelljs/src/exec.js b/node_modules/shelljs/src/exec.js deleted file mode 100644 index 7ccdbc00..00000000 --- a/node_modules/shelljs/src/exec.js +++ /dev/null @@ -1,181 +0,0 @@ -var common = require('./common'); -var _tempDir = require('./tempdir'); -var _pwd = require('./pwd'); -var path = require('path'); -var fs = require('fs'); -var child = require('child_process'); - -// Hack to run child_process.exec() synchronously (sync avoids callback hell) -// Uses a custom wait loop that checks for a flag file, created when the child process is done. -// (Can't do a wait loop that checks for internal Node variables/messages as -// Node is single-threaded; callbacks and other internal state changes are done in the -// event loop). -function execSync(cmd, opts) { - var tempDir = _tempDir(); - var stdoutFile = path.resolve(tempDir+'/'+common.randomFileName()), - codeFile = path.resolve(tempDir+'/'+common.randomFileName()), - scriptFile = path.resolve(tempDir+'/'+common.randomFileName()), - sleepFile = path.resolve(tempDir+'/'+common.randomFileName()); - - var options = common.extend({ - silent: common.config.silent - }, opts); - - var previousStdoutContent = ''; - // Echoes stdout changes from running process, if not silent - function updateStdout() { - if (options.silent || !fs.existsSync(stdoutFile)) - return; - - var stdoutContent = fs.readFileSync(stdoutFile, 'utf8'); - // No changes since last time? - if (stdoutContent.length <= previousStdoutContent.length) - return; - - process.stdout.write(stdoutContent.substr(previousStdoutContent.length)); - previousStdoutContent = stdoutContent; - } - - function escape(str) { - return (str+'').replace(/([\\"'])/g, "\\$1").replace(/\0/g, "\\0"); - } - - cmd += ' > '+stdoutFile+' 2>&1'; // works on both win/unix - - var script = - "var child = require('child_process')," + - " fs = require('fs');" + - "child.exec('"+escape(cmd)+"', {env: process.env, maxBuffer: 20*1024*1024}, function(err) {" + - " fs.writeFileSync('"+escape(codeFile)+"', err ? err.code.toString() : '0');" + - "});"; - - if (fs.existsSync(scriptFile)) common.unlinkSync(scriptFile); - if (fs.existsSync(stdoutFile)) common.unlinkSync(stdoutFile); - if (fs.existsSync(codeFile)) common.unlinkSync(codeFile); - - fs.writeFileSync(scriptFile, script); - child.exec('"'+process.execPath+'" '+scriptFile, { - env: process.env, - cwd: _pwd(), - maxBuffer: 20*1024*1024 - }); - - // The wait loop - // sleepFile is used as a dummy I/O op to mitigate unnecessary CPU usage - // (tried many I/O sync ops, writeFileSync() seems to be only one that is effective in reducing - // CPU usage, though apparently not so much on Windows) - while (!fs.existsSync(codeFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); } - while (!fs.existsSync(stdoutFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); } - - // At this point codeFile exists, but it's not necessarily flushed yet. - // Keep reading it until it is. - var code = parseInt('', 10); - while (isNaN(code)) { - code = parseInt(fs.readFileSync(codeFile, 'utf8'), 10); - } - - var stdout = fs.readFileSync(stdoutFile, 'utf8'); - - // No biggie if we can't erase the files now -- they're in a temp dir anyway - try { common.unlinkSync(scriptFile); } catch(e) {} - try { common.unlinkSync(stdoutFile); } catch(e) {} - try { common.unlinkSync(codeFile); } catch(e) {} - try { common.unlinkSync(sleepFile); } catch(e) {} - - // some shell return codes are defined as errors, per http://tldp.org/LDP/abs/html/exitcodes.html - if (code === 1 || code === 2 || code >= 126) { - common.error('', true); // unix/shell doesn't really give an error message after non-zero exit codes - } - // True if successful, false if not - var obj = { - code: code, - output: stdout - }; - return obj; -} // execSync() - -// Wrapper around exec() to enable echoing output to console in real time -function execAsync(cmd, opts, callback) { - var output = ''; - - var options = common.extend({ - silent: common.config.silent - }, opts); - - var c = child.exec(cmd, {env: process.env, maxBuffer: 20*1024*1024}, function(err) { - if (callback) - callback(err ? err.code : 0, output); - }); - - c.stdout.on('data', function(data) { - output += data; - if (!options.silent) - process.stdout.write(data); - }); - - c.stderr.on('data', function(data) { - output += data; - if (!options.silent) - process.stdout.write(data); - }); - - return c; -} - -//@ -//@ ### exec(command [, options] [, callback]) -//@ Available options (all `false` by default): -//@ -//@ + `async`: Asynchronous execution. Defaults to true if a callback is provided. -//@ + `silent`: Do not echo program output to console. -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var version = exec('node --version', {silent:true}).output; -//@ -//@ var child = exec('some_long_running_process', {async:true}); -//@ child.stdout.on('data', function(data) { -//@ /* ... do something with data ... */ -//@ }); -//@ -//@ exec('some_long_running_process', function(code, output) { -//@ console.log('Exit code:', code); -//@ console.log('Program output:', output); -//@ }); -//@ ``` -//@ -//@ Executes the given `command` _synchronously_, unless otherwise specified. -//@ When in synchronous mode returns the object `{ code:..., output:... }`, containing the program's -//@ `output` (stdout + stderr) and its exit `code`. Otherwise returns the child process object, and -//@ the `callback` gets the arguments `(code, output)`. -//@ -//@ **Note:** For long-lived processes, it's best to run `exec()` asynchronously as -//@ the current synchronous implementation uses a lot of CPU. This should be getting -//@ fixed soon. -function _exec(command, options, callback) { - if (!command) - common.error('must specify command'); - - // Callback is defined instead of options. - if (typeof options === 'function') { - callback = options; - options = { async: true }; - } - - // Callback is defined with options. - if (typeof options === 'object' && typeof callback === 'function') { - options.async = true; - } - - options = common.extend({ - silent: common.config.silent, - async: false - }, options); - - if (options.async) - return execAsync(command, options, callback); - else - return execSync(command, options); -} -module.exports = _exec; diff --git a/node_modules/shelljs/src/find.js b/node_modules/shelljs/src/find.js deleted file mode 100644 index d9eeec26..00000000 --- a/node_modules/shelljs/src/find.js +++ /dev/null @@ -1,51 +0,0 @@ -var fs = require('fs'); -var common = require('./common'); -var _ls = require('./ls'); - -//@ -//@ ### find(path [,path ...]) -//@ ### find(path_array) -//@ Examples: -//@ -//@ ```javascript -//@ find('src', 'lib'); -//@ find(['src', 'lib']); // same as above -//@ find('.').filter(function(file) { return file.match(/\.js$/); }); -//@ ``` -//@ -//@ Returns array of all files (however deep) in the given paths. -//@ -//@ The main difference from `ls('-R', path)` is that the resulting file names -//@ include the base directories, e.g. `lib/resources/file1` instead of just `file1`. -function _find(options, paths) { - if (!paths) - common.error('no path specified'); - else if (typeof paths === 'object') - paths = paths; // assume array - else if (typeof paths === 'string') - paths = [].slice.call(arguments, 1); - - var list = []; - - function pushFile(file) { - if (common.platform === 'win') - file = file.replace(/\\/g, '/'); - list.push(file); - } - - // why not simply do ls('-R', paths)? because the output wouldn't give the base dirs - // to get the base dir in the output, we need instead ls('-R', 'dir/*') for every directory - - paths.forEach(function(file) { - pushFile(file); - - if (fs.statSync(file).isDirectory()) { - _ls('-RA', file+'/*').forEach(function(subfile) { - pushFile(subfile); - }); - } - }); - - return list; -} -module.exports = _find; diff --git a/node_modules/shelljs/src/grep.js b/node_modules/shelljs/src/grep.js deleted file mode 100644 index 00c7d6a4..00000000 --- a/node_modules/shelljs/src/grep.js +++ /dev/null @@ -1,52 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -//@ -//@ ### grep([options ,] regex_filter, file [, file ...]) -//@ ### grep([options ,] regex_filter, file_array) -//@ Available options: -//@ -//@ + `-v`: Inverse the sense of the regex and print the lines not matching the criteria. -//@ -//@ Examples: -//@ -//@ ```javascript -//@ grep('-v', 'GLOBAL_VARIABLE', '*.js'); -//@ grep('GLOBAL_VARIABLE', '*.js'); -//@ ``` -//@ -//@ Reads input string from given files and returns a string containing all lines of the -//@ file that match the given `regex_filter`. Wildcard `*` accepted. -function _grep(options, regex, files) { - options = common.parseOptions(options, { - 'v': 'inverse' - }); - - if (!files) - common.error('no paths given'); - - if (typeof files === 'string') - files = [].slice.call(arguments, 2); - // if it's array leave it as it is - - files = common.expand(files); - - var grep = ''; - files.forEach(function(file) { - if (!fs.existsSync(file)) { - common.error('no such file or directory: ' + file, true); - return; - } - - var contents = fs.readFileSync(file, 'utf8'), - lines = contents.split(/\r*\n/); - lines.forEach(function(line) { - var matched = line.match(regex); - if ((options.inverse && !matched) || (!options.inverse && matched)) - grep += line + '\n'; - }); - }); - - return common.ShellString(grep); -} -module.exports = _grep; diff --git a/node_modules/shelljs/src/ln.js b/node_modules/shelljs/src/ln.js deleted file mode 100644 index a7b9701b..00000000 --- a/node_modules/shelljs/src/ln.js +++ /dev/null @@ -1,53 +0,0 @@ -var fs = require('fs'); -var path = require('path'); -var common = require('./common'); -var os = require('os'); - -//@ -//@ ### ln(options, source, dest) -//@ ### ln(source, dest) -//@ Available options: -//@ -//@ + `s`: symlink -//@ + `f`: force -//@ -//@ Examples: -//@ -//@ ```javascript -//@ ln('file', 'newlink'); -//@ ln('-sf', 'file', 'existing'); -//@ ``` -//@ -//@ Links source to dest. Use -f to force the link, should dest already exist. -function _ln(options, source, dest) { - options = common.parseOptions(options, { - 's': 'symlink', - 'f': 'force' - }); - - if (!source || !dest) { - common.error('Missing and/or '); - } - - source = path.resolve(process.cwd(), String(source)); - dest = path.resolve(process.cwd(), String(dest)); - - if (!fs.existsSync(source)) { - common.error('Source file does not exist', true); - } - - if (fs.existsSync(dest)) { - if (!options.force) { - common.error('Destination file exists', true); - } - - fs.unlinkSync(dest); - } - - if (options.symlink) { - fs.symlinkSync(source, dest, os.platform() === "win32" ? "junction" : null); - } else { - fs.linkSync(source, dest, os.platform() === "win32" ? "junction" : null); - } -} -module.exports = _ln; diff --git a/node_modules/shelljs/src/ls.js b/node_modules/shelljs/src/ls.js deleted file mode 100644 index 3345db44..00000000 --- a/node_modules/shelljs/src/ls.js +++ /dev/null @@ -1,126 +0,0 @@ -var path = require('path'); -var fs = require('fs'); -var common = require('./common'); -var _cd = require('./cd'); -var _pwd = require('./pwd'); - -//@ -//@ ### ls([options ,] path [,path ...]) -//@ ### ls([options ,] path_array) -//@ Available options: -//@ -//@ + `-R`: recursive -//@ + `-A`: all files (include files beginning with `.`, except for `.` and `..`) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ ls('projs/*.js'); -//@ ls('-R', '/users/me', '/tmp'); -//@ ls('-R', ['/users/me', '/tmp']); // same as above -//@ ``` -//@ -//@ Returns array of files in the given path, or in current directory if no path provided. -function _ls(options, paths) { - options = common.parseOptions(options, { - 'R': 'recursive', - 'A': 'all', - 'a': 'all_deprecated' - }); - - if (options.all_deprecated) { - // We won't support the -a option as it's hard to image why it's useful - // (it includes '.' and '..' in addition to '.*' files) - // For backwards compatibility we'll dump a deprecated message and proceed as before - common.log('ls: Option -a is deprecated. Use -A instead'); - options.all = true; - } - - if (!paths) - paths = ['.']; - else if (typeof paths === 'object') - paths = paths; // assume array - else if (typeof paths === 'string') - paths = [].slice.call(arguments, 1); - - var list = []; - - // Conditionally pushes file to list - returns true if pushed, false otherwise - // (e.g. prevents hidden files to be included unless explicitly told so) - function pushFile(file, query) { - // hidden file? - if (path.basename(file)[0] === '.') { - // not explicitly asking for hidden files? - if (!options.all && !(path.basename(query)[0] === '.' && path.basename(query).length > 1)) - return false; - } - - if (common.platform === 'win') - file = file.replace(/\\/g, '/'); - - list.push(file); - return true; - } - - paths.forEach(function(p) { - if (fs.existsSync(p)) { - var stats = fs.statSync(p); - // Simple file? - if (stats.isFile()) { - pushFile(p, p); - return; // continue - } - - // Simple dir? - if (stats.isDirectory()) { - // Iterate over p contents - fs.readdirSync(p).forEach(function(file) { - if (!pushFile(file, p)) - return; - - // Recursive? - if (options.recursive) { - var oldDir = _pwd(); - _cd('', p); - if (fs.statSync(file).isDirectory()) - list = list.concat(_ls('-R'+(options.all?'A':''), file+'/*')); - _cd('', oldDir); - } - }); - return; // continue - } - } - - // p does not exist - possible wildcard present - - var basename = path.basename(p); - var dirname = path.dirname(p); - // Wildcard present on an existing dir? (e.g. '/tmp/*.js') - if (basename.search(/\*/) > -1 && fs.existsSync(dirname) && fs.statSync(dirname).isDirectory) { - // Escape special regular expression chars - var regexp = basename.replace(/(\^|\$|\(|\)|<|>|\[|\]|\{|\}|\.|\+|\?)/g, '\\$1'); - // Translates wildcard into regex - regexp = '^' + regexp.replace(/\*/g, '.*') + '$'; - // Iterate over directory contents - fs.readdirSync(dirname).forEach(function(file) { - if (file.match(new RegExp(regexp))) { - if (!pushFile(path.normalize(dirname+'/'+file), basename)) - return; - - // Recursive? - if (options.recursive) { - var pp = dirname + '/' + file; - if (fs.lstatSync(pp).isDirectory()) - list = list.concat(_ls('-R'+(options.all?'A':''), pp+'/*')); - } // recursive - } // if file matches - }); // forEach - return; - } - - common.error('no such file or directory: ' + p, true); - }); - - return list; -} -module.exports = _ls; diff --git a/node_modules/shelljs/src/mkdir.js b/node_modules/shelljs/src/mkdir.js deleted file mode 100644 index 5a7088f2..00000000 --- a/node_modules/shelljs/src/mkdir.js +++ /dev/null @@ -1,68 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); -var path = require('path'); - -// Recursively creates 'dir' -function mkdirSyncRecursive(dir) { - var baseDir = path.dirname(dir); - - // Base dir exists, no recursion necessary - if (fs.existsSync(baseDir)) { - fs.mkdirSync(dir, parseInt('0777', 8)); - return; - } - - // Base dir does not exist, go recursive - mkdirSyncRecursive(baseDir); - - // Base dir created, can create dir - fs.mkdirSync(dir, parseInt('0777', 8)); -} - -//@ -//@ ### mkdir([options ,] dir [, dir ...]) -//@ ### mkdir([options ,] dir_array) -//@ Available options: -//@ -//@ + `p`: full path (will create intermediate dirs if necessary) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g'); -//@ mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above -//@ ``` -//@ -//@ Creates directories. -function _mkdir(options, dirs) { - options = common.parseOptions(options, { - 'p': 'fullpath' - }); - if (!dirs) - common.error('no paths given'); - - if (typeof dirs === 'string') - dirs = [].slice.call(arguments, 1); - // if it's array leave it as it is - - dirs.forEach(function(dir) { - if (fs.existsSync(dir)) { - if (!options.fullpath) - common.error('path already exists: ' + dir, true); - return; // skip dir - } - - // Base dir does not exist, and no -p option given - var baseDir = path.dirname(dir); - if (!fs.existsSync(baseDir) && !options.fullpath) { - common.error('no such file or directory: ' + baseDir, true); - return; // skip dir - } - - if (options.fullpath) - mkdirSyncRecursive(dir); - else - fs.mkdirSync(dir, parseInt('0777', 8)); - }); -} // mkdir -module.exports = _mkdir; diff --git a/node_modules/shelljs/src/mv.js b/node_modules/shelljs/src/mv.js deleted file mode 100644 index 11f96071..00000000 --- a/node_modules/shelljs/src/mv.js +++ /dev/null @@ -1,80 +0,0 @@ -var fs = require('fs'); -var path = require('path'); -var common = require('./common'); - -//@ -//@ ### mv(source [, source ...], dest') -//@ ### mv(source_array, dest') -//@ Available options: -//@ -//@ + `f`: force -//@ -//@ Examples: -//@ -//@ ```javascript -//@ mv('-f', 'file', 'dir/'); -//@ mv('file1', 'file2', 'dir/'); -//@ mv(['file1', 'file2'], 'dir/'); // same as above -//@ ``` -//@ -//@ Moves files. The wildcard `*` is accepted. -function _mv(options, sources, dest) { - options = common.parseOptions(options, { - 'f': 'force' - }); - - // Get sources, dest - if (arguments.length < 3) { - common.error('missing and/or '); - } else if (arguments.length > 3) { - sources = [].slice.call(arguments, 1, arguments.length - 1); - dest = arguments[arguments.length - 1]; - } else if (typeof sources === 'string') { - sources = [sources]; - } else if ('length' in sources) { - sources = sources; // no-op for array - } else { - common.error('invalid arguments'); - } - - sources = common.expand(sources); - - var exists = fs.existsSync(dest), - stats = exists && fs.statSync(dest); - - // Dest is not existing dir, but multiple sources given - if ((!exists || !stats.isDirectory()) && sources.length > 1) - common.error('dest is not a directory (too many sources)'); - - // Dest is an existing file, but no -f given - if (exists && stats.isFile() && !options.force) - common.error('dest file already exists: ' + dest); - - sources.forEach(function(src) { - if (!fs.existsSync(src)) { - common.error('no such file or directory: '+src, true); - return; // skip file - } - - // If here, src exists - - // When copying to '/path/dir': - // thisDest = '/path/dir/file1' - var thisDest = dest; - if (fs.existsSync(dest) && fs.statSync(dest).isDirectory()) - thisDest = path.normalize(dest + '/' + path.basename(src)); - - if (fs.existsSync(thisDest) && !options.force) { - common.error('dest file already exists: ' + thisDest, true); - return; // skip file - } - - if (path.resolve(src) === path.dirname(path.resolve(thisDest))) { - common.error('cannot move to self: '+src, true); - return; // skip file - } - - fs.renameSync(src, thisDest); - }); // forEach(src) -} // mv -module.exports = _mv; diff --git a/node_modules/shelljs/src/popd.js b/node_modules/shelljs/src/popd.js deleted file mode 100644 index 11ea24fa..00000000 --- a/node_modules/shelljs/src/popd.js +++ /dev/null @@ -1 +0,0 @@ -// see dirs.js \ No newline at end of file diff --git a/node_modules/shelljs/src/pushd.js b/node_modules/shelljs/src/pushd.js deleted file mode 100644 index 11ea24fa..00000000 --- a/node_modules/shelljs/src/pushd.js +++ /dev/null @@ -1 +0,0 @@ -// see dirs.js \ No newline at end of file diff --git a/node_modules/shelljs/src/pwd.js b/node_modules/shelljs/src/pwd.js deleted file mode 100644 index 41727bb9..00000000 --- a/node_modules/shelljs/src/pwd.js +++ /dev/null @@ -1,11 +0,0 @@ -var path = require('path'); -var common = require('./common'); - -//@ -//@ ### pwd() -//@ Returns the current directory. -function _pwd(options) { - var pwd = path.resolve(process.cwd()); - return common.ShellString(pwd); -} -module.exports = _pwd; diff --git a/node_modules/shelljs/src/rm.js b/node_modules/shelljs/src/rm.js deleted file mode 100644 index 3abe6e1d..00000000 --- a/node_modules/shelljs/src/rm.js +++ /dev/null @@ -1,145 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -// Recursively removes 'dir' -// Adapted from https://github.com/ryanmcgrath/wrench-js -// -// Copyright (c) 2010 Ryan McGrath -// Copyright (c) 2012 Artur Adib -// -// Licensed under the MIT License -// http://www.opensource.org/licenses/mit-license.php -function rmdirSyncRecursive(dir, force) { - var files; - - files = fs.readdirSync(dir); - - // Loop through and delete everything in the sub-tree after checking it - for(var i = 0; i < files.length; i++) { - var file = dir + "/" + files[i], - currFile = fs.lstatSync(file); - - if(currFile.isDirectory()) { // Recursive function back to the beginning - rmdirSyncRecursive(file, force); - } - - else if(currFile.isSymbolicLink()) { // Unlink symlinks - if (force || isWriteable(file)) { - try { - common.unlinkSync(file); - } catch (e) { - common.error('could not remove file (code '+e.code+'): ' + file, true); - } - } - } - - else // Assume it's a file - perhaps a try/catch belongs here? - if (force || isWriteable(file)) { - try { - common.unlinkSync(file); - } catch (e) { - common.error('could not remove file (code '+e.code+'): ' + file, true); - } - } - } - - // Now that we know everything in the sub-tree has been deleted, we can delete the main directory. - // Huzzah for the shopkeep. - - var result; - try { - result = fs.rmdirSync(dir); - } catch(e) { - common.error('could not remove directory (code '+e.code+'): ' + dir, true); - } - - return result; -} // rmdirSyncRecursive - -// Hack to determine if file has write permissions for current user -// Avoids having to check user, group, etc, but it's probably slow -function isWriteable(file) { - var writePermission = true; - try { - var __fd = fs.openSync(file, 'a'); - fs.closeSync(__fd); - } catch(e) { - writePermission = false; - } - - return writePermission; -} - -//@ -//@ ### rm([options ,] file [, file ...]) -//@ ### rm([options ,] file_array) -//@ Available options: -//@ -//@ + `-f`: force -//@ + `-r, -R`: recursive -//@ -//@ Examples: -//@ -//@ ```javascript -//@ rm('-rf', '/tmp/*'); -//@ rm('some_file.txt', 'another_file.txt'); -//@ rm(['some_file.txt', 'another_file.txt']); // same as above -//@ ``` -//@ -//@ Removes files. The wildcard `*` is accepted. -function _rm(options, files) { - options = common.parseOptions(options, { - 'f': 'force', - 'r': 'recursive', - 'R': 'recursive' - }); - if (!files) - common.error('no paths given'); - - if (typeof files === 'string') - files = [].slice.call(arguments, 1); - // if it's array leave it as it is - - files = common.expand(files); - - files.forEach(function(file) { - if (!fs.existsSync(file)) { - // Path does not exist, no force flag given - if (!options.force) - common.error('no such file or directory: '+file, true); - - return; // skip file - } - - // If here, path exists - - var stats = fs.lstatSync(file); - if (stats.isFile() || stats.isSymbolicLink()) { - - // Do not check for file writing permissions - if (options.force) { - common.unlinkSync(file); - return; - } - - if (isWriteable(file)) - common.unlinkSync(file); - else - common.error('permission denied: '+file, true); - - return; - } // simple file - - // Path is an existing directory, but no -r flag given - if (stats.isDirectory() && !options.recursive) { - common.error('path is a directory', true); - return; // skip path - } - - // Recursively remove existing directory - if (stats.isDirectory() && options.recursive) { - rmdirSyncRecursive(file, options.force); - } - }); // forEach(file) -} // rm -module.exports = _rm; diff --git a/node_modules/shelljs/src/sed.js b/node_modules/shelljs/src/sed.js deleted file mode 100644 index 65f7cb49..00000000 --- a/node_modules/shelljs/src/sed.js +++ /dev/null @@ -1,43 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -//@ -//@ ### sed([options ,] search_regex, replacement, file) -//@ Available options: -//@ -//@ + `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_ -//@ -//@ Examples: -//@ -//@ ```javascript -//@ sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); -//@ sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); -//@ ``` -//@ -//@ Reads an input string from `file` and performs a JavaScript `replace()` on the input -//@ using the given search regex and replacement string or function. Returns the new string after replacement. -function _sed(options, regex, replacement, file) { - options = common.parseOptions(options, { - 'i': 'inplace' - }); - - if (typeof replacement === 'string' || typeof replacement === 'function') - replacement = replacement; // no-op - else if (typeof replacement === 'number') - replacement = replacement.toString(); // fallback - else - common.error('invalid replacement string'); - - if (!file) - common.error('no file given'); - - if (!fs.existsSync(file)) - common.error('no such file or directory: ' + file); - - var result = fs.readFileSync(file, 'utf8').replace(regex, replacement); - if (options.inplace) - fs.writeFileSync(file, result, 'utf8'); - - return common.ShellString(result); -} -module.exports = _sed; diff --git a/node_modules/shelljs/src/tempdir.js b/node_modules/shelljs/src/tempdir.js deleted file mode 100644 index 45953c24..00000000 --- a/node_modules/shelljs/src/tempdir.js +++ /dev/null @@ -1,56 +0,0 @@ -var common = require('./common'); -var os = require('os'); -var fs = require('fs'); - -// Returns false if 'dir' is not a writeable directory, 'dir' otherwise -function writeableDir(dir) { - if (!dir || !fs.existsSync(dir)) - return false; - - if (!fs.statSync(dir).isDirectory()) - return false; - - var testFile = dir+'/'+common.randomFileName(); - try { - fs.writeFileSync(testFile, ' '); - common.unlinkSync(testFile); - return dir; - } catch (e) { - return false; - } -} - - -//@ -//@ ### tempdir() -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var tmp = tempdir(); // "/tmp" for most *nix platforms -//@ ``` -//@ -//@ Searches and returns string containing a writeable, platform-dependent temporary directory. -//@ Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). -function _tempDir() { - var state = common.state; - if (state.tempDir) - return state.tempDir; // from cache - - state.tempDir = writeableDir(os.tempDir && os.tempDir()) || // node 0.8+ - writeableDir(process.env['TMPDIR']) || - writeableDir(process.env['TEMP']) || - writeableDir(process.env['TMP']) || - writeableDir(process.env['Wimp$ScrapDir']) || // RiscOS - writeableDir('C:\\TEMP') || // Windows - writeableDir('C:\\TMP') || // Windows - writeableDir('\\TEMP') || // Windows - writeableDir('\\TMP') || // Windows - writeableDir('/tmp') || - writeableDir('/var/tmp') || - writeableDir('/usr/tmp') || - writeableDir('.'); // last resort - - return state.tempDir; -} -module.exports = _tempDir; diff --git a/node_modules/shelljs/src/test.js b/node_modules/shelljs/src/test.js deleted file mode 100644 index 8a4ac7d4..00000000 --- a/node_modules/shelljs/src/test.js +++ /dev/null @@ -1,85 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -//@ -//@ ### test(expression) -//@ Available expression primaries: -//@ -//@ + `'-b', 'path'`: true if path is a block device -//@ + `'-c', 'path'`: true if path is a character device -//@ + `'-d', 'path'`: true if path is a directory -//@ + `'-e', 'path'`: true if path exists -//@ + `'-f', 'path'`: true if path is a regular file -//@ + `'-L', 'path'`: true if path is a symboilc link -//@ + `'-p', 'path'`: true if path is a pipe (FIFO) -//@ + `'-S', 'path'`: true if path is a socket -//@ -//@ Examples: -//@ -//@ ```javascript -//@ if (test('-d', path)) { /* do something with dir */ }; -//@ if (!test('-f', path)) continue; // skip if it's a regular file -//@ ``` -//@ -//@ Evaluates expression using the available primaries and returns corresponding value. -function _test(options, path) { - if (!path) - common.error('no path given'); - - // hack - only works with unary primaries - options = common.parseOptions(options, { - 'b': 'block', - 'c': 'character', - 'd': 'directory', - 'e': 'exists', - 'f': 'file', - 'L': 'link', - 'p': 'pipe', - 'S': 'socket' - }); - - var canInterpret = false; - for (var key in options) - if (options[key] === true) { - canInterpret = true; - break; - } - - if (!canInterpret) - common.error('could not interpret expression'); - - if (options.link) { - try { - return fs.lstatSync(path).isSymbolicLink(); - } catch(e) { - return false; - } - } - - if (!fs.existsSync(path)) - return false; - - if (options.exists) - return true; - - var stats = fs.statSync(path); - - if (options.block) - return stats.isBlockDevice(); - - if (options.character) - return stats.isCharacterDevice(); - - if (options.directory) - return stats.isDirectory(); - - if (options.file) - return stats.isFile(); - - if (options.pipe) - return stats.isFIFO(); - - if (options.socket) - return stats.isSocket(); -} // test -module.exports = _test; diff --git a/node_modules/shelljs/src/to.js b/node_modules/shelljs/src/to.js deleted file mode 100644 index f0299993..00000000 --- a/node_modules/shelljs/src/to.js +++ /dev/null @@ -1,29 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); -var path = require('path'); - -//@ -//@ ### 'string'.to(file) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ cat('input.txt').to('output.txt'); -//@ ``` -//@ -//@ Analogous to the redirection operator `>` in Unix, but works with JavaScript strings (such as -//@ those returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will overwrite any existing file!_ -function _to(options, file) { - if (!file) - common.error('wrong arguments'); - - if (!fs.existsSync( path.dirname(file) )) - common.error('no such file or directory: ' + path.dirname(file)); - - try { - fs.writeFileSync(file, this.toString(), 'utf8'); - } catch(e) { - common.error('could not write to file (code '+e.code+'): '+file, true); - } -} -module.exports = _to; diff --git a/node_modules/shelljs/src/toEnd.js b/node_modules/shelljs/src/toEnd.js deleted file mode 100644 index f6d099d9..00000000 --- a/node_modules/shelljs/src/toEnd.js +++ /dev/null @@ -1,29 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); -var path = require('path'); - -//@ -//@ ### 'string'.toEnd(file) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ cat('input.txt').toEnd('output.txt'); -//@ ``` -//@ -//@ Analogous to the redirect-and-append operator `>>` in Unix, but works with JavaScript strings (such as -//@ those returned by `cat`, `grep`, etc). -function _toEnd(options, file) { - if (!file) - common.error('wrong arguments'); - - if (!fs.existsSync( path.dirname(file) )) - common.error('no such file or directory: ' + path.dirname(file)); - - try { - fs.appendFileSync(file, this.toString(), 'utf8'); - } catch(e) { - common.error('could not append to file (code '+e.code+'): '+file, true); - } -} -module.exports = _toEnd; diff --git a/node_modules/shelljs/src/which.js b/node_modules/shelljs/src/which.js deleted file mode 100644 index 2822ecfb..00000000 --- a/node_modules/shelljs/src/which.js +++ /dev/null @@ -1,83 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); -var path = require('path'); - -// Cross-platform method for splitting environment PATH variables -function splitPath(p) { - for (i=1;i<2;i++) {} - - if (!p) - return []; - - if (common.platform === 'win') - return p.split(';'); - else - return p.split(':'); -} - -function checkPath(path) { - return fs.existsSync(path) && fs.statSync(path).isDirectory() == false; -} - -//@ -//@ ### which(command) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var nodeExec = which('node'); -//@ ``` -//@ -//@ Searches for `command` in the system's PATH. On Windows looks for `.exe`, `.cmd`, and `.bat` extensions. -//@ Returns string containing the absolute path to the command. -function _which(options, cmd) { - if (!cmd) - common.error('must specify command'); - - var pathEnv = process.env.path || process.env.Path || process.env.PATH, - pathArray = splitPath(pathEnv), - where = null; - - // No relative/absolute paths provided? - if (cmd.search(/\//) === -1) { - // Search for command in PATH - pathArray.forEach(function(dir) { - if (where) - return; // already found it - - var attempt = path.resolve(dir + '/' + cmd); - if (checkPath(attempt)) { - where = attempt; - return; - } - - if (common.platform === 'win') { - var baseAttempt = attempt; - attempt = baseAttempt + '.exe'; - if (checkPath(attempt)) { - where = attempt; - return; - } - attempt = baseAttempt + '.cmd'; - if (checkPath(attempt)) { - where = attempt; - return; - } - attempt = baseAttempt + '.bat'; - if (checkPath(attempt)) { - where = attempt; - return; - } - } // if 'win' - }); - } - - // Command not found anywhere? - if (!checkPath(cmd) && !where) - return null; - - where = where || path.resolve(cmd); - - return common.ShellString(where); -} -module.exports = _which; diff --git a/package-lock.json b/package-lock.json index e091e542..4206ba44 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,13 +25,12 @@ }, "@actions/tool-cache": { "version": "file:toolkit/actions-tool-cache-0.0.0.tgz", - "integrity": "sha512-R08MGFekNLkf1ofh5wi8QVgmFyPgkKC+Cp8FRE1n6zOpHbUWv3QGa6eR6z+2ESuGCstOPtbq/tRgZsSusItm9Q==", + "integrity": "sha512-33oYAVRdp6MWNT7Yca0//SmOsvpE7FpFfNA/LzwjIZdLucHaO6V67dqZ5p81CTBncrZal+O5kE9B8qSk0rhipg==", "requires": { "@actions/core": "^0.0.0", "@actions/exec": "^0.0.0", "@actions/io": "^0.0.0", "semver": "^6.1.0", - "shelljs": "^0.3.0", "typed-rest-client": "^1.4.0", "uuid": "^3.3.2" } @@ -4523,11 +4522,6 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=" - }, "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", diff --git a/package.json b/package.json index 57ec95c5..1ff1d4a6 100644 --- a/package.json +++ b/package.json @@ -22,10 +22,10 @@ "author": "GitHub", "license": "MIT", "dependencies": { - "@actions/exit": "file:toolkit/actions-exit-0.0.0.tgz", "@actions/core": "file:toolkit/actions-core-0.0.0.tgz", - "@actions/io": "file:toolkit/actions-io-0.0.0.tgz", "@actions/exec": "file:toolkit/actions-exec-0.0.0.tgz", + "@actions/exit": "file:toolkit/actions-exit-0.0.0.tgz", + "@actions/io": "file:toolkit/actions-io-0.0.0.tgz", "@actions/tool-cache": "file:toolkit/actions-tool-cache-0.0.0.tgz", "semver": "^6.1.1" }, diff --git a/toolkit/actions-tool-cache-0.0.0.tgz b/toolkit/actions-tool-cache-0.0.0.tgz index 4b0e65efec4ced709b4fb69de905d0bd02b4571e..7ff733692094f7dd4ed5a40ca6e2de2b73bbca6e 100644 GIT binary patch literal 119066 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:i1 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