Use callbacks for all Git command receivers

This commit is contained in:
Vallie Joseph 2022-11-30 19:32:40 +00:00 committed by Cory Miller
parent 755da8c3cf
commit d4a3cff00f
4 changed files with 96 additions and 19 deletions

View file

@ -7,6 +7,7 @@ import * as refHelper from './ref-helper'
import * as regexpHelper from './regexp-helper'
import * as retryHelper from './retry-helper'
import {GitVersion} from './git-version'
import stream, {Writable} from 'stream'
// Auth header not supported before 2.9
// Wire protocol v2 not supported before 2.18
@ -94,8 +95,11 @@ class GitCommandManager {
// Note, this implementation uses "rev-parse --symbolic-full-name" because the output from
// "branch --list" is more difficult when in a detached HEAD state.
// Note, this implementation uses "rev-parse --symbolic-full-name" because there is a bug
// in Git 2.18 that causes "rev-parse --symbolic" to output symbolic full names.
// TODO(https://github.com/actions/checkout/issues/786): this implementation uses
// "rev-parse --symbolic-full-name" because there is a bug
// in Git 2.18 that causes "rev-parse --symbolic" to output symbolic full names. When
// 2.18 is no longer supported, we can switch back to --symbolic.
const args = ['rev-parse', '--symbolic-full-name']
if (remote) {
@ -104,9 +108,36 @@ class GitCommandManager {
args.push('--branches')
}
const output = await this.execGit(args)
const stderr: string[] = []
const errline: string[] = []
const stdout: string[] = []
const stdline: string[] = []
for (let branch of output.stdout.trim().split('\n')) {
const listeners = {
stderr: (data: Buffer) => {
stderr.push(data.toString())
},
errline: (data: Buffer) => {
errline.push(data.toString())
},
stdout: (data: Buffer) => {
stdout.push(data.toString())
},
stdline: (data: Buffer) => {
stdline.push(data.toString())
}
}
core.info(`${this.gitPath} ${args.join(' ')}`)
await this.execGit(args, false, true, listeners)
core.debug(`stderr callback is: ${stderr}`)
core.debug(`errline callback is: ${errline}`)
core.debug(`stdout callback is: ${stdout}`)
core.debug(`stdline callback is: ${stdline}`)
for (let branch of stdline) {
branch = branch.trim()
if (branch) {
if (branch.startsWith('refs/heads/')) {
@ -119,6 +150,8 @@ class GitCommandManager {
}
}
core.info(result.join('\n'))
return result
}
@ -395,7 +428,8 @@ class GitCommandManager {
private async execGit(
args: string[],
allowAllExitCodes = false,
silent = false
silent = false,
customListeners = {}
): Promise<GitOutput> {
fshelper.directoryExistsSync(this.workingDirectory, true)
@ -409,18 +443,21 @@ class GitCommandManager {
env[key] = this.gitEnv[key]
}
const stdout: string[] = []
const defaultListener = {
stdout: (data: Buffer) => {
stdout.push(data.toString())
}
}
const mergedListeners = {...defaultListener, ...customListeners}
const stdout: string[] = []
const options = {
cwd: this.workingDirectory,
env,
silent,
ignoreReturnCode: allowAllExitCodes,
listeners: {
stdout: (data: Buffer) => {
stdout.push(data.toString())
}
}
listeners: mergedListeners
}
result.exitCode = await exec.exec(`"${this.gitPath}"`, args, options)