Take global core.sshCommand into consideration

This commit is contained in:
Luca Niccoli 2023-01-04 17:08:43 +01:00
parent ac59398561
commit e978c3f43b
5 changed files with 103 additions and 11 deletions

View File

@ -297,6 +297,41 @@ describe('git-auth-helper tests', () => {
) )
}) })
const configureAuth_setsSshCommandWithCustomCommand =
'sets SSH command preseving custom command'
it(configureAuth_setsSshCommandWithCustomCommand, async () => {
// Arrange
await setup(configureAuth_setsSshCommandWithCustomCommand)
await fs.promises.writeFile(globalGitConfigPath, 'core.sshCommand fakeSsh')
expect(await git.configExists('core.sshCommand', true)).toBeTruthy() // sanity check
expect(await git.configGet('core.sshCommand', true)).toBe('fakeSsh') // sanity check
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
// Act
await authHelper.configureAuth()
expect(git.configGet).toHaveBeenCalledWith('core.sshCommand', true)
// Assert git env var
const actualKeyPath = await getActualSshKeyPath()
const actualKnownHostsPath = await getActualSshKnownHostsPath()
const expectedSshCommand = `"fakeSsh" -i "$RUNNER_TEMP/${path.basename(
actualKeyPath
)}" -o StrictHostKeyChecking=yes -o CheckHostIP=no -o "UserKnownHostsFile=$RUNNER_TEMP/${path.basename(
actualKnownHostsPath
)}"`
expect(git.setEnvironmentVariable).toHaveBeenCalledWith(
'GIT_SSH_COMMAND',
expectedSshCommand
)
// Asserty git config
expect(git.config).toHaveBeenCalledWith(
'core.sshCommand',
expectedSshCommand
)
})
const configureAuth_writesExplicitKnownHosts = 'writes explicit known hosts' const configureAuth_writesExplicitKnownHosts = 'writes explicit known hosts'
it(configureAuth_writesExplicitKnownHosts, async () => { it(configureAuth_writesExplicitKnownHosts, async () => {
if (!sshPath) { if (!sshPath) {
@ -739,6 +774,7 @@ async function setup(testName: string): Promise<void> {
), ),
configExists: jest.fn( configExists: jest.fn(
async (key: string, globalConfig?: boolean): Promise<boolean> => { async (key: string, globalConfig?: boolean): Promise<boolean> => {
try {
const configPath = globalConfig const configPath = globalConfig
? path.join(git.env['HOME'] || tempHomedir, '.gitconfig') ? path.join(git.env['HOME'] || tempHomedir, '.gitconfig')
: localGitConfigPath : localGitConfigPath
@ -748,6 +784,37 @@ async function setup(testName: string): Promise<void> {
.split('\n') .split('\n')
.filter(x => x) .filter(x => x)
return lines.some(x => x.startsWith(key)) return lines.some(x => x.startsWith(key))
} catch (error) {
if ((error as any)?.code === 'ENOENT') {
return false
}
throw error
}
}
),
configGet: jest.fn(
async (key: string, globalConfig?: boolean): Promise<string> => {
try {
const configPath = globalConfig
? path.join(git.env['HOME'] || tempHomedir, '.gitconfig')
: localGitConfigPath
const content = await fs.promises.readFile(configPath)
const lines = content
.toString()
.split('\n')
.filter(x => x)
.filter(x => x.startsWith(key))
if (lines.length) {
return lines[0].split(' ')[1]
} else {
return ''
}
} catch (error) {
if ((error as any)?.code === 'ENOENT') {
return ''
}
throw error
}
} }
), ),
env: {}, env: {},

View File

@ -407,6 +407,7 @@ async function setup(testName: string): Promise<void> {
checkoutDetach: jest.fn(), checkoutDetach: jest.fn(),
config: jest.fn(), config: jest.fn(),
configExists: jest.fn(), configExists: jest.fn(),
configGet: jest.fn(),
fetch: jest.fn(), fetch: jest.fn(),
getDefaultBranch: jest.fn(), getDefaultBranch: jest.fn(),
getWorkingDirectory: jest.fn(() => repositoryPath), getWorkingDirectory: jest.fn(() => repositoryPath),

14
dist/index.js vendored
View File

@ -7253,7 +7253,9 @@ class GitAuthHelper {
stateHelper.setSshKnownHostsPath(this.sshKnownHostsPath); stateHelper.setSshKnownHostsPath(this.sshKnownHostsPath);
yield fs.promises.writeFile(this.sshKnownHostsPath, knownHosts); yield fs.promises.writeFile(this.sshKnownHostsPath, knownHosts);
// Configure GIT_SSH_COMMAND // Configure GIT_SSH_COMMAND
const sshPath = yield io.which('ssh', true); const sshPath = (yield this.git.configExists(SSH_COMMAND_KEY, true))
? yield this.git.configGet(SSH_COMMAND_KEY, true)
: yield io.which('ssh', true);
this.sshCommand = `"${sshPath}" -i "$RUNNER_TEMP/${path.basename(this.sshKeyPath)}"`; this.sshCommand = `"${sshPath}" -i "$RUNNER_TEMP/${path.basename(this.sshKeyPath)}"`;
if (this.settings.sshStrict) { if (this.settings.sshStrict) {
this.sshCommand += ' -o StrictHostKeyChecking=yes -o CheckHostIP=no'; this.sshCommand += ' -o StrictHostKeyChecking=yes -o CheckHostIP=no';
@ -7533,6 +7535,16 @@ class GitCommandManager {
return output.exitCode === 0; return output.exitCode === 0;
}); });
} }
configGet(configKey, globalConfig) {
return __awaiter(this, void 0, void 0, function* () {
const output = yield this.execGit([
'config',
globalConfig ? '--global' : '--local',
configKey
]);
return output.stdout.trim();
});
}
fetch(refSpec, fetchDepth) { fetch(refSpec, fetchDepth) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const args = ['-c', 'protocol.version=2', 'fetch']; const args = ['-c', 'protocol.version=2', 'fetch'];

View File

@ -253,7 +253,9 @@ class GitAuthHelper {
await fs.promises.writeFile(this.sshKnownHostsPath, knownHosts) await fs.promises.writeFile(this.sshKnownHostsPath, knownHosts)
// Configure GIT_SSH_COMMAND // Configure GIT_SSH_COMMAND
const sshPath = await io.which('ssh', true) const sshPath = (await this.git.configExists(SSH_COMMAND_KEY, true))
? await this.git.configGet(SSH_COMMAND_KEY, true)
: await io.which('ssh', true)
this.sshCommand = `"${sshPath}" -i "$RUNNER_TEMP/${path.basename( this.sshCommand = `"${sshPath}" -i "$RUNNER_TEMP/${path.basename(
this.sshKeyPath this.sshKeyPath
)}"` )}"`

View File

@ -26,6 +26,7 @@ export interface IGitCommandManager {
): Promise<void> ): Promise<void>
configExists(configKey: string, globalConfig?: boolean): Promise<boolean> configExists(configKey: string, globalConfig?: boolean): Promise<boolean>
fetch(refSpec: string[], fetchDepth?: number): Promise<void> fetch(refSpec: string[], fetchDepth?: number): Promise<void>
configGet(configKey: string, globalConfig?: boolean): Promise<string>
getDefaultBranch(repositoryUrl: string): Promise<string> getDefaultBranch(repositoryUrl: string): Promise<string>
getWorkingDirectory(): string getWorkingDirectory(): string
init(): Promise<void> init(): Promise<void>
@ -201,6 +202,15 @@ class GitCommandManager {
return output.exitCode === 0 return output.exitCode === 0
} }
async configGet(configKey: string, globalConfig?: boolean): Promise<string> {
const output = await this.execGit([
'config',
globalConfig ? '--global' : '--local',
configKey
])
return output.stdout.trim()
}
async fetch(refSpec: string[], fetchDepth?: number): Promise<void> { async fetch(refSpec: string[], fetchDepth?: number): Promise<void> {
const args = ['-c', 'protocol.version=2', 'fetch'] const args = ['-c', 'protocol.version=2', 'fetch']
if (!refSpec.some(x => x === refHelper.tagsRefSpec)) { if (!refSpec.some(x => x === refHelper.tagsRefSpec)) {