mirror of
https://github.com/actions/checkout.git
synced 2026-06-26 18:03:53 +08:00
Compare commits
2 Commits
fix-window
...
26bf18e514
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
26bf18e514 | ||
|
|
0dcc70b094 |
@@ -974,46 +974,6 @@ describe('git-auth-helper tests', () => {
|
|||||||
).toBe(false)
|
).toBe(false)
|
||||||
expect((authHelper as any).testCredentialsConfigPath('')).toBe(false)
|
expect((authHelper as any).testCredentialsConfigPath('')).toBe(false)
|
||||||
})
|
})
|
||||||
|
|
||||||
const includeIfCleanupRegex_matchesBothVariants =
|
|
||||||
'includeIf cleanup regex matches both gitdir: and gitdir/i: keys'
|
|
||||||
it(includeIfCleanupRegex_matchesBothVariants, async () => {
|
|
||||||
// The cleanup regex must match both variants so credential
|
|
||||||
// removal works regardless of which was written
|
|
||||||
const regex = /^includeIf\.gitdir(\/i)?:/
|
|
||||||
expect(regex.test('includeIf.gitdir:D:/workspaces/repo/.git.path')).toBe(
|
|
||||||
true
|
|
||||||
)
|
|
||||||
expect(regex.test('includeIf.gitdir/i:D:/Workspaces/repo/.git.path')).toBe(
|
|
||||||
true
|
|
||||||
)
|
|
||||||
expect(regex.test('includeIf.gitdir/i:/github/workspace/.git.path')).toBe(
|
|
||||||
true
|
|
||||||
)
|
|
||||||
expect(regex.test('includeIf.gitdir:~/projects/foo/.git.path')).toBe(true)
|
|
||||||
expect(regex.test('includeIf.onbranch:main.path')).toBe(false)
|
|
||||||
expect(regex.test('include.path')).toBe(false)
|
|
||||||
})
|
|
||||||
|
|
||||||
const includeIfDirective_usesCorrectVariantForPlatform =
|
|
||||||
'includeIf directive uses gitdir/i on Windows and gitdir on other platforms'
|
|
||||||
it(includeIfDirective_usesCorrectVariantForPlatform, async () => {
|
|
||||||
await setup(includeIfDirective_usesCorrectVariantForPlatform)
|
|
||||||
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
|
|
||||||
await authHelper.configureAuth()
|
|
||||||
|
|
||||||
const localConfigContent = (
|
|
||||||
await fs.promises.readFile(localGitConfigPath)
|
|
||||||
).toString()
|
|
||||||
|
|
||||||
if (isWindows) {
|
|
||||||
expect(localConfigContent).toContain('includeIf.gitdir/i:')
|
|
||||||
expect(localConfigContent).not.toContain('includeIf.gitdir:')
|
|
||||||
} else {
|
|
||||||
expect(localConfigContent).toContain('includeIf.gitdir:')
|
|
||||||
expect(localConfigContent).not.toContain('includeIf.gitdir/i:')
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
||||||
async function setup(testName: string): Promise<void> {
|
async function setup(testName: string): Promise<void> {
|
||||||
|
|||||||
@@ -133,16 +133,6 @@ describe('input-helper tests', () => {
|
|||||||
expect(settings.commit).toBe('1111111111222222222233333333334444444444')
|
expect(settings.commit).toBe('1111111111222222222233333333334444444444')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('sets ref to empty when explicit sha-256', async () => {
|
|
||||||
inputs.ref =
|
|
||||||
'1111111111222222222233333333334444444444555555555566666666667777'
|
|
||||||
const settings: IGitSourceSettings = await inputHelper.getInputs()
|
|
||||||
expect(settings.ref).toBeFalsy()
|
|
||||||
expect(settings.commit).toBe(
|
|
||||||
'1111111111222222222233333333334444444444555555555566666666667777'
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('sets sha to empty when explicit ref', async () => {
|
it('sets sha to empty when explicit ref', async () => {
|
||||||
inputs.ref = 'refs/heads/some-other-ref'
|
inputs.ref = 'refs/heads/some-other-ref'
|
||||||
const settings: IGitSourceSettings = await inputHelper.getInputs()
|
const settings: IGitSourceSettings = await inputHelper.getInputs()
|
||||||
|
|||||||
@@ -1,12 +1,8 @@
|
|||||||
import * as assert from 'assert'
|
import * as assert from 'assert'
|
||||||
import * as core from '@actions/core'
|
|
||||||
import * as github from '@actions/github'
|
|
||||||
import * as refHelper from '../lib/ref-helper'
|
import * as refHelper from '../lib/ref-helper'
|
||||||
import {IGitCommandManager} from '../lib/git-command-manager'
|
import {IGitCommandManager} from '../lib/git-command-manager'
|
||||||
|
|
||||||
const commit = '1234567890123456789012345678901234567890'
|
const commit = '1234567890123456789012345678901234567890'
|
||||||
const sha256Commit =
|
|
||||||
'1234567890123456789012345678901234567890123456789012345678901234'
|
|
||||||
let git: IGitCommandManager
|
let git: IGitCommandManager
|
||||||
|
|
||||||
describe('ref-helper tests', () => {
|
describe('ref-helper tests', () => {
|
||||||
@@ -41,12 +37,6 @@ describe('ref-helper tests', () => {
|
|||||||
expect(checkoutInfo.startPoint).toBeFalsy()
|
expect(checkoutInfo.startPoint).toBeFalsy()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('getCheckoutInfo sha-256 only', async () => {
|
|
||||||
const checkoutInfo = await refHelper.getCheckoutInfo(git, '', sha256Commit)
|
|
||||||
expect(checkoutInfo.ref).toBe(sha256Commit)
|
|
||||||
expect(checkoutInfo.startPoint).toBeFalsy()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('getCheckoutInfo refs/heads/', async () => {
|
it('getCheckoutInfo refs/heads/', async () => {
|
||||||
const checkoutInfo = await refHelper.getCheckoutInfo(
|
const checkoutInfo = await refHelper.getCheckoutInfo(
|
||||||
git,
|
git,
|
||||||
@@ -237,142 +227,4 @@ describe('ref-helper tests', () => {
|
|||||||
'+refs/heads/my/branch:refs/remotes/origin/my/branch'
|
'+refs/heads/my/branch:refs/remotes/origin/my/branch'
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('checkCommitInfo', () => {
|
|
||||||
const repositoryOwner = 'some-owner'
|
|
||||||
const repositoryName = 'some-repo'
|
|
||||||
const ref = 'refs/pull/123/merge'
|
|
||||||
const sha1Head = '1111111111222222222233333333334444444444'
|
|
||||||
const sha1Base = 'aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd'
|
|
||||||
const sha256Head =
|
|
||||||
'1111111111222222222233333333334444444444555555555566666666667777'
|
|
||||||
const sha256Base =
|
|
||||||
'aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffff0000'
|
|
||||||
let debugSpy: jest.SpyInstance
|
|
||||||
let getOctokitSpy: jest.SpyInstance
|
|
||||||
let repoGetSpy: jest.Mock
|
|
||||||
let originalEventName: string
|
|
||||||
let originalPayload: unknown
|
|
||||||
let originalRef: string
|
|
||||||
let originalSha: string
|
|
||||||
|
|
||||||
function setPullRequestContext(
|
|
||||||
expectedHeadSha: string,
|
|
||||||
expectedBaseSha: string,
|
|
||||||
mergeCommit: string
|
|
||||||
): void {
|
|
||||||
;(github.context as any).eventName = 'pull_request'
|
|
||||||
github.context.ref = ref
|
|
||||||
github.context.sha = mergeCommit
|
|
||||||
;(github.context as any).payload = {
|
|
||||||
action: 'synchronize',
|
|
||||||
after: expectedHeadSha,
|
|
||||||
number: 123,
|
|
||||||
pull_request: {
|
|
||||||
base: {
|
|
||||||
sha: expectedBaseSha
|
|
||||||
}
|
|
||||||
},
|
|
||||||
repository: {
|
|
||||||
private: false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
originalEventName = github.context.eventName
|
|
||||||
originalPayload = github.context.payload
|
|
||||||
originalRef = github.context.ref
|
|
||||||
originalSha = github.context.sha
|
|
||||||
|
|
||||||
jest.spyOn(github.context, 'repo', 'get').mockReturnValue({
|
|
||||||
owner: repositoryOwner,
|
|
||||||
repo: repositoryName
|
|
||||||
})
|
|
||||||
debugSpy = jest.spyOn(core, 'debug').mockImplementation(jest.fn())
|
|
||||||
repoGetSpy = jest.fn(async () => ({}))
|
|
||||||
getOctokitSpy = jest.spyOn(github, 'getOctokit').mockReturnValue({
|
|
||||||
rest: {
|
|
||||||
repos: {
|
|
||||||
get: repoGetSpy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} as any)
|
|
||||||
})
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
;(github.context as any).eventName = originalEventName
|
|
||||||
;(github.context as any).payload = originalPayload
|
|
||||||
github.context.ref = originalRef
|
|
||||||
github.context.sha = originalSha
|
|
||||||
jest.restoreAllMocks()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('returns early for SHA-1 merge commit', async () => {
|
|
||||||
setPullRequestContext(sha1Head, sha1Base, commit)
|
|
||||||
|
|
||||||
await refHelper.checkCommitInfo(
|
|
||||||
'token',
|
|
||||||
`Merge ${sha1Head} into ${sha1Base}`,
|
|
||||||
repositoryOwner,
|
|
||||||
repositoryName,
|
|
||||||
ref,
|
|
||||||
commit
|
|
||||||
)
|
|
||||||
|
|
||||||
expect(getOctokitSpy).not.toHaveBeenCalled()
|
|
||||||
expect(repoGetSpy).not.toHaveBeenCalled()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('matches SHA-256 merge commit info', async () => {
|
|
||||||
const actualHeadSha =
|
|
||||||
'9999999999888888888877777777776666666666555555555544444444443333'
|
|
||||||
setPullRequestContext(sha256Head, sha256Base, sha256Commit)
|
|
||||||
|
|
||||||
await refHelper.checkCommitInfo(
|
|
||||||
'token',
|
|
||||||
`Merge ${actualHeadSha} into ${sha256Base}`,
|
|
||||||
repositoryOwner,
|
|
||||||
repositoryName,
|
|
||||||
ref,
|
|
||||||
sha256Commit
|
|
||||||
)
|
|
||||||
|
|
||||||
expect(getOctokitSpy).toHaveBeenCalledWith(
|
|
||||||
'token',
|
|
||||||
expect.objectContaining({
|
|
||||||
userAgent: expect.stringContaining(
|
|
||||||
`expected_head_sha=${sha256Head};actual_head_sha=${actualHeadSha}`
|
|
||||||
)
|
|
||||||
})
|
|
||||||
)
|
|
||||||
expect(repoGetSpy).toHaveBeenCalledWith({
|
|
||||||
owner: repositoryOwner,
|
|
||||||
repo: repositoryName
|
|
||||||
})
|
|
||||||
expect(debugSpy).toHaveBeenCalledWith(
|
|
||||||
`Expected head sha ${sha256Head}; actual head sha ${actualHeadSha}`
|
|
||||||
)
|
|
||||||
expect(debugSpy).not.toHaveBeenCalledWith('Unexpected message format')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('does not match 50-char hex as a valid merge', async () => {
|
|
||||||
const invalidHeadSha =
|
|
||||||
'99999999998888888888777777777766666666665555555555'
|
|
||||||
setPullRequestContext(sha1Head, sha1Base, commit)
|
|
||||||
|
|
||||||
await refHelper.checkCommitInfo(
|
|
||||||
'token',
|
|
||||||
`Merge ${invalidHeadSha} into ${sha1Base}`,
|
|
||||||
repositoryOwner,
|
|
||||||
repositoryName,
|
|
||||||
ref,
|
|
||||||
commit
|
|
||||||
)
|
|
||||||
|
|
||||||
expect(getOctokitSpy).not.toHaveBeenCalled()
|
|
||||||
expect(repoGetSpy).not.toHaveBeenCalled()
|
|
||||||
expect(debugSpy).toHaveBeenCalledWith('Unexpected message format')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|||||||
24
dist/index.js
vendored
24
dist/index.js
vendored
@@ -151,12 +151,6 @@ const stateHelper = __importStar(__nccwpck_require__(4866));
|
|||||||
const urlHelper = __importStar(__nccwpck_require__(9437));
|
const urlHelper = __importStar(__nccwpck_require__(9437));
|
||||||
const uuid_1 = __nccwpck_require__(5840);
|
const uuid_1 = __nccwpck_require__(5840);
|
||||||
const IS_WINDOWS = process.platform === 'win32';
|
const IS_WINDOWS = process.platform === 'win32';
|
||||||
// Use case-insensitive gitdir matching on Windows to handle path casing mismatches
|
|
||||||
// between the runner's GITHUB_WORKSPACE and the actual filesystem casing.
|
|
||||||
// See: https://github.com/actions/checkout/issues/2345
|
|
||||||
const INCLUDE_IF_GITDIR = IS_WINDOWS
|
|
||||||
? 'includeIf.gitdir/i:'
|
|
||||||
: 'includeIf.gitdir:';
|
|
||||||
const SSH_COMMAND_KEY = 'core.sshCommand';
|
const SSH_COMMAND_KEY = 'core.sshCommand';
|
||||||
function createAuthHelper(git, settings) {
|
function createAuthHelper(git, settings) {
|
||||||
return new GitAuthHelper(git, settings);
|
return new GitAuthHelper(git, settings);
|
||||||
@@ -276,7 +270,7 @@ class GitAuthHelper {
|
|||||||
let submoduleGitDir = path.dirname(configPath); // The config file is at .git/modules/submodule-name/config
|
let submoduleGitDir = path.dirname(configPath); // The config file is at .git/modules/submodule-name/config
|
||||||
submoduleGitDir = submoduleGitDir.replace(/\\/g, '/'); // Use forward slashes, even on Windows
|
submoduleGitDir = submoduleGitDir.replace(/\\/g, '/'); // Use forward slashes, even on Windows
|
||||||
// Configure host includeIf
|
// Configure host includeIf
|
||||||
yield this.git.config(`${INCLUDE_IF_GITDIR}${submoduleGitDir}.path`, credentialsConfigPath, false, // globalConfig?
|
yield this.git.config(`includeIf.gitdir:${submoduleGitDir}.path`, credentialsConfigPath, false, // globalConfig?
|
||||||
false, // add?
|
false, // add?
|
||||||
configPath);
|
configPath);
|
||||||
// Container submodule git directory
|
// Container submodule git directory
|
||||||
@@ -286,7 +280,7 @@ class GitAuthHelper {
|
|||||||
relativeSubmoduleGitDir = relativeSubmoduleGitDir.replace(/\\/g, '/'); // Use forward slashes, even on Windows
|
relativeSubmoduleGitDir = relativeSubmoduleGitDir.replace(/\\/g, '/'); // Use forward slashes, even on Windows
|
||||||
const containerSubmoduleGitDir = path.posix.join('/github/workspace', relativeSubmoduleGitDir);
|
const containerSubmoduleGitDir = path.posix.join('/github/workspace', relativeSubmoduleGitDir);
|
||||||
// Configure container includeIf
|
// Configure container includeIf
|
||||||
yield this.git.config(`${INCLUDE_IF_GITDIR}${containerSubmoduleGitDir}.path`, containerCredentialsPath, false, // globalConfig?
|
yield this.git.config(`includeIf.gitdir:${containerSubmoduleGitDir}.path`, containerCredentialsPath, false, // globalConfig?
|
||||||
false, // add?
|
false, // add?
|
||||||
configPath);
|
configPath);
|
||||||
}
|
}
|
||||||
@@ -416,10 +410,10 @@ class GitAuthHelper {
|
|||||||
let gitDir = path.join(this.git.getWorkingDirectory(), '.git');
|
let gitDir = path.join(this.git.getWorkingDirectory(), '.git');
|
||||||
gitDir = gitDir.replace(/\\/g, '/'); // Use forward slashes, even on Windows
|
gitDir = gitDir.replace(/\\/g, '/'); // Use forward slashes, even on Windows
|
||||||
// Configure host includeIf
|
// Configure host includeIf
|
||||||
const hostIncludeKey = `${INCLUDE_IF_GITDIR}${gitDir}.path`;
|
const hostIncludeKey = `includeIf.gitdir:${gitDir}.path`;
|
||||||
yield this.git.config(hostIncludeKey, credentialsConfigPath);
|
yield this.git.config(hostIncludeKey, credentialsConfigPath);
|
||||||
// Configure host includeIf for worktrees
|
// Configure host includeIf for worktrees
|
||||||
const hostWorktreeIncludeKey = `${INCLUDE_IF_GITDIR}${gitDir}/worktrees/*.path`;
|
const hostWorktreeIncludeKey = `includeIf.gitdir:${gitDir}/worktrees/*.path`;
|
||||||
yield this.git.config(hostWorktreeIncludeKey, credentialsConfigPath);
|
yield this.git.config(hostWorktreeIncludeKey, credentialsConfigPath);
|
||||||
// Container git directory
|
// Container git directory
|
||||||
const workingDirectory = this.git.getWorkingDirectory();
|
const workingDirectory = this.git.getWorkingDirectory();
|
||||||
@@ -431,10 +425,10 @@ class GitAuthHelper {
|
|||||||
// Container credentials config path
|
// Container credentials config path
|
||||||
const containerCredentialsPath = path.posix.join('/github/runner_temp', path.basename(credentialsConfigPath));
|
const containerCredentialsPath = path.posix.join('/github/runner_temp', path.basename(credentialsConfigPath));
|
||||||
// Configure container includeIf
|
// Configure container includeIf
|
||||||
const containerIncludeKey = `${INCLUDE_IF_GITDIR}${containerGitDir}.path`;
|
const containerIncludeKey = `includeIf.gitdir:${containerGitDir}.path`;
|
||||||
yield this.git.config(containerIncludeKey, containerCredentialsPath);
|
yield this.git.config(containerIncludeKey, containerCredentialsPath);
|
||||||
// Configure container includeIf for worktrees
|
// Configure container includeIf for worktrees
|
||||||
const containerWorktreeIncludeKey = `${INCLUDE_IF_GITDIR}${containerGitDir}/worktrees/*.path`;
|
const containerWorktreeIncludeKey = `includeIf.gitdir:${containerGitDir}/worktrees/*.path`;
|
||||||
yield this.git.config(containerWorktreeIncludeKey, containerCredentialsPath);
|
yield this.git.config(containerWorktreeIncludeKey, containerCredentialsPath);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -571,7 +565,7 @@ class GitAuthHelper {
|
|||||||
const credentialsPaths = new Set();
|
const credentialsPaths = new Set();
|
||||||
try {
|
try {
|
||||||
// Get all includeIf.gitdir keys
|
// Get all includeIf.gitdir keys
|
||||||
const keys = yield this.git.tryGetConfigKeys('^includeIf\\.gitdir(/i)?:', false, // globalConfig?
|
const keys = yield this.git.tryGetConfigKeys('^includeIf\\.gitdir:', false, // globalConfig?
|
||||||
configPath);
|
configPath);
|
||||||
for (const key of keys) {
|
for (const key of keys) {
|
||||||
// Get all values for this key
|
// Get all values for this key
|
||||||
@@ -2027,7 +2021,7 @@ function getInputs() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// SHA?
|
// SHA?
|
||||||
else if (result.ref.match(/^(?:[0-9a-fA-F]{40}|[0-9a-fA-F]{64})$/)) {
|
else if (result.ref.match(/^[0-9a-fA-F]{40}$/)) {
|
||||||
result.commit = result.ref;
|
result.commit = result.ref;
|
||||||
result.ref = '';
|
result.ref = '';
|
||||||
}
|
}
|
||||||
@@ -2450,7 +2444,7 @@ function checkCommitInfo(token, commitInfo, repositoryOwner, repositoryName, ref
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Extract details from message
|
// Extract details from message
|
||||||
const match = commitInfo.match(/Merge ([0-9a-f]{40}|[0-9a-f]{64}) into ([0-9a-f]{40}|[0-9a-f]{64})/);
|
const match = commitInfo.match(/Merge ([0-9a-f]{40}) into ([0-9a-f]{40})/);
|
||||||
if (!match) {
|
if (!match) {
|
||||||
core.debug('Unexpected message format');
|
core.debug('Unexpected message format');
|
||||||
return;
|
return;
|
||||||
|
|||||||
22
package-lock.json
generated
22
package-lock.json
generated
@@ -13,13 +13,11 @@
|
|||||||
"@actions/exec": "^1.1.1",
|
"@actions/exec": "^1.1.1",
|
||||||
"@actions/github": "^6.0.0",
|
"@actions/github": "^6.0.0",
|
||||||
"@actions/io": "^1.1.3",
|
"@actions/io": "^1.1.3",
|
||||||
"@actions/tool-cache": "^2.0.1",
|
"@actions/tool-cache": "^2.0.1"
|
||||||
"uuid": "^9.0.1"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^29.5.12",
|
"@types/jest": "^29.5.12",
|
||||||
"@types/node": "^24.1.0",
|
"@types/node": "^24.1.0",
|
||||||
"@types/uuid": "^9.0.8",
|
|
||||||
"@typescript-eslint/eslint-plugin": "^7.9.0",
|
"@typescript-eslint/eslint-plugin": "^7.9.0",
|
||||||
"@typescript-eslint/parser": "^7.9.0",
|
"@typescript-eslint/parser": "^7.9.0",
|
||||||
"@vercel/ncc": "^0.38.1",
|
"@vercel/ncc": "^0.38.1",
|
||||||
@@ -1529,12 +1527,6 @@
|
|||||||
"integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
|
"integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/uuid": {
|
|
||||||
"version": "9.0.8",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz",
|
|
||||||
"integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/@types/yargs": {
|
"node_modules/@types/yargs": {
|
||||||
"version": "17.0.32",
|
"version": "17.0.32",
|
||||||
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz",
|
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz",
|
||||||
@@ -6914,18 +6906,6 @@
|
|||||||
"punycode": "^2.1.0"
|
"punycode": "^2.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/uuid": {
|
|
||||||
"version": "9.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
|
|
||||||
"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
|
|
||||||
"funding": [
|
|
||||||
"https://github.com/sponsors/broofa",
|
|
||||||
"https://github.com/sponsors/ctavan"
|
|
||||||
],
|
|
||||||
"bin": {
|
|
||||||
"uuid": "dist/bin/uuid"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/v8-to-istanbul": {
|
"node_modules/v8-to-istanbul": {
|
||||||
"version": "9.2.0",
|
"version": "9.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz",
|
||||||
|
|||||||
@@ -32,13 +32,11 @@
|
|||||||
"@actions/exec": "^1.1.1",
|
"@actions/exec": "^1.1.1",
|
||||||
"@actions/github": "^6.0.0",
|
"@actions/github": "^6.0.0",
|
||||||
"@actions/io": "^1.1.3",
|
"@actions/io": "^1.1.3",
|
||||||
"@actions/tool-cache": "^2.0.1",
|
"@actions/tool-cache": "^2.0.1"
|
||||||
"uuid": "^9.0.1"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^29.5.12",
|
"@types/jest": "^29.5.12",
|
||||||
"@types/node": "^24.1.0",
|
"@types/node": "^24.1.0",
|
||||||
"@types/uuid": "^9.0.8",
|
|
||||||
"@typescript-eslint/eslint-plugin": "^7.9.0",
|
"@typescript-eslint/eslint-plugin": "^7.9.0",
|
||||||
"@typescript-eslint/parser": "^7.9.0",
|
"@typescript-eslint/parser": "^7.9.0",
|
||||||
"@vercel/ncc": "^0.38.1",
|
"@vercel/ncc": "^0.38.1",
|
||||||
|
|||||||
@@ -8,17 +8,10 @@ import * as path from 'path'
|
|||||||
import * as regexpHelper from './regexp-helper'
|
import * as regexpHelper from './regexp-helper'
|
||||||
import * as stateHelper from './state-helper'
|
import * as stateHelper from './state-helper'
|
||||||
import * as urlHelper from './url-helper'
|
import * as urlHelper from './url-helper'
|
||||||
import {v4 as uuid} from 'uuid'
|
|
||||||
import {IGitCommandManager} from './git-command-manager'
|
import {IGitCommandManager} from './git-command-manager'
|
||||||
import {IGitSourceSettings} from './git-source-settings'
|
import {IGitSourceSettings} from './git-source-settings'
|
||||||
|
|
||||||
const IS_WINDOWS = process.platform === 'win32'
|
const IS_WINDOWS = process.platform === 'win32'
|
||||||
// Use case-insensitive gitdir matching on Windows to handle path casing mismatches
|
|
||||||
// between the runner's GITHUB_WORKSPACE and the actual filesystem casing.
|
|
||||||
// See: https://github.com/actions/checkout/issues/2345
|
|
||||||
const INCLUDE_IF_GITDIR = IS_WINDOWS
|
|
||||||
? 'includeIf.gitdir/i:'
|
|
||||||
: 'includeIf.gitdir:'
|
|
||||||
const SSH_COMMAND_KEY = 'core.sshCommand'
|
const SSH_COMMAND_KEY = 'core.sshCommand'
|
||||||
|
|
||||||
export interface IGitAuthHelper {
|
export interface IGitAuthHelper {
|
||||||
@@ -96,7 +89,7 @@ class GitAuthHelper {
|
|||||||
// Create a temp home directory
|
// Create a temp home directory
|
||||||
const runnerTemp = process.env['RUNNER_TEMP'] || ''
|
const runnerTemp = process.env['RUNNER_TEMP'] || ''
|
||||||
assert.ok(runnerTemp, 'RUNNER_TEMP is not defined')
|
assert.ok(runnerTemp, 'RUNNER_TEMP is not defined')
|
||||||
const uniqueId = uuid()
|
const uniqueId = crypto.randomUUID()
|
||||||
this.temporaryHomePath = path.join(runnerTemp, uniqueId)
|
this.temporaryHomePath = path.join(runnerTemp, uniqueId)
|
||||||
await fs.promises.mkdir(this.temporaryHomePath, {recursive: true})
|
await fs.promises.mkdir(this.temporaryHomePath, {recursive: true})
|
||||||
|
|
||||||
@@ -188,7 +181,7 @@ class GitAuthHelper {
|
|||||||
|
|
||||||
// Configure host includeIf
|
// Configure host includeIf
|
||||||
await this.git.config(
|
await this.git.config(
|
||||||
`${INCLUDE_IF_GITDIR}${submoduleGitDir}.path`,
|
`includeIf.gitdir:${submoduleGitDir}.path`,
|
||||||
credentialsConfigPath,
|
credentialsConfigPath,
|
||||||
false, // globalConfig?
|
false, // globalConfig?
|
||||||
false, // add?
|
false, // add?
|
||||||
@@ -210,7 +203,7 @@ class GitAuthHelper {
|
|||||||
|
|
||||||
// Configure container includeIf
|
// Configure container includeIf
|
||||||
await this.git.config(
|
await this.git.config(
|
||||||
`${INCLUDE_IF_GITDIR}${containerSubmoduleGitDir}.path`,
|
`includeIf.gitdir:${containerSubmoduleGitDir}.path`,
|
||||||
containerCredentialsPath,
|
containerCredentialsPath,
|
||||||
false, // globalConfig?
|
false, // globalConfig?
|
||||||
false, // add?
|
false, // add?
|
||||||
@@ -261,7 +254,7 @@ class GitAuthHelper {
|
|||||||
// Write key
|
// Write key
|
||||||
const runnerTemp = process.env['RUNNER_TEMP'] || ''
|
const runnerTemp = process.env['RUNNER_TEMP'] || ''
|
||||||
assert.ok(runnerTemp, 'RUNNER_TEMP is not defined')
|
assert.ok(runnerTemp, 'RUNNER_TEMP is not defined')
|
||||||
const uniqueId = uuid()
|
const uniqueId = crypto.randomUUID()
|
||||||
this.sshKeyPath = path.join(runnerTemp, uniqueId)
|
this.sshKeyPath = path.join(runnerTemp, uniqueId)
|
||||||
stateHelper.setSshKeyPath(this.sshKeyPath)
|
stateHelper.setSshKeyPath(this.sshKeyPath)
|
||||||
await fs.promises.mkdir(runnerTemp, {recursive: true})
|
await fs.promises.mkdir(runnerTemp, {recursive: true})
|
||||||
@@ -377,11 +370,11 @@ class GitAuthHelper {
|
|||||||
gitDir = gitDir.replace(/\\/g, '/') // Use forward slashes, even on Windows
|
gitDir = gitDir.replace(/\\/g, '/') // Use forward slashes, even on Windows
|
||||||
|
|
||||||
// Configure host includeIf
|
// Configure host includeIf
|
||||||
const hostIncludeKey = `${INCLUDE_IF_GITDIR}${gitDir}.path`
|
const hostIncludeKey = `includeIf.gitdir:${gitDir}.path`
|
||||||
await this.git.config(hostIncludeKey, credentialsConfigPath)
|
await this.git.config(hostIncludeKey, credentialsConfigPath)
|
||||||
|
|
||||||
// Configure host includeIf for worktrees
|
// Configure host includeIf for worktrees
|
||||||
const hostWorktreeIncludeKey = `${INCLUDE_IF_GITDIR}${gitDir}/worktrees/*.path`
|
const hostWorktreeIncludeKey = `includeIf.gitdir:${gitDir}/worktrees/*.path`
|
||||||
await this.git.config(hostWorktreeIncludeKey, credentialsConfigPath)
|
await this.git.config(hostWorktreeIncludeKey, credentialsConfigPath)
|
||||||
|
|
||||||
// Container git directory
|
// Container git directory
|
||||||
@@ -403,11 +396,11 @@ class GitAuthHelper {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Configure container includeIf
|
// Configure container includeIf
|
||||||
const containerIncludeKey = `${INCLUDE_IF_GITDIR}${containerGitDir}.path`
|
const containerIncludeKey = `includeIf.gitdir:${containerGitDir}.path`
|
||||||
await this.git.config(containerIncludeKey, containerCredentialsPath)
|
await this.git.config(containerIncludeKey, containerCredentialsPath)
|
||||||
|
|
||||||
// Configure container includeIf for worktrees
|
// Configure container includeIf for worktrees
|
||||||
const containerWorktreeIncludeKey = `${INCLUDE_IF_GITDIR}${containerGitDir}/worktrees/*.path`
|
const containerWorktreeIncludeKey = `includeIf.gitdir:${containerGitDir}/worktrees/*.path`
|
||||||
await this.git.config(
|
await this.git.config(
|
||||||
containerWorktreeIncludeKey,
|
containerWorktreeIncludeKey,
|
||||||
containerCredentialsPath
|
containerCredentialsPath
|
||||||
@@ -560,7 +553,7 @@ class GitAuthHelper {
|
|||||||
try {
|
try {
|
||||||
// Get all includeIf.gitdir keys
|
// Get all includeIf.gitdir keys
|
||||||
const keys = await this.git.tryGetConfigKeys(
|
const keys = await this.git.tryGetConfigKeys(
|
||||||
'^includeIf\\.gitdir(/i)?:',
|
'^includeIf\\.gitdir:',
|
||||||
false, // globalConfig?
|
false, // globalConfig?
|
||||||
configPath
|
configPath
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import * as io from '@actions/io'
|
|||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import * as retryHelper from './retry-helper'
|
import * as retryHelper from './retry-helper'
|
||||||
import * as toolCache from '@actions/tool-cache'
|
import * as toolCache from '@actions/tool-cache'
|
||||||
import {v4 as uuid} from 'uuid'
|
|
||||||
import {getServerApiUrl} from './url-helper'
|
import {getServerApiUrl} from './url-helper'
|
||||||
|
|
||||||
const IS_WINDOWS = process.platform === 'win32'
|
const IS_WINDOWS = process.platform === 'win32'
|
||||||
@@ -34,7 +33,7 @@ export async function downloadRepository(
|
|||||||
|
|
||||||
// Write archive to disk
|
// Write archive to disk
|
||||||
core.info('Writing archive to disk')
|
core.info('Writing archive to disk')
|
||||||
const uniqueId = uuid()
|
const uniqueId = crypto.randomUUID()
|
||||||
const archivePath = IS_WINDOWS
|
const archivePath = IS_WINDOWS
|
||||||
? path.join(repositoryPath, `${uniqueId}.zip`)
|
? path.join(repositoryPath, `${uniqueId}.zip`)
|
||||||
: path.join(repositoryPath, `${uniqueId}.tar.gz`)
|
: path.join(repositoryPath, `${uniqueId}.tar.gz`)
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ export async function getInputs(): Promise<IGitSourceSettings> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// SHA?
|
// SHA?
|
||||||
else if (result.ref.match(/^(?:[0-9a-fA-F]{40}|[0-9a-fA-F]{64})$/)) {
|
else if (result.ref.match(/^[0-9a-fA-F]{40}$/)) {
|
||||||
result.commit = result.ref
|
result.commit = result.ref
|
||||||
result.ref = ''
|
result.ref = ''
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -258,9 +258,7 @@ export async function checkCommitInfo(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Extract details from message
|
// Extract details from message
|
||||||
const match = commitInfo.match(
|
const match = commitInfo.match(/Merge ([0-9a-f]{40}) into ([0-9a-f]{40})/)
|
||||||
/Merge ([0-9a-f]{40}|[0-9a-f]{64}) into ([0-9a-f]{40}|[0-9a-f]{64})/
|
|
||||||
)
|
|
||||||
if (!match) {
|
if (!match) {
|
||||||
core.debug('Unexpected message format')
|
core.debug('Unexpected message format')
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user