mirror of
https://github.com/actions/checkout.git
synced 2026-06-17 20:25:56 +00:00
Merge origin/main into aiqiaoy/update-error
This commit is contained in:
commit
29092a1639
@ -17,4 +17,4 @@ jobs:
|
|||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v6
|
||||||
- name: Publish
|
- name: Publish
|
||||||
id: publish
|
id: publish
|
||||||
uses: actions/publish-immutable-action@0.0.3
|
uses: actions/publish-immutable-action@v0.0.4
|
||||||
|
|||||||
@ -12,3 +12,4 @@ allowed:
|
|||||||
|
|
||||||
reviewed:
|
reviewed:
|
||||||
npm:
|
npm:
|
||||||
|
- "@actions/http-client" # MIT
|
||||||
|
|||||||
BIN
.licenses/npm/@actions/core.dep.yml
generated
BIN
.licenses/npm/@actions/core.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@actions/exec.dep.yml
generated
BIN
.licenses/npm/@actions/exec.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@actions/github.dep.yml
generated
BIN
.licenses/npm/@actions/github.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/@actions/http-client-4.0.1.dep.yml
generated
Normal file
BIN
.licenses/npm/@actions/http-client-4.0.1.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@actions/io.dep.yml
generated
BIN
.licenses/npm/@actions/io.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@actions/tool-cache.dep.yml
generated
BIN
.licenses/npm/@actions/tool-cache.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@fastify/busboy.dep.yml
generated
BIN
.licenses/npm/@fastify/busboy.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@octokit/auth-token.dep.yml
generated
BIN
.licenses/npm/@octokit/auth-token.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@octokit/core.dep.yml
generated
BIN
.licenses/npm/@octokit/core.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@octokit/endpoint.dep.yml
generated
BIN
.licenses/npm/@octokit/endpoint.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@octokit/graphql.dep.yml
generated
BIN
.licenses/npm/@octokit/graphql.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@octokit/openapi-types-22.1.0.dep.yml
generated
BIN
.licenses/npm/@octokit/openapi-types-22.1.0.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/@octokit/plugin-paginate-rest.dep.yml
generated
BIN
.licenses/npm/@octokit/plugin-paginate-rest.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/@octokit/request-error.dep.yml
generated
BIN
.licenses/npm/@octokit/request-error.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@octokit/request.dep.yml
generated
BIN
.licenses/npm/@octokit/request.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@octokit/types-13.4.1.dep.yml
generated
BIN
.licenses/npm/@octokit/types-13.4.1.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/before-after-hook.dep.yml
generated
BIN
.licenses/npm/before-after-hook.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/content-type.dep.yml
generated
Normal file
BIN
.licenses/npm/content-type.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/deprecation.dep.yml
generated
BIN
.licenses/npm/deprecation.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/once.dep.yml
generated
BIN
.licenses/npm/once.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/semver.dep.yml
generated
BIN
.licenses/npm/semver.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/undici.dep.yml
generated
BIN
.licenses/npm/undici.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/universal-user-agent.dep.yml
generated
BIN
.licenses/npm/universal-user-agent.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/uuid-8.3.2.dep.yml
generated
BIN
.licenses/npm/uuid-8.3.2.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/uuid-9.0.1.dep.yml
generated
BIN
.licenses/npm/uuid-9.0.1.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/wrappy.dep.yml
generated
BIN
.licenses/npm/wrappy.dep.yml
generated
Binary file not shown.
@ -1,5 +1,14 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 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
|
||||||
|
* 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 flatted from 3.3.1 to 3.4.2 by @dependabot[bot] in https://github.com/actions/checkout/pull/2460
|
||||||
|
* Bump js-yaml from 4.1.0 to 4.2.0 by @dependabot[bot] in https://github.com/actions/checkout/pull/2461
|
||||||
|
* Bump @actions/core and @actions/tool-cache and Remove uuid by @dependabot[bot] in https://github.com/actions/checkout/pull/2459
|
||||||
|
* upgrade module to esm and update dependencies by @aiqiaoy in https://github.com/actions/checkout/pull/2463
|
||||||
|
* Bump the minor-npm-dependencies group across 1 directory with 3 updates by @dependabot[bot] in https://github.com/actions/checkout/pull/2462
|
||||||
|
|
||||||
## v6.0.3
|
## v6.0.3
|
||||||
* Fix checkout init for SHA-256 repositories by @yaananth in https://github.com/actions/checkout/pull/2439
|
* Fix checkout init for SHA-256 repositories by @yaananth in https://github.com/actions/checkout/pull/2439
|
||||||
* fix: expand merge commit SHA regex and add SHA-256 test cases by @yaananth in https://github.com/actions/checkout/pull/2414
|
* fix: expand merge commit SHA regex and add SHA-256 test cases by @yaananth in https://github.com/actions/checkout/pull/2414
|
||||||
|
|||||||
44
README.md
44
README.md
@ -1,5 +1,14 @@
|
|||||||
[](https://github.com/actions/checkout/actions/workflows/test.yml)
|
[](https://github.com/actions/checkout/actions/workflows/test.yml)
|
||||||
|
|
||||||
|
# Checkout v7
|
||||||
|
|
||||||
|
## What's new
|
||||||
|
|
||||||
|
- Safer fork pull request handling: checkout now refuses to check out fork pull request code by default when the workflow is triggered by `pull_request_target` or `workflow_run`. These triggers run with the base repository's `GITHUB_TOKEN`, secrets, and runner access, where executing a fork's code commonly leads to "pwn request" vulnerabilities.
|
||||||
|
- To opt in after [reviewing the risks](https://gh.io/securely-using-pull_request_target), set the new `allow-unsafe-pr-checkout: true` input.
|
||||||
|
- Migrated `actions/checkout` to ESM to support new versions of the `@actions/*` packages.
|
||||||
|
- Updated direct and transitive dependencies, including security fixes for known vulnerabilities.
|
||||||
|
|
||||||
# Checkout v6
|
# Checkout v6
|
||||||
|
|
||||||
## What's new
|
## What's new
|
||||||
@ -15,7 +24,6 @@
|
|||||||
- Updated to the node24 runtime
|
- Updated to the node24 runtime
|
||||||
- This requires a minimum Actions Runner version of [v2.327.1](https://github.com/actions/runner/releases/tag/v2.327.1) to run.
|
- This requires a minimum Actions Runner version of [v2.327.1](https://github.com/actions/runner/releases/tag/v2.327.1) to run.
|
||||||
|
|
||||||
|
|
||||||
# Checkout v4
|
# Checkout v4
|
||||||
|
|
||||||
This action checks-out your repository under `$GITHUB_WORKSPACE`, so your workflow can access it.
|
This action checks-out your repository under `$GITHUB_WORKSPACE`, so your workflow can access it.
|
||||||
@ -52,7 +60,7 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
|
|||||||
|
|
||||||
<!-- start usage -->
|
<!-- start usage -->
|
||||||
```yaml
|
```yaml
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v7
|
||||||
with:
|
with:
|
||||||
# Repository name with owner. For example, actions/checkout
|
# Repository name with owner. For example, actions/checkout
|
||||||
# Default: ${{ github.repository }}
|
# Default: ${{ github.repository }}
|
||||||
@ -200,7 +208,7 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
|
|||||||
## Fetch only the root files
|
## Fetch only the root files
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v7
|
||||||
with:
|
with:
|
||||||
sparse-checkout: .
|
sparse-checkout: .
|
||||||
```
|
```
|
||||||
@ -208,7 +216,7 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
|
|||||||
## Fetch only the root files and `.github` and `src` folder
|
## Fetch only the root files and `.github` and `src` folder
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v7
|
||||||
with:
|
with:
|
||||||
sparse-checkout: |
|
sparse-checkout: |
|
||||||
.github
|
.github
|
||||||
@ -218,7 +226,7 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
|
|||||||
## Fetch only a single file
|
## Fetch only a single file
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v7
|
||||||
with:
|
with:
|
||||||
sparse-checkout: |
|
sparse-checkout: |
|
||||||
README.md
|
README.md
|
||||||
@ -228,7 +236,7 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
|
|||||||
## Fetch all history for all tags and branches
|
## Fetch all history for all tags and branches
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v7
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
```
|
```
|
||||||
@ -236,7 +244,7 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
|
|||||||
## Checkout a different branch
|
## Checkout a different branch
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v7
|
||||||
with:
|
with:
|
||||||
ref: my-branch
|
ref: my-branch
|
||||||
```
|
```
|
||||||
@ -244,7 +252,7 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
|
|||||||
## Checkout HEAD^
|
## Checkout HEAD^
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v7
|
||||||
with:
|
with:
|
||||||
fetch-depth: 2
|
fetch-depth: 2
|
||||||
- run: git checkout HEAD^
|
- run: git checkout HEAD^
|
||||||
@ -254,12 +262,12 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v7
|
||||||
with:
|
with:
|
||||||
path: main
|
path: main
|
||||||
|
|
||||||
- name: Checkout tools repo
|
- name: Checkout tools repo
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v7
|
||||||
with:
|
with:
|
||||||
repository: my-org/my-tools
|
repository: my-org/my-tools
|
||||||
path: my-tools
|
path: my-tools
|
||||||
@ -270,10 +278,10 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
- name: Checkout tools repo
|
- name: Checkout tools repo
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v7
|
||||||
with:
|
with:
|
||||||
repository: my-org/my-tools
|
repository: my-org/my-tools
|
||||||
path: my-tools
|
path: my-tools
|
||||||
@ -284,12 +292,12 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v7
|
||||||
with:
|
with:
|
||||||
path: main
|
path: main
|
||||||
|
|
||||||
- name: Checkout private tools
|
- name: Checkout private tools
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v7
|
||||||
with:
|
with:
|
||||||
repository: my-org/my-private-tools
|
repository: my-org/my-private-tools
|
||||||
token: ${{ secrets.GH_PAT }} # `GH_PAT` is a secret that contains your PAT
|
token: ${{ secrets.GH_PAT }} # `GH_PAT` is a secret that contains your PAT
|
||||||
@ -302,7 +310,7 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
|
|||||||
## Checkout pull request HEAD commit instead of merge commit
|
## Checkout pull request HEAD commit instead of merge commit
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v7
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
```
|
```
|
||||||
@ -318,7 +326,7 @@ jobs:
|
|||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v7
|
||||||
```
|
```
|
||||||
|
|
||||||
## Push a commit using the built-in token
|
## Push a commit using the built-in token
|
||||||
@ -329,7 +337,7 @@ jobs:
|
|||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v7
|
||||||
- run: |
|
- run: |
|
||||||
date > generated.txt
|
date > generated.txt
|
||||||
# Note: the following account information will not work on GHES
|
# Note: the following account information will not work on GHES
|
||||||
@ -351,7 +359,7 @@ jobs:
|
|||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v7
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.head_ref }}
|
ref: ${{ github.head_ref }}
|
||||||
- run: |
|
- run: |
|
||||||
|
|||||||
@ -1,12 +1,46 @@
|
|||||||
import * as core from '@actions/core'
|
import {
|
||||||
|
jest,
|
||||||
|
describe,
|
||||||
|
it,
|
||||||
|
expect,
|
||||||
|
beforeAll,
|
||||||
|
beforeEach,
|
||||||
|
afterEach,
|
||||||
|
afterAll
|
||||||
|
} from '@jest/globals'
|
||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
import * as gitAuthHelper from '../lib/git-auth-helper'
|
|
||||||
import * as io from '@actions/io'
|
import * as io from '@actions/io'
|
||||||
import * as os from 'os'
|
import * as os from 'os'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import * as stateHelper from '../lib/state-helper'
|
import {fileURLToPath} from 'url'
|
||||||
import {IGitCommandManager} from '../lib/git-command-manager'
|
|
||||||
import {IGitSourceSettings} from '../lib/git-source-settings'
|
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||||||
|
|
||||||
|
// Mock @actions/core before loading git-auth-helper
|
||||||
|
jest.unstable_mockModule('@actions/core', () => ({
|
||||||
|
setSecret: jest.fn(),
|
||||||
|
error: jest.fn(),
|
||||||
|
warning: jest.fn(),
|
||||||
|
info: jest.fn(),
|
||||||
|
debug: jest.fn(),
|
||||||
|
setFailed: jest.fn()
|
||||||
|
}))
|
||||||
|
|
||||||
|
// Mock state-helper
|
||||||
|
jest.unstable_mockModule('../src/state-helper.js', () => ({
|
||||||
|
setSshKeyPath: jest.fn(),
|
||||||
|
setSshKnownHostsPath: jest.fn(),
|
||||||
|
IsPost: false,
|
||||||
|
RepositoryPath: ''
|
||||||
|
}))
|
||||||
|
|
||||||
|
// Dynamic imports after mocking
|
||||||
|
const core = await import('@actions/core')
|
||||||
|
const gitAuthHelper = await import('../src/git-auth-helper.js')
|
||||||
|
type IGitCommandManager =
|
||||||
|
import('../src/git-command-manager.js').IGitCommandManager
|
||||||
|
type IGitSourceSettings =
|
||||||
|
import('../src/git-source-settings.js').IGitSourceSettings
|
||||||
|
|
||||||
const isWindows = process.platform === 'win32'
|
const isWindows = process.platform === 'win32'
|
||||||
const testWorkspace = path.join(__dirname, '_temp', 'git-auth-helper')
|
const testWorkspace = path.join(__dirname, '_temp', 'git-auth-helper')
|
||||||
@ -32,25 +66,12 @@ describe('git-auth-helper tests', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
// Mock setSecret
|
jest.clearAllMocks()
|
||||||
jest.spyOn(core, 'setSecret').mockImplementation((secret: string) => {})
|
|
||||||
|
|
||||||
// Mock error/warning/info/debug
|
|
||||||
jest.spyOn(core, 'error').mockImplementation(jest.fn())
|
|
||||||
jest.spyOn(core, 'warning').mockImplementation(jest.fn())
|
|
||||||
jest.spyOn(core, 'info').mockImplementation(jest.fn())
|
|
||||||
jest.spyOn(core, 'debug').mockImplementation(jest.fn())
|
|
||||||
|
|
||||||
// Mock state helper
|
|
||||||
jest.spyOn(stateHelper, 'setSshKeyPath').mockImplementation(jest.fn())
|
|
||||||
jest
|
|
||||||
.spyOn(stateHelper, 'setSshKnownHostsPath')
|
|
||||||
.mockImplementation(jest.fn())
|
|
||||||
})
|
})
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
// Unregister mocks
|
// Unregister mocks
|
||||||
jest.restoreAllMocks()
|
jest.clearAllMocks()
|
||||||
|
|
||||||
// Restore HOME
|
// Restore HOME
|
||||||
if (originalHome) {
|
if (originalHome) {
|
||||||
@ -229,7 +250,7 @@ describe('git-auth-helper tests', () => {
|
|||||||
await authHelper.configureAuth()
|
await authHelper.configureAuth()
|
||||||
|
|
||||||
// Assert secret
|
// Assert secret
|
||||||
const setSecretSpy = core.setSecret as jest.Mock<any, any>
|
const setSecretSpy = core.setSecret as jest.Mock<any>
|
||||||
expect(setSecretSpy).toHaveBeenCalledTimes(1)
|
expect(setSecretSpy).toHaveBeenCalledTimes(1)
|
||||||
const expectedSecret = Buffer.from(
|
const expectedSecret = Buffer.from(
|
||||||
`x-access-token:${settings.authToken}`,
|
`x-access-token:${settings.authToken}`,
|
||||||
@ -529,7 +550,7 @@ describe('git-auth-helper tests', () => {
|
|||||||
settings.sshKey = ''
|
settings.sshKey = ''
|
||||||
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
|
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
|
||||||
await authHelper.configureAuth()
|
await authHelper.configureAuth()
|
||||||
const mockSubmoduleForeach = git.submoduleForeach as jest.Mock<any, any>
|
const mockSubmoduleForeach = git.submoduleForeach as jest.Mock<any>
|
||||||
mockSubmoduleForeach.mockClear() // reset calls
|
mockSubmoduleForeach.mockClear() // reset calls
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
@ -562,7 +583,7 @@ describe('git-auth-helper tests', () => {
|
|||||||
settings.persistCredentials = false
|
settings.persistCredentials = false
|
||||||
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
|
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
|
||||||
await authHelper.configureAuth()
|
await authHelper.configureAuth()
|
||||||
const mockSubmoduleForeach = git.submoduleForeach as jest.Mock<any, any>
|
const mockSubmoduleForeach = git.submoduleForeach as jest.Mock<any>
|
||||||
mockSubmoduleForeach.mockClear() // reset calls
|
mockSubmoduleForeach.mockClear() // reset calls
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
@ -588,7 +609,7 @@ describe('git-auth-helper tests', () => {
|
|||||||
settings.sshKey = ''
|
settings.sshKey = ''
|
||||||
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
|
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
|
||||||
await authHelper.configureAuth()
|
await authHelper.configureAuth()
|
||||||
const mockSubmoduleForeach = git.submoduleForeach as jest.Mock<any, any>
|
const mockSubmoduleForeach = git.submoduleForeach as jest.Mock<any>
|
||||||
mockSubmoduleForeach.mockClear() // reset calls
|
mockSubmoduleForeach.mockClear() // reset calls
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
@ -627,7 +648,7 @@ describe('git-auth-helper tests', () => {
|
|||||||
)
|
)
|
||||||
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
|
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
|
||||||
await authHelper.configureAuth()
|
await authHelper.configureAuth()
|
||||||
const mockSubmoduleForeach = git.submoduleForeach as jest.Mock<any, any>
|
const mockSubmoduleForeach = git.submoduleForeach as jest.Mock<any>
|
||||||
mockSubmoduleForeach.mockClear() // reset calls
|
mockSubmoduleForeach.mockClear() // reset calls
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
@ -809,7 +830,7 @@ describe('git-auth-helper tests', () => {
|
|||||||
|
|
||||||
// Mock getSubmoduleConfigPaths to return our fake submodules (for both configure and remove)
|
// Mock getSubmoduleConfigPaths to return our fake submodules (for both configure and remove)
|
||||||
const mockGetSubmoduleConfigPaths =
|
const mockGetSubmoduleConfigPaths =
|
||||||
git.getSubmoduleConfigPaths as jest.Mock<any, any>
|
git.getSubmoduleConfigPaths as jest.Mock<any>
|
||||||
mockGetSubmoduleConfigPaths.mockResolvedValue([
|
mockGetSubmoduleConfigPaths.mockResolvedValue([
|
||||||
submodule1ConfigPath,
|
submodule1ConfigPath,
|
||||||
submodule2ConfigPath
|
submodule2ConfigPath
|
||||||
@ -1147,7 +1168,7 @@ async function setup(testName: string): Promise<void> {
|
|||||||
),
|
),
|
||||||
tryReset: jest.fn(),
|
tryReset: jest.fn(),
|
||||||
version: jest.fn()
|
version: jest.fn()
|
||||||
}
|
} as unknown as IGitCommandManager & {env: {[key: string]: string}}
|
||||||
|
|
||||||
settings = {
|
settings = {
|
||||||
authToken: 'some auth token',
|
authToken: 'some auth token',
|
||||||
|
|||||||
@ -1,26 +1,51 @@
|
|||||||
import * as exec from '@actions/exec'
|
import {
|
||||||
import * as fshelper from '../lib/fs-helper'
|
jest,
|
||||||
import * as commandManager from '../lib/git-command-manager'
|
describe,
|
||||||
|
it,
|
||||||
|
expect,
|
||||||
|
beforeAll,
|
||||||
|
beforeEach,
|
||||||
|
afterEach,
|
||||||
|
afterAll
|
||||||
|
} from '@jest/globals'
|
||||||
|
|
||||||
let git: commandManager.IGitCommandManager
|
// Mock @actions/exec
|
||||||
let mockExec = jest.fn()
|
const mockExec = jest.fn()
|
||||||
|
jest.unstable_mockModule('@actions/exec', () => ({
|
||||||
|
exec: mockExec
|
||||||
|
}))
|
||||||
|
|
||||||
|
// Mock fs-helper
|
||||||
|
const mockFileExistsSync = jest.fn()
|
||||||
|
const mockDirectoryExistsSync = jest.fn()
|
||||||
|
jest.unstable_mockModule('../src/fs-helper.js', () => ({
|
||||||
|
fileExistsSync: mockFileExistsSync,
|
||||||
|
directoryExistsSync: mockDirectoryExistsSync
|
||||||
|
}))
|
||||||
|
|
||||||
|
// Dynamic imports after mocking
|
||||||
|
const commandManager = await import('../src/git-command-manager.js')
|
||||||
|
type IGitCommandManager =
|
||||||
|
import('../src/git-command-manager.js').IGitCommandManager
|
||||||
|
|
||||||
|
let git: IGitCommandManager
|
||||||
|
|
||||||
describe('git-auth-helper tests', () => {
|
describe('git-auth-helper tests', () => {
|
||||||
beforeAll(async () => {})
|
beforeAll(async () => {})
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
jest.spyOn(fshelper, 'fileExistsSync').mockImplementation(jest.fn())
|
mockFileExistsSync.mockReset()
|
||||||
jest.spyOn(fshelper, 'directoryExistsSync').mockImplementation(jest.fn())
|
mockDirectoryExistsSync.mockReset()
|
||||||
})
|
})
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
jest.restoreAllMocks()
|
jest.clearAllMocks()
|
||||||
})
|
})
|
||||||
|
|
||||||
afterAll(() => {})
|
afterAll(() => {})
|
||||||
|
|
||||||
it('branch list matches', async () => {
|
it('branch list matches', async () => {
|
||||||
mockExec.mockImplementation((path, args, options) => {
|
mockExec.mockImplementation((path: any, args: any, options: any) => {
|
||||||
console.log(args, options.listeners.stdout)
|
console.log(args, options.listeners.stdout)
|
||||||
|
|
||||||
if (args.includes('version')) {
|
if (args.includes('version')) {
|
||||||
@ -36,7 +61,7 @@ describe('git-auth-helper tests', () => {
|
|||||||
|
|
||||||
return 1
|
return 1
|
||||||
})
|
})
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
// exec.exec is already mockExec
|
||||||
const workingDirectory = 'test'
|
const workingDirectory = 'test'
|
||||||
const lfs = false
|
const lfs = false
|
||||||
const doSparseCheckout = false
|
const doSparseCheckout = false
|
||||||
@ -53,7 +78,7 @@ describe('git-auth-helper tests', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('ambiguous ref name output is captured', async () => {
|
it('ambiguous ref name output is captured', async () => {
|
||||||
mockExec.mockImplementation((path, args, options) => {
|
mockExec.mockImplementation((path: any, args: any, options: any) => {
|
||||||
console.log(args, options.listeners.stdout)
|
console.log(args, options.listeners.stdout)
|
||||||
|
|
||||||
if (args.includes('version')) {
|
if (args.includes('version')) {
|
||||||
@ -72,7 +97,7 @@ describe('git-auth-helper tests', () => {
|
|||||||
|
|
||||||
return 1
|
return 1
|
||||||
})
|
})
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
// exec.exec is already mockExec
|
||||||
const workingDirectory = 'test'
|
const workingDirectory = 'test'
|
||||||
const lfs = false
|
const lfs = false
|
||||||
const doSparseCheckout = false
|
const doSparseCheckout = false
|
||||||
@ -91,9 +116,9 @@ describe('git-auth-helper tests', () => {
|
|||||||
|
|
||||||
describe('Test fetchDepth and fetchTags options', () => {
|
describe('Test fetchDepth and fetchTags options', () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
jest.spyOn(fshelper, 'fileExistsSync').mockImplementation(jest.fn())
|
mockFileExistsSync.mockReset()
|
||||||
jest.spyOn(fshelper, 'directoryExistsSync').mockImplementation(jest.fn())
|
mockDirectoryExistsSync.mockReset()
|
||||||
mockExec.mockImplementation((path, args, options) => {
|
mockExec.mockImplementation((path: any, args: any, options: any) => {
|
||||||
console.log(args, options.listeners.stdout)
|
console.log(args, options.listeners.stdout)
|
||||||
|
|
||||||
if (args.includes('version')) {
|
if (args.includes('version')) {
|
||||||
@ -105,11 +130,11 @@ describe('Test fetchDepth and fetchTags options', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
jest.restoreAllMocks()
|
jest.clearAllMocks()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should call execGit with the correct arguments when fetchDepth is 0', async () => {
|
it('should call execGit with the correct arguments when fetchDepth is 0', async () => {
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
// exec.exec is already mockExec
|
||||||
const workingDirectory = 'test'
|
const workingDirectory = 'test'
|
||||||
const lfs = false
|
const lfs = false
|
||||||
const doSparseCheckout = false
|
const doSparseCheckout = false
|
||||||
@ -146,7 +171,7 @@ describe('Test fetchDepth and fetchTags options', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('should call execGit with the correct arguments when fetchDepth is 0 and refSpec includes tags', async () => {
|
it('should call execGit with the correct arguments when fetchDepth is 0 and refSpec includes tags', async () => {
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
// exec.exec is already mockExec
|
||||||
|
|
||||||
const workingDirectory = 'test'
|
const workingDirectory = 'test'
|
||||||
const lfs = false
|
const lfs = false
|
||||||
@ -184,7 +209,7 @@ describe('Test fetchDepth and fetchTags options', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('should call execGit with the correct arguments when fetchDepth is 1', async () => {
|
it('should call execGit with the correct arguments when fetchDepth is 1', async () => {
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
// exec.exec is already mockExec
|
||||||
|
|
||||||
const workingDirectory = 'test'
|
const workingDirectory = 'test'
|
||||||
const lfs = false
|
const lfs = false
|
||||||
@ -222,7 +247,7 @@ describe('Test fetchDepth and fetchTags options', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('should call execGit with the correct arguments when fetchDepth is 1 and refSpec includes tags', async () => {
|
it('should call execGit with the correct arguments when fetchDepth is 1 and refSpec includes tags', async () => {
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
// exec.exec is already mockExec
|
||||||
|
|
||||||
const workingDirectory = 'test'
|
const workingDirectory = 'test'
|
||||||
const lfs = false
|
const lfs = false
|
||||||
@ -261,7 +286,7 @@ describe('Test fetchDepth and fetchTags options', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('should call execGit with the correct arguments when showProgress is true', async () => {
|
it('should call execGit with the correct arguments when showProgress is true', async () => {
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
// exec.exec is already mockExec
|
||||||
|
|
||||||
const workingDirectory = 'test'
|
const workingDirectory = 'test'
|
||||||
const lfs = false
|
const lfs = false
|
||||||
@ -299,7 +324,7 @@ describe('Test fetchDepth and fetchTags options', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('should call execGit with the correct arguments when fetchDepth is 42 and showProgress is true', async () => {
|
it('should call execGit with the correct arguments when fetchDepth is 42 and showProgress is true', async () => {
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
// exec.exec is already mockExec
|
||||||
|
|
||||||
const workingDirectory = 'test'
|
const workingDirectory = 'test'
|
||||||
const lfs = false
|
const lfs = false
|
||||||
@ -339,7 +364,7 @@ describe('Test fetchDepth and fetchTags options', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('should call execGit with the correct arguments when showProgress is true and refSpec includes tags', async () => {
|
it('should call execGit with the correct arguments when showProgress is true and refSpec includes tags', async () => {
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
// exec.exec is already mockExec
|
||||||
|
|
||||||
const workingDirectory = 'test'
|
const workingDirectory = 'test'
|
||||||
const lfs = false
|
const lfs = false
|
||||||
@ -380,23 +405,23 @@ describe('Test fetchDepth and fetchTags options', () => {
|
|||||||
|
|
||||||
describe('repository initialization object format', () => {
|
describe('repository initialization object format', () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
jest.spyOn(fshelper, 'fileExistsSync').mockImplementation(jest.fn())
|
mockFileExistsSync.mockReset()
|
||||||
jest.spyOn(fshelper, 'directoryExistsSync').mockImplementation(jest.fn())
|
mockDirectoryExistsSync.mockReset()
|
||||||
})
|
})
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
jest.restoreAllMocks()
|
jest.clearAllMocks()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('initializes SHA-256 repositories with the matching object format', async () => {
|
it('initializes SHA-256 repositories with the matching object format', async () => {
|
||||||
mockExec.mockImplementation((path, args, options) => {
|
mockExec.mockImplementation((path: any, args: any, options: any) => {
|
||||||
if (args.includes('version')) {
|
if (args.includes('version')) {
|
||||||
options.listeners.stdout(Buffer.from('git version 2.50.1'))
|
options.listeners.stdout(Buffer.from('git version 2.50.1'))
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
})
|
})
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
// exec.exec is already mockExec
|
||||||
|
|
||||||
git = await commandManager.createCommandManager('test', false, false)
|
git = await commandManager.createCommandManager('test', false, false)
|
||||||
|
|
||||||
@ -410,14 +435,14 @@ describe('repository initialization object format', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('initializes SHA-1 repositories with existing default arguments', async () => {
|
it('initializes SHA-1 repositories with existing default arguments', async () => {
|
||||||
mockExec.mockImplementation((path, args, options) => {
|
mockExec.mockImplementation((path: any, args: any, options: any) => {
|
||||||
if (args.includes('version')) {
|
if (args.includes('version')) {
|
||||||
options.listeners.stdout(Buffer.from('git version 2.50.1'))
|
options.listeners.stdout(Buffer.from('git version 2.50.1'))
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
})
|
})
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
// exec.exec is already mockExec
|
||||||
|
|
||||||
git = await commandManager.createCommandManager('test', false, false)
|
git = await commandManager.createCommandManager('test', false, false)
|
||||||
|
|
||||||
@ -433,12 +458,12 @@ describe('repository initialization object format', () => {
|
|||||||
|
|
||||||
describe('git user-agent with orchestration ID', () => {
|
describe('git user-agent with orchestration ID', () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
jest.spyOn(fshelper, 'fileExistsSync').mockImplementation(jest.fn())
|
mockFileExistsSync.mockReset()
|
||||||
jest.spyOn(fshelper, 'directoryExistsSync').mockImplementation(jest.fn())
|
mockDirectoryExistsSync.mockReset()
|
||||||
})
|
})
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
jest.restoreAllMocks()
|
jest.clearAllMocks()
|
||||||
// Clean up environment variable to prevent test pollution
|
// Clean up environment variable to prevent test pollution
|
||||||
delete process.env['ACTIONS_ORCHESTRATION_ID']
|
delete process.env['ACTIONS_ORCHESTRATION_ID']
|
||||||
})
|
})
|
||||||
@ -448,7 +473,7 @@ describe('git user-agent with orchestration ID', () => {
|
|||||||
process.env['ACTIONS_ORCHESTRATION_ID'] = orchId
|
process.env['ACTIONS_ORCHESTRATION_ID'] = orchId
|
||||||
|
|
||||||
let capturedEnv: any = null
|
let capturedEnv: any = null
|
||||||
mockExec.mockImplementation((path, args, options) => {
|
mockExec.mockImplementation((path: any, args: any, options: any) => {
|
||||||
if (args.includes('version')) {
|
if (args.includes('version')) {
|
||||||
options.listeners.stdout(Buffer.from('2.18'))
|
options.listeners.stdout(Buffer.from('2.18'))
|
||||||
}
|
}
|
||||||
@ -456,7 +481,7 @@ describe('git user-agent with orchestration ID', () => {
|
|||||||
capturedEnv = options.env
|
capturedEnv = options.env
|
||||||
return 0
|
return 0
|
||||||
})
|
})
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
// exec.exec is already mockExec
|
||||||
|
|
||||||
const workingDirectory = 'test'
|
const workingDirectory = 'test'
|
||||||
const lfs = false
|
const lfs = false
|
||||||
@ -483,7 +508,7 @@ describe('git user-agent with orchestration ID', () => {
|
|||||||
process.env['ACTIONS_ORCHESTRATION_ID'] = orchId
|
process.env['ACTIONS_ORCHESTRATION_ID'] = orchId
|
||||||
|
|
||||||
let capturedEnv: any = null
|
let capturedEnv: any = null
|
||||||
mockExec.mockImplementation((path, args, options) => {
|
mockExec.mockImplementation((path: any, args: any, options: any) => {
|
||||||
if (args.includes('version')) {
|
if (args.includes('version')) {
|
||||||
options.listeners.stdout(Buffer.from('2.18'))
|
options.listeners.stdout(Buffer.from('2.18'))
|
||||||
}
|
}
|
||||||
@ -491,7 +516,7 @@ describe('git user-agent with orchestration ID', () => {
|
|||||||
capturedEnv = options.env
|
capturedEnv = options.env
|
||||||
return 0
|
return 0
|
||||||
})
|
})
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
// exec.exec is already mockExec
|
||||||
|
|
||||||
const workingDirectory = 'test'
|
const workingDirectory = 'test'
|
||||||
const lfs = false
|
const lfs = false
|
||||||
@ -517,7 +542,7 @@ describe('git user-agent with orchestration ID', () => {
|
|||||||
delete process.env['ACTIONS_ORCHESTRATION_ID']
|
delete process.env['ACTIONS_ORCHESTRATION_ID']
|
||||||
|
|
||||||
let capturedEnv: any = null
|
let capturedEnv: any = null
|
||||||
mockExec.mockImplementation((path, args, options) => {
|
mockExec.mockImplementation((path: any, args: any, options: any) => {
|
||||||
if (args.includes('version')) {
|
if (args.includes('version')) {
|
||||||
options.listeners.stdout(Buffer.from('2.18'))
|
options.listeners.stdout(Buffer.from('2.18'))
|
||||||
}
|
}
|
||||||
@ -525,7 +550,7 @@ describe('git user-agent with orchestration ID', () => {
|
|||||||
capturedEnv = options.env
|
capturedEnv = options.env
|
||||||
return 0
|
return 0
|
||||||
})
|
})
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
// exec.exec is already mockExec
|
||||||
|
|
||||||
const workingDirectory = 'test'
|
const workingDirectory = 'test'
|
||||||
const lfs = false
|
const lfs = false
|
||||||
|
|||||||
@ -1,9 +1,36 @@
|
|||||||
import * as core from '@actions/core'
|
import {
|
||||||
|
jest,
|
||||||
|
describe,
|
||||||
|
it,
|
||||||
|
expect,
|
||||||
|
beforeAll,
|
||||||
|
beforeEach,
|
||||||
|
afterEach
|
||||||
|
} from '@jest/globals'
|
||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
import * as gitDirectoryHelper from '../lib/git-directory-helper'
|
|
||||||
import * as io from '@actions/io'
|
import * as io from '@actions/io'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import {IGitCommandManager} from '../lib/git-command-manager'
|
import {fileURLToPath} from 'url'
|
||||||
|
|
||||||
|
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||||||
|
|
||||||
|
// Mock @actions/core before loading git-directory-helper
|
||||||
|
jest.unstable_mockModule('@actions/core', () => ({
|
||||||
|
error: jest.fn(),
|
||||||
|
warning: jest.fn(),
|
||||||
|
info: jest.fn(),
|
||||||
|
debug: jest.fn(),
|
||||||
|
setFailed: jest.fn(),
|
||||||
|
startGroup: jest.fn(),
|
||||||
|
endGroup: jest.fn()
|
||||||
|
}))
|
||||||
|
|
||||||
|
// Dynamic imports after mocking
|
||||||
|
const core = await import('@actions/core')
|
||||||
|
const gitDirectoryHelper = await import('../src/git-directory-helper.js')
|
||||||
|
|
||||||
|
type IGitCommandManager =
|
||||||
|
import('../src/git-command-manager.js').IGitCommandManager
|
||||||
|
|
||||||
const testWorkspace = path.join(__dirname, '_temp', 'git-directory-helper')
|
const testWorkspace = path.join(__dirname, '_temp', 'git-directory-helper')
|
||||||
let repositoryPath: string
|
let repositoryPath: string
|
||||||
@ -19,16 +46,11 @@ describe('git-directory-helper tests', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
// Mock error/warning/info/debug
|
jest.clearAllMocks()
|
||||||
jest.spyOn(core, 'error').mockImplementation(jest.fn())
|
|
||||||
jest.spyOn(core, 'warning').mockImplementation(jest.fn())
|
|
||||||
jest.spyOn(core, 'info').mockImplementation(jest.fn())
|
|
||||||
jest.spyOn(core, 'debug').mockImplementation(jest.fn())
|
|
||||||
})
|
})
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
// Unregister mocks
|
jest.clearAllMocks()
|
||||||
jest.restoreAllMocks()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const cleansWhenCleanTrue = 'cleans when clean true'
|
const cleansWhenCleanTrue = 'cleans when clean true'
|
||||||
@ -81,7 +103,7 @@ describe('git-directory-helper tests', () => {
|
|||||||
// Arrange
|
// Arrange
|
||||||
await setup(doesNotCheckoutDetachWhenNotAlreadyDetached)
|
await setup(doesNotCheckoutDetachWhenNotAlreadyDetached)
|
||||||
await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
|
await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
|
||||||
const mockIsDetached = git.isDetached as jest.Mock<any, any>
|
const mockIsDetached = git.isDetached as jest.Mock<any>
|
||||||
mockIsDetached.mockImplementation(async () => {
|
mockIsDetached.mockImplementation(async () => {
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
@ -132,7 +154,7 @@ describe('git-directory-helper tests', () => {
|
|||||||
// Arrange
|
// Arrange
|
||||||
await setup(removesContentsWhenCleanFails)
|
await setup(removesContentsWhenCleanFails)
|
||||||
await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
|
await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
|
||||||
let mockTryClean = git.tryClean as jest.Mock<any, any>
|
let mockTryClean = git.tryClean as jest.Mock<any>
|
||||||
mockTryClean.mockImplementation(async () => {
|
mockTryClean.mockImplementation(async () => {
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
@ -210,7 +232,7 @@ describe('git-directory-helper tests', () => {
|
|||||||
// Arrange
|
// Arrange
|
||||||
await setup(removesContentsWhenResetFails)
|
await setup(removesContentsWhenResetFails)
|
||||||
await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
|
await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
|
||||||
let mockTryReset = git.tryReset as jest.Mock<any, any>
|
let mockTryReset = git.tryReset as jest.Mock<any>
|
||||||
mockTryReset.mockImplementation(async () => {
|
mockTryReset.mockImplementation(async () => {
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
@ -260,7 +282,7 @@ describe('git-directory-helper tests', () => {
|
|||||||
// Arrange
|
// Arrange
|
||||||
await setup(removesLocalBranches)
|
await setup(removesLocalBranches)
|
||||||
await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
|
await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
|
||||||
const mockBranchList = git.branchList as jest.Mock<any, any>
|
const mockBranchList = git.branchList as jest.Mock<any>
|
||||||
mockBranchList.mockImplementation(async (remote: boolean) => {
|
mockBranchList.mockImplementation(async (remote: boolean) => {
|
||||||
return remote ? [] : ['local-branch-1', 'local-branch-2']
|
return remote ? [] : ['local-branch-1', 'local-branch-2']
|
||||||
})
|
})
|
||||||
@ -291,7 +313,7 @@ describe('git-directory-helper tests', () => {
|
|||||||
|
|
||||||
//mock bad submodule
|
//mock bad submodule
|
||||||
|
|
||||||
const submoduleStatus = git.submoduleStatus as jest.Mock<any, any>
|
const submoduleStatus = git.submoduleStatus as jest.Mock<any>
|
||||||
submoduleStatus.mockImplementation(async (remote: boolean) => {
|
submoduleStatus.mockImplementation(async (remote: boolean) => {
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
@ -319,7 +341,7 @@ describe('git-directory-helper tests', () => {
|
|||||||
await setup(doesNotCleanWhenSubmoduleStatusIsTrue)
|
await setup(doesNotCleanWhenSubmoduleStatusIsTrue)
|
||||||
await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
|
await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
|
||||||
|
|
||||||
const submoduleStatus = git.submoduleStatus as jest.Mock<any, any>
|
const submoduleStatus = git.submoduleStatus as jest.Mock<any>
|
||||||
submoduleStatus.mockImplementation(async (remote: boolean) => {
|
submoduleStatus.mockImplementation(async (remote: boolean) => {
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
@ -381,7 +403,7 @@ describe('git-directory-helper tests', () => {
|
|||||||
// Arrange
|
// Arrange
|
||||||
await setup(removesAncestorRemoteBranch)
|
await setup(removesAncestorRemoteBranch)
|
||||||
await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
|
await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
|
||||||
const mockBranchList = git.branchList as jest.Mock<any, any>
|
const mockBranchList = git.branchList as jest.Mock<any>
|
||||||
mockBranchList.mockImplementation(async (remote: boolean) => {
|
mockBranchList.mockImplementation(async (remote: boolean) => {
|
||||||
return remote ? ['origin/remote-branch-1', 'origin/remote-branch-2'] : []
|
return remote ? ['origin/remote-branch-1', 'origin/remote-branch-2'] : []
|
||||||
})
|
})
|
||||||
@ -411,7 +433,7 @@ describe('git-directory-helper tests', () => {
|
|||||||
// Arrange
|
// Arrange
|
||||||
await setup(removesDescendantRemoteBranches)
|
await setup(removesDescendantRemoteBranches)
|
||||||
await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
|
await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
|
||||||
const mockBranchList = git.branchList as jest.Mock<any, any>
|
const mockBranchList = git.branchList as jest.Mock<any>
|
||||||
mockBranchList.mockImplementation(async (remote: boolean) => {
|
mockBranchList.mockImplementation(async (remote: boolean) => {
|
||||||
return remote
|
return remote
|
||||||
? ['origin/remote-branch-1/conflict', 'origin/remote-branch-2']
|
? ['origin/remote-branch-1/conflict', 'origin/remote-branch-2']
|
||||||
@ -507,5 +529,5 @@ async function setup(testName: string): Promise<void> {
|
|||||||
return true
|
return true
|
||||||
}),
|
}),
|
||||||
version: jest.fn()
|
version: jest.fn()
|
||||||
}
|
} as unknown as IGitCommandManager
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import {GitVersion} from '../src/git-version'
|
import {describe, it, expect} from '@jest/globals'
|
||||||
import {MinimumGitSparseCheckoutVersion} from '../src/git-command-manager'
|
import {GitVersion} from '../src/git-version.js'
|
||||||
|
import {MinimumGitSparseCheckoutVersion} from '../src/git-command-manager.js'
|
||||||
|
|
||||||
describe('git-version tests', () => {
|
describe('git-version tests', () => {
|
||||||
it('basics', async () => {
|
it('basics', async () => {
|
||||||
|
|||||||
@ -1,11 +1,25 @@
|
|||||||
import * as core from '@actions/core'
|
import {jest, describe, it, expect, beforeEach, afterEach} from '@jest/globals'
|
||||||
import * as github from '@actions/github'
|
|
||||||
import * as githubApiHelper from '../lib/github-api-helper'
|
// Mock @actions/core
|
||||||
|
const mockDebug = jest.fn()
|
||||||
|
jest.unstable_mockModule('@actions/core', () => ({
|
||||||
|
debug: mockDebug,
|
||||||
|
info: jest.fn(),
|
||||||
|
warning: jest.fn(),
|
||||||
|
error: jest.fn()
|
||||||
|
}))
|
||||||
|
|
||||||
|
// Mock @actions/github
|
||||||
|
const mockGetOctokit = jest.fn()
|
||||||
|
jest.unstable_mockModule('@actions/github', () => ({
|
||||||
|
getOctokit: mockGetOctokit
|
||||||
|
}))
|
||||||
|
|
||||||
|
// Dynamic imports after mocking
|
||||||
|
const githubApiHelper = await import('../src/github-api-helper.js')
|
||||||
|
|
||||||
describe('github-api-helper object format', () => {
|
describe('github-api-helper object format', () => {
|
||||||
let getOctokitSpy: jest.SpyInstance
|
let request: jest.Mock<any>
|
||||||
let debugSpy: jest.SpyInstance
|
|
||||||
let request: jest.Mock
|
|
||||||
|
|
||||||
function mockHashAlgorithmApi(hashAlgorithm: string): void {
|
function mockHashAlgorithmApi(hashAlgorithm: string): void {
|
||||||
request = jest.fn(async () => ({
|
request = jest.fn(async () => ({
|
||||||
@ -13,17 +27,18 @@ describe('github-api-helper object format', () => {
|
|||||||
hash_algorithm: hashAlgorithm
|
hash_algorithm: hashAlgorithm
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
getOctokitSpy = jest.spyOn(github, 'getOctokit').mockReturnValue({
|
mockGetOctokit.mockReturnValue({
|
||||||
request
|
request
|
||||||
} as any)
|
} as any)
|
||||||
}
|
}
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
debugSpy = jest.spyOn(core, 'debug').mockImplementation(jest.fn())
|
mockDebug.mockClear()
|
||||||
|
mockGetOctokit.mockClear()
|
||||||
})
|
})
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
jest.restoreAllMocks()
|
jest.clearAllMocks()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('detects SHA-256 from the repository hash algorithm endpoint', async () => {
|
it('detects SHA-256 from the repository hash algorithm endpoint', async () => {
|
||||||
@ -33,7 +48,7 @@ describe('github-api-helper object format', () => {
|
|||||||
githubApiHelper.tryGetRepositoryObjectFormat('token', 'owner', 'repo')
|
githubApiHelper.tryGetRepositoryObjectFormat('token', 'owner', 'repo')
|
||||||
).resolves.toEqual({format: 'sha256', succeeded: true})
|
).resolves.toEqual({format: 'sha256', succeeded: true})
|
||||||
|
|
||||||
expect(getOctokitSpy).toHaveBeenCalledWith(
|
expect(mockGetOctokit).toHaveBeenCalledWith(
|
||||||
'token',
|
'token',
|
||||||
expect.objectContaining({baseUrl: 'https://api.github.com'})
|
expect.objectContaining({baseUrl: 'https://api.github.com'})
|
||||||
)
|
)
|
||||||
@ -54,7 +69,6 @@ describe('github-api-helper object format', () => {
|
|||||||
it('detects object format from an existing commit without API calls', async () => {
|
it('detects object format from an existing commit without API calls', async () => {
|
||||||
const commitSha =
|
const commitSha =
|
||||||
'9422233ca7ee1b17f1e905d0e141faf0c401556c41cdc6acd71c6bd685da2e92'
|
'9422233ca7ee1b17f1e905d0e141faf0c401556c41cdc6acd71c6bd685da2e92'
|
||||||
getOctokitSpy = jest.spyOn(github, 'getOctokit')
|
|
||||||
|
|
||||||
await expect(
|
await expect(
|
||||||
githubApiHelper.tryGetRepositoryObjectFormat(
|
githubApiHelper.tryGetRepositoryObjectFormat(
|
||||||
@ -66,7 +80,7 @@ describe('github-api-helper object format', () => {
|
|||||||
)
|
)
|
||||||
).resolves.toEqual({format: 'sha256', succeeded: true})
|
).resolves.toEqual({format: 'sha256', succeeded: true})
|
||||||
|
|
||||||
expect(getOctokitSpy).not.toHaveBeenCalled()
|
expect(mockGetOctokit).not.toHaveBeenCalled()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('returns unsuccessful when the hash algorithm endpoint value is not recognized', async () => {
|
it('returns unsuccessful when the hash algorithm endpoint value is not recognized', async () => {
|
||||||
@ -75,7 +89,7 @@ describe('github-api-helper object format', () => {
|
|||||||
await expect(
|
await expect(
|
||||||
githubApiHelper.tryGetRepositoryObjectFormat('token', 'owner', 'repo')
|
githubApiHelper.tryGetRepositoryObjectFormat('token', 'owner', 'repo')
|
||||||
).resolves.toEqual({format: '', succeeded: false})
|
).resolves.toEqual({format: '', succeeded: false})
|
||||||
expect(debugSpy).toHaveBeenCalledWith(
|
expect(mockDebug).toHaveBeenCalledWith(
|
||||||
'Unable to determine repository object format from hash-algorithm endpoint'
|
'Unable to determine repository object format from hash-algorithm endpoint'
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -84,14 +98,14 @@ describe('github-api-helper object format', () => {
|
|||||||
request = jest.fn(async () => {
|
request = jest.fn(async () => {
|
||||||
throw new Error('not found')
|
throw new Error('not found')
|
||||||
})
|
})
|
||||||
jest.spyOn(github, 'getOctokit').mockReturnValue({
|
mockGetOctokit.mockReturnValue({
|
||||||
request
|
request
|
||||||
} as any)
|
} as any)
|
||||||
|
|
||||||
await expect(
|
await expect(
|
||||||
githubApiHelper.tryGetRepositoryObjectFormat('token', 'owner', 'repo')
|
githubApiHelper.tryGetRepositoryObjectFormat('token', 'owner', 'repo')
|
||||||
).resolves.toEqual({format: '', succeeded: false})
|
).resolves.toEqual({format: '', succeeded: false})
|
||||||
expect(debugSpy).toHaveBeenCalledWith(
|
expect(mockDebug).toHaveBeenCalledWith(
|
||||||
'Unable to determine repository object format from hash-algorithm endpoint: not found'
|
'Unable to determine repository object format from hash-algorithm endpoint: not found'
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,10 +1,13 @@
|
|||||||
import * as core from '@actions/core'
|
import {
|
||||||
import * as fsHelper from '../lib/fs-helper'
|
jest,
|
||||||
import * as github from '@actions/github'
|
describe,
|
||||||
import * as inputHelper from '../lib/input-helper'
|
it,
|
||||||
|
expect,
|
||||||
|
beforeAll,
|
||||||
|
beforeEach,
|
||||||
|
afterAll
|
||||||
|
} from '@jest/globals'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import * as workflowContextHelper from '../lib/workflow-context-helper'
|
|
||||||
import {IGitSourceSettings} from '../lib/git-source-settings'
|
|
||||||
|
|
||||||
const originalGitHubWorkspace = process.env['GITHUB_WORKSPACE']
|
const originalGitHubWorkspace = process.env['GITHUB_WORKSPACE']
|
||||||
const gitHubWorkspace = path.resolve('/checkout-tests/workspace')
|
const gitHubWorkspace = path.resolve('/checkout-tests/workspace')
|
||||||
@ -12,42 +15,58 @@ const gitHubWorkspace = path.resolve('/checkout-tests/workspace')
|
|||||||
// Inputs for mock @actions/core
|
// Inputs for mock @actions/core
|
||||||
let inputs = {} as any
|
let inputs = {} as any
|
||||||
|
|
||||||
// Shallow clone original @actions/github context
|
// Mutable mock github context
|
||||||
let originalContext = {...github.context}
|
const mockGithubContext: any = {
|
||||||
|
ref: 'refs/heads/some-ref',
|
||||||
|
sha: '1234567890123456789012345678901234567890',
|
||||||
|
repo: {owner: 'some-owner', repo: 'some-repo'},
|
||||||
|
eventName: '',
|
||||||
|
payload: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mock @actions/core before loading input-helper
|
||||||
|
jest.unstable_mockModule('@actions/core', () => ({
|
||||||
|
getInput: jest.fn((name: string) => inputs[name]),
|
||||||
|
getBooleanInput: jest.fn((name: string) => inputs[name]),
|
||||||
|
getMultilineInput: jest.fn((name: string) =>
|
||||||
|
inputs[name] ? String(inputs[name]).split('\n').filter(Boolean) : []
|
||||||
|
),
|
||||||
|
error: jest.fn(),
|
||||||
|
warning: jest.fn(),
|
||||||
|
info: jest.fn(),
|
||||||
|
debug: jest.fn(),
|
||||||
|
setFailed: jest.fn(),
|
||||||
|
setOutput: jest.fn(),
|
||||||
|
setSecret: jest.fn()
|
||||||
|
}))
|
||||||
|
|
||||||
|
// Mock @actions/github before loading input-helper
|
||||||
|
jest.unstable_mockModule('@actions/github', () => ({
|
||||||
|
context: mockGithubContext,
|
||||||
|
getOctokit: jest.fn()
|
||||||
|
}))
|
||||||
|
|
||||||
|
// Mock fs-helper
|
||||||
|
const mockDirectoryExistsSync = jest.fn((p: string) => p === gitHubWorkspace)
|
||||||
|
jest.unstable_mockModule('../src/fs-helper.js', () => ({
|
||||||
|
directoryExistsSync: mockDirectoryExistsSync,
|
||||||
|
fileExistsSync: jest.fn()
|
||||||
|
}))
|
||||||
|
|
||||||
|
// Mock workflow-context-helper
|
||||||
|
const mockGetOrganizationId = jest.fn(async () => 123456)
|
||||||
|
jest.unstable_mockModule('../src/workflow-context-helper.js', () => ({
|
||||||
|
getOrganizationId: mockGetOrganizationId
|
||||||
|
}))
|
||||||
|
|
||||||
|
// Dynamic imports after mocking
|
||||||
|
const core = await import('@actions/core')
|
||||||
|
const inputHelper = await import('../src/input-helper.js')
|
||||||
|
type IGitSourceSettings =
|
||||||
|
import('../src/git-source-settings.js').IGitSourceSettings
|
||||||
|
|
||||||
describe('input-helper tests', () => {
|
describe('input-helper tests', () => {
|
||||||
beforeAll(() => {
|
beforeAll(() => {
|
||||||
// Mock getInput
|
|
||||||
jest.spyOn(core, 'getInput').mockImplementation((name: string) => {
|
|
||||||
return inputs[name]
|
|
||||||
})
|
|
||||||
|
|
||||||
// Mock error/warning/info/debug
|
|
||||||
jest.spyOn(core, 'error').mockImplementation(jest.fn())
|
|
||||||
jest.spyOn(core, 'warning').mockImplementation(jest.fn())
|
|
||||||
jest.spyOn(core, 'info').mockImplementation(jest.fn())
|
|
||||||
jest.spyOn(core, 'debug').mockImplementation(jest.fn())
|
|
||||||
|
|
||||||
// Mock github context
|
|
||||||
jest.spyOn(github.context, 'repo', 'get').mockImplementation(() => {
|
|
||||||
return {
|
|
||||||
owner: 'some-owner',
|
|
||||||
repo: 'some-repo'
|
|
||||||
}
|
|
||||||
})
|
|
||||||
github.context.ref = 'refs/heads/some-ref'
|
|
||||||
github.context.sha = '1234567890123456789012345678901234567890'
|
|
||||||
|
|
||||||
// Mock ./fs-helper directoryExistsSync()
|
|
||||||
jest
|
|
||||||
.spyOn(fsHelper, 'directoryExistsSync')
|
|
||||||
.mockImplementation((path: string) => path == gitHubWorkspace)
|
|
||||||
|
|
||||||
// Mock ./workflowContextHelper getOrganizationId()
|
|
||||||
jest
|
|
||||||
.spyOn(workflowContextHelper, 'getOrganizationId')
|
|
||||||
.mockImplementation(() => Promise.resolve(123456))
|
|
||||||
|
|
||||||
// GitHub workspace
|
// GitHub workspace
|
||||||
process.env['GITHUB_WORKSPACE'] = gitHubWorkspace
|
process.env['GITHUB_WORKSPACE'] = gitHubWorkspace
|
||||||
})
|
})
|
||||||
@ -55,6 +74,15 @@ describe('input-helper tests', () => {
|
|||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
// Reset inputs
|
// Reset inputs
|
||||||
inputs = {}
|
inputs = {}
|
||||||
|
jest.clearAllMocks()
|
||||||
|
// Re-apply default mocks
|
||||||
|
;(core.getInput as jest.Mock<any>).mockImplementation(
|
||||||
|
(name: string) => inputs[name]
|
||||||
|
)
|
||||||
|
mockDirectoryExistsSync.mockImplementation(
|
||||||
|
(p: string) => p === gitHubWorkspace
|
||||||
|
)
|
||||||
|
mockGetOrganizationId.mockResolvedValue(123456)
|
||||||
})
|
})
|
||||||
|
|
||||||
afterAll(() => {
|
afterAll(() => {
|
||||||
@ -65,11 +93,8 @@ describe('input-helper tests', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Restore @actions/github context
|
// Restore @actions/github context
|
||||||
github.context.ref = originalContext.ref
|
mockGithubContext.ref = 'refs/heads/some-ref'
|
||||||
github.context.sha = originalContext.sha
|
mockGithubContext.sha = '1234567890123456789012345678901234567890'
|
||||||
|
|
||||||
// Restore
|
|
||||||
jest.restoreAllMocks()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('sets defaults', async () => {
|
it('sets defaults', async () => {
|
||||||
@ -95,15 +120,15 @@ describe('input-helper tests', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('qualifies ref', async () => {
|
it('qualifies ref', async () => {
|
||||||
let originalRef = github.context.ref
|
let originalRef = mockGithubContext.ref
|
||||||
try {
|
try {
|
||||||
github.context.ref = 'some-unqualified-ref'
|
mockGithubContext.ref = 'some-unqualified-ref'
|
||||||
const settings: IGitSourceSettings = await inputHelper.getInputs()
|
const settings: IGitSourceSettings = await inputHelper.getInputs()
|
||||||
expect(settings).toBeTruthy()
|
expect(settings).toBeTruthy()
|
||||||
expect(settings.commit).toBe('1234567890123456789012345678901234567890')
|
expect(settings.commit).toBe('1234567890123456789012345678901234567890')
|
||||||
expect(settings.ref).toBe('refs/heads/some-unqualified-ref')
|
expect(settings.ref).toBe('refs/heads/some-unqualified-ref')
|
||||||
} finally {
|
} finally {
|
||||||
github.context.ref = originalRef
|
mockGithubContext.ref = originalRef
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -1,8 +1,36 @@
|
|||||||
|
import {jest, describe, it, expect, beforeEach, afterEach} from '@jest/globals'
|
||||||
import * as assert from 'assert'
|
import * as assert from 'assert'
|
||||||
import * as core from '@actions/core'
|
|
||||||
import * as github from '@actions/github'
|
// Mutable mock github context
|
||||||
import * as refHelper from '../lib/ref-helper'
|
const mockGithubContext: any = {
|
||||||
import {IGitCommandManager} from '../lib/git-command-manager'
|
eventName: '',
|
||||||
|
payload: {},
|
||||||
|
repo: {owner: 'some-owner', repo: 'some-repo'},
|
||||||
|
ref: '',
|
||||||
|
sha: ''
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mock @actions/core
|
||||||
|
const mockDebug = jest.fn()
|
||||||
|
jest.unstable_mockModule('@actions/core', () => ({
|
||||||
|
debug: mockDebug,
|
||||||
|
info: jest.fn(),
|
||||||
|
warning: jest.fn(),
|
||||||
|
error: jest.fn(),
|
||||||
|
setFailed: jest.fn()
|
||||||
|
}))
|
||||||
|
|
||||||
|
// Mock @actions/github
|
||||||
|
const mockGetOctokit = jest.fn()
|
||||||
|
jest.unstable_mockModule('@actions/github', () => ({
|
||||||
|
context: mockGithubContext,
|
||||||
|
getOctokit: mockGetOctokit
|
||||||
|
}))
|
||||||
|
|
||||||
|
// Dynamic imports after mocking
|
||||||
|
const refHelper = await import('../src/ref-helper.js')
|
||||||
|
type IGitCommandManager =
|
||||||
|
import('../src/git-command-manager.js').IGitCommandManager
|
||||||
|
|
||||||
const commit = '1234567890123456789012345678901234567890'
|
const commit = '1234567890123456789012345678901234567890'
|
||||||
const sha256Commit =
|
const sha256Commit =
|
||||||
@ -12,6 +40,7 @@ let git: IGitCommandManager
|
|||||||
describe('ref-helper tests', () => {
|
describe('ref-helper tests', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
git = {} as unknown as IGitCommandManager
|
git = {} as unknown as IGitCommandManager
|
||||||
|
jest.clearAllMocks()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('getCheckoutInfo requires git', async () => {
|
it('getCheckoutInfo requires git', async () => {
|
||||||
@ -166,14 +195,12 @@ describe('ref-helper tests', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('getRefSpec sha + refs/tags/ with fetchTags', async () => {
|
it('getRefSpec sha + refs/tags/ with fetchTags', async () => {
|
||||||
// When fetchTags is true, only include tags wildcard (specific tag is redundant)
|
|
||||||
const refSpec = refHelper.getRefSpec('refs/tags/my-tag', commit, true)
|
const refSpec = refHelper.getRefSpec('refs/tags/my-tag', commit, true)
|
||||||
expect(refSpec.length).toBe(1)
|
expect(refSpec.length).toBe(1)
|
||||||
expect(refSpec[0]).toBe('+refs/tags/*:refs/tags/*')
|
expect(refSpec[0]).toBe('+refs/tags/*:refs/tags/*')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('getRefSpec sha + refs/heads/ with fetchTags', async () => {
|
it('getRefSpec sha + refs/heads/ with fetchTags', async () => {
|
||||||
// When fetchTags is true, include both the branch refspec and tags wildcard
|
|
||||||
const refSpec = refHelper.getRefSpec('refs/heads/my/branch', commit, true)
|
const refSpec = refHelper.getRefSpec('refs/heads/my/branch', commit, true)
|
||||||
expect(refSpec.length).toBe(2)
|
expect(refSpec.length).toBe(2)
|
||||||
expect(refSpec[0]).toBe('+refs/tags/*:refs/tags/*')
|
expect(refSpec[0]).toBe('+refs/tags/*:refs/tags/*')
|
||||||
@ -194,7 +221,6 @@ describe('ref-helper tests', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('getRefSpec unqualified ref only with fetchTags', async () => {
|
it('getRefSpec unqualified ref only with fetchTags', async () => {
|
||||||
// When fetchTags is true, skip specific tag pattern since wildcard covers all
|
|
||||||
const refSpec = refHelper.getRefSpec('my-ref', '', true)
|
const refSpec = refHelper.getRefSpec('my-ref', '', true)
|
||||||
expect(refSpec.length).toBe(2)
|
expect(refSpec.length).toBe(2)
|
||||||
expect(refSpec[0]).toBe('+refs/tags/*:refs/tags/*')
|
expect(refSpec[0]).toBe('+refs/tags/*:refs/tags/*')
|
||||||
@ -222,14 +248,12 @@ describe('ref-helper tests', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('getRefSpec refs/tags/ only with fetchTags', async () => {
|
it('getRefSpec refs/tags/ only with fetchTags', async () => {
|
||||||
// When fetchTags is true, only include tags wildcard (specific tag is redundant)
|
|
||||||
const refSpec = refHelper.getRefSpec('refs/tags/my-tag', '', true)
|
const refSpec = refHelper.getRefSpec('refs/tags/my-tag', '', true)
|
||||||
expect(refSpec.length).toBe(1)
|
expect(refSpec.length).toBe(1)
|
||||||
expect(refSpec[0]).toBe('+refs/tags/*:refs/tags/*')
|
expect(refSpec[0]).toBe('+refs/tags/*:refs/tags/*')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('getRefSpec refs/heads/ only with fetchTags', async () => {
|
it('getRefSpec refs/heads/ only with fetchTags', async () => {
|
||||||
// When fetchTags is true, include both the branch refspec and tags wildcard
|
|
||||||
const refSpec = refHelper.getRefSpec('refs/heads/my/branch', '', true)
|
const refSpec = refHelper.getRefSpec('refs/heads/my/branch', '', true)
|
||||||
expect(refSpec.length).toBe(2)
|
expect(refSpec.length).toBe(2)
|
||||||
expect(refSpec[0]).toBe('+refs/tags/*:refs/tags/*')
|
expect(refSpec[0]).toBe('+refs/tags/*:refs/tags/*')
|
||||||
@ -248,9 +272,7 @@ describe('ref-helper tests', () => {
|
|||||||
'1111111111222222222233333333334444444444555555555566666666667777'
|
'1111111111222222222233333333334444444444555555555566666666667777'
|
||||||
const sha256Base =
|
const sha256Base =
|
||||||
'aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffff0000'
|
'aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffff0000'
|
||||||
let debugSpy: jest.SpyInstance
|
let repoGetSpy: jest.Mock<any>
|
||||||
let getOctokitSpy: jest.SpyInstance
|
|
||||||
let repoGetSpy: jest.Mock
|
|
||||||
let originalEventName: string
|
let originalEventName: string
|
||||||
let originalPayload: unknown
|
let originalPayload: unknown
|
||||||
let originalRef: string
|
let originalRef: string
|
||||||
@ -261,10 +283,10 @@ describe('ref-helper tests', () => {
|
|||||||
expectedBaseSha: string,
|
expectedBaseSha: string,
|
||||||
mergeCommit: string
|
mergeCommit: string
|
||||||
): void {
|
): void {
|
||||||
;(github.context as any).eventName = 'pull_request'
|
mockGithubContext.eventName = 'pull_request'
|
||||||
github.context.ref = ref
|
mockGithubContext.ref = ref
|
||||||
github.context.sha = mergeCommit
|
mockGithubContext.sha = mergeCommit
|
||||||
;(github.context as any).payload = {
|
mockGithubContext.payload = {
|
||||||
action: 'synchronize',
|
action: 'synchronize',
|
||||||
after: expectedHeadSha,
|
after: expectedHeadSha,
|
||||||
number: 123,
|
number: 123,
|
||||||
@ -280,18 +302,18 @@ describe('ref-helper tests', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
originalEventName = github.context.eventName
|
originalEventName = mockGithubContext.eventName
|
||||||
originalPayload = github.context.payload
|
originalPayload = mockGithubContext.payload
|
||||||
originalRef = github.context.ref
|
originalRef = mockGithubContext.ref
|
||||||
originalSha = github.context.sha
|
originalSha = mockGithubContext.sha
|
||||||
|
|
||||||
jest.spyOn(github.context, 'repo', 'get').mockReturnValue({
|
mockGithubContext.repo = {
|
||||||
owner: repositoryOwner,
|
owner: repositoryOwner,
|
||||||
repo: repositoryName
|
repo: repositoryName
|
||||||
})
|
}
|
||||||
debugSpy = jest.spyOn(core, 'debug').mockImplementation(jest.fn())
|
|
||||||
repoGetSpy = jest.fn(async () => ({}))
|
repoGetSpy = jest.fn(async () => ({}))
|
||||||
getOctokitSpy = jest.spyOn(github, 'getOctokit').mockReturnValue({
|
mockGetOctokit.mockReturnValue({
|
||||||
rest: {
|
rest: {
|
||||||
repos: {
|
repos: {
|
||||||
get: repoGetSpy
|
get: repoGetSpy
|
||||||
@ -301,11 +323,11 @@ describe('ref-helper tests', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
;(github.context as any).eventName = originalEventName
|
mockGithubContext.eventName = originalEventName
|
||||||
;(github.context as any).payload = originalPayload
|
mockGithubContext.payload = originalPayload
|
||||||
github.context.ref = originalRef
|
mockGithubContext.ref = originalRef
|
||||||
github.context.sha = originalSha
|
mockGithubContext.sha = originalSha
|
||||||
jest.restoreAllMocks()
|
jest.clearAllMocks()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('returns early for SHA-1 merge commit', async () => {
|
it('returns early for SHA-1 merge commit', async () => {
|
||||||
@ -320,7 +342,7 @@ describe('ref-helper tests', () => {
|
|||||||
commit
|
commit
|
||||||
)
|
)
|
||||||
|
|
||||||
expect(getOctokitSpy).not.toHaveBeenCalled()
|
expect(mockGetOctokit).not.toHaveBeenCalled()
|
||||||
expect(repoGetSpy).not.toHaveBeenCalled()
|
expect(repoGetSpy).not.toHaveBeenCalled()
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -338,7 +360,7 @@ describe('ref-helper tests', () => {
|
|||||||
sha256Commit
|
sha256Commit
|
||||||
)
|
)
|
||||||
|
|
||||||
expect(getOctokitSpy).toHaveBeenCalledWith(
|
expect(mockGetOctokit).toHaveBeenCalledWith(
|
||||||
'token',
|
'token',
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
userAgent: expect.stringContaining(
|
userAgent: expect.stringContaining(
|
||||||
@ -350,10 +372,10 @@ describe('ref-helper tests', () => {
|
|||||||
owner: repositoryOwner,
|
owner: repositoryOwner,
|
||||||
repo: repositoryName
|
repo: repositoryName
|
||||||
})
|
})
|
||||||
expect(debugSpy).toHaveBeenCalledWith(
|
expect(mockDebug).toHaveBeenCalledWith(
|
||||||
`Expected head sha ${sha256Head}; actual head sha ${actualHeadSha}`
|
`Expected head sha ${sha256Head}; actual head sha ${actualHeadSha}`
|
||||||
)
|
)
|
||||||
expect(debugSpy).not.toHaveBeenCalledWith('Unexpected message format')
|
expect(mockDebug).not.toHaveBeenCalledWith('Unexpected message format')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('does not match 50-char hex as a valid merge', async () => {
|
it('does not match 50-char hex as a valid merge', async () => {
|
||||||
@ -370,9 +392,9 @@ describe('ref-helper tests', () => {
|
|||||||
commit
|
commit
|
||||||
)
|
)
|
||||||
|
|
||||||
expect(getOctokitSpy).not.toHaveBeenCalled()
|
expect(mockGetOctokit).not.toHaveBeenCalled()
|
||||||
expect(repoGetSpy).not.toHaveBeenCalled()
|
expect(repoGetSpy).not.toHaveBeenCalled()
|
||||||
expect(debugSpy).toHaveBeenCalledWith('Unexpected message format')
|
expect(mockDebug).toHaveBeenCalledWith('Unexpected message format')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,16 +1,32 @@
|
|||||||
import * as core from '@actions/core'
|
import {
|
||||||
import {RetryHelper} from '../lib/retry-helper'
|
jest,
|
||||||
|
describe,
|
||||||
|
it,
|
||||||
|
expect,
|
||||||
|
beforeAll,
|
||||||
|
beforeEach,
|
||||||
|
afterAll
|
||||||
|
} from '@jest/globals'
|
||||||
|
|
||||||
|
let info: string[] = []
|
||||||
|
|
||||||
|
// Mock @actions/core before loading retry-helper
|
||||||
|
jest.unstable_mockModule('@actions/core', () => ({
|
||||||
|
info: jest.fn((message: string) => {
|
||||||
|
info.push(message)
|
||||||
|
}),
|
||||||
|
debug: jest.fn(),
|
||||||
|
warning: jest.fn(),
|
||||||
|
error: jest.fn()
|
||||||
|
}))
|
||||||
|
|
||||||
|
// Dynamic imports after mocking
|
||||||
|
const {RetryHelper} = await import('../src/retry-helper.js')
|
||||||
|
|
||||||
let info: string[]
|
|
||||||
let retryHelper: any
|
let retryHelper: any
|
||||||
|
|
||||||
describe('retry-helper tests', () => {
|
describe('retry-helper tests', () => {
|
||||||
beforeAll(() => {
|
beforeAll(() => {
|
||||||
// Mock @actions/core info()
|
|
||||||
jest.spyOn(core, 'info').mockImplementation((message: string) => {
|
|
||||||
info.push(message)
|
|
||||||
})
|
|
||||||
|
|
||||||
retryHelper = new RetryHelper(3, 0, 0)
|
retryHelper = new RetryHelper(3, 0, 0)
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -20,7 +36,6 @@ describe('retry-helper tests', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
afterAll(() => {
|
afterAll(() => {
|
||||||
// Restore
|
|
||||||
jest.restoreAllMocks()
|
jest.restoreAllMocks()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -1,10 +1,12 @@
|
|||||||
import * as github from '@actions/github'
|
import {
|
||||||
import {assertSafePrCheckout} from '../lib/unsafe-pr-checkout-helper'
|
jest,
|
||||||
|
describe,
|
||||||
// Shallow clone original @actions/github context
|
it,
|
||||||
const originalContext = {...github.context}
|
expect,
|
||||||
const originalEventName = github.context.eventName
|
beforeAll,
|
||||||
const originalPayload = github.context.payload
|
afterEach,
|
||||||
|
afterAll
|
||||||
|
} from '@jest/globals'
|
||||||
|
|
||||||
const BASE_REPO_ID = 100
|
const BASE_REPO_ID = 100
|
||||||
const FORK_REPO_ID = 200
|
const FORK_REPO_ID = 200
|
||||||
@ -15,9 +17,29 @@ const WORKFLOW_RUN_HEAD_COMMIT_SHA = '4444444444444444444444444444444444444444'
|
|||||||
const BASE_QUALIFIED_REPO = 'some-owner/some-repo'
|
const BASE_QUALIFIED_REPO = 'some-owner/some-repo'
|
||||||
const FORK_QUALIFIED_REPO = 'another-repo/fork'
|
const FORK_QUALIFIED_REPO = 'another-repo/fork'
|
||||||
|
|
||||||
|
// Mutable mock context
|
||||||
|
const mockContext: any = {
|
||||||
|
eventName: '',
|
||||||
|
payload: {},
|
||||||
|
repo: {owner: 'some-owner', repo: 'some-repo'},
|
||||||
|
ref: '',
|
||||||
|
sha: ''
|
||||||
|
}
|
||||||
|
|
||||||
|
jest.unstable_mockModule('@actions/github', () => ({
|
||||||
|
context: mockContext
|
||||||
|
}))
|
||||||
|
|
||||||
|
// Dynamic imports after mocking
|
||||||
|
const {assertSafePrCheckout} =
|
||||||
|
await import('../src/unsafe-pr-checkout-helper.js')
|
||||||
|
|
||||||
|
const originalEventName = mockContext.eventName
|
||||||
|
const originalPayload = mockContext.payload
|
||||||
|
|
||||||
function setContext(eventName: string, payload: object): void {
|
function setContext(eventName: string, payload: object): void {
|
||||||
;(github.context as {eventName: string}).eventName = eventName
|
mockContext.eventName = eventName
|
||||||
;(github.context as {payload: object}).payload = payload
|
mockContext.payload = payload
|
||||||
}
|
}
|
||||||
|
|
||||||
function forkPullRequestTargetPayload(): object {
|
function forkPullRequestTargetPayload(): object {
|
||||||
@ -59,22 +81,17 @@ function forkWorkflowRunPayload(): object {
|
|||||||
|
|
||||||
describe('unsafe-pr-checkout-helper', () => {
|
describe('unsafe-pr-checkout-helper', () => {
|
||||||
beforeAll(() => {
|
beforeAll(() => {
|
||||||
jest.spyOn(github.context, 'repo', 'get').mockReturnValue({
|
mockContext.repo = {owner: 'some-owner', repo: 'some-repo'}
|
||||||
owner: 'some-owner',
|
|
||||||
repo: 'some-repo'
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
;(github.context as {eventName: string}).eventName = originalEventName
|
mockContext.eventName = originalEventName
|
||||||
;(github.context as {payload: object}).payload = originalPayload
|
mockContext.payload = originalPayload
|
||||||
})
|
})
|
||||||
|
|
||||||
afterAll(() => {
|
afterAll(() => {
|
||||||
;(github.context as {eventName: string}).eventName =
|
mockContext.eventName = originalEventName
|
||||||
originalContext.eventName
|
mockContext.payload = originalPayload
|
||||||
;(github.context as {payload: object}).payload = originalContext.payload
|
|
||||||
jest.restoreAllMocks()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('allows pull_request events untouched', () => {
|
it('allows pull_request events untouched', () => {
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import * as urlHelper from '../src/url-helper'
|
import {jest, describe, it, expect, beforeEach, afterAll} from '@jest/globals'
|
||||||
|
import * as urlHelper from '../src/url-helper.js'
|
||||||
|
|
||||||
describe('getServerUrl tests', () => {
|
describe('getServerUrl tests', () => {
|
||||||
it('basics', async () => {
|
it('basics', async () => {
|
||||||
|
|||||||
6251
dist/index.js
vendored
6251
dist/index.js
vendored
File diff suppressed because it is too large
Load Diff
3
dist/package.json
vendored
Normal file
3
dist/package.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"type": "module"
|
||||||
|
}
|
||||||
@ -1,12 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
clearMocks: true,
|
|
||||||
fakeTimers: {},
|
|
||||||
moduleFileExtensions: ['js', 'ts'],
|
|
||||||
testEnvironment: 'node',
|
|
||||||
testMatch: ['**/*.test.ts'],
|
|
||||||
testRunner: 'jest-circus/runner',
|
|
||||||
transform: {
|
|
||||||
'^.+\\.ts$': 'ts-jest'
|
|
||||||
},
|
|
||||||
verbose: true
|
|
||||||
}
|
|
||||||
24
jest.config.ts
Normal file
24
jest.config.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
export default {
|
||||||
|
clearMocks: true,
|
||||||
|
moduleFileExtensions: ['js', 'ts'],
|
||||||
|
roots: ['<rootDir>'],
|
||||||
|
testEnvironment: 'node',
|
||||||
|
testMatch: ['**/*.test.ts'],
|
||||||
|
transform: {
|
||||||
|
'^.+\\.ts$': [
|
||||||
|
'ts-jest',
|
||||||
|
{
|
||||||
|
useESM: true,
|
||||||
|
diagnostics: {
|
||||||
|
ignoreCodes: [151002]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
extensionsToTreatAsEsm: ['.ts'],
|
||||||
|
transformIgnorePatterns: ['node_modules/(?!(@actions)/)'],
|
||||||
|
moduleNameMapper: {
|
||||||
|
'^(\\.{1,2}/.*)\\.js$': '$1'
|
||||||
|
},
|
||||||
|
verbose: true
|
||||||
|
}
|
||||||
804
package-lock.json
generated
804
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
32
package.json
32
package.json
@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"name": "checkout",
|
"name": "checkout",
|
||||||
"version": "5.0.0",
|
"version": "7.0.0",
|
||||||
"description": "checkout action",
|
"description": "checkout action",
|
||||||
|
"type": "module",
|
||||||
"main": "lib/main.js",
|
"main": "lib/main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "tsc && ncc build && node lib/misc/generate-docs.js",
|
"build": "tsc && ncc build src/main.ts -o dist && node lib/misc/generate-docs.js",
|
||||||
"format": "prettier --write '**/*.ts'",
|
"format": "prettier --write '**/*.ts'",
|
||||||
"format-check": "prettier --check '**/*.ts'",
|
"format-check": "prettier --check '**/*.ts'",
|
||||||
"lint": "eslint src/**/*.ts",
|
"lint": "eslint src/**/*.ts",
|
||||||
"test": "jest",
|
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
|
||||||
"licensed-check": "src/misc/licensed-check.sh",
|
"licensed-check": "src/misc/licensed-check.sh",
|
||||||
"licensed-generate": "src/misc/licensed-generate.sh"
|
"licensed-generate": "src/misc/licensed-generate.sh"
|
||||||
},
|
},
|
||||||
@ -27,29 +28,30 @@
|
|||||||
"url": "https://github.com/actions/checkout/issues"
|
"url": "https://github.com/actions/checkout/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/actions/checkout#readme",
|
"homepage": "https://github.com/actions/checkout#readme",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=24"
|
||||||
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.10.1",
|
"@actions/core": "^3.0.1",
|
||||||
"@actions/exec": "^1.1.1",
|
"@actions/exec": "^3.0.0",
|
||||||
"@actions/github": "^6.0.0",
|
"@actions/github": "^9.1.1",
|
||||||
"@actions/io": "^1.1.3",
|
"@actions/io": "^3.0.2",
|
||||||
"@actions/tool-cache": "^2.0.1",
|
"@actions/tool-cache": "^4.0.0"
|
||||||
"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.44.0",
|
||||||
"eslint": "^8.57.0",
|
"eslint": "^8.57.0",
|
||||||
"eslint-plugin-github": "^4.10.2",
|
"eslint-plugin-github": "^4.10.2",
|
||||||
"eslint-plugin-jest": "^28.8.2",
|
"eslint-plugin-jest": "^28.8.2",
|
||||||
"jest": "^29.7.0",
|
"jest": "^29.7.0",
|
||||||
"jest-circus": "^29.7.0",
|
"js-yaml": "^4.2.0",
|
||||||
"js-yaml": "^4.1.0",
|
"prettier": "^3.8.4",
|
||||||
"prettier": "^3.3.3",
|
"ts-jest": "^29.4.11",
|
||||||
"ts-jest": "^29.2.5",
|
"ts-node": "^10.9.2",
|
||||||
"typescript": "^5.5.4"
|
"typescript": "^5.5.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,12 +5,12 @@ import * as fs from 'fs'
|
|||||||
import * as io from '@actions/io'
|
import * as io from '@actions/io'
|
||||||
import * as os from 'os'
|
import * as os from 'os'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import * as regexpHelper from './regexp-helper'
|
import * as regexpHelper from './regexp-helper.js'
|
||||||
import * as stateHelper from './state-helper'
|
import * as stateHelper from './state-helper.js'
|
||||||
import * as urlHelper from './url-helper'
|
import * as urlHelper from './url-helper.js'
|
||||||
import {v4 as uuid} from 'uuid'
|
import {randomUUID} from 'crypto'
|
||||||
import {IGitCommandManager} from './git-command-manager'
|
import {IGitCommandManager} from './git-command-manager.js'
|
||||||
import {IGitSourceSettings} from './git-source-settings'
|
import {IGitSourceSettings} from './git-source-settings.js'
|
||||||
|
|
||||||
const IS_WINDOWS = process.platform === 'win32'
|
const IS_WINDOWS = process.platform === 'win32'
|
||||||
const SSH_COMMAND_KEY = 'core.sshCommand'
|
const SSH_COMMAND_KEY = 'core.sshCommand'
|
||||||
@ -90,7 +90,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 = 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})
|
||||||
|
|
||||||
@ -255,7 +255,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 = 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})
|
||||||
@ -422,7 +422,7 @@ class GitAuthHelper {
|
|||||||
assert.ok(runnerTemp, 'RUNNER_TEMP is not defined')
|
assert.ok(runnerTemp, 'RUNNER_TEMP is not defined')
|
||||||
|
|
||||||
// Create a unique filename for this checkout instance
|
// Create a unique filename for this checkout instance
|
||||||
const configFileName = `git-credentials-${uuid()}.config`
|
const configFileName = `git-credentials-${randomUUID()}.config`
|
||||||
this.credentialsConfigPath = path.join(runnerTemp, configFileName)
|
this.credentialsConfigPath = path.join(runnerTemp, configFileName)
|
||||||
|
|
||||||
core.debug(`Credentials config path: ${this.credentialsConfigPath}`)
|
core.debug(`Credentials config path: ${this.credentialsConfigPath}`)
|
||||||
|
|||||||
@ -1,13 +1,13 @@
|
|||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as exec from '@actions/exec'
|
import * as exec from '@actions/exec'
|
||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
import * as fshelper from './fs-helper'
|
import * as fshelper from './fs-helper.js'
|
||||||
import * as io from '@actions/io'
|
import * as io from '@actions/io'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import * as refHelper from './ref-helper'
|
import * as refHelper from './ref-helper.js'
|
||||||
import * as regexpHelper from './regexp-helper'
|
import * as regexpHelper from './regexp-helper.js'
|
||||||
import * as retryHelper from './retry-helper'
|
import * as retryHelper from './retry-helper.js'
|
||||||
import {GitVersion} from './git-version'
|
import {GitVersion} from './git-version.js'
|
||||||
|
|
||||||
// Auth header not supported before 2.9
|
// Auth header not supported before 2.9
|
||||||
// Wire protocol v2 not supported before 2.18
|
// Wire protocol v2 not supported before 2.18
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
import * as assert from 'assert'
|
import * as assert from 'assert'
|
||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
import * as fsHelper from './fs-helper'
|
import * as fsHelper from './fs-helper.js'
|
||||||
import * as io from '@actions/io'
|
import * as io from '@actions/io'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import {IGitCommandManager} from './git-command-manager'
|
import {IGitCommandManager} from './git-command-manager.js'
|
||||||
|
|
||||||
export async function prepareExistingDirectory(
|
export async function prepareExistingDirectory(
|
||||||
git: IGitCommandManager | undefined,
|
git: IGitCommandManager | undefined,
|
||||||
|
|||||||
@ -1,19 +1,19 @@
|
|||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as fsHelper from './fs-helper'
|
import * as fsHelper from './fs-helper.js'
|
||||||
import * as gitAuthHelper from './git-auth-helper'
|
import * as gitAuthHelper from './git-auth-helper.js'
|
||||||
import * as gitCommandManager from './git-command-manager'
|
import * as gitCommandManager from './git-command-manager.js'
|
||||||
import * as gitDirectoryHelper from './git-directory-helper'
|
import * as gitDirectoryHelper from './git-directory-helper.js'
|
||||||
import * as githubApiHelper from './github-api-helper'
|
import * as githubApiHelper from './github-api-helper.js'
|
||||||
import * as io from '@actions/io'
|
import * as io from '@actions/io'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import * as refHelper from './ref-helper'
|
import * as refHelper from './ref-helper.js'
|
||||||
import * as stateHelper from './state-helper'
|
import * as stateHelper from './state-helper.js'
|
||||||
import * as urlHelper from './url-helper'
|
import * as urlHelper from './url-helper.js'
|
||||||
import {
|
import {
|
||||||
MinimumGitSparseCheckoutVersion,
|
MinimumGitSparseCheckoutVersion,
|
||||||
IGitCommandManager
|
IGitCommandManager
|
||||||
} from './git-command-manager'
|
} from './git-command-manager.js'
|
||||||
import {IGitSourceSettings} from './git-source-settings'
|
import {IGitSourceSettings} from './git-source-settings.js'
|
||||||
|
|
||||||
export async function getSource(settings: IGitSourceSettings): Promise<void> {
|
export async function getSource(settings: IGitSourceSettings): Promise<void> {
|
||||||
// Repository URL
|
// Repository URL
|
||||||
|
|||||||
@ -4,10 +4,10 @@ import * as fs from 'fs'
|
|||||||
import * as github from '@actions/github'
|
import * as github from '@actions/github'
|
||||||
import * as io from '@actions/io'
|
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.js'
|
||||||
import * as toolCache from '@actions/tool-cache'
|
import * as toolCache from '@actions/tool-cache'
|
||||||
import {v4 as uuid} from 'uuid'
|
import {randomUUID} from 'crypto'
|
||||||
import {getServerApiUrl} from './url-helper'
|
import {getServerApiUrl} from './url-helper.js'
|
||||||
|
|
||||||
const IS_WINDOWS = process.platform === 'win32'
|
const IS_WINDOWS = process.platform === 'win32'
|
||||||
|
|
||||||
@ -39,7 +39,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 = 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`)
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as fsHelper from './fs-helper'
|
import * as fsHelper from './fs-helper.js'
|
||||||
import * as github from '@actions/github'
|
import * as github from '@actions/github'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import * as unsafePrCheckoutHelper from './unsafe-pr-checkout-helper'
|
import * as unsafePrCheckoutHelper from './unsafe-pr-checkout-helper.js'
|
||||||
import * as workflowContextHelper from './workflow-context-helper'
|
import * as workflowContextHelper from './workflow-context-helper.js'
|
||||||
import {IGitSourceSettings} from './git-source-settings'
|
import {IGitSourceSettings} from './git-source-settings.js'
|
||||||
|
|
||||||
export async function getInputs(): Promise<IGitSourceSettings> {
|
export async function getInputs(): Promise<IGitSourceSettings> {
|
||||||
const result = {} as unknown as IGitSourceSettings
|
const result = {} as unknown as IGitSourceSettings
|
||||||
|
|||||||
18
src/main.ts
18
src/main.ts
@ -1,9 +1,11 @@
|
|||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as coreCommand from '@actions/core/lib/command'
|
import * as gitSourceProvider from './git-source-provider.js'
|
||||||
import * as gitSourceProvider from './git-source-provider'
|
import * as inputHelper from './input-helper.js'
|
||||||
import * as inputHelper from './input-helper'
|
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import * as stateHelper from './state-helper'
|
import * as stateHelper from './state-helper.js'
|
||||||
|
import {fileURLToPath} from 'url'
|
||||||
|
|
||||||
|
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||||||
|
|
||||||
async function run(): Promise<void> {
|
async function run(): Promise<void> {
|
||||||
try {
|
try {
|
||||||
@ -11,10 +13,8 @@ async function run(): Promise<void> {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// Register problem matcher
|
// Register problem matcher
|
||||||
coreCommand.issueCommand(
|
core.info(
|
||||||
'add-matcher',
|
`::add-matcher::${path.join(__dirname, 'problem-matcher.json')}`
|
||||||
{},
|
|
||||||
path.join(__dirname, 'problem-matcher.json')
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Get sources
|
// Get sources
|
||||||
@ -22,7 +22,7 @@ async function run(): Promise<void> {
|
|||||||
core.setOutput('ref', sourceSettings.ref)
|
core.setOutput('ref', sourceSettings.ref)
|
||||||
} finally {
|
} finally {
|
||||||
// Unregister problem matcher
|
// Unregister problem matcher
|
||||||
coreCommand.issueCommand('remove-matcher', {owner: 'checkout-git'}, '')
|
core.info('::remove-matcher owner=checkout-git::')
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
core.setFailed(`${(error as any)?.message ?? error}`)
|
core.setFailed(`${(error as any)?.message ?? error}`)
|
||||||
|
|||||||
@ -2,6 +2,9 @@ import * as fs from 'fs'
|
|||||||
import * as os from 'os'
|
import * as os from 'os'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import * as yaml from 'js-yaml'
|
import * as yaml from 'js-yaml'
|
||||||
|
import {fileURLToPath} from 'url'
|
||||||
|
|
||||||
|
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||||||
|
|
||||||
//
|
//
|
||||||
// SUMMARY
|
// SUMMARY
|
||||||
@ -120,7 +123,7 @@ function updateUsage(
|
|||||||
}
|
}
|
||||||
|
|
||||||
updateUsage(
|
updateUsage(
|
||||||
'actions/checkout@v6',
|
'actions/checkout@v7',
|
||||||
path.join(__dirname, '..', '..', 'action.yml'),
|
path.join(__dirname, '..', '..', 'action.yml'),
|
||||||
path.join(__dirname, '..', '..', 'README.md')
|
path.join(__dirname, '..', '..', 'README.md')
|
||||||
)
|
)
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import {IGitCommandManager} from './git-command-manager'
|
import {IGitCommandManager} from './git-command-manager.js'
|
||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as github from '@actions/github'
|
import * as github from '@actions/github'
|
||||||
import {getServerApiUrl, isGhes} from './url-helper'
|
import {getServerApiUrl, isGhes} from './url-helper.js'
|
||||||
|
|
||||||
export const tagsRefSpec = '+refs/tags/*:refs/tags/*'
|
export const tagsRefSpec = '+refs/tags/*:refs/tags/*'
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import * as github from '@actions/github'
|
import * as github from '@actions/github'
|
||||||
import {fromPayload} from './ref-helper'
|
import {fromPayload} from './ref-helper.js'
|
||||||
|
|
||||||
const PR_REF_PATTERN = /^refs\/pull\/[0-9]+\/(?:head|merge)$/
|
const PR_REF_PATTERN = /^refs\/pull\/[0-9]+\/(?:head|merge)$/
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import * as assert from 'assert'
|
import * as assert from 'assert'
|
||||||
import {URL} from 'url'
|
import {URL} from 'url'
|
||||||
import {IGitSourceSettings} from './git-source-settings'
|
import {IGitSourceSettings} from './git-source-settings.js'
|
||||||
|
|
||||||
export function getFetchUrl(settings: IGitSourceSettings): string {
|
export function getFetchUrl(settings: IGitSourceSettings): string {
|
||||||
assert.ok(
|
assert.ok(
|
||||||
|
|||||||
@ -1,17 +1,13 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "es6",
|
"target": "ES2022",
|
||||||
"module": "commonjs",
|
"module": "NodeNext",
|
||||||
"lib": [
|
"moduleResolution": "NodeNext",
|
||||||
"es6"
|
|
||||||
],
|
|
||||||
"outDir": "./lib",
|
"outDir": "./lib",
|
||||||
"rootDir": "./src",
|
"rootDir": "./src",
|
||||||
"declaration": true,
|
|
||||||
"strict": true,
|
"strict": true,
|
||||||
"noImplicitAny": false,
|
"noImplicitAny": false,
|
||||||
"esModuleInterop": true,
|
"esModuleInterop": true
|
||||||
"skipLibCheck": true
|
|
||||||
},
|
},
|
||||||
"exclude": ["__test__", "lib", "node_modules"]
|
"exclude": ["__test__", "lib", "node_modules", "jest.config.ts"]
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user