From ce8f47aa7f40abefa791d8aee110268f54fdd10c Mon Sep 17 00:00:00 2001 From: Michal Dorner Date: Tue, 11 Oct 2022 23:01:54 +0200 Subject: [PATCH] Fix incorrect handling of Unicode characters in exec() --- package-lock.json | 14 +++++++------- package.json | 2 +- src/exec.ts | 21 --------------------- src/git.ts | 41 +++++++++++++++++++++-------------------- 4 files changed, 29 insertions(+), 49 deletions(-) delete mode 100644 src/exec.ts diff --git a/package-lock.json b/package-lock.json index b3fb8ec6..9c5374b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@actions/core": "^1.2.4", - "@actions/exec": "^1.0.4", + "@actions/exec": "^1.1.1", "@actions/github": "^2.2.0", "@octokit/webhooks": "^7.6.2", "picomatch": "^2.2.2" @@ -44,9 +44,9 @@ } }, "node_modules/@actions/exec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.0.4.tgz", - "integrity": "sha512-4DPChWow9yc9W3WqEbUj8Nr86xkpyE29ZzWjXucHItclLbEW6jr80Zx4nqv18QL6KK65+cifiQZXvnqgTV6oHw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", + "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", "dependencies": { "@actions/io": "^1.0.1" } @@ -8437,9 +8437,9 @@ } }, "@actions/exec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.0.4.tgz", - "integrity": "sha512-4DPChWow9yc9W3WqEbUj8Nr86xkpyE29ZzWjXucHItclLbEW6jr80Zx4nqv18QL6KK65+cifiQZXvnqgTV6oHw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", + "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", "requires": { "@actions/io": "^1.0.1" } diff --git a/package.json b/package.json index 894680d2..c947f642 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "license": "MIT", "dependencies": { "@actions/core": "^1.2.4", - "@actions/exec": "^1.0.4", + "@actions/exec": "^1.1.1", "@actions/github": "^2.2.0", "@octokit/webhooks": "^7.6.2", "picomatch": "^2.2.2" diff --git a/src/exec.ts b/src/exec.ts deleted file mode 100644 index d0abd030..00000000 --- a/src/exec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import {exec as execImpl, ExecOptions} from '@actions/exec' - -// Wraps original exec() function -// Returns exit code and whole stdout/stderr -export default async function exec(commandLine: string, args?: string[], options?: ExecOptions): Promise { - options = options || {} - let stdout = '' - let stderr = '' - options.listeners = { - stdout: (data: Buffer) => (stdout += data.toString()), - stderr: (data: Buffer) => (stderr += data.toString()) - } - const code = await execImpl(commandLine, args, options) - return {code, stdout, stderr} -} - -export interface ExecResult { - code: number - stdout: string - stderr: string -} diff --git a/src/git.ts b/src/git.ts index 3d6d3be1..a4132362 100644 --- a/src/git.ts +++ b/src/git.ts @@ -1,4 +1,4 @@ -import exec from './exec' +import {getExecOutput} from '@actions/exec' import * as core from '@actions/core' import {File, ChangeStatus} from './file' @@ -9,7 +9,7 @@ export async function getChangesInLastCommit(): Promise { core.startGroup(`Change detection in last commit`) let output = '' try { - output = (await exec('git', ['log', '--format=', '--no-renames', '--name-status', '-z', '-n', '1'])).stdout + output = (await getExecOutput('git', ['log', '--format=', '--no-renames', '--name-status', '-z', '-n', '1'])).stdout } finally { fixStdOutNullTermination() core.endGroup() @@ -27,7 +27,8 @@ export async function getChanges(base: string, head: string): Promise { let output = '' try { // Two dots '..' change detection - directly compares two versions - output = (await exec('git', ['diff', '--no-renames', '--name-status', '-z', `${baseRef}..${headRef}`])).stdout + output = (await getExecOutput('git', ['diff', '--no-renames', '--name-status', '-z', `${baseRef}..${headRef}`])) + .stdout } finally { fixStdOutNullTermination() core.endGroup() @@ -41,7 +42,7 @@ export async function getChangesOnHead(): Promise { core.startGroup(`Change detection on HEAD`) let output = '' try { - output = (await exec('git', ['diff', '--no-renames', '--name-status', '-z', 'HEAD'])).stdout + output = (await getExecOutput('git', ['diff', '--no-renames', '--name-status', '-z', 'HEAD'])).stdout } finally { fixStdOutNullTermination() core.endGroup() @@ -57,7 +58,7 @@ export async function getChangesSinceMergeBase(base: string, head: string, initi if (baseRef === undefined || headRef === undefined) { return false } - return (await exec('git', ['merge-base', baseRef, headRef], {ignoreReturnCode: true})).code === 0 + return (await getExecOutput('git', ['merge-base', baseRef, headRef], {ignoreReturnCode: true})).exitCode === 0 } let noMergeBase = false @@ -66,12 +67,12 @@ export async function getChangesSinceMergeBase(base: string, head: string, initi baseRef = await getLocalRef(base) headRef = await getLocalRef(head) if (!(await hasMergeBase())) { - await exec('git', ['fetch', '--no-tags', `--depth=${initialFetchDepth}`, 'origin', base, head]) + await getExecOutput('git', ['fetch', '--no-tags', `--depth=${initialFetchDepth}`, 'origin', base, head]) if (baseRef === undefined || headRef === undefined) { baseRef = baseRef ?? (await getLocalRef(base)) headRef = headRef ?? (await getLocalRef(head)) if (baseRef === undefined || headRef === undefined) { - await exec('git', ['fetch', '--tags', '--depth=1', 'origin', base, head], { + await getExecOutput('git', ['fetch', '--tags', '--depth=1', 'origin', base, head], { ignoreReturnCode: true // returns exit code 1 if tags on remote were updated - we can safely ignore it }) baseRef = baseRef ?? (await getLocalRef(base)) @@ -93,12 +94,12 @@ export async function getChangesSinceMergeBase(base: string, head: string, initi let lastCommitCount = await getCommitCount() while (!(await hasMergeBase())) { depth = Math.min(depth * 2, Number.MAX_SAFE_INTEGER) - await exec('git', ['fetch', `--deepen=${depth}`, 'origin', base, head]) + await getExecOutput('git', ['fetch', `--deepen=${depth}`, 'origin', base, head]) const commitCount = await getCommitCount() if (commitCount === lastCommitCount) { core.info('No more commits were fetched') core.info('Last attempt will be to fetch full history') - await exec('git', ['fetch']) + await getExecOutput('git', ['fetch']) if (!(await hasMergeBase())) { noMergeBase = true } @@ -122,7 +123,7 @@ export async function getChangesSinceMergeBase(base: string, head: string, initi core.startGroup(`Change detection ${diffArg}`) let output = '' try { - output = (await exec('git', ['diff', '--no-renames', '--name-status', '-z', diffArg])).stdout + output = (await getExecOutput('git', ['diff', '--no-renames', '--name-status', '-z', diffArg])).stdout } finally { fixStdOutNullTermination() core.endGroup() @@ -147,7 +148,7 @@ export async function listAllFilesAsAdded(): Promise { core.startGroup('Listing all files tracked by git') let output = '' try { - output = (await exec('git', ['ls-files', '-z'])).stdout + output = (await getExecOutput('git', ['ls-files', '-z'])).stdout } finally { fixStdOutNullTermination() core.endGroup() @@ -165,17 +166,17 @@ export async function listAllFilesAsAdded(): Promise { export async function getCurrentRef(): Promise { core.startGroup(`Get current git ref`) try { - const branch = (await exec('git', ['branch', '--show-current'])).stdout.trim() + const branch = (await getExecOutput('git', ['branch', '--show-current'])).stdout.trim() if (branch) { return branch } - const describe = await exec('git', ['describe', '--tags', '--exact-match'], {ignoreReturnCode: true}) - if (describe.code === 0) { + const describe = await getExecOutput('git', ['describe', '--tags', '--exact-match'], {ignoreReturnCode: true}) + if (describe.exitCode === 0) { return describe.stdout.trim() } - return (await exec('git', ['rev-parse', HEAD])).stdout.trim() + return (await getExecOutput('git', ['rev-parse', HEAD])).stdout.trim() } finally { core.endGroup() } @@ -198,11 +199,11 @@ export function isGitSha(ref: string): boolean { } async function hasCommit(ref: string): Promise { - return (await exec('git', ['cat-file', '-e', `${ref}^{commit}`], {ignoreReturnCode: true})).code === 0 + return (await getExecOutput('git', ['cat-file', '-e', `${ref}^{commit}`], {ignoreReturnCode: true})).exitCode === 0 } async function getCommitCount(): Promise { - const output = (await exec('git', ['rev-list', '--count', '--all'])).stdout + const output = (await getExecOutput('git', ['rev-list', '--count', '--all'])).stdout const count = parseInt(output) return isNaN(count) ? 0 : count } @@ -212,7 +213,7 @@ async function getLocalRef(shortName: string): Promise { return (await hasCommit(shortName)) ? shortName : undefined } - const output = (await exec('git', ['show-ref', shortName], {ignoreReturnCode: true})).stdout + const output = (await getExecOutput('git', ['show-ref', shortName], {ignoreReturnCode: true})).stdout const refs = output .split(/\r?\n/g) .map(l => l.match(/refs\/(?:(?:heads)|(?:tags)|(?:remotes\/origin))\/(.*)$/)) @@ -236,10 +237,10 @@ async function ensureRefAvailable(name: string): Promise { try { let ref = await getLocalRef(name) if (ref === undefined) { - await exec('git', ['fetch', '--depth=1', '--no-tags', 'origin', name]) + await getExecOutput('git', ['fetch', '--depth=1', '--no-tags', 'origin', name]) ref = await getLocalRef(name) if (ref === undefined) { - await exec('git', ['fetch', '--depth=1', '--tags', 'origin', name]) + await getExecOutput('git', ['fetch', '--depth=1', '--tags', 'origin', name]) ref = await getLocalRef(name) if (ref === undefined) { throw new Error(`Could not determine what is ${name} - fetch works but it's not a branch, tag or commit SHA`)