diff --git a/cleanup.js b/cleanup.js index 0bb1c617..5a19127b 100644 --- a/cleanup.js +++ b/cleanup.js @@ -21,16 +21,16 @@ 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. */ -const core = require('@actions/core'); -const os = require('os'); -const path = require('path'); +const core = require('@actions/core'); const settings = require('./settings'); async function run() { - settings.cleanup(); + try { + settings.cleanup(); + } catch (error) { + core.setFailed(error.message); + } } run(); - -module.exports = { run }; diff --git a/cleanup.test.js b/cleanup.test.js index 88a85136..a69f9355 100644 --- a/cleanup.test.js +++ b/cleanup.test.js @@ -56,6 +56,5 @@ afterAll(() => { test('run with default values', () => { - const out = cp.execSync(`node ${cleanupPath}`, { env: process.env }).toString(); - console.log(out); + cp.execSync(`node ${cleanupPath}`, { env: process.env }).toString(); }) diff --git a/index.js b/index.js index 3d6c87e2..23418a44 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,27 @@ +/* +The MIT License (MIT) + +Copyright (c) 2020 Slawomir Jaranowski and contributors + +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. +*/ + const core = require('@actions/core'); const settings = require('./settings'); @@ -7,7 +31,6 @@ async function run() { settings.generate(); } catch (error) { core.setFailed(error.message); - console.error(error); } } diff --git a/index.test.js b/index.test.js index 67baec4d..353cdf18 100644 --- a/index.test.js +++ b/index.test.js @@ -21,6 +21,7 @@ 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. */ + const process = require('process'); const cp = require('child_process'); const path = require('path'); @@ -60,35 +61,20 @@ afterAll(() => { }); -function assertSetingsFile() { - const settingsStatus = fs.lstatSync(settingsPath); - expect(settingsStatus.isFile()).toBeTruthy(); - expect(settingsStatus.size).toBeGreaterThan(0); - - const settingsBody = fs.readFileSync(settingsPath).toString(); - expect(settingsBody).toMatch(''); -} - -test('run with default values', () => { - - const out = cp.execSync(`node ${indexPath}`, { env: process.env }).toString(); - console.log(out); - - assertSetingsFile(); -}) - test('run with all feature', () => { process.env['INPUT_SERVERS'] = '[{"id": "serverId", "username": "username", "password": "password"}]'; process.env['INPUT_PROPERTIES'] = '[{"prop1": "value1"}, {"prop2": "value2"}]' process.env['INPUT_SONATYPESNAPSHOT'] = true; - const out = cp.execSync(`node ${indexPath}`, { env: process.env }).toString(); - console.log(out); + cp.execSync(`node ${indexPath}`, { env: process.env }).toString(); - assertSetingsFile(); + const settingsStatus = fs.lstatSync(settingsPath); + expect(settingsStatus.isFile()).toBeTruthy(); + expect(settingsStatus.size).toBeGreaterThan(0); const settingsBody = fs.readFileSync(settingsPath).toString(); + expect(settingsBody).toMatch(''); expect(settingsBody).toMatch('serverIdusernamepassword'); expect(settingsBody).toMatch('prop1'); }) diff --git a/settings.js b/settings.js index 732dac19..ea49fed7 100644 --- a/settings.js +++ b/settings.js @@ -1,3 +1,27 @@ +/* +The MIT License (MIT) + +Copyright (c) 2020 Slawomir Jaranowski and contributors + +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. +*/ + const core = require('@actions/core'); const os = require('os'); const path = require('path'); @@ -7,7 +31,9 @@ const XMLSerializer = require('xmldom').XMLSerializer; const xpath = require('xpath'); -const settingsPath = path.join(os.homedir(), '.m2', 'settings.xml'); +function getSettingsPath() { + return path.join(os.homedir(), '.m2', 'settings.xml'); +} function getSettingsTemplate() { const templatePath = path.join(__dirname, 'templates', 'settings.xml'); @@ -87,11 +113,19 @@ function addSonatypeSnapshots(template) { } function generate() { + + const settingsPath = getSettingsPath(); + core.info('Prepare maven setings: ' + settingsPath); if (fs.existsSync(settingsPath)) { - core.warning('maven settings.xml already exists - skip'); - return; + const val = core.getInput("override"); + if (val && val.toLocaleLowerCase() == 'true') { + core.info('maven settings.xml already exists - override'); + } else { + core.warning('maven settings.xml already exists - skip'); + return; + } } const templateXml = getSettingsTemplate(); @@ -103,8 +137,19 @@ function generate() { } function cleanup() { + const mavenSettingsState = core.getState('maven-settings'); - core.info('Cleanup maven setings: ' + settingsPath + " state: " + mavenSettingsState); + const settingsPath = getSettingsPath(); + if (mavenSettingsState == 'ok') { + if (fs.existsSync(settingsPath)) { + fs.unlinkSync(settingsPath); + core.info('Cleanup maven setings: ' + settingsPath + ' - file was removed'); + } else { + core.warning('Cleanup maven setings: ' + settingsPath + ' - file not exist'); + } + } else { + core.info('Cleanup maven setings: ' + settingsPath + ' - file wasn\'t generated by action'); + } } module.exports = { diff --git a/settings.test.js b/settings.test.js index a8e89715..c001d55c 100644 --- a/settings.test.js +++ b/settings.test.js @@ -1,4 +1,29 @@ +/* +The MIT License (MIT) +Copyright (c) 2020 Slawomir Jaranowski and contributors + +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. +*/ + +const os = require('os'); +const process = require('process'); const DOMParser = require('xmldom').DOMParser; const XMLSerializer = require('xmldom').XMLSerializer; const fs = require('fs'); @@ -11,6 +36,20 @@ var xmlTestProfile = undefined; const testHomePath = fs.mkdtempSync(".m2"); const settingsPath = path.join(testHomePath, '.m2', 'settings.xml'); +var consoleOutput = []; + +beforeAll(() => { + if (!fs.existsSync(testHomePath)) { + fs.mkdirSync(testHomePath); + } + + process.env['HOME'] = testHomePath; + process.env['USERPROFILE'] = testHomePath; + os.homedir = () => testHomePath; + + process.stdout.write = output => consoleOutput.push(output); +}); + beforeEach(() => { xmlTestProfile = new DOMParser().parseFromString(` @@ -30,6 +69,19 @@ beforeEach(() => { `); + consoleOutput = []; +}); + +afterAll(() => { + try { + fs.rmdirSync(path.dirname(settingsPath)); + } catch (error) { + } + + try { + fs.rmdirSync(testHomePath); + } catch (error) { + } }); afterEach(() => { @@ -46,14 +98,6 @@ afterEach(() => { } }); -afterAll(() => { - try { - fs.rmdirSync(path.dirname(settingsPath)); - fs.rmdirSync(testHomePath); - } catch (error) { - } -}); - test('template should be read', () => { const template = settings.getSettingsTemplate(); @@ -193,3 +237,88 @@ test('fillProperties do nothing if no params', () => { `); }) + +test('cleanup - not generated', () => { + + settings.cleanup(); + + expect(consoleOutput).toEqual( + expect.arrayContaining([ + expect.stringMatching(/Cleanup maven setings: \..+\/\.m2\/settings.xml - file wasn\'t generated by action/) + ]) + ); +}) + +test('cleanup - not exist', () => { + + process.env['STATE_maven-settings'] = 'ok'; + + settings.cleanup(); + + expect(consoleOutput).toEqual( + expect.arrayContaining([ + expect.stringMatching(/::warning::Cleanup maven setings: \..+\/\.m2\/settings.xml - file not exist/) + ]) + ); +}) + +test('cleanup - ok', () => { + + process.env['STATE_maven-settings'] = 'ok'; + fs.closeSync(fs.openSync(settingsPath, 'w')); + + settings.cleanup(); + + expect(consoleOutput).toEqual( + expect.arrayContaining([ + expect.stringMatching(/Cleanup maven setings: \..+\/\.m2\/settings.xml - file was removed/) + ]) + ); + expect(fs.existsSync(settingsPath)).not.toBeTruthy(); +}) + +test('genereate', () => { + + process.env['INPUT_SERVERS'] = '[{"id": "serverId", "username": "username", "password": "password"}]'; + process.env['INPUT_PROPERTIES'] = '[{"prop1": "value1"}, {"prop2": "value2"}]' + process.env['INPUT_SONATYPESNAPSHOT'] = true; + + settings.generate(); + + expect(consoleOutput).toEqual( + expect.arrayContaining([ + expect.stringMatching(/Prepare maven setings: \..+\/.m2\/settings.xml/), + expect.stringMatching(/:save-state name=maven-settings::ok/) + ]) + ); +}) + +test('genereate - skip', () => { + + fs.closeSync(fs.openSync(settingsPath, 'w')); + + settings.generate(); + + expect(consoleOutput).toEqual( + expect.arrayContaining([ + expect.stringMatching(/Prepare maven setings: \..+\/.m2\/settings.xml/), + expect.stringMatching(/::warning::maven settings.xml already exists - skip/) + ]) + ); +}) + +test('genereate - override', () => { + + fs.closeSync(fs.openSync(settingsPath, 'w')); + process.env['INPUT_OVERRIDE'] = 'true'; + + settings.generate(); + + expect(consoleOutput).toEqual( + expect.arrayContaining([ + expect.stringMatching(/Prepare maven setings: \..+\/.m2\/settings.xml/), + expect.stringMatching(/maven settings.xml already exists - override/), + expect.stringMatching(/:save-state name=maven-settings::ok/) + ]) + ); +})