diff --git a/.editorconfig b/.editorconfig
index fa21b07..291c13a 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -10,6 +10,9 @@ max_line_length = 100
insert_final_newline = true
trim_trailing_whitespace = true
+[*.{bat,cmd}]
+end_of_line = crlf
+
[*.{ts,js,yml}]
quote_type = single
spaces_around_brackets = inside
diff --git a/.eslintrc.json b/.eslintrc.json
index 324243d..9dc707f 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -3,13 +3,67 @@
"es6": true,
"node": true
},
- "plugins": ["@typescript-eslint"],
- "extends": [
- "eslint:recommended", // all
- "plugin:@typescript-eslint/all",
- "prettier"
- ],
+ "extends": ["eslint:all"],
+ "parserOptions": {
+ "ecmaVersion": 9,
+ "sourceType": "module"
+ },
+ "rules": {
+ "capitalized-comments": [
+ "warn",
+ "always",
+ {
+ "ignorePattern": "noinspection|pragma",
+ "ignoreInlineComments": true
+ }
+ ],
+ "one-var": ["warn", "never"],
+ "sort-imports": [
+ "warn",
+ {
+ "allowSeparatedGroups": true,
+ "ignoreDeclarationSort": true
+ }
+ ],
+ "no-undefined": "off",
+ "require-unicode-regexp": "off",
+ "no-ternary": "off",
+ "no-negated-condition": "off",
+ "prefer-named-capture-group": "off"
+ },
"overrides": [
+ {
+ "files": ["**/*.ts"],
+ "plugins": ["@typescript-eslint"],
+ "extends": ["plugin:@typescript-eslint/all"],
+ "parser": "@typescript-eslint/parser",
+ "parserOptions": {
+ "project": "./tsconfig.eslint.json"
+ },
+ "rules": {
+ "func-style": [
+ "error",
+ "declaration",
+ {
+ "allowArrowFunctions": true
+ }
+ ],
+ "@typescript-eslint/no-implicit-any-catch": "off",
+ "@typescript-eslint/no-magic-numbers": [
+ "warn",
+ {
+ "ignore": [0, 1],
+ "ignoreArrayIndexes": true
+ }
+ ],
+ "@typescript-eslint/strict-boolean-expressions": [
+ "error",
+ {
+ "allowNullableString": true
+ }
+ ]
+ }
+ },
{
"files": ["**/*.test.ts"],
"env": {
@@ -18,29 +72,14 @@
"plugins": ["jest"],
"extends": ["plugin:jest/all"],
"rules": {
+ "max-lines-per-function": ["warn", 100],
+ "jest/no-hooks": "off",
"jest/prefer-expect-assertions": "off"
}
+ },
+ {
+ "files": ["**/*"],
+ "extends": ["prettier"]
}
- ],
- "parser": "@typescript-eslint/parser",
- "parserOptions": {
- "ecmaVersion": 9,
- "sourceType": "module",
- "project": "./tsconfig.eslint.json"
- },
- "rules": {
- "@typescript-eslint/no-implicit-any-catch": "off",
- "@typescript-eslint/no-magic-numbers": [
- "error",
- {
- "ignoreArrayIndexes": true
- }
- ],
- "@typescript-eslint/strict-boolean-expressions": [
- "error",
- {
- "allowNullableString": true
- }
- ]
- }
+ ]
}
diff --git a/.gitattributes b/.gitattributes
index 078a367..e49189f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -5,3 +5,7 @@
# Excluded from stats, hidden in diffs
dist/** -diff -merge linguist-generated
+
+# These are explicitly windows files and should use crlf
+*.bat text eol=crlf
+*.cmd text eol=crlf
diff --git a/__tests__/data/mvn b/__tests__/data/mvn
new file mode 100755
index 0000000..6d6bd45
--- /dev/null
+++ b/__tests__/data/mvn
@@ -0,0 +1,7 @@
+#!/bin/sh
+echo 'Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T07:58:13Z)'
+echo 'Maven home: /usr/share/maven'
+echo 'Java version: 1.8.0_121, vendor: Oracle Corporation'
+echo 'Java home: /usr/lib/jvm/java-1.8-openjdk/jre'
+echo 'Default locale: en_US, platform encoding: UTF-8'
+echo 'OS name: "linux", version: "4.4.0-210-generic", arch: "amd64", family: "unix"'
diff --git a/__tests__/data/mvn.bat b/__tests__/data/mvn.bat
new file mode 100644
index 0000000..bb677a8
--- /dev/null
+++ b/__tests__/data/mvn.bat
@@ -0,0 +1,6 @@
+@ECHO OFF
+ECHO Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d)
+ECHO Maven home: C:\Program Files\Java\maven3
+ECHO Java version: 11.0.15.1, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk-11.0
+ECHO Default locale: en_US, platform encoding: Cp1252
+ECHO OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
diff --git a/__tests__/installer.test.ts b/__tests__/installer.test.ts
index 1876d6c..5b4ae00 100644
--- a/__tests__/installer.test.ts
+++ b/__tests__/installer.test.ts
@@ -1,11 +1,110 @@
+/* eslint @typescript-eslint/consistent-type-imports: 0 */
+import * as os from 'os';
+import * as path from 'path';
+import { IncomingMessage } from 'http';
+
+import * as core from '@actions/core';
+import { HttpClient, HttpCodes } from '@actions/http-client';
+
import * as installer from '../src/installer';
+// Mocking modules
+jest.mock('@actions/core');
+
+const CACHE_PATH = path.join(__dirname, 'runner');
+
+function createXmlManifest(...versions: readonly string[]): string {
+ return versions.map(ver => `${ver}`).join();
+}
+
describe('getAvailableVersions', () => {
it('loads real available versions', async () => {
const availableVersions = await installer.getAvailableVersions();
+ expect(core.info).toHaveBeenCalledWith(expect.stringMatching(/Downloading.* versions.* from/i));
+ expect(core.debug).toHaveBeenCalledWith(
+ expect.stringMatching(/Available.* versions: \[.*,3.1.1,.*]/i)
+ );
+
expect(availableVersions).toStrictEqual(
expect.arrayContaining(['3.0', '3.2.5', '3.3.3', '3.8.2'])
);
});
+
+ it('failed to download versions manifest', async () => {
+ jest.spyOn(HttpClient.prototype, 'get').mockResolvedValue({
+ message: ({ statusCode: 0 } as unknown) as IncomingMessage,
+ readBody: jest.fn().mockResolvedValue('')
+ });
+
+ await expect(installer.getAvailableVersions()).rejects.toThrow(
+ /Unable to get available versions from/i
+ );
+ expect(core.info).toHaveBeenCalledTimes(1);
+ });
+
+ describe('returns bad versions for incorrect downloaded manifest', () => {
+ it.each([
+ [` bar${createXmlManifest('')} foo`, []],
+ [` ${createXmlManifest(' 1.x', 'foo')}!`, [' 1.x', 'foo']]
+ ])('%s -> %j', async (xml: string, expected: readonly string[]) => {
+ jest.spyOn(HttpClient.prototype, 'get').mockResolvedValue({
+ message: ({ statusCode: HttpCodes.OK } as unknown) as IncomingMessage,
+ readBody: jest.fn().mockResolvedValue(xml)
+ });
+
+ const availableVersions = await installer.getAvailableVersions();
+ expect(availableVersions).toStrictEqual(expected);
+
+ expect(core.info).toHaveBeenCalledTimes(1);
+ expect(core.debug).toHaveBeenCalledWith(expect.stringContaining(` [${String(expected)}]`));
+ });
+ });
+});
+
+describe('findVersionForDownload', () => {
+ describe('raises error if versionSpec was not matched', () => {
+ it.each([
+ [' *', ['']],
+ ['* ', ['foo', ' ', ' 1.0.x ', '3.0']],
+ [' >=3', [' 2.0.1', '!', ' 3.0.x ', '3.3']]
+ ])('%s %j', async (spec: string, versions: readonly string[]) => {
+ jest.spyOn(HttpClient.prototype, 'get').mockResolvedValue({
+ message: ({ statusCode: HttpCodes.OK } as unknown) as IncomingMessage,
+ readBody: jest.fn().mockResolvedValue(createXmlManifest(...versions))
+ });
+
+ await expect(installer.findVersionForDownload(spec)).rejects.toThrow(
+ new RegExp(`not find.* version for.* ${spec}`, 'i')
+ );
+ });
+ });
+
+ describe('returns the best matched correctly', () => {
+ it.each([
+ [' 1.x', ['foo', '1.0.1', ' 1.1.0 ', '0.1.0 '], '1.1.0'],
+ [' * ', ['!', '1.0.1', ' 3.1.0 ', '2.0.1 ', '3.3.0-alpha-1'], '3.1.0'],
+ ['>=1 ', [' ', '1.1.0-beta-1', ' 1.0.1 ', ' 1.0.1-1'], '1.0.1']
+ ])('%s %j -> %s', async (spec: string, versions: readonly string[], expected: string) => {
+ jest.spyOn(HttpClient.prototype, 'get').mockResolvedValue({
+ message: ({ statusCode: HttpCodes.OK } as unknown) as IncomingMessage,
+ readBody: jest.fn().mockResolvedValue(createXmlManifest(...versions))
+ });
+
+ const resolvedVersion = await installer.findVersionForDownload(spec);
+ expect(resolvedVersion).toBe(expected);
+ expect(core.debug).toHaveBeenCalledWith(expect.stringMatching(/Resolved version/i));
+ });
+ });
+});
+
+process.env.RUNNER_TEMP = os.tmpdir();
+process.env.RUNNER_TOOL_CACHE = CACHE_PATH;
+
+describe('downloadMaven', () => {
+ it.todo('download a real version of Maven');
+
+ it.todo('raises error if download failed');
+
+ it.todo('raises error when extracting failed');
});
diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts
index a8ddd04..43aea9c 100644
--- a/__tests__/main.test.ts
+++ b/__tests__/main.test.ts
@@ -1,17 +1,57 @@
import * as core from '@actions/core';
+import { getActiveMavenVersion } from '../src/utils';
+import { setupMaven } from '../src/installer';
import { run } from '../src/main';
+// Mocking modules
+jest.mock('@actions/core');
+jest.mock('../src/utils');
+jest.mock('../src/installer');
+
+const DEFAULT_VERSION = '3';
+
describe('failed to run with invalid inputs', () => {
it.each([
- ['maven-version', { 'maven-version': ' foo-3!' }] // eslint-disable-line no-inline-comments
+ ['maven-version', { 'maven-version': ' foo-3!' }] // eslint-disable-line
])('%s', async (name: string, inputs: Readonly>) => {
- const spyFailed = jest.spyOn(core, 'setFailed');
- jest.spyOn(core, 'getInput').mockImplementation((key: string) => inputs[key]);
+ (core.getInput as jest.Mock).mockImplementation((key: string) => inputs[key]);
await run();
- expect(spyFailed).toHaveBeenCalledWith(
+ expect(core.setFailed).toHaveBeenCalledWith(
expect.stringMatching(new RegExp(`[Ii]nvalid .*'${inputs[name]}'`))
);
});
});
+
+describe('run with valid inputs', () => {
+ it('setups default version when no Maven is installed', async () => {
+ (core.getInput as jest.Mock).mockReturnValue('');
+ (getActiveMavenVersion as jest.Mock).mockResolvedValue(undefined);
+ (setupMaven as jest.Mock).mockResolvedValue('foo');
+
+ await run();
+ expect(setupMaven).toHaveBeenCalledWith(DEFAULT_VERSION, undefined);
+ expect(core.setOutput).toHaveBeenCalledWith('version', 'foo');
+ });
+
+ it('setups when installed Maven is different with version input', async () => {
+ (core.getInput as jest.Mock).mockReturnValue('3.3');
+ (getActiveMavenVersion as jest.Mock).mockResolvedValue('3.5.2');
+ (setupMaven as jest.Mock).mockResolvedValue(DEFAULT_VERSION);
+
+ await run();
+ expect(setupMaven).toHaveBeenCalledWith('3.3', undefined);
+ expect(core.setOutput).toHaveBeenCalledWith('version', DEFAULT_VERSION);
+ });
+
+ it('setups when installed Maven is correspond with version input', async () => {
+ (core.getInput as jest.Mock).mockReturnValue('3.x');
+ (getActiveMavenVersion as jest.Mock).mockResolvedValue('3.3.9');
+ (setupMaven as jest.Mock).mockResolvedValue('');
+
+ await run();
+ expect(setupMaven).toHaveBeenCalledWith('3.x', '3.3.9');
+ expect(core.setOutput).toHaveBeenCalledWith('version', '');
+ });
+});
diff --git a/__tests__/utils.test.ts b/__tests__/utils.test.ts
index 6bbd65c..70806d2 100644
--- a/__tests__/utils.test.ts
+++ b/__tests__/utils.test.ts
@@ -1,6 +1,16 @@
import * as path from 'path';
+import * as child from 'child_process';
+import { EventEmitter } from 'events';
-import { getVersionFromToolcachePath } from '../src/utils';
+import * as core from '@actions/core';
+
+import { getActiveMavenVersion, getVersionFromToolcachePath } from '../src/utils';
+
+// Mocking modules
+jest.mock('child_process');
+jest.mock('@actions/core');
+
+const MVN_PATH = path.join(__dirname, 'data');
describe('getVersionFromToolcachePath', () => {
it.each([
@@ -14,3 +24,64 @@ describe('getVersionFromToolcachePath', () => {
expect(actual).toBe(expected);
});
});
+
+describe('getActiveMavenVersion', () => {
+ const ORIGINAL_PATH = process.env.PATH;
+ const EMIT_AT = 21;
+
+ afterEach(() => {
+ process.env.PATH = ORIGINAL_PATH;
+ });
+
+ it('gets real version by `mvn` command', async () => {
+ const expectedVersion = '3.5.2';
+ process.env.PATH = `${MVN_PATH}${path.delimiter}${ORIGINAL_PATH ?? ''}`;
+
+ const cp = jest.requireActual('child_process');
+ (child.spawn as jest.Mock).mockImplementation(cp.spawn);
+
+ const installedVersion = await getActiveMavenVersion();
+
+ expect(installedVersion).toBe(expectedVersion);
+ expect(core.debug).toHaveBeenCalledWith(
+ expect.stringMatching(new RegExp(`Retrieved.* version: ${expectedVersion}`, 'i'))
+ );
+ });
+
+ it('returns null if no Maven is installed', async () => {
+ process.env.PATH = '';
+ const installedVersion = await getActiveMavenVersion();
+
+ expect(installedVersion).toBeUndefined();
+ expect(core.info).toHaveBeenCalledWith(
+ expect.stringMatching(/Failed.* version.* Unable.* locate executable file: mvn/i)
+ );
+ });
+
+ it('returns null if `mvn` command is failed', async () => {
+ process.env.PATH = MVN_PATH;
+ const cp = new EventEmitter();
+ (child.spawn as jest.Mock).mockReturnValue(cp);
+
+ setTimeout(() => cp.emit('close', EMIT_AT), EMIT_AT);
+ const installedVersion = await getActiveMavenVersion();
+
+ expect(installedVersion).toBeUndefined();
+ expect(core.info).toHaveBeenCalledWith(
+ expect.stringMatching(new RegExp(`Failed.* version.* process.* exit code ${EMIT_AT}`, 'i'))
+ );
+ });
+
+ it('returns empty if `mvn` command is incorrect', async () => {
+ process.env.PATH = MVN_PATH;
+
+ const cp = Object.create(new EventEmitter()) as EventEmitter & { stdout: EventEmitter };
+ (child.spawn as jest.Mock).mockReturnValue((cp.stdout = cp));
+
+ setTimeout(() => cp.emit('data', 'foo') && cp.emit('close', 0), EMIT_AT);
+ const installedVersion = await getActiveMavenVersion();
+
+ expect(installedVersion).toBe('');
+ expect(core.debug).toHaveBeenCalledTimes(1);
+ });
+});
diff --git a/dist/index.js b/dist/index.js
index 6dcfb14..3ed920f 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -5045,20 +5045,20 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.setupMaven = exports.findVersionForDownload = exports.downloadMaven = exports.getAvailableVersions = void 0;
const path = __importStar(__nccwpck_require__(622));
const core = __importStar(__nccwpck_require__(186));
-const httpm = __importStar(__nccwpck_require__(925));
const tc = __importStar(__nccwpck_require__(784));
const semver = __importStar(__nccwpck_require__(911));
+const http_client_1 = __nccwpck_require__(925);
const utils_1 = __nccwpck_require__(314);
const DOWNLOAD_BASE_URL = 'https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven';
function getAvailableVersions() {
var _a;
return __awaiter(this, void 0, void 0, function* () {
const resourceUrl = `${DOWNLOAD_BASE_URL}/maven-metadata.xml`;
- const http = new httpm.HttpClient('setup-maven', undefined, { allowRetries: true });
+ const http = new http_client_1.HttpClient('setup-maven', undefined, { allowRetries: true });
core.info(`Downloading Maven versions manifest from ${resourceUrl} ...`);
const response = yield http.get(resourceUrl);
const body = yield response.readBody();
- if (response.message.statusCode !== httpm.HttpCodes.OK || !body) {
+ if (response.message.statusCode !== http_client_1.HttpCodes.OK || !body) {
throw new Error(`Unable to get available versions from ${resourceUrl}`);
}
const availableVersions = (_a = body.match(/(?<=)[^<>]+(?=<\/version>)/g)) !== null && _a !== void 0 ? _a : [];
@@ -5070,21 +5070,21 @@ exports.getAvailableVersions = getAvailableVersions;
/**
* Download and extract a specified Maven version to the tool-cache.
*/
-function downloadMaven(fullVersion) {
+function downloadMaven(version) {
return __awaiter(this, void 0, void 0, function* () {
- const toolDirectoryName = `apache-maven-${fullVersion}`;
- const downloadUrl = `${DOWNLOAD_BASE_URL}/${fullVersion}/${toolDirectoryName}-bin.tar.gz`;
- core.info(`Downloading Maven ${fullVersion} from ${downloadUrl} ...`);
+ const toolDirectoryName = `apache-maven-${version}`;
+ const downloadUrl = `${DOWNLOAD_BASE_URL}/${version}/${toolDirectoryName}-bin.tar.gz`;
+ core.info(`Downloading Maven ${version} from ${downloadUrl} ...`);
const downloadPath = yield tc.downloadTool(downloadUrl);
const extractedPath = yield tc.extractTar(downloadPath);
const toolRoot = path.join(extractedPath, toolDirectoryName);
- return tc.cacheDir(toolRoot, 'maven', fullVersion);
+ return tc.cacheDir(toolRoot, 'maven', version);
});
}
exports.downloadMaven = downloadMaven;
function findVersionForDownload(versionSpec) {
return __awaiter(this, void 0, void 0, function* () {
- const availableVersions = yield getAvailableVersions();
+ const availableVersions = (yield getAvailableVersions()).map(ver => ver.trim());
const resolvedVersion = semver.maxSatisfying(availableVersions, versionSpec);
if (!resolvedVersion) {
throw new Error(`Could not find satisfied version for SemVer ${versionSpec}`);
@@ -5156,8 +5156,9 @@ const core = __importStar(__nccwpck_require__(186));
const semver = __importStar(__nccwpck_require__(911));
const utils_1 = __nccwpck_require__(314);
const installer_1 = __nccwpck_require__(574);
+const DEFAULT_VERSION = '3';
function resolveVersionInput() {
- const versionSpec = core.getInput('maven-version') || '3';
+ const versionSpec = core.getInput('maven-version') || DEFAULT_VERSION;
if (!semver.validRange(versionSpec)) {
throw new Error(`Invalid SemVer notation '${versionSpec}' for a Maven version`);
}
@@ -5233,13 +5234,13 @@ function getActiveMavenVersion() {
return __awaiter(this, void 0, void 0, function* () {
try {
const { stdout } = yield exec.getExecOutput('mvn', ['-v'], { silent: true });
- const found = /^[^\d]*(\S+)/.exec(stdout);
+ const found = /^[^\d]*(\d\S*)/.exec(stdout);
const installedVersion = !found ? '' : found[1];
core.debug(`Retrieved activated Maven version: ${installedVersion}`);
return installedVersion;
}
catch (err) {
- core.info(`Failed to get activated Maven version. ${err.message}`);
+ core.info(`Failed to get activated Maven version. ${String(err)}`);
}
return undefined;
});
@@ -5414,9 +5415,9 @@ var __webpack_exports__ = {};
var exports = __webpack_exports__;
Object.defineProperty(exports, "__esModule", ({ value: true }));
+/* eslint @typescript-eslint/no-floating-promises: 0 */
const main_1 = __nccwpck_require__(399);
// noinspection JSIgnoredPromiseFromCall
-// eslint-disable-next-line @typescript-eslint/no-floating-promises
main_1.run();
})();
diff --git a/jest.config.json b/jest.config.json
index f6fd712..0d7e67a 100644
--- a/jest.config.json
+++ b/jest.config.json
@@ -1,5 +1,6 @@
{
"clearMocks": true,
+ "resetMocks": true,
"moduleFileExtensions": ["ts", "js"],
"testEnvironment": "node",
"testMatch": ["**/*.test.ts"],
diff --git a/src/installer.ts b/src/installer.ts
index 8976d3c..c3a1341 100644
--- a/src/installer.ts
+++ b/src/installer.ts
@@ -1,8 +1,9 @@
import * as path from 'path';
+
import * as core from '@actions/core';
-import * as httpm from '@actions/http-client';
import * as tc from '@actions/tool-cache';
import * as semver from 'semver';
+import { HttpClient, HttpCodes } from '@actions/http-client';
import { getVersionFromToolcachePath } from './utils';
@@ -10,13 +11,13 @@ const DOWNLOAD_BASE_URL = 'https://repo.maven.apache.org/maven2/org/apache/maven
export async function getAvailableVersions(): Promise {
const resourceUrl = `${DOWNLOAD_BASE_URL}/maven-metadata.xml`;
- const http = new httpm.HttpClient('setup-maven', undefined, { allowRetries: true });
+ const http = new HttpClient('setup-maven', undefined, { allowRetries: true });
core.info(`Downloading Maven versions manifest from ${resourceUrl} ...`);
const response = await http.get(resourceUrl);
const body = await response.readBody();
- if (response.message.statusCode !== httpm.HttpCodes.OK || !body) {
+ if (response.message.statusCode !== HttpCodes.OK || !body) {
throw new Error(`Unable to get available versions from ${resourceUrl}`);
}
@@ -29,21 +30,21 @@ export async function getAvailableVersions(): Promise {
/**
* Download and extract a specified Maven version to the tool-cache.
*/
-export async function downloadMaven(fullVersion: string): Promise {
- const toolDirectoryName = `apache-maven-${fullVersion}`;
- const downloadUrl = `${DOWNLOAD_BASE_URL}/${fullVersion}/${toolDirectoryName}-bin.tar.gz`;
+export async function downloadMaven(version: string): Promise {
+ const toolDirectoryName = `apache-maven-${version}`;
+ const downloadUrl = `${DOWNLOAD_BASE_URL}/${version}/${toolDirectoryName}-bin.tar.gz`;
- core.info(`Downloading Maven ${fullVersion} from ${downloadUrl} ...`);
+ core.info(`Downloading Maven ${version} from ${downloadUrl} ...`);
const downloadPath = await tc.downloadTool(downloadUrl);
const extractedPath = await tc.extractTar(downloadPath);
const toolRoot = path.join(extractedPath, toolDirectoryName);
- return tc.cacheDir(toolRoot, 'maven', fullVersion);
+ return tc.cacheDir(toolRoot, 'maven', version);
}
export async function findVersionForDownload(versionSpec: string): Promise {
- const availableVersions = await getAvailableVersions();
+ const availableVersions = (await getAvailableVersions()).map(ver => ver.trim());
const resolvedVersion = semver.maxSatisfying(availableVersions, versionSpec);
if (!resolvedVersion) {
diff --git a/src/main.ts b/src/main.ts
index 0eb0a8e..ac58836 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -4,8 +4,10 @@ import * as semver from 'semver';
import { getActiveMavenVersion } from './utils';
import { setupMaven } from './installer';
+const DEFAULT_VERSION = '3';
+
function resolveVersionInput(): string {
- const versionSpec = core.getInput('maven-version') || '3';
+ const versionSpec = core.getInput('maven-version') || DEFAULT_VERSION;
if (!semver.validRange(versionSpec)) {
throw new Error(`Invalid SemVer notation '${versionSpec}' for a Maven version`);
diff --git a/src/setup-maven.ts b/src/setup-maven.ts
index 7380ef6..0ad4b3a 100644
--- a/src/setup-maven.ts
+++ b/src/setup-maven.ts
@@ -1,5 +1,5 @@
+/* eslint @typescript-eslint/no-floating-promises: 0 */
import { run } from './main';
// noinspection JSIgnoredPromiseFromCall
-// eslint-disable-next-line @typescript-eslint/no-floating-promises
run();
diff --git a/src/utils.ts b/src/utils.ts
index 3bbae0b..6985cb0 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -1,4 +1,5 @@
import * as path from 'path';
+
import * as core from '@actions/core';
import * as exec from '@actions/exec';
@@ -13,13 +14,13 @@ export async function getActiveMavenVersion(): Promise {
try {
const { stdout } = await exec.getExecOutput('mvn', ['-v'], { silent: true });
- const found = /^[^\d]*(\S+)/.exec(stdout);
+ const found = /^[^\d]*(\d\S*)/.exec(stdout);
const installedVersion = !found ? '' : found[1];
core.debug(`Retrieved activated Maven version: ${installedVersion}`);
return installedVersion;
} catch (err) {
- core.info(`Failed to get activated Maven version. ${(err as Error).message}`);
+ core.info(`Failed to get activated Maven version. ${String(err)}`);
}
return undefined;
diff --git a/yarn.lock b/yarn.lock
index 827181f..73bc008 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -962,15 +962,15 @@ browser-process-hrtime@^1.0.0:
integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
browserslist@^4.14.5:
- version "4.16.6"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2"
- integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==
+ version "4.17.6"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.6.tgz#c76be33e7786b497f66cad25a73756c8b938985d"
+ integrity sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==
dependencies:
- caniuse-lite "^1.0.30001219"
- colorette "^1.2.2"
- electron-to-chromium "^1.3.723"
+ caniuse-lite "^1.0.30001274"
+ electron-to-chromium "^1.3.886"
escalade "^3.1.1"
- node-releases "^1.1.71"
+ node-releases "^2.0.1"
+ picocolors "^1.0.0"
bs-logger@0.x:
version "0.2.6"
@@ -1006,10 +1006,10 @@ camelcase@^6.2.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
-caniuse-lite@^1.0.30001219:
- version "1.0.30001228"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa"
- integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==
+caniuse-lite@^1.0.30001274:
+ version "1.0.30001312"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz#e11eba4b87e24d22697dae05455d5aea28550d5f"
+ integrity sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==
chalk@^2.0.0:
version "2.4.2"
@@ -1081,11 +1081,6 @@ color-name@1.1.3, color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-colorette@^1.2.2:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
- integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
-
combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
@@ -1203,10 +1198,10 @@ domexception@^2.0.1:
dependencies:
webidl-conversions "^5.0.0"
-electron-to-chromium@^1.3.723:
- version "1.3.729"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.729.tgz#3dc87b55c4aa3c75370471d9c72accf70d9af263"
- integrity sha512-Ho8K+hCEFOt6FsRZRgh1zUpIJ4Nn9MUSgLBEF+I2Xbzo3E8zvvxZFV/tEmAl2e9dsJDWzTFnGsZTuEVfYEv8eg==
+electron-to-chromium@^1.3.886:
+ version "1.4.71"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz#17056914465da0890ce00351a3b946fd4cd51ff6"
+ integrity sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==
emittery@^0.8.1:
version "0.8.1"
@@ -2398,10 +2393,10 @@ node-modules-regexp@^1.0.0:
resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
integrity sha512-JMaRS9L4wSRIR+6PTVEikTrq/lMGEZR43a48ETeilY0Q0iMwVnccMFrUM1k+tNzmYuIU0Vh710bCUqHX+/+ctQ==
-node-releases@^1.1.71:
- version "1.1.72"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe"
- integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==
+node-releases@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01"
+ integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==
normalize-path@^3.0.0:
version "3.0.0"
@@ -2502,6 +2497,11 @@ path-type@^4.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
version "2.2.3"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d"