mirror of
https://code.forgejo.org/actions/checkout.git
synced 2024-12-23 12:36:00 +01:00
Take global core.sshCommand into consideration
This commit is contained in:
parent
ac59398561
commit
e978c3f43b
5 changed files with 103 additions and 11 deletions
|
@ -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,15 +774,47 @@ 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> => {
|
||||||
const configPath = globalConfig
|
try {
|
||||||
? path.join(git.env['HOME'] || tempHomedir, '.gitconfig')
|
const configPath = globalConfig
|
||||||
: localGitConfigPath
|
? path.join(git.env['HOME'] || tempHomedir, '.gitconfig')
|
||||||
const content = await fs.promises.readFile(configPath)
|
: localGitConfigPath
|
||||||
const lines = content
|
const content = await fs.promises.readFile(configPath)
|
||||||
.toString()
|
const lines = content
|
||||||
.split('\n')
|
.toString()
|
||||||
.filter(x => x)
|
.split('\n')
|
||||||
return lines.some(x => x.startsWith(key))
|
.filter(x => x)
|
||||||
|
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: {},
|
||||||
|
|
|
@ -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
14
dist/index.js
vendored
|
@ -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'];
|
||||||
|
|
|
@ -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
|
||||||
)}"`
|
)}"`
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
Loading…
Reference in a new issue