From b2da0d905bc29d795f7ed67e8590eb4e38790c97 Mon Sep 17 00:00:00 2001 From: dmvict Date: Tue, 7 May 2024 08:03:20 +0300 Subject: [PATCH 01/10] Improve routine `retry`. add cleaning of outputs --- src/Retry.js | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/Retry.js b/src/Retry.js index 4904940..5927e7d 100644 --- a/src/Retry.js +++ b/src/Retry.js @@ -162,14 +162,23 @@ function retry( scriptType ) return con.then( () => { if( routine ) - return _.retry - ({ - routine, - attemptLimit, - attemptDelay, - onSuccess, - onError, - }); + { + const githubOutputCleanRoutine = () => + { + if( _.fileProvider.fileExists( process.env.GITHUB_OUTPUT ) ) + _.fileProvider.fileWrite( process.env.GITHUB_OUTPUT, '' ); + return routine(); + }; + return _.retry + ({ + routine : githubOutputCleanRoutine, + attemptLimit, + attemptDelay, + onSuccess, + onError, + }); + } + return null; }); }) From c262c32bd979acdc5edcb26c68d392fdc40438e1 Mon Sep 17 00:00:00 2001 From: dmvict Date: Tue, 7 May 2024 08:12:23 +0300 Subject: [PATCH 02/10] Extend routine `contextGet`, add runtime resolving of current step outputs --- src/Common.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Common.js b/src/Common.js index fcd032a..c4a0072 100644 --- a/src/Common.js +++ b/src/Common.js @@ -170,7 +170,21 @@ function contextGet( contextName ) githubContext = githubContextUpdate( githubContext ); return githubContext; } - else if( [ 'job', 'matrix', 'inputs', 'steps' ].includes( contextName ) ) + else if( contextName === 'steps' ) + { + const context = JSON.parse( core.getInput( `${ contextName }_context` ) ); + if( _.fileProvider.fileExists( process.env.GITHUB_OUTPUT ) ) + { + const rawFile = _.fileProvider.fileRead({ filePath : process.env.GITHUB_OUTPUT }); + const regex = /^(.*)< Date: Tue, 7 May 2024 08:13:32 +0300 Subject: [PATCH 03/10] Add module `ini` to parse context --- node_modules/ini/LICENSE | 15 +++ node_modules/ini/README.md | 102 +++++++++++++++++ node_modules/ini/ini.js | 206 ++++++++++++++++++++++++++++++++++ node_modules/ini/package.json | 36 ++++++ 4 files changed, 359 insertions(+) create mode 100644 node_modules/ini/LICENSE create mode 100644 node_modules/ini/README.md create mode 100644 node_modules/ini/ini.js create mode 100644 node_modules/ini/package.json diff --git a/node_modules/ini/LICENSE b/node_modules/ini/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/ini/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/ini/README.md b/node_modules/ini/README.md new file mode 100644 index 0000000..33df258 --- /dev/null +++ b/node_modules/ini/README.md @@ -0,0 +1,102 @@ +An ini format parser and serializer for node. + +Sections are treated as nested objects. Items before the first +heading are saved on the object directly. + +## Usage + +Consider an ini-file `config.ini` that looks like this: + + ; this comment is being ignored + scope = global + + [database] + user = dbuser + password = dbpassword + database = use_this_database + + [paths.default] + datadir = /var/lib/data + array[] = first value + array[] = second value + array[] = third value + +You can read, manipulate and write the ini-file like so: + + var fs = require('fs') + , ini = require('ini') + + var config = ini.parse(fs.readFileSync('./config.ini', 'utf-8')) + + config.scope = 'local' + config.database.database = 'use_another_database' + config.paths.default.tmpdir = '/tmp' + delete config.paths.default.datadir + config.paths.default.array.push('fourth value') + + fs.writeFileSync('./config_modified.ini', ini.stringify(config, { section: 'section' })) + +This will result in a file called `config_modified.ini` being written +to the filesystem with the following content: + + [section] + scope=local + [section.database] + user=dbuser + password=dbpassword + database=use_another_database + [section.paths.default] + tmpdir=/tmp + array[]=first value + array[]=second value + array[]=third value + array[]=fourth value + + +## API + +### decode(inistring) + +Decode the ini-style formatted `inistring` into a nested object. + +### parse(inistring) + +Alias for `decode(inistring)` + +### encode(object, [options]) + +Encode the object `object` into an ini-style formatted string. If the +optional parameter `section` is given, then all top-level properties +of the object are put into this section and the `section`-string is +prepended to all sub-sections, see the usage example above. + +The `options` object may contain the following: + +* `section` A string which will be the first `section` in the encoded + ini data. Defaults to none. +* `whitespace` Boolean to specify whether to put whitespace around the + `=` character. By default, whitespace is omitted, to be friendly to + some persnickety old parsers that don't tolerate it well. But some + find that it's more human-readable and pretty with the whitespace. + +For backwards compatibility reasons, if a `string` options is passed +in, then it is assumed to be the `section` value. + +### stringify(object, [options]) + +Alias for `encode(object, [options])` + +### safe(val) + +Escapes the string `val` such that it is safe to be used as a key or +value in an ini-file. Basically escapes quotes. For example + + ini.safe('"unsafe string"') + +would result in + + "\"unsafe string\"" + +### unsafe(val) + +Unescapes the string `val` diff --git a/node_modules/ini/ini.js b/node_modules/ini/ini.js new file mode 100644 index 0000000..7d05a71 --- /dev/null +++ b/node_modules/ini/ini.js @@ -0,0 +1,206 @@ +const { hasOwnProperty } = Object.prototype + +const eol = typeof process !== 'undefined' && + process.platform === 'win32' ? '\r\n' : '\n' + +const encode = (obj, opt) => { + const children = [] + let out = '' + + if (typeof opt === 'string') { + opt = { + section: opt, + whitespace: false, + } + } else { + opt = opt || Object.create(null) + opt.whitespace = opt.whitespace === true + } + + const separator = opt.whitespace ? ' = ' : '=' + + for (const k of Object.keys(obj)) { + const val = obj[k] + if (val && Array.isArray(val)) { + for (const item of val) + out += safe(k + '[]') + separator + safe(item) + '\n' + } else if (val && typeof val === 'object') + children.push(k) + else + out += safe(k) + separator + safe(val) + eol + } + + if (opt.section && out.length) + out = '[' + safe(opt.section) + ']' + eol + out + + for (const k of children) { + const nk = dotSplit(k).join('\\.') + const section = (opt.section ? opt.section + '.' : '') + nk + const { whitespace } = opt + const child = encode(obj[k], { + section, + whitespace, + }) + if (out.length && child.length) + out += eol + + out += child + } + + return out +} + +const dotSplit = str => + str.replace(/\1/g, '\u0002LITERAL\\1LITERAL\u0002') + .replace(/\\\./g, '\u0001') + .split(/\./) + .map(part => + part.replace(/\1/g, '\\.') + .replace(/\2LITERAL\\1LITERAL\2/g, '\u0001')) + +const decode = str => { + const out = Object.create(null) + let p = out + let section = null + // section |key = value + const re = /^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i + const lines = str.split(/[\r\n]+/g) + + for (const line of lines) { + if (!line || line.match(/^\s*[;#]/)) + continue + const match = line.match(re) + if (!match) + continue + if (match[1] !== undefined) { + section = unsafe(match[1]) + if (section === '__proto__') { + // not allowed + // keep parsing the section, but don't attach it. + p = Object.create(null) + continue + } + p = out[section] = out[section] || Object.create(null) + continue + } + const keyRaw = unsafe(match[2]) + const isArray = keyRaw.length > 2 && keyRaw.slice(-2) === '[]' + const key = isArray ? keyRaw.slice(0, -2) : keyRaw + if (key === '__proto__') + continue + const valueRaw = match[3] ? unsafe(match[4]) : true + const value = valueRaw === 'true' || + valueRaw === 'false' || + valueRaw === 'null' ? JSON.parse(valueRaw) + : valueRaw + + // Convert keys with '[]' suffix to an array + if (isArray) { + if (!hasOwnProperty.call(p, key)) + p[key] = [] + else if (!Array.isArray(p[key])) + p[key] = [p[key]] + } + + // safeguard against resetting a previously defined + // array by accidentally forgetting the brackets + if (Array.isArray(p[key])) + p[key].push(value) + else + p[key] = value + } + + // {a:{y:1},"a.b":{x:2}} --> {a:{y:1,b:{x:2}}} + // use a filter to return the keys that have to be deleted. + const remove = [] + for (const k of Object.keys(out)) { + if (!hasOwnProperty.call(out, k) || + typeof out[k] !== 'object' || + Array.isArray(out[k])) + continue + + // see if the parent section is also an object. + // if so, add it to that, and mark this one for deletion + const parts = dotSplit(k) + let p = out + const l = parts.pop() + const nl = l.replace(/\\\./g, '.') + for (const part of parts) { + if (part === '__proto__') + continue + if (!hasOwnProperty.call(p, part) || typeof p[part] !== 'object') + p[part] = Object.create(null) + p = p[part] + } + if (p === out && nl === l) + continue + + p[nl] = out[k] + remove.push(k) + } + for (const del of remove) + delete out[del] + + return out +} + +const isQuoted = val => + (val.charAt(0) === '"' && val.slice(-1) === '"') || + (val.charAt(0) === "'" && val.slice(-1) === "'") + +const safe = val => + (typeof val !== 'string' || + val.match(/[=\r\n]/) || + val.match(/^\[/) || + (val.length > 1 && + isQuoted(val)) || + val !== val.trim()) + ? JSON.stringify(val) + : val.replace(/;/g, '\\;').replace(/#/g, '\\#') + +const unsafe = (val, doUnesc) => { + val = (val || '').trim() + if (isQuoted(val)) { + // remove the single quotes before calling JSON.parse + if (val.charAt(0) === "'") + val = val.substr(1, val.length - 2) + + try { + val = JSON.parse(val) + } catch (_) {} + } else { + // walk the val to find the first not-escaped ; character + let esc = false + let unesc = '' + for (let i = 0, l = val.length; i < l; i++) { + const c = val.charAt(i) + if (esc) { + if ('\\;#'.indexOf(c) !== -1) + unesc += c + else + unesc += '\\' + c + + esc = false + } else if (';#'.indexOf(c) !== -1) + break + else if (c === '\\') + esc = true + else + unesc += c + } + if (esc) + unesc += '\\' + + return unesc.trim() + } + return val +} + +module.exports = { + parse: decode, + decode, + stringify: encode, + encode, + safe, + unsafe, +} diff --git a/node_modules/ini/package.json b/node_modules/ini/package.json new file mode 100644 index 0000000..59b7d5d --- /dev/null +++ b/node_modules/ini/package.json @@ -0,0 +1,36 @@ +{ + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "name": "ini", + "description": "An ini encoder/decoder for node", + "version": "2.0.0", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/ini.git" + }, + "main": "ini.js", + "scripts": { + "eslint": "eslint", + "lint": "npm run eslint -- ini.js test/*.js", + "lintfix": "npm run lint -- --fix", + "test": "tap", + "posttest": "npm run lint", + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags" + }, + "devDependencies": { + "eslint": "^7.9.0", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^4.0.1", + "tap": "14" + }, + "license": "ISC", + "files": [ + "ini.js" + ], + "engines": { + "node": ">=10" + } +} From cbefd9cfaa9f07584ce7f8820b231b8896d888c4 Mon Sep 17 00:00:00 2001 From: dmvict Date: Tue, 7 May 2024 08:14:51 +0300 Subject: [PATCH 04/10] Extend willfile, add exclude pattern for module --- will.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/will.yml b/will.yml index 03a169e..c32b4a3 100644 --- a/will.yml +++ b/will.yml @@ -181,6 +181,7 @@ reflector: - ! /file-uri-to-path/ - ! /github-actions-parser/ - ! /graceful-fs/ + - ! /ini/ - ! /js-yaml/ - ! /lodash/ - ! /proper-lockfile/ From a158f43065232798be518ecbb243a26f8907ab0c Mon Sep 17 00:00:00 2001 From: dmvict Date: Tue, 7 May 2024 08:47:15 +0300 Subject: [PATCH 05/10] Extend section `retry_condition` of file `Readme.md`, add info about current step outputs --- Readme.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/Readme.md b/Readme.md index a31aba8..0ee0e62 100644 --- a/Readme.md +++ b/Readme.md @@ -120,7 +120,7 @@ Set time out in ms for entire step including all retries. By default actions set ### `retry_condition` -Use any valid expression to decide the continuation of retries. If expression resolves to `false`, then the action interrupts retries. Default value is `true`. +Use any valid expression to control the continuation of retries. If the expression resolves to `false`, the action will interrupt the retries. Default value is `true`. ```yaml - uses: Wandalen/wretry.action@master with: @@ -130,7 +130,22 @@ Use any valid expression to decide the continuation of retries. If expression re option1: value option2: value ``` -**Attention**. The expression can be wrapped by expression tokens `${{ }}`. Github workflow runner resolves expressions wrapped in the tokens to a specific value and replaces action input. The expression without tokens will be resolved by the action for each retry. If you don't need recalculations put the expression in the expression tokens. +**Attention**. The expression can be wrapped in expression tokens `${{ }}`. The Github workflow runner will resolve the expressions wrapped in these tokens and replace the action input with the specific value. If you don't need the expression to be recalculated for each retry, you can put it inside the expression tokens. + +**How to use outputs of current step in condition** + +The action can resolve the output of the current step using the special syntax: `steps._this.outputs.`. The action uses the special name `_this` to refer to the current step. If you have a step with the name `_this` and provide the steps context using the `steps_context` option, the action will rewrite the value of this field. This does not affect the outputs of the workflow, but allows the action to access the current step's outputs. + +Example of condition with check of current step output: +```yaml +- uses: Wandalen/wretry.action@master + with: + action: owner/action-repo@version + retry_condition: steps._this.outputs.code == 0 + with: | + option1: value + option2: value +``` ### `github_token` From c36c4137c449eecf83a1a50b9c258c6a26edf957 Mon Sep 17 00:00:00 2001 From: dmvict Date: Wed, 8 May 2024 08:34:58 +0300 Subject: [PATCH 06/10] Fix helper routine for handling output --- src/Retry.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Retry.js b/src/Retry.js index 5927e7d..817f3d5 100644 --- a/src/Retry.js +++ b/src/Retry.js @@ -165,7 +165,7 @@ function retry( scriptType ) { const githubOutputCleanRoutine = () => { - if( _.fileProvider.fileExists( process.env.GITHUB_OUTPUT ) ) + if( process.env.GITHUB_OUTPUT && _.fileProvider.fileExists( process.env.GITHUB_OUTPUT ) ) _.fileProvider.fileWrite( process.env.GITHUB_OUTPUT, '' ); return routine(); }; From 92b3115c66f0405d5ff4327d8387619f885f846d Mon Sep 17 00:00:00 2001 From: dmvict Date: Wed, 8 May 2024 09:00:56 +0300 Subject: [PATCH 07/10] Write test routine `retryWithOptionRetryConditionAndCheckOfStepOutput` --- test/Command.test.s | 87 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/test/Command.test.s b/test/Command.test.s index e569fb2..42377e3 100644 --- a/test/Command.test.s +++ b/test/Command.test.s @@ -467,6 +467,92 @@ function retryAndCheckRuntimeEnvironments( test ) // +function retryWithOptionRetryConditionAndCheckOfStepOutput( test ) +{ + let context = this; + const a = test.assetFor( false ); + const actionPath = a.abs( '_action/actions/wretry.action/v1' ); + const execPath = `node ${ a.path.nativize( a.abs( actionPath, 'src/Main.js' ) ) }`; + + /* - */ + + a.ready.then( () => + { + test.case = 'multiline command'; + core.exportVariable( `INPUT_COMMAND`, '|\necho "foo=bar" >> $GITHUB_OUTPUT\nexit 1' ); + core.exportVariable( `INPUT_STEPS_CONTEXT`, '{}' ); + core.exportVariable( `INPUT_RETRY_CONDITION`, `steps._this.outputs.foo == 'bar'` ); + core.exportVariable( `GITHUB_OUTPUT`, `${ actionPath }/github_output` ); + core.exportVariable( `INPUT_ATTEMPT_LIMIT`, '4' ); + return null; + }); + + actionSetup(); + + a.shellNonThrowing({ currentPath : actionPath, execPath }); + a.ready.then( ( op ) => + { + test.notIdentical( op.exitCode, 0 ); + test.identical( _.strCount( op.output, '::error::Please, specify Github action name' ), 0 ); + test.identical( _.strCount( op.output, 'Attempts exhausted, made 4 attempts' ), 1 ); + return null; + }); + + /* */ + + a.ready.then( () => + { + test.case = 'multiline command'; + core.exportVariable( `INPUT_COMMAND`, '|\necho "foo=bar" >> $GITHUB_OUTPUT\nexit 1' ); + core.exportVariable( `INPUT_STEPS_CONTEXT`, '{}' ); + core.exportVariable( `INPUT_RETRY_CONDITION`, `steps._this.outputs.foo == 'foo'` ); + core.exportVariable( `GITHUB_OUTPUT`, `${ actionPath }/github_output` ); + core.exportVariable( `INPUT_ATTEMPT_LIMIT`, '4' ); + return null; + }); + + actionSetup(); + + a.shellNonThrowing({ currentPath : actionPath, execPath }); + a.ready.then( ( op ) => + { + test.notIdentical( op.exitCode, 0 ); + test.identical( _.strCount( op.output, '::error::Please, specify Github action name' ), 0 ); + test.identical( _.strCount( op.output, 'Attempts exhausted, made 4 attempts' ), 0 ); + return null; + }); + + /* - */ + + return a.ready; + + /* */ + + function actionSetup() + { + a.ready.then( () => + { + a.fileProvider.filesDelete( a.abs( '.' ) ); + a.fileProvider.dirMake( actionPath ); + return null; + }); + a.ready.then( () => + { + return __.git.repositoryClone + ({ + localPath : actionPath, + remotePath : __.git.path.normalize( context.actionDirPath ), + attemptLimit : 4, + attemptDelay : 250, + attemptDelayMultiplier : 4, + }); + }); + return a.ready; + } +} + +// + function retryCheckRetryTime( test ) { let context = this; @@ -654,6 +740,7 @@ const Proto = retryWithOptionCurrentPath, retryWithMultilineCommand, retryAndCheckRuntimeEnvironments, + retryWithOptionRetryConditionAndCheckOfStepOutput, retryCheckRetryTime, }, }; From 348b8fd535c30a537ccc4cf726c3d9b17f2e5f1d Mon Sep 17 00:00:00 2001 From: dmvict Date: Fri, 10 May 2024 09:02:24 +0300 Subject: [PATCH 08/10] Fix test routine `retryWithOptionRetryConditionAndCheckOfStepOutput`, update command for windows shell --- test/Command.test.s | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/test/Command.test.s b/test/Command.test.s index 42377e3..8d083a9 100644 --- a/test/Command.test.s +++ b/test/Command.test.s @@ -479,10 +479,13 @@ function retryWithOptionRetryConditionAndCheckOfStepOutput( test ) a.ready.then( () => { test.case = 'multiline command'; - core.exportVariable( `INPUT_COMMAND`, '|\necho "foo=bar" >> $GITHUB_OUTPUT\nexit 1' ); + if( process.platform === 'win32' ) + core.exportVariable( `INPUT_COMMAND`, '|\necho $Env:GITHUB_OUTPUT\necho "foo=bar" >> $Env:GITHUB_OUTPUT\nexit 1' ); + else + core.exportVariable( `INPUT_COMMAND`, '|\necho $GITHUB_OUTPUT\necho "foo=bar" >> $GITHUB_OUTPUT\nexit 1' ); core.exportVariable( `INPUT_STEPS_CONTEXT`, '{}' ); core.exportVariable( `INPUT_RETRY_CONDITION`, `steps._this.outputs.foo == 'bar'` ); - core.exportVariable( `GITHUB_OUTPUT`, `${ actionPath }/github_output` ); + core.exportVariable( `GITHUB_OUTPUT`, `${ a.path.nativize( a.abs( actionPath, 'github_output' ) ) }` ); core.exportVariable( `INPUT_ATTEMPT_LIMIT`, '4' ); return null; }); @@ -492,6 +495,7 @@ function retryWithOptionRetryConditionAndCheckOfStepOutput( test ) a.shellNonThrowing({ currentPath : actionPath, execPath }); a.ready.then( ( op ) => { + console.log( op.output ); test.notIdentical( op.exitCode, 0 ); test.identical( _.strCount( op.output, '::error::Please, specify Github action name' ), 0 ); test.identical( _.strCount( op.output, 'Attempts exhausted, made 4 attempts' ), 1 ); @@ -503,10 +507,13 @@ function retryWithOptionRetryConditionAndCheckOfStepOutput( test ) a.ready.then( () => { test.case = 'multiline command'; - core.exportVariable( `INPUT_COMMAND`, '|\necho "foo=bar" >> $GITHUB_OUTPUT\nexit 1' ); + if( process.platform === 'win32' ) + core.exportVariable( `INPUT_COMMAND`, '|\necho $Env:GITHUB_OUTPUT\necho "foo=bar" >> $Env:GITHUB_OUTPUT\nexit 1' ); + else + core.exportVariable( `INPUT_COMMAND`, '|\necho $GITHUB_OUTPUT\necho "foo=bar" >> $GITHUB_OUTPUT\nexit 1' ); core.exportVariable( `INPUT_STEPS_CONTEXT`, '{}' ); core.exportVariable( `INPUT_RETRY_CONDITION`, `steps._this.outputs.foo == 'foo'` ); - core.exportVariable( `GITHUB_OUTPUT`, `${ actionPath }/github_output` ); + core.exportVariable( `GITHUB_OUTPUT`, `${ a.path.nativize( a.abs( actionPath, 'github_output' ) ) }` ); core.exportVariable( `INPUT_ATTEMPT_LIMIT`, '4' ); return null; }); From 47baebbefa830243f2a80888f71d0b23cdf93292 Mon Sep 17 00:00:00 2001 From: dmvict Date: Fri, 10 May 2024 17:04:49 +0300 Subject: [PATCH 09/10] Remove varible `INPUT_RETRY_CONDITION` from execution --- test/Command.test.s | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/Command.test.s b/test/Command.test.s index 8d083a9..a69af6e 100644 --- a/test/Command.test.s +++ b/test/Command.test.s @@ -30,6 +30,7 @@ function onRoutineBegin() delete process.env.INPUT_ATTEMPT_LIMIT; delete process.env.INPUT_WITH; delete process.env.INPUT_ATTEMPT_DELAY; + delete process.env.INPUT_RETRY_CONDITION; } // @@ -529,6 +530,12 @@ function retryWithOptionRetryConditionAndCheckOfStepOutput( test ) return null; }); + a.ready.finally( () => + { + core.exportVariable( `INPUT_RETRY_CONDITION`, true ); + return null; + }); + /* - */ return a.ready; From 6d5e72be25a3dc6b1bccb078f0acdcf0a0e076d4 Mon Sep 17 00:00:00 2001 From: dmvict Date: Fri, 10 May 2024 17:27:05 +0300 Subject: [PATCH 10/10] Remove varible `GITHUB_OUTPUT` from execution --- test/Action.test.s | 6 ++++++ test/Command.test.s | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/test/Action.test.s b/test/Action.test.s index 9831dbc..861db89 100644 --- a/test/Action.test.s +++ b/test/Action.test.s @@ -1681,6 +1681,12 @@ function retryDockerTrivialAction( test ) return null; }); + a.ready.finally( () => + { + delete process.env.GITHUB_OUTPUT; + return null; + }); + /* - */ return a.ready; diff --git a/test/Command.test.s b/test/Command.test.s index a69af6e..925caa9 100644 --- a/test/Command.test.s +++ b/test/Command.test.s @@ -31,6 +31,7 @@ function onRoutineBegin() delete process.env.INPUT_WITH; delete process.env.INPUT_ATTEMPT_DELAY; delete process.env.INPUT_RETRY_CONDITION; + delete process.env.GITHUB_OUTPUT; } // @@ -536,6 +537,12 @@ function retryWithOptionRetryConditionAndCheckOfStepOutput( test ) return null; }); + a.ready.finally( () => + { + delete process.env.GITHUB_OUTPUT; + return null; + }); + /* - */ return a.ready;