mirror of
https://github.com/actions/checkout.git
synced 2026-06-22 03:41:20 +08:00
Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2b8f79e013 | |||
| d651e32721 | |||
| 8f0d2fbedc | |||
| 418530e26c | |||
| 0cf6e008d0 | |||
| 9a43814785 | |||
| 317b5f36ae | |||
| efb66ddacf | |||
| 3e9f24a519 | |||
| 8ade135a41 | |||
| c533a0a4cf |
@@ -72,6 +72,16 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: __test__/verify-side-by-side.sh
|
run: __test__/verify-side-by-side.sh
|
||||||
|
|
||||||
|
# Filter
|
||||||
|
- name: Fetch filter
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
filter: 'blob:none'
|
||||||
|
path: fetch-filter
|
||||||
|
|
||||||
|
- name: Verify fetch filter
|
||||||
|
run: __test__/verify-fetch-filter.sh
|
||||||
|
|
||||||
# Sparse checkout
|
# Sparse checkout
|
||||||
- name: Sparse checkout
|
- name: Sparse checkout
|
||||||
uses: ./
|
uses: ./
|
||||||
|
|||||||
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,5 +1,8 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## v4.1.0
|
||||||
|
- [Add support for partial checkout filters](https://github.com/actions/checkout/pull/1396)
|
||||||
|
|
||||||
## v4.0.0
|
## v4.0.0
|
||||||
- [Support fetching without the --progress option](https://github.com/actions/checkout/pull/1067)
|
- [Support fetching without the --progress option](https://github.com/actions/checkout/pull/1067)
|
||||||
- [Update to node20](https://github.com/actions/checkout/pull/1436)
|
- [Update to node20](https://github.com/actions/checkout/pull/1436)
|
||||||
|
|||||||
@@ -75,8 +75,12 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl
|
|||||||
# Default: true
|
# Default: true
|
||||||
clean: ''
|
clean: ''
|
||||||
|
|
||||||
|
# Partially clone against a given filter. Overrides sparse-checkout if set.
|
||||||
|
# Default: null
|
||||||
|
filter: ''
|
||||||
|
|
||||||
# Do a sparse checkout on given patterns. Each pattern should be separated with
|
# Do a sparse checkout on given patterns. Each pattern should be separated with
|
||||||
# new lines
|
# new lines.
|
||||||
# Default: null
|
# Default: null
|
||||||
sparse-checkout: ''
|
sparse-checkout: ''
|
||||||
|
|
||||||
|
|||||||
@@ -169,8 +169,9 @@ describe('git-auth-helper tests', () => {
|
|||||||
|
|
||||||
// Mock fs.promises.readFile
|
// Mock fs.promises.readFile
|
||||||
const realReadFile = fs.promises.readFile
|
const realReadFile = fs.promises.readFile
|
||||||
jest.spyOn(fs.promises, 'readFile').mockImplementation(
|
jest
|
||||||
async (file: any, options: any): Promise<Buffer> => {
|
.spyOn(fs.promises, 'readFile')
|
||||||
|
.mockImplementation(async (file: any, options: any): Promise<Buffer> => {
|
||||||
const userKnownHostsPath = path.join(
|
const userKnownHostsPath = path.join(
|
||||||
os.homedir(),
|
os.homedir(),
|
||||||
'.ssh',
|
'.ssh',
|
||||||
@@ -181,8 +182,7 @@ describe('git-auth-helper tests', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return await realReadFile(file, options)
|
return await realReadFile(file, options)
|
||||||
}
|
})
|
||||||
)
|
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
|
const authHelper = gitAuthHelper.createAuthHelper(git, settings)
|
||||||
@@ -802,6 +802,7 @@ async function setup(testName: string): Promise<void> {
|
|||||||
authToken: 'some auth token',
|
authToken: 'some auth token',
|
||||||
clean: true,
|
clean: true,
|
||||||
commit: '',
|
commit: '',
|
||||||
|
filter: undefined,
|
||||||
sparseCheckout: [],
|
sparseCheckout: [],
|
||||||
sparseCheckoutConeMode: true,
|
sparseCheckoutConeMode: true,
|
||||||
fetchDepth: 1,
|
fetchDepth: 1,
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ describe('input-helper tests', () => {
|
|||||||
expect(settings.clean).toBe(true)
|
expect(settings.clean).toBe(true)
|
||||||
expect(settings.commit).toBeTruthy()
|
expect(settings.commit).toBeTruthy()
|
||||||
expect(settings.commit).toBe('1234567890123456789012345678901234567890')
|
expect(settings.commit).toBe('1234567890123456789012345678901234567890')
|
||||||
|
expect(settings.filter).toBe(undefined)
|
||||||
expect(settings.sparseCheckout).toBe(undefined)
|
expect(settings.sparseCheckout).toBe(undefined)
|
||||||
expect(settings.sparseCheckoutConeMode).toBe(true)
|
expect(settings.sparseCheckoutConeMode).toBe(true)
|
||||||
expect(settings.fetchDepth).toBe(1)
|
expect(settings.fetchDepth).toBe(1)
|
||||||
|
|||||||
@@ -7,11 +7,11 @@ let git: IGitCommandManager
|
|||||||
|
|
||||||
describe('ref-helper tests', () => {
|
describe('ref-helper tests', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
git = ({} as unknown) as IGitCommandManager
|
git = {} as unknown as IGitCommandManager
|
||||||
})
|
})
|
||||||
|
|
||||||
it('getCheckoutInfo requires git', async () => {
|
it('getCheckoutInfo requires git', async () => {
|
||||||
const git = (null as unknown) as IGitCommandManager
|
const git = null as unknown as IGitCommandManager
|
||||||
try {
|
try {
|
||||||
await refHelper.getCheckoutInfo(git, 'refs/heads/my/branch', commit)
|
await refHelper.getCheckoutInfo(git, 'refs/heads/my/branch', commit)
|
||||||
throw new Error('Should not reach here')
|
throw new Error('Should not reach here')
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ describe('retry-helper tests', () => {
|
|||||||
|
|
||||||
it('all attempts fail succeeds', async () => {
|
it('all attempts fail succeeds', async () => {
|
||||||
let attempts = 0
|
let attempts = 0
|
||||||
let error: Error = (null as unknown) as Error
|
let error: Error = null as unknown as Error
|
||||||
try {
|
try {
|
||||||
await retryHelper.execute(() => {
|
await retryHelper.execute(() => {
|
||||||
throw new Error(`some error ${++attempts}`)
|
throw new Error(`some error ${++attempts}`)
|
||||||
|
|||||||
Executable
+16
@@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Verify .git folder
|
||||||
|
if [ ! -d "./fetch-filter/.git" ]; then
|
||||||
|
echo "Expected ./fetch-filter/.git folder to exist"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Verify .git/config contains partialclonefilter
|
||||||
|
|
||||||
|
CLONE_FILTER=$(git -C fetch-filter config --local --get remote.origin.partialclonefilter)
|
||||||
|
|
||||||
|
if [ "$CLONE_FILTER" != "blob:none" ]; then
|
||||||
|
echo "Expected ./fetch-filter/.git/config to have 'remote.origin.partialclonefilter' set to 'blob:none'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
+6
-1
@@ -53,10 +53,15 @@ inputs:
|
|||||||
clean:
|
clean:
|
||||||
description: 'Whether to execute `git clean -ffdx && git reset --hard HEAD` before fetching'
|
description: 'Whether to execute `git clean -ffdx && git reset --hard HEAD` before fetching'
|
||||||
default: true
|
default: true
|
||||||
|
filter:
|
||||||
|
description: >
|
||||||
|
Partially clone against a given filter.
|
||||||
|
Overrides sparse-checkout if set.
|
||||||
|
default: null
|
||||||
sparse-checkout:
|
sparse-checkout:
|
||||||
description: >
|
description: >
|
||||||
Do a sparse checkout on given patterns.
|
Do a sparse checkout on given patterns.
|
||||||
Each pattern should be separated with new lines
|
Each pattern should be separated with new lines.
|
||||||
default: null
|
default: null
|
||||||
sparse-checkout-cone-mode:
|
sparse-checkout-cone-mode:
|
||||||
description: >
|
description: >
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Vendored
+26823
-4116
File diff suppressed because one or more lines are too long
Generated
+5554
-9261
File diff suppressed because it is too large
Load Diff
+19
-19
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "checkout",
|
"name": "checkout",
|
||||||
"version": "4.0.0",
|
"version": "4.1.0",
|
||||||
"description": "checkout action",
|
"description": "checkout action",
|
||||||
"main": "lib/main.js",
|
"main": "lib/main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -28,28 +28,28 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/actions/checkout#readme",
|
"homepage": "https://github.com/actions/checkout#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.10.0",
|
"@actions/core": "^1.10.1",
|
||||||
"@actions/exec": "^1.0.1",
|
"@actions/exec": "^1.1.1",
|
||||||
"@actions/github": "^5.0.0",
|
"@actions/github": "file:actions-github-6.0.2.tgz",
|
||||||
"@actions/io": "^1.1.3",
|
"@actions/io": "^1.1.3",
|
||||||
"@actions/tool-cache": "^1.1.2",
|
"@actions/tool-cache": "^2.0.1",
|
||||||
"uuid": "^3.3.3"
|
"uuid": "^3.3.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^27.0.2",
|
"@types/jest": "^29.5.5",
|
||||||
"@types/node": "^20.5.3",
|
"@types/node": "^20.8.2",
|
||||||
"@types/uuid": "^3.4.6",
|
"@types/uuid": "^3.4.6",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.45.0",
|
"@typescript-eslint/eslint-plugin": "^6.7.4",
|
||||||
"@typescript-eslint/parser": "^5.45.0",
|
"@typescript-eslint/parser": "^6.7.4",
|
||||||
"@vercel/ncc": "^0.36.1",
|
"@vercel/ncc": "^0.38.0",
|
||||||
"eslint": "^7.32.0",
|
"eslint": "^8.50.0",
|
||||||
"eslint-plugin-github": "^4.3.2",
|
"eslint-plugin-github": "^4.10.1",
|
||||||
"eslint-plugin-jest": "^25.7.0",
|
"eslint-plugin-jest": "^27.4.2",
|
||||||
"jest": "^27.3.0",
|
"jest": "^29.7.0",
|
||||||
"jest-circus": "^27.3.0",
|
"jest-circus": "^29.7.0",
|
||||||
"js-yaml": "^3.13.1",
|
"js-yaml": "^3.13.1",
|
||||||
"prettier": "^1.19.1",
|
"prettier": "^3.0.3",
|
||||||
"ts-jest": "^27.0.7",
|
"ts-jest": "^29.1.1",
|
||||||
"typescript": "^4.4.4"
|
"typescript": "^5.2.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-6
@@ -18,8 +18,9 @@ export function directoryExistsSync(path: string, required?: boolean): boolean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Encountered an error when checking whether path '${path}' exists: ${(error as any)
|
`Encountered an error when checking whether path '${path}' exists: ${
|
||||||
?.message ?? error}`
|
(error as any)?.message ?? error
|
||||||
|
}`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,8 +46,9 @@ export function existsSync(path: string): boolean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Encountered an error when checking whether path '${path}' exists: ${(error as any)
|
`Encountered an error when checking whether path '${path}' exists: ${
|
||||||
?.message ?? error}`
|
(error as any)?.message ?? error
|
||||||
|
}`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,8 +69,9 @@ export function fileExistsSync(path: string): boolean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Encountered an error when checking whether path '${path}' exists: ${(error as any)
|
`Encountered an error when checking whether path '${path}' exists: ${
|
||||||
?.message ?? error}`
|
(error as any)?.message ?? error
|
||||||
|
}`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class GitAuthHelper {
|
|||||||
gitSourceSettings: IGitSourceSettings | undefined
|
gitSourceSettings: IGitSourceSettings | undefined
|
||||||
) {
|
) {
|
||||||
this.git = gitCommandManager
|
this.git = gitCommandManager
|
||||||
this.settings = gitSourceSettings || (({} as unknown) as IGitSourceSettings)
|
this.settings = gitSourceSettings || ({} as unknown as IGitSourceSettings)
|
||||||
|
|
||||||
// Token auth header
|
// Token auth header
|
||||||
const serverUrl = urlHelper.getServerUrl(this.settings.githubServerUrl)
|
const serverUrl = urlHelper.getServerUrl(this.settings.githubServerUrl)
|
||||||
|
|||||||
@@ -159,7 +159,13 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
|
|||||||
fetchTags?: boolean
|
fetchTags?: boolean
|
||||||
showProgress?: boolean
|
showProgress?: boolean
|
||||||
} = {}
|
} = {}
|
||||||
if (settings.sparseCheckout) fetchOptions.filter = 'blob:none'
|
|
||||||
|
if (settings.filter) {
|
||||||
|
fetchOptions.filter = settings.filter
|
||||||
|
} else if (settings.sparseCheckout) {
|
||||||
|
fetchOptions.filter = 'blob:none'
|
||||||
|
}
|
||||||
|
|
||||||
if (settings.fetchDepth <= 0) {
|
if (settings.fetchDepth <= 0) {
|
||||||
// Fetch all branches and tags
|
// Fetch all branches and tags
|
||||||
let refSpec = refHelper.getRefSpecForAllHistory(
|
let refSpec = refHelper.getRefSpecForAllHistory(
|
||||||
|
|||||||
@@ -29,6 +29,11 @@ export interface IGitSourceSettings {
|
|||||||
*/
|
*/
|
||||||
clean: boolean
|
clean: boolean
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The filter determining which objects to include
|
||||||
|
*/
|
||||||
|
filter: string | undefined
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The array of folders to make the sparse checkout
|
* The array of folders to make the sparse checkout
|
||||||
*/
|
*/
|
||||||
|
|||||||
+11
-2
@@ -6,7 +6,7 @@ import * as workflowContextHelper from './workflow-context-helper'
|
|||||||
import {IGitSourceSettings} from './git-source-settings'
|
import {IGitSourceSettings} from './git-source-settings'
|
||||||
|
|
||||||
export async function getInputs(): Promise<IGitSourceSettings> {
|
export async function getInputs(): Promise<IGitSourceSettings> {
|
||||||
const result = ({} as unknown) as IGitSourceSettings
|
const result = {} as unknown as IGitSourceSettings
|
||||||
|
|
||||||
// GitHub workspace
|
// GitHub workspace
|
||||||
let githubWorkspacePath = process.env['GITHUB_WORKSPACE']
|
let githubWorkspacePath = process.env['GITHUB_WORKSPACE']
|
||||||
@@ -82,6 +82,14 @@ export async function getInputs(): Promise<IGitSourceSettings> {
|
|||||||
result.clean = (core.getInput('clean') || 'true').toUpperCase() === 'TRUE'
|
result.clean = (core.getInput('clean') || 'true').toUpperCase() === 'TRUE'
|
||||||
core.debug(`clean = ${result.clean}`)
|
core.debug(`clean = ${result.clean}`)
|
||||||
|
|
||||||
|
// Filter
|
||||||
|
const filter = core.getInput('filter')
|
||||||
|
if (filter) {
|
||||||
|
result.filter = filter
|
||||||
|
}
|
||||||
|
|
||||||
|
core.debug(`filter = ${result.filter}`)
|
||||||
|
|
||||||
// Sparse checkout
|
// Sparse checkout
|
||||||
const sparseCheckout = core.getMultilineInput('sparse-checkout')
|
const sparseCheckout = core.getMultilineInput('sparse-checkout')
|
||||||
if (sparseCheckout.length) {
|
if (sparseCheckout.length) {
|
||||||
@@ -141,7 +149,8 @@ export async function getInputs(): Promise<IGitSourceSettings> {
|
|||||||
(core.getInput('persist-credentials') || 'false').toUpperCase() === 'TRUE'
|
(core.getInput('persist-credentials') || 'false').toUpperCase() === 'TRUE'
|
||||||
|
|
||||||
// Workflow organization ID
|
// Workflow organization ID
|
||||||
result.workflowOrganizationId = await workflowContextHelper.getOrganizationId()
|
result.workflowOrganizationId =
|
||||||
|
await workflowContextHelper.getOrganizationId()
|
||||||
|
|
||||||
// Set safe.directory in git global config.
|
// Set safe.directory in git global config.
|
||||||
result.setSafeDirectory =
|
result.setSafeDirectory =
|
||||||
|
|||||||
+1
-1
@@ -23,7 +23,7 @@ export async function getCheckoutInfo(
|
|||||||
throw new Error('Args ref and commit cannot both be empty')
|
throw new Error('Args ref and commit cannot both be empty')
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = ({} as unknown) as ICheckoutInfo
|
const result = {} as unknown as ICheckoutInfo
|
||||||
const upperRef = (ref || '').toUpperCase()
|
const upperRef = (ref || '').toUpperCase()
|
||||||
|
|
||||||
// SHA only
|
// SHA only
|
||||||
|
|||||||
@@ -23,8 +23,9 @@ export async function getOrganizationId(): Promise<number | undefined> {
|
|||||||
return id as number
|
return id as number
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
core.debug(
|
core.debug(
|
||||||
`Unable to load organization ID from GITHUB_EVENT_PATH: ${(err as any)
|
`Unable to load organization ID from GITHUB_EVENT_PATH: ${
|
||||||
.message || err}`
|
(err as any).message || err
|
||||||
|
}`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user