Compare commits

...

5 Commits

Author SHA1 Message Date
axi92 4ebcf0addb
Merge 227ee32e4d into 3d3c42e5aa 2026-07-18 17:41:17 -04:00
Aiqiao Yan 3d3c42e5aa
prep v7.0.1 release (#2531)
* prep v7.0.1 release

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-17 14:45:11 -04:00
Aiqiao Yan 28802689a1
escape values passed to --unset (#2530) 2026-07-17 13:44:40 -04:00
axi92 227ee32e4d
chore: rebuild dist/index.js after rebasing onto upstream main 2026-07-06 15:16:54 +02:00
axi92 cf4d457ccf
feat: support custom SSH user in git auth configuration
- Allow sshUser setting to override default 'git' user in insteadOf config
- When sshUser is empty, default to 'git@github.com'
- When sshUser is provided (e.g., 'customuser'), use 'customuser@github.com'
- Updated tests to verify custom SSH user behavior in auth configuration

Co-Authored-By: Claude:Qwen3-Coder-Next-4bit
2026-07-06 15:15:52 +02:00
7 changed files with 112 additions and 7 deletions

View File

@ -1,5 +1,18 @@
# Changelog # Changelog
## v7.0.1
* Bump github/codeql-action from 3 to 4 by @dependabot[bot] in https://github.com/actions/checkout/pull/2475
* Bump actions/setup-node from 4 to 6 by @dependabot[bot] in https://github.com/actions/checkout/pull/2477
* Bump docker/build-push-action from 6.5.0 to 7.2.0 by @dependabot[bot] in https://github.com/actions/checkout/pull/2478
* Bump docker/login-action from 3.3.0 to 4.2.0 by @dependabot[bot] in https://github.com/actions/checkout/pull/2479
* Bump actions/checkout from 6 to 7 by @dependabot[bot] in https://github.com/actions/checkout/pull/2488
* Bump actions/upload-artifact from 4 to 7 by @dependabot[bot] in https://github.com/actions/checkout/pull/2476
* eslint 9 by @dependabot[bot] in https://github.com/actions/checkout/pull/2474
* Bump the minor-actions-dependencies group with 2 updates by @dependabot[bot] in https://github.com/actions/checkout/pull/2499
* skip running unsafe pr check if input is default by @aiqiaoy in https://github.com/actions/checkout/pull/2518
* trim only ascii whitespace for branch by @aiqiaoy in https://github.com/actions/checkout/pull/2521
* escape values passed to --unset by @aiqiaoy in https://github.com/actions/checkout/pull/2530
## v7.0.0 ## v7.0.0
* Block checking out fork PR for pull_request_target and workflow_run by @aiqiaoy in https://github.com/actions/checkout/pull/2454 * Block checking out fork PR for pull_request_target and workflow_run by @aiqiaoy in https://github.com/actions/checkout/pull/2454
* Bump actions/publish-immutable-action from 0.0.3 to 0.0.4 in the minor-actions-dependencies group across 1 directory by @dependabot[bot] in https://github.com/actions/checkout/pull/2458 * Bump actions/publish-immutable-action from 0.0.3 to 0.0.4 in the minor-actions-dependencies group across 1 directory by @dependabot[bot] in https://github.com/actions/checkout/pull/2458

View File

@ -995,6 +995,91 @@ describe('git-auth-helper tests', () => {
).toBe(false) ).toBe(false)
expect((authHelper as any).testCredentialsConfigPath('')).toBe(false) expect((authHelper as any).testCredentialsConfigPath('')).toBe(false)
}) })
const configureAuth_uses_default_git_user_when_sshUser_empty =
'configureAuth uses default git user when sshUser is empty'
it(configureAuth_uses_default_git_user_when_sshUser_empty, async () => {
// Arrange
await setup(configureAuth_uses_default_git_user_when_sshUser_empty)
settings.sshUser = ''
settings.sshKey = ''
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
// Act
await authHelper.configureAuth()
await authHelper.configureGlobalAuth()
// Assert - verify that git@github.com is in the insteadOf config
const home = git.env['HOME'] || tempHomedir
const configContent = (
await fs.promises.readFile(path.join(home, '.gitconfig'))
).toString()
expect(configContent.indexOf('url.https://github.com/.insteadOf git@github.com')).toBeGreaterThanOrEqual(0)
})
const configureAuth_uses_custom_ssh_user_when_sshUser_provided =
'configureAuth uses custom SSH user when sshUser is provided'
it(configureAuth_uses_custom_ssh_user_when_sshUser_provided, async () => {
// Arrange
await setup(configureAuth_uses_custom_ssh_user_when_sshUser_provided)
settings.sshUser = 'customuser'
settings.sshKey = ''
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
// Act
await authHelper.configureAuth()
await authHelper.configureGlobalAuth()
// Assert - verify that customuser@github.com is in the insteadOf config
const home = git.env['HOME'] || tempHomedir
const configContent = (
await fs.promises.readFile(path.join(home, '.gitconfig'))
).toString()
expect(configContent.indexOf('url.https://github.com/.insteadOf customuser@github.com')).toBeGreaterThanOrEqual(0)
})
const configureGlobalAuth_with_custom_sshUser =
'configureGlobalAuth with custom sshUser'
it(configureGlobalAuth_with_custom_sshUser, async () => {
// Arrange
await setup(configureGlobalAuth_with_custom_sshUser)
settings.sshUser = 'admin'
settings.sshKey = ''
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
// Act
await authHelper.configureAuth()
await authHelper.configureGlobalAuth()
// Assert - verify the .insteadOf config contains the custom user
const home = git.env['HOME'] || tempHomedir
const configContent = (
await fs.promises.readFile(path.join(home, '.gitconfig'))
).toString()
expect(configContent.indexOf('url.https://github.com/.insteadOf admin@github.com')).toBeGreaterThanOrEqual(0)
})
const configureSubmoduleAuth_with_custom_sshUser =
'configureSubmoduleAuth with custom sshUser'
it(configureSubmoduleAuth_with_custom_sshUser, async () => {
// Arrange
await setup(configureSubmoduleAuth_with_custom_sshUser)
settings.sshUser = 'deploy'
settings.sshKey = ''
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
await authHelper.configureAuth()
const mockSubmoduleForeach = git.submoduleForeach as jest.Mock<any>
mockSubmoduleForeach.mockClear()
// Act
await authHelper.configureSubmoduleAuth()
// Assert - verify the insteadOf config uses the custom user
expect(mockSubmoduleForeach).toHaveBeenCalledTimes(3)
expect(mockSubmoduleForeach.mock.calls[1][0]).toMatch(
/url.*insteadOf.*deploy@github.com:/
)
})
}) })
async function setup(testName: string): Promise<void> { async function setup(testName: string): Promise<void> {

7
dist/index.js vendored
View File

@ -35063,7 +35063,10 @@ class GitAuthHelper {
this.tokenConfigValue = `AUTHORIZATION: basic ${basicCredential}`; this.tokenConfigValue = `AUTHORIZATION: basic ${basicCredential}`;
// Instead of SSH URL // Instead of SSH URL
this.insteadOfKey = `url.${serverUrl.origin}/.insteadOf`; // "origin" is SCHEME://HOSTNAME[:PORT] this.insteadOfKey = `url.${serverUrl.origin}/.insteadOf`; // "origin" is SCHEME://HOSTNAME[:PORT]
this.insteadOfValues.push(`git@${serverUrl.hostname}:`); const sshUser = this.settings.sshUser && this.settings.sshUser.length > 0
? this.settings.sshUser
: 'git';
this.insteadOfValues.push(`${sshUser}@${serverUrl.hostname}:`);
if (this.settings.workflowOrganizationId) { if (this.settings.workflowOrganizationId) {
this.insteadOfValues.push(`org-${this.settings.workflowOrganizationId}@github.com:`); this.insteadOfValues.push(`org-${this.settings.workflowOrganizationId}@github.com:`);
} }
@ -35913,7 +35916,7 @@ class GitCommandManager {
else { else {
args.push(globalConfig ? '--global' : '--local'); args.push(globalConfig ? '--global' : '--local');
} }
args.push('--unset', configKey, configValue); args.push('--unset', configKey, regexp_helper_escape(configValue));
const output = await this.execGit(args, true); const output = await this.execGit(args, true);
return output.exitCode === 0; return output.exitCode === 0;
} }

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "checkout", "name": "checkout",
"version": "7.0.0", "version": "7.0.1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "checkout", "name": "checkout",
"version": "7.0.0", "version": "7.0.1",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/core": "^3.0.1", "@actions/core": "^3.0.1",

View File

@ -1,6 +1,6 @@
{ {
"name": "checkout", "name": "checkout",
"version": "7.0.0", "version": "7.0.1",
"description": "checkout action", "description": "checkout action",
"type": "module", "type": "module",
"main": "lib/main.js", "main": "lib/main.js",

View File

@ -65,7 +65,11 @@ class GitAuthHelper {
// Instead of SSH URL // Instead of SSH URL
this.insteadOfKey = `url.${serverUrl.origin}/.insteadOf` // "origin" is SCHEME://HOSTNAME[:PORT] this.insteadOfKey = `url.${serverUrl.origin}/.insteadOf` // "origin" is SCHEME://HOSTNAME[:PORT]
this.insteadOfValues.push(`git@${serverUrl.hostname}:`) const sshUser =
this.settings.sshUser && this.settings.sshUser.length > 0
? this.settings.sshUser
: 'git'
this.insteadOfValues.push(`${sshUser}@${serverUrl.hostname}:`)
if (this.settings.workflowOrganizationId) { if (this.settings.workflowOrganizationId) {
this.insteadOfValues.push( this.insteadOfValues.push(
`org-${this.settings.workflowOrganizationId}@github.com:` `org-${this.settings.workflowOrganizationId}@github.com:`

View File

@ -510,7 +510,7 @@ class GitCommandManager {
} else { } else {
args.push(globalConfig ? '--global' : '--local') args.push(globalConfig ? '--global' : '--local')
} }
args.push('--unset', configKey, configValue) args.push('--unset', configKey, regexpHelper.escape(configValue))
const output = await this.execGit(args, true) const output = await this.execGit(args, true)
return output.exitCode === 0 return output.exitCode === 0