Compare commits
1 Commits
v3
...
fhammerl/r
Author | SHA1 | Date | |
---|---|---|---|
ed85399349 |
27
.github/workflows/test.yml
vendored
27
.github/workflows/test.yml
vendored
@ -72,33 +72,6 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: __test__/verify-side-by-side.sh
|
run: __test__/verify-side-by-side.sh
|
||||||
|
|
||||||
# Sparse checkout
|
|
||||||
- name: Sparse checkout
|
|
||||||
uses: ./
|
|
||||||
with:
|
|
||||||
sparse-checkout: |
|
|
||||||
__test__
|
|
||||||
.github
|
|
||||||
dist
|
|
||||||
path: sparse-checkout
|
|
||||||
|
|
||||||
- name: Verify sparse checkout
|
|
||||||
run: __test__/verify-sparse-checkout.sh
|
|
||||||
|
|
||||||
# Sparse checkout (non-cone mode)
|
|
||||||
- name: Sparse checkout (non-cone mode)
|
|
||||||
uses: ./
|
|
||||||
with:
|
|
||||||
sparse-checkout: |
|
|
||||||
/__test__/
|
|
||||||
/.github/
|
|
||||||
/dist/
|
|
||||||
sparse-checkout-cone-mode: false
|
|
||||||
path: sparse-checkout-non-cone-mode
|
|
||||||
|
|
||||||
- name: Verify sparse checkout (non-cone mode)
|
|
||||||
run: __test__/verify-sparse-checkout-non-cone-mode.sh
|
|
||||||
|
|
||||||
# LFS
|
# LFS
|
||||||
- name: Checkout LFS
|
- name: Checkout LFS
|
||||||
uses: ./
|
uses: ./
|
||||||
|
18
CHANGELOG.md
18
CHANGELOG.md
@ -1,23 +1,5 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## v3.6.0
|
|
||||||
- [Fix: Mark test scripts with Bash'isms to be run via Bash](https://github.com/actions/checkout/pull/1377)
|
|
||||||
- [Add option to fetch tags even if fetch-depth > 0](https://github.com/actions/checkout/pull/579)
|
|
||||||
|
|
||||||
## v3.5.3
|
|
||||||
- [Fix: Checkout fail in self-hosted runners when faulty submodule are checked-in](https://github.com/actions/checkout/pull/1196)
|
|
||||||
- [Fix typos found by codespell](https://github.com/actions/checkout/pull/1287)
|
|
||||||
- [Add support for sparse checkouts](https://github.com/actions/checkout/pull/1369)
|
|
||||||
|
|
||||||
## v3.5.2
|
|
||||||
- [Fix api endpoint for GHES](https://github.com/actions/checkout/pull/1289)
|
|
||||||
|
|
||||||
## v3.5.1
|
|
||||||
- [Fix slow checkout on Windows](https://github.com/actions/checkout/pull/1246)
|
|
||||||
|
|
||||||
## v3.5.0
|
|
||||||
* [Add new public key for known_hosts](https://github.com/actions/checkout/pull/1237)
|
|
||||||
|
|
||||||
## v3.4.0
|
## v3.4.0
|
||||||
- [Upgrade codeql actions to v2](https://github.com/actions/checkout/pull/1209)
|
- [Upgrade codeql actions to v2](https://github.com/actions/checkout/pull/1209)
|
||||||
- [Upgrade dependencies](https://github.com/actions/checkout/pull/1210)
|
- [Upgrade dependencies](https://github.com/actions/checkout/pull/1210)
|
||||||
|
44
README.md
44
README.md
@ -74,23 +74,10 @@ 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: ''
|
||||||
|
|
||||||
# Do a sparse checkout on given patterns. Each pattern should be separated with
|
|
||||||
# new lines
|
|
||||||
# Default: null
|
|
||||||
sparse-checkout: ''
|
|
||||||
|
|
||||||
# Specifies whether to use cone-mode when doing a sparse checkout.
|
|
||||||
# Default: true
|
|
||||||
sparse-checkout-cone-mode: ''
|
|
||||||
|
|
||||||
# Number of commits to fetch. 0 indicates all history for all branches and tags.
|
# Number of commits to fetch. 0 indicates all history for all branches and tags.
|
||||||
# Default: 1
|
# Default: 1
|
||||||
fetch-depth: ''
|
fetch-depth: ''
|
||||||
|
|
||||||
# Whether to fetch tags, even if fetch-depth > 0.
|
|
||||||
# Default: false
|
|
||||||
fetch-tags: ''
|
|
||||||
|
|
||||||
# Whether to download Git-LFS files
|
# Whether to download Git-LFS files
|
||||||
# Default: false
|
# Default: false
|
||||||
lfs: ''
|
lfs: ''
|
||||||
@ -119,9 +106,6 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl
|
|||||||
|
|
||||||
# Scenarios
|
# Scenarios
|
||||||
|
|
||||||
- [Fetch only the root files](#Fetch-only-the-root-files)
|
|
||||||
- [Fetch only the root files and `.github` and `src` folder](#Fetch-only-the-root-files-and-github-and-src-folder)
|
|
||||||
- [Fetch only a single file](#Fetch-only-a-single-file)
|
|
||||||
- [Fetch all history for all tags and branches](#Fetch-all-history-for-all-tags-and-branches)
|
- [Fetch all history for all tags and branches](#Fetch-all-history-for-all-tags-and-branches)
|
||||||
- [Checkout a different branch](#Checkout-a-different-branch)
|
- [Checkout a different branch](#Checkout-a-different-branch)
|
||||||
- [Checkout HEAD^](#Checkout-HEAD)
|
- [Checkout HEAD^](#Checkout-HEAD)
|
||||||
@ -132,34 +116,6 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl
|
|||||||
- [Checkout pull request on closed event](#Checkout-pull-request-on-closed-event)
|
- [Checkout pull request on closed event](#Checkout-pull-request-on-closed-event)
|
||||||
- [Push a commit using the built-in token](#Push-a-commit-using-the-built-in-token)
|
- [Push a commit using the built-in token](#Push-a-commit-using-the-built-in-token)
|
||||||
|
|
||||||
## Fetch only the root files
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
sparse-checkout: .
|
|
||||||
```
|
|
||||||
|
|
||||||
## Fetch only the root files and `.github` and `src` folder
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
sparse-checkout: |
|
|
||||||
.github
|
|
||||||
src
|
|
||||||
```
|
|
||||||
|
|
||||||
## Fetch only a single file
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
sparse-checkout: |
|
|
||||||
README.md
|
|
||||||
sparse-checkout-cone-mode: false
|
|
||||||
```
|
|
||||||
|
|
||||||
## Fetch all history for all tags and branches
|
## Fetch all history for all tags and branches
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
|
@ -727,8 +727,6 @@ async function setup(testName: string): Promise<void> {
|
|||||||
branchDelete: jest.fn(),
|
branchDelete: jest.fn(),
|
||||||
branchExists: jest.fn(),
|
branchExists: jest.fn(),
|
||||||
branchList: jest.fn(),
|
branchList: jest.fn(),
|
||||||
sparseCheckout: jest.fn(),
|
|
||||||
sparseCheckoutNonConeMode: jest.fn(),
|
|
||||||
checkout: jest.fn(),
|
checkout: jest.fn(),
|
||||||
checkoutDetach: jest.fn(),
|
checkoutDetach: jest.fn(),
|
||||||
config: jest.fn(
|
config: jest.fn(
|
||||||
@ -772,9 +770,6 @@ async function setup(testName: string): Promise<void> {
|
|||||||
return ''
|
return ''
|
||||||
}),
|
}),
|
||||||
submoduleSync: jest.fn(),
|
submoduleSync: jest.fn(),
|
||||||
submoduleStatus: jest.fn(async () => {
|
|
||||||
return true
|
|
||||||
}),
|
|
||||||
submoduleUpdate: jest.fn(),
|
submoduleUpdate: jest.fn(),
|
||||||
tagExists: jest.fn(),
|
tagExists: jest.fn(),
|
||||||
tryClean: jest.fn(),
|
tryClean: jest.fn(),
|
||||||
@ -802,10 +797,7 @@ async function setup(testName: string): Promise<void> {
|
|||||||
authToken: 'some auth token',
|
authToken: 'some auth token',
|
||||||
clean: true,
|
clean: true,
|
||||||
commit: '',
|
commit: '',
|
||||||
sparseCheckout: [],
|
|
||||||
sparseCheckoutConeMode: true,
|
|
||||||
fetchDepth: 1,
|
fetchDepth: 1,
|
||||||
fetchTags: false,
|
|
||||||
lfs: false,
|
lfs: false,
|
||||||
submodules: false,
|
submodules: false,
|
||||||
nestedSubmodules: false,
|
nestedSubmodules: false,
|
||||||
|
@ -39,12 +39,7 @@ describe('git-auth-helper tests', () => {
|
|||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
||||||
const workingDirectory = 'test'
|
const workingDirectory = 'test'
|
||||||
const lfs = false
|
const lfs = false
|
||||||
const doSparseCheckout = false
|
git = await commandManager.createCommandManager(workingDirectory, lfs)
|
||||||
git = await commandManager.createCommandManager(
|
|
||||||
workingDirectory,
|
|
||||||
lfs,
|
|
||||||
doSparseCheckout
|
|
||||||
)
|
|
||||||
|
|
||||||
let branches = await git.branchList(false)
|
let branches = await git.branchList(false)
|
||||||
|
|
||||||
@ -75,12 +70,7 @@ describe('git-auth-helper tests', () => {
|
|||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
||||||
const workingDirectory = 'test'
|
const workingDirectory = 'test'
|
||||||
const lfs = false
|
const lfs = false
|
||||||
const doSparseCheckout = false
|
git = await commandManager.createCommandManager(workingDirectory, lfs)
|
||||||
git = await commandManager.createCommandManager(
|
|
||||||
workingDirectory,
|
|
||||||
lfs,
|
|
||||||
doSparseCheckout
|
|
||||||
)
|
|
||||||
|
|
||||||
let branches = await git.branchList(false)
|
let branches = await git.branchList(false)
|
||||||
|
|
||||||
@ -88,179 +78,3 @@ describe('git-auth-helper tests', () => {
|
|||||||
expect(branches.sort()).toEqual(['foo'].sort())
|
expect(branches.sort()).toEqual(['foo'].sort())
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('Test fetchDepth and fetchTags options', () => {
|
|
||||||
beforeEach(async () => {
|
|
||||||
jest.spyOn(fshelper, 'fileExistsSync').mockImplementation(jest.fn())
|
|
||||||
jest.spyOn(fshelper, 'directoryExistsSync').mockImplementation(jest.fn())
|
|
||||||
mockExec.mockImplementation((path, args, options) => {
|
|
||||||
console.log(args, options.listeners.stdout)
|
|
||||||
|
|
||||||
if (args.includes('version')) {
|
|
||||||
options.listeners.stdout(Buffer.from('2.18'))
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
jest.restoreAllMocks()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should call execGit with the correct arguments when fetchDepth is 0 and fetchTags is true', async () => {
|
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
|
||||||
const workingDirectory = 'test'
|
|
||||||
const lfs = false
|
|
||||||
const doSparseCheckout = false
|
|
||||||
git = await commandManager.createCommandManager(
|
|
||||||
workingDirectory,
|
|
||||||
lfs,
|
|
||||||
doSparseCheckout
|
|
||||||
)
|
|
||||||
|
|
||||||
const refSpec = ['refspec1', 'refspec2']
|
|
||||||
const options = {
|
|
||||||
filter: 'filterValue',
|
|
||||||
fetchDepth: 0,
|
|
||||||
fetchTags: true
|
|
||||||
}
|
|
||||||
|
|
||||||
await git.fetch(refSpec, options)
|
|
||||||
|
|
||||||
expect(mockExec).toHaveBeenCalledWith(
|
|
||||||
expect.any(String),
|
|
||||||
[
|
|
||||||
'-c',
|
|
||||||
'protocol.version=2',
|
|
||||||
'fetch',
|
|
||||||
'--prune',
|
|
||||||
'--progress',
|
|
||||||
'--no-recurse-submodules',
|
|
||||||
'--filter=filterValue',
|
|
||||||
'origin',
|
|
||||||
'refspec1',
|
|
||||||
'refspec2'
|
|
||||||
],
|
|
||||||
expect.any(Object)
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should call execGit with the correct arguments when fetchDepth is 0 and fetchTags is false', async () => {
|
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
|
||||||
|
|
||||||
const workingDirectory = 'test'
|
|
||||||
const lfs = false
|
|
||||||
const doSparseCheckout = false
|
|
||||||
git = await commandManager.createCommandManager(
|
|
||||||
workingDirectory,
|
|
||||||
lfs,
|
|
||||||
doSparseCheckout
|
|
||||||
)
|
|
||||||
const refSpec = ['refspec1', 'refspec2']
|
|
||||||
const options = {
|
|
||||||
filter: 'filterValue',
|
|
||||||
fetchDepth: 0,
|
|
||||||
fetchTags: false
|
|
||||||
}
|
|
||||||
|
|
||||||
await git.fetch(refSpec, options)
|
|
||||||
|
|
||||||
expect(mockExec).toHaveBeenCalledWith(
|
|
||||||
expect.any(String),
|
|
||||||
[
|
|
||||||
'-c',
|
|
||||||
'protocol.version=2',
|
|
||||||
'fetch',
|
|
||||||
'--no-tags',
|
|
||||||
'--prune',
|
|
||||||
'--progress',
|
|
||||||
'--no-recurse-submodules',
|
|
||||||
'--filter=filterValue',
|
|
||||||
'origin',
|
|
||||||
'refspec1',
|
|
||||||
'refspec2'
|
|
||||||
],
|
|
||||||
expect.any(Object)
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should call execGit with the correct arguments when fetchDepth is 1 and fetchTags is false', async () => {
|
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
|
||||||
|
|
||||||
const workingDirectory = 'test'
|
|
||||||
const lfs = false
|
|
||||||
const doSparseCheckout = false
|
|
||||||
git = await commandManager.createCommandManager(
|
|
||||||
workingDirectory,
|
|
||||||
lfs,
|
|
||||||
doSparseCheckout
|
|
||||||
)
|
|
||||||
const refSpec = ['refspec1', 'refspec2']
|
|
||||||
const options = {
|
|
||||||
filter: 'filterValue',
|
|
||||||
fetchDepth: 1,
|
|
||||||
fetchTags: false
|
|
||||||
}
|
|
||||||
|
|
||||||
await git.fetch(refSpec, options)
|
|
||||||
|
|
||||||
expect(mockExec).toHaveBeenCalledWith(
|
|
||||||
expect.any(String),
|
|
||||||
[
|
|
||||||
'-c',
|
|
||||||
'protocol.version=2',
|
|
||||||
'fetch',
|
|
||||||
'--no-tags',
|
|
||||||
'--prune',
|
|
||||||
'--progress',
|
|
||||||
'--no-recurse-submodules',
|
|
||||||
'--filter=filterValue',
|
|
||||||
'--depth=1',
|
|
||||||
'origin',
|
|
||||||
'refspec1',
|
|
||||||
'refspec2'
|
|
||||||
],
|
|
||||||
expect.any(Object)
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should call execGit with the correct arguments when fetchDepth is 1 and fetchTags is true', async () => {
|
|
||||||
jest.spyOn(exec, 'exec').mockImplementation(mockExec)
|
|
||||||
|
|
||||||
const workingDirectory = 'test'
|
|
||||||
const lfs = false
|
|
||||||
const doSparseCheckout = false
|
|
||||||
git = await commandManager.createCommandManager(
|
|
||||||
workingDirectory,
|
|
||||||
lfs,
|
|
||||||
doSparseCheckout
|
|
||||||
)
|
|
||||||
const refSpec = ['refspec1', 'refspec2']
|
|
||||||
const options = {
|
|
||||||
filter: 'filterValue',
|
|
||||||
fetchDepth: 1,
|
|
||||||
fetchTags: true
|
|
||||||
}
|
|
||||||
|
|
||||||
await git.fetch(refSpec, options)
|
|
||||||
|
|
||||||
expect(mockExec).toHaveBeenCalledWith(
|
|
||||||
expect.any(String),
|
|
||||||
[
|
|
||||||
'-c',
|
|
||||||
'protocol.version=2',
|
|
||||||
'fetch',
|
|
||||||
'--prune',
|
|
||||||
'--progress',
|
|
||||||
'--no-recurse-submodules',
|
|
||||||
'--filter=filterValue',
|
|
||||||
'--depth=1',
|
|
||||||
'origin',
|
|
||||||
'refspec1',
|
|
||||||
'refspec2'
|
|
||||||
],
|
|
||||||
expect.any(Object)
|
|
||||||
)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
@ -281,65 +281,6 @@ describe('git-directory-helper tests', () => {
|
|||||||
expect(git.branchDelete).toHaveBeenCalledWith(false, 'local-branch-2')
|
expect(git.branchDelete).toHaveBeenCalledWith(false, 'local-branch-2')
|
||||||
})
|
})
|
||||||
|
|
||||||
const cleanWhenSubmoduleStatusIsFalse =
|
|
||||||
'cleans when submodule status is false'
|
|
||||||
|
|
||||||
it(cleanWhenSubmoduleStatusIsFalse, async () => {
|
|
||||||
// Arrange
|
|
||||||
await setup(cleanWhenSubmoduleStatusIsFalse)
|
|
||||||
await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
|
|
||||||
|
|
||||||
//mock bad submodule
|
|
||||||
|
|
||||||
const submoduleStatus = git.submoduleStatus as jest.Mock<any, any>
|
|
||||||
submoduleStatus.mockImplementation(async (remote: boolean) => {
|
|
||||||
return false
|
|
||||||
})
|
|
||||||
|
|
||||||
// Act
|
|
||||||
await gitDirectoryHelper.prepareExistingDirectory(
|
|
||||||
git,
|
|
||||||
repositoryPath,
|
|
||||||
repositoryUrl,
|
|
||||||
clean,
|
|
||||||
ref
|
|
||||||
)
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
const files = await fs.promises.readdir(repositoryPath)
|
|
||||||
expect(files).toHaveLength(0)
|
|
||||||
expect(git.tryClean).toHaveBeenCalled()
|
|
||||||
})
|
|
||||||
|
|
||||||
const doesNotCleanWhenSubmoduleStatusIsTrue =
|
|
||||||
'does not clean when submodule status is true'
|
|
||||||
|
|
||||||
it(doesNotCleanWhenSubmoduleStatusIsTrue, async () => {
|
|
||||||
// Arrange
|
|
||||||
await setup(doesNotCleanWhenSubmoduleStatusIsTrue)
|
|
||||||
await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
|
|
||||||
|
|
||||||
const submoduleStatus = git.submoduleStatus as jest.Mock<any, any>
|
|
||||||
submoduleStatus.mockImplementation(async (remote: boolean) => {
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
|
|
||||||
// Act
|
|
||||||
await gitDirectoryHelper.prepareExistingDirectory(
|
|
||||||
git,
|
|
||||||
repositoryPath,
|
|
||||||
repositoryUrl,
|
|
||||||
clean,
|
|
||||||
ref
|
|
||||||
)
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
|
|
||||||
const files = await fs.promises.readdir(repositoryPath)
|
|
||||||
expect(files.sort()).toEqual(['.git', 'my-file'])
|
|
||||||
expect(git.tryClean).toHaveBeenCalled()
|
|
||||||
})
|
|
||||||
|
|
||||||
const removesLockFiles = 'removes lock files'
|
const removesLockFiles = 'removes lock files'
|
||||||
it(removesLockFiles, async () => {
|
it(removesLockFiles, async () => {
|
||||||
// Arrange
|
// Arrange
|
||||||
@ -462,8 +403,6 @@ async function setup(testName: string): Promise<void> {
|
|||||||
branchList: jest.fn(async () => {
|
branchList: jest.fn(async () => {
|
||||||
return []
|
return []
|
||||||
}),
|
}),
|
||||||
sparseCheckout: jest.fn(),
|
|
||||||
sparseCheckoutNonConeMode: jest.fn(),
|
|
||||||
checkout: jest.fn(),
|
checkout: jest.fn(),
|
||||||
checkoutDetach: jest.fn(),
|
checkoutDetach: jest.fn(),
|
||||||
config: jest.fn(),
|
config: jest.fn(),
|
||||||
@ -484,9 +423,6 @@ async function setup(testName: string): Promise<void> {
|
|||||||
submoduleForeach: jest.fn(),
|
submoduleForeach: jest.fn(),
|
||||||
submoduleSync: jest.fn(),
|
submoduleSync: jest.fn(),
|
||||||
submoduleUpdate: jest.fn(),
|
submoduleUpdate: jest.fn(),
|
||||||
submoduleStatus: jest.fn(async () => {
|
|
||||||
return true
|
|
||||||
}),
|
|
||||||
tagExists: jest.fn(),
|
tagExists: jest.fn(),
|
||||||
tryClean: jest.fn(async () => {
|
tryClean: jest.fn(async () => {
|
||||||
return true
|
return true
|
||||||
|
@ -79,10 +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.sparseCheckout).toBe(undefined)
|
|
||||||
expect(settings.sparseCheckoutConeMode).toBe(true)
|
|
||||||
expect(settings.fetchDepth).toBe(1)
|
expect(settings.fetchDepth).toBe(1)
|
||||||
expect(settings.fetchTags).toBe(false)
|
|
||||||
expect(settings.lfs).toBe(false)
|
expect(settings.lfs).toBe(false)
|
||||||
expect(settings.ref).toBe('refs/heads/some-ref')
|
expect(settings.ref).toBe('refs/heads/some-ref')
|
||||||
expect(settings.repositoryName).toBe('some-repo')
|
expect(settings.repositoryName).toBe('some-repo')
|
||||||
|
@ -1,51 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Verify .git folder
|
|
||||||
if [ ! -d "./sparse-checkout-non-cone-mode/.git" ]; then
|
|
||||||
echo "Expected ./sparse-checkout-non-cone-mode/.git folder to exist"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Verify sparse-checkout (non-cone-mode)
|
|
||||||
cd sparse-checkout-non-cone-mode
|
|
||||||
|
|
||||||
ENABLED=$(git config --local --get-all core.sparseCheckout)
|
|
||||||
|
|
||||||
if [ "$?" != "0" ]; then
|
|
||||||
echo "Failed to verify that sparse-checkout is enabled"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check that sparse-checkout is enabled
|
|
||||||
if [ "$ENABLED" != "true" ]; then
|
|
||||||
echo "Expected sparse-checkout to be enabled (is: $ENABLED)"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
SPARSE_CHECKOUT_FILE=$(git rev-parse --git-path info/sparse-checkout)
|
|
||||||
|
|
||||||
if [ "$?" != "0" ]; then
|
|
||||||
echo "Failed to validate sparse-checkout"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check that sparse-checkout list is not empty
|
|
||||||
if [ ! -f "$SPARSE_CHECKOUT_FILE" ]; then
|
|
||||||
echo "Expected sparse-checkout file to exist"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check that all folders from sparse-checkout exists
|
|
||||||
for pattern in $(cat "$SPARSE_CHECKOUT_FILE")
|
|
||||||
do
|
|
||||||
if [ ! -d "${pattern#/}" ]; then
|
|
||||||
echo "Expected directory '${pattern#/}' to exist"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Verify that the root directory is not checked out
|
|
||||||
if [ -f README.md ]; then
|
|
||||||
echo "Expected top-level files not to exist"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
@ -1,63 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Verify .git folder
|
|
||||||
if [ ! -d "./sparse-checkout/.git" ]; then
|
|
||||||
echo "Expected ./sparse-checkout/.git folder to exist"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Verify sparse-checkout
|
|
||||||
cd sparse-checkout
|
|
||||||
|
|
||||||
SPARSE=$(git sparse-checkout list)
|
|
||||||
|
|
||||||
if [ "$?" != "0" ]; then
|
|
||||||
echo "Failed to validate sparse-checkout"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check that sparse-checkout list is not empty
|
|
||||||
if [ -z "$SPARSE" ]; then
|
|
||||||
echo "Expected sparse-checkout list to not be empty"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check that all folders of the sparse checkout exist
|
|
||||||
for pattern in $SPARSE
|
|
||||||
do
|
|
||||||
if [ ! -d "$pattern" ]; then
|
|
||||||
echo "Expected directory '$pattern' to exist"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
checkSparse () {
|
|
||||||
if [ ! -d "./$1" ]; then
|
|
||||||
echo "Expected directory '$1' to exist"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
for file in $(git ls-tree -r --name-only HEAD $1)
|
|
||||||
do
|
|
||||||
if [ ! -f "$file" ]; then
|
|
||||||
echo "Expected file '$file' to exist"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check that all folders and their children have been checked out
|
|
||||||
checkSparse __test__
|
|
||||||
checkSparse .github
|
|
||||||
checkSparse dist
|
|
||||||
|
|
||||||
# Check that only sparse-checkout folders have been checked out
|
|
||||||
for pattern in $(git ls-tree --name-only HEAD)
|
|
||||||
do
|
|
||||||
if [ -d "$pattern" ]; then
|
|
||||||
if [[ "$pattern" != "__test__" && "$pattern" != ".github" && "$pattern" != "dist" ]]; then
|
|
||||||
echo "Expected directory '$pattern' to not exist"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
12
action.yml
12
action.yml
@ -53,21 +53,9 @@ 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
|
||||||
sparse-checkout:
|
|
||||||
description: >
|
|
||||||
Do a sparse checkout on given patterns.
|
|
||||||
Each pattern should be separated with new lines
|
|
||||||
default: null
|
|
||||||
sparse-checkout-cone-mode:
|
|
||||||
description: >
|
|
||||||
Specifies whether to use cone-mode when doing a sparse checkout.
|
|
||||||
default: true
|
|
||||||
fetch-depth:
|
fetch-depth:
|
||||||
description: 'Number of commits to fetch. 0 indicates all history for all branches and tags.'
|
description: 'Number of commits to fetch. 0 indicates all history for all branches and tags.'
|
||||||
default: 1
|
default: 1
|
||||||
fetch-tags:
|
|
||||||
description: 'Whether to fetch tags, even if fetch-depth > 0.'
|
|
||||||
default: false
|
|
||||||
lfs:
|
lfs:
|
||||||
description: 'Whether to download Git-LFS files'
|
description: 'Whether to download Git-LFS files'
|
||||||
default: false
|
default: false
|
||||||
|
@ -181,7 +181,7 @@ GITHUB_WORKSPACE=/home/runner/work/foo/foo
|
|||||||
RUNNER_WORKSPACE=/home/runner/work/foo
|
RUNNER_WORKSPACE=/home/runner/work/foo
|
||||||
```
|
```
|
||||||
|
|
||||||
V2 introduces a new constraint on the checkout path. The location must now be under `github.workspace`. Whereas the checkout@v1 constraint was one level up, under `runner.workspace`.
|
V2 introduces a new contraint on the checkout path. The location must now be under `github.workspace`. Whereas the checkout@v1 constraint was one level up, under `runner.workspace`.
|
||||||
|
|
||||||
V2 no longer changes `github.workspace` to follow wherever the self repo is checked-out.
|
V2 no longer changes `github.workspace` to follow wherever the self repo is checked-out.
|
||||||
|
|
||||||
@ -287,4 +287,4 @@ Note:
|
|||||||
- Update samples to consume `actions/checkout@v2`
|
- Update samples to consume `actions/checkout@v2`
|
||||||
- Job containers now require git in the PATH for checkout, otherwise fallback to REST API
|
- Job containers now require git in the PATH for checkout, otherwise fallback to REST API
|
||||||
- Minimum git version 2.18
|
- Minimum git version 2.18
|
||||||
- Update problem matcher logic regarding source file verification (runner)
|
- Update problem matcher logic regarding source file verification (runner)
|
119
dist/index.js
vendored
119
dist/index.js
vendored
@ -470,7 +470,6 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|||||||
exports.createCommandManager = exports.MinimumGitVersion = void 0;
|
exports.createCommandManager = exports.MinimumGitVersion = void 0;
|
||||||
const core = __importStar(__nccwpck_require__(2186));
|
const core = __importStar(__nccwpck_require__(2186));
|
||||||
const exec = __importStar(__nccwpck_require__(1514));
|
const exec = __importStar(__nccwpck_require__(1514));
|
||||||
const fs = __importStar(__nccwpck_require__(7147));
|
|
||||||
const fshelper = __importStar(__nccwpck_require__(7219));
|
const fshelper = __importStar(__nccwpck_require__(7219));
|
||||||
const io = __importStar(__nccwpck_require__(7436));
|
const io = __importStar(__nccwpck_require__(7436));
|
||||||
const path = __importStar(__nccwpck_require__(1017));
|
const path = __importStar(__nccwpck_require__(1017));
|
||||||
@ -481,9 +480,9 @@ const git_version_1 = __nccwpck_require__(3142);
|
|||||||
// 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
|
||||||
exports.MinimumGitVersion = new git_version_1.GitVersion('2.18');
|
exports.MinimumGitVersion = new git_version_1.GitVersion('2.18');
|
||||||
function createCommandManager(workingDirectory, lfs, doSparseCheckout) {
|
function createCommandManager(workingDirectory, lfs) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
return yield GitCommandManager.createCommandManager(workingDirectory, lfs, doSparseCheckout);
|
return yield GitCommandManager.createCommandManager(workingDirectory, lfs);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.createCommandManager = createCommandManager;
|
exports.createCommandManager = createCommandManager;
|
||||||
@ -496,7 +495,6 @@ class GitCommandManager {
|
|||||||
};
|
};
|
||||||
this.gitPath = '';
|
this.gitPath = '';
|
||||||
this.lfs = false;
|
this.lfs = false;
|
||||||
this.doSparseCheckout = false;
|
|
||||||
this.workingDirectory = '';
|
this.workingDirectory = '';
|
||||||
}
|
}
|
||||||
branchDelete(remote, branch) {
|
branchDelete(remote, branch) {
|
||||||
@ -576,23 +574,6 @@ class GitCommandManager {
|
|||||||
return result;
|
return result;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
sparseCheckout(sparseCheckout) {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
yield this.execGit(['sparse-checkout', 'set', ...sparseCheckout]);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
sparseCheckoutNonConeMode(sparseCheckout) {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
yield this.execGit(['config', 'core.sparseCheckout', 'true']);
|
|
||||||
const output = yield this.execGit([
|
|
||||||
'rev-parse',
|
|
||||||
'--git-path',
|
|
||||||
'info/sparse-checkout'
|
|
||||||
]);
|
|
||||||
const sparseCheckoutPath = path.join(this.workingDirectory, output.stdout.trimRight());
|
|
||||||
yield fs.promises.appendFile(sparseCheckoutPath, `\n${sparseCheckout.join('\n')}\n`);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
checkout(ref, startPoint) {
|
checkout(ref, startPoint) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
const args = ['checkout', '--progress', '--force'];
|
const args = ['checkout', '--progress', '--force'];
|
||||||
@ -634,18 +615,15 @@ class GitCommandManager {
|
|||||||
return output.exitCode === 0;
|
return output.exitCode === 0;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
fetch(refSpec, options) {
|
fetch(refSpec, fetchDepth) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
const args = ['-c', 'protocol.version=2', 'fetch'];
|
const args = ['-c', 'protocol.version=2', 'fetch'];
|
||||||
if (!refSpec.some(x => x === refHelper.tagsRefSpec) && !options.fetchTags) {
|
if (!refSpec.some(x => x === refHelper.tagsRefSpec)) {
|
||||||
args.push('--no-tags');
|
args.push('--no-tags');
|
||||||
}
|
}
|
||||||
args.push('--prune', '--progress', '--no-recurse-submodules');
|
args.push('--prune', '--progress', '--no-recurse-submodules');
|
||||||
if (options.filter) {
|
if (fetchDepth && fetchDepth > 0) {
|
||||||
args.push(`--filter=${options.filter}`);
|
args.push(`--depth=${fetchDepth}`);
|
||||||
}
|
|
||||||
if (options.fetchDepth && options.fetchDepth > 0) {
|
|
||||||
args.push(`--depth=${options.fetchDepth}`);
|
|
||||||
}
|
}
|
||||||
else if (fshelper.fileExistsSync(path.join(this.workingDirectory, '.git', 'shallow'))) {
|
else if (fshelper.fileExistsSync(path.join(this.workingDirectory, '.git', 'shallow'))) {
|
||||||
args.push('--unshallow');
|
args.push('--unshallow');
|
||||||
@ -718,8 +696,8 @@ class GitCommandManager {
|
|||||||
}
|
}
|
||||||
log1(format) {
|
log1(format) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
const args = format ? ['log', '-1', format] : ['log', '-1'];
|
var args = format ? ['log', '-1', format] : ['log', '-1'];
|
||||||
const silent = format ? false : true;
|
var silent = format ? false : true;
|
||||||
const output = yield this.execGit(args, false, silent);
|
const output = yield this.execGit(args, false, silent);
|
||||||
return output.stdout;
|
return output.stdout;
|
||||||
});
|
});
|
||||||
@ -787,13 +765,6 @@ class GitCommandManager {
|
|||||||
yield this.execGit(args);
|
yield this.execGit(args);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
submoduleStatus() {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
const output = yield this.execGit(['submodule', 'status'], true);
|
|
||||||
core.debug(output.stdout);
|
|
||||||
return output.exitCode === 0;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
tagExists(pattern) {
|
tagExists(pattern) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
const output = yield this.execGit(['tag', '--list', pattern]);
|
const output = yield this.execGit(['tag', '--list', pattern]);
|
||||||
@ -842,10 +813,10 @@ class GitCommandManager {
|
|||||||
return output.exitCode === 0;
|
return output.exitCode === 0;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
static createCommandManager(workingDirectory, lfs, doSparseCheckout) {
|
static createCommandManager(workingDirectory, lfs) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
const result = new GitCommandManager();
|
const result = new GitCommandManager();
|
||||||
yield result.initializeCommandManager(workingDirectory, lfs, doSparseCheckout);
|
yield result.initializeCommandManager(workingDirectory, lfs);
|
||||||
return result;
|
return result;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -881,7 +852,7 @@ class GitCommandManager {
|
|||||||
return result;
|
return result;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
initializeCommandManager(workingDirectory, lfs, doSparseCheckout) {
|
initializeCommandManager(workingDirectory, lfs) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
this.workingDirectory = workingDirectory;
|
this.workingDirectory = workingDirectory;
|
||||||
// Git-lfs will try to pull down assets if any of the local/user/system setting exist.
|
// Git-lfs will try to pull down assets if any of the local/user/system setting exist.
|
||||||
@ -933,14 +904,6 @@ class GitCommandManager {
|
|||||||
throw new Error(`Minimum required git-lfs version is ${minimumGitLfsVersion}. Your git-lfs ('${gitLfsPath}') is ${gitLfsVersion}`);
|
throw new Error(`Minimum required git-lfs version is ${minimumGitLfsVersion}. Your git-lfs ('${gitLfsPath}') is ${gitLfsVersion}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.doSparseCheckout = doSparseCheckout;
|
|
||||||
if (this.doSparseCheckout) {
|
|
||||||
// The `git sparse-checkout` command was introduced in Git v2.25.0
|
|
||||||
const minimumGitSparseCheckoutVersion = new git_version_1.GitVersion('2.25');
|
|
||||||
if (!gitVersion.checkMinimum(minimumGitSparseCheckoutVersion)) {
|
|
||||||
throw new Error(`Minimum Git version required for sparse checkout is ${minimumGitSparseCheckoutVersion}. Your git ('${this.gitPath}') is ${gitVersion}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Set the user agent
|
// Set the user agent
|
||||||
const gitHttpUserAgent = `git/${gitVersion} (github-actions-checkout)`;
|
const gitHttpUserAgent = `git/${gitVersion} (github-actions-checkout)`;
|
||||||
core.debug(`Set git useragent to: ${gitHttpUserAgent}`);
|
core.debug(`Set git useragent to: ${gitHttpUserAgent}`);
|
||||||
@ -1060,16 +1023,11 @@ function prepareExistingDirectory(git, repositoryPath, repositoryUrl, clean, ref
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
core.endGroup();
|
core.endGroup();
|
||||||
// Check for submodules and delete any existing files if submodules are present
|
|
||||||
if (!(yield git.submoduleStatus())) {
|
|
||||||
remove = true;
|
|
||||||
core.info('Bad Submodules found, removing existing files');
|
|
||||||
}
|
|
||||||
// Clean
|
// Clean
|
||||||
if (clean) {
|
if (clean) {
|
||||||
core.startGroup('Cleaning the repository');
|
core.startGroup('Cleaning the repository');
|
||||||
if (!(yield git.tryClean())) {
|
if (!(yield git.tryClean())) {
|
||||||
core.debug(`The clean command failed. This might be caused by: 1) path too long, 2) permission issue, or 3) file in use. For further investigation, manually run 'git clean -ffdx' on the directory '${repositoryPath}'.`);
|
core.debug(`The clean command failed. This might be caused by: 1) path too long, 2) permission issue, or 3) file in use. For futher investigation, manually run 'git clean -ffdx' on the directory '${repositoryPath}'.`);
|
||||||
remove = true;
|
remove = true;
|
||||||
}
|
}
|
||||||
else if (!(yield git.tryReset())) {
|
else if (!(yield git.tryReset())) {
|
||||||
@ -1240,25 +1198,20 @@ function getSource(settings) {
|
|||||||
}
|
}
|
||||||
// Fetch
|
// Fetch
|
||||||
core.startGroup('Fetching the repository');
|
core.startGroup('Fetching the repository');
|
||||||
const fetchOptions = {};
|
|
||||||
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(settings.ref, settings.commit);
|
let refSpec = refHelper.getRefSpecForAllHistory(settings.ref, settings.commit);
|
||||||
yield git.fetch(refSpec, fetchOptions);
|
yield git.fetch(refSpec);
|
||||||
// When all history is fetched, the ref we're interested in may have moved to a different
|
// When all history is fetched, the ref we're interested in may have moved to a different
|
||||||
// commit (push or force push). If so, fetch again with a targeted refspec.
|
// commit (push or force push). If so, fetch again with a targeted refspec.
|
||||||
if (!(yield refHelper.testRef(git, settings.ref, settings.commit))) {
|
if (!(yield refHelper.testRef(git, settings.ref, settings.commit))) {
|
||||||
refSpec = refHelper.getRefSpec(settings.ref, settings.commit);
|
refSpec = refHelper.getRefSpec(settings.ref, settings.commit);
|
||||||
yield git.fetch(refSpec, fetchOptions);
|
yield git.fetch(refSpec);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fetchOptions.fetchDepth = settings.fetchDepth;
|
|
||||||
fetchOptions.fetchTags = settings.fetchTags;
|
|
||||||
const refSpec = refHelper.getRefSpec(settings.ref, settings.commit);
|
const refSpec = refHelper.getRefSpec(settings.ref, settings.commit);
|
||||||
yield git.fetch(refSpec, fetchOptions);
|
yield git.fetch(refSpec, settings.fetchDepth);
|
||||||
}
|
}
|
||||||
core.endGroup();
|
core.endGroup();
|
||||||
// Checkout info
|
// Checkout info
|
||||||
@ -1268,23 +1221,11 @@ function getSource(settings) {
|
|||||||
// LFS fetch
|
// LFS fetch
|
||||||
// Explicit lfs-fetch to avoid slow checkout (fetches one lfs object at a time).
|
// Explicit lfs-fetch to avoid slow checkout (fetches one lfs object at a time).
|
||||||
// Explicit lfs fetch will fetch lfs objects in parallel.
|
// Explicit lfs fetch will fetch lfs objects in parallel.
|
||||||
// For sparse checkouts, let `checkout` fetch the needed objects lazily.
|
if (settings.lfs) {
|
||||||
if (settings.lfs && !settings.sparseCheckout) {
|
|
||||||
core.startGroup('Fetching LFS objects');
|
core.startGroup('Fetching LFS objects');
|
||||||
yield git.lfsFetch(checkoutInfo.startPoint || checkoutInfo.ref);
|
yield git.lfsFetch(checkoutInfo.startPoint || checkoutInfo.ref);
|
||||||
core.endGroup();
|
core.endGroup();
|
||||||
}
|
}
|
||||||
// Sparse checkout
|
|
||||||
if (settings.sparseCheckout) {
|
|
||||||
core.startGroup('Setting up sparse checkout');
|
|
||||||
if (settings.sparseCheckoutConeMode) {
|
|
||||||
yield git.sparseCheckout(settings.sparseCheckout);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
yield git.sparseCheckoutNonConeMode(settings.sparseCheckout);
|
|
||||||
}
|
|
||||||
core.endGroup();
|
|
||||||
}
|
|
||||||
// Checkout
|
// Checkout
|
||||||
core.startGroup('Checking out the ref');
|
core.startGroup('Checking out the ref');
|
||||||
yield git.checkout(checkoutInfo.ref, checkoutInfo.startPoint);
|
yield git.checkout(checkoutInfo.ref, checkoutInfo.startPoint);
|
||||||
@ -1338,7 +1279,7 @@ function cleanup(repositoryPath) {
|
|||||||
}
|
}
|
||||||
let git;
|
let git;
|
||||||
try {
|
try {
|
||||||
git = yield gitCommandManager.createCommandManager(repositoryPath, false, false);
|
git = yield gitCommandManager.createCommandManager(repositoryPath, false);
|
||||||
}
|
}
|
||||||
catch (_a) {
|
catch (_a) {
|
||||||
return;
|
return;
|
||||||
@ -1369,7 +1310,7 @@ function getGitCommandManager(settings) {
|
|||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
core.info(`Working directory is '${settings.repositoryPath}'`);
|
core.info(`Working directory is '${settings.repositoryPath}'`);
|
||||||
try {
|
try {
|
||||||
return yield gitCommandManager.createCommandManager(settings.repositoryPath, settings.lfs, settings.sparseCheckout != null);
|
return yield gitCommandManager.createCommandManager(settings.repositoryPath, settings.lfs);
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
// Git is required for LFS
|
// Git is required for LFS
|
||||||
@ -1512,7 +1453,6 @@ const path = __importStar(__nccwpck_require__(1017));
|
|||||||
const retryHelper = __importStar(__nccwpck_require__(2155));
|
const retryHelper = __importStar(__nccwpck_require__(2155));
|
||||||
const toolCache = __importStar(__nccwpck_require__(7784));
|
const toolCache = __importStar(__nccwpck_require__(7784));
|
||||||
const v4_1 = __importDefault(__nccwpck_require__(824));
|
const v4_1 = __importDefault(__nccwpck_require__(824));
|
||||||
const url_helper_1 = __nccwpck_require__(9437);
|
|
||||||
const IS_WINDOWS = process.platform === 'win32';
|
const IS_WINDOWS = process.platform === 'win32';
|
||||||
function downloadRepository(authToken, owner, repo, ref, commit, repositoryPath, baseUrl) {
|
function downloadRepository(authToken, owner, repo, ref, commit, repositoryPath, baseUrl) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
@ -1573,9 +1513,7 @@ function getDefaultBranch(authToken, owner, repo, baseUrl) {
|
|||||||
return yield retryHelper.execute(() => __awaiter(this, void 0, void 0, function* () {
|
return yield retryHelper.execute(() => __awaiter(this, void 0, void 0, function* () {
|
||||||
var _a;
|
var _a;
|
||||||
core.info('Retrieving the default branch name');
|
core.info('Retrieving the default branch name');
|
||||||
const octokit = github.getOctokit(authToken, {
|
const octokit = github.getOctokit(authToken, { baseUrl: baseUrl });
|
||||||
baseUrl: (0, url_helper_1.getServerApiUrl)(baseUrl)
|
|
||||||
});
|
|
||||||
let result;
|
let result;
|
||||||
try {
|
try {
|
||||||
// Get the default branch from the repo info
|
// Get the default branch from the repo info
|
||||||
@ -1607,9 +1545,7 @@ function getDefaultBranch(authToken, owner, repo, baseUrl) {
|
|||||||
exports.getDefaultBranch = getDefaultBranch;
|
exports.getDefaultBranch = getDefaultBranch;
|
||||||
function downloadArchive(authToken, owner, repo, ref, commit, baseUrl) {
|
function downloadArchive(authToken, owner, repo, ref, commit, baseUrl) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
const octokit = github.getOctokit(authToken, {
|
const octokit = github.getOctokit(authToken, { baseUrl: baseUrl });
|
||||||
baseUrl: (0, url_helper_1.getServerApiUrl)(baseUrl)
|
|
||||||
});
|
|
||||||
const download = IS_WINDOWS
|
const download = IS_WINDOWS
|
||||||
? octokit.rest.repos.downloadZipballArchive
|
? octokit.rest.repos.downloadZipballArchive
|
||||||
: octokit.rest.repos.downloadTarballArchive;
|
: octokit.rest.repos.downloadTarballArchive;
|
||||||
@ -1720,25 +1656,12 @@ function getInputs() {
|
|||||||
// Clean
|
// Clean
|
||||||
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}`);
|
||||||
// Sparse checkout
|
|
||||||
const sparseCheckout = core.getMultilineInput('sparse-checkout');
|
|
||||||
if (sparseCheckout.length) {
|
|
||||||
result.sparseCheckout = sparseCheckout;
|
|
||||||
core.debug(`sparse checkout = ${result.sparseCheckout}`);
|
|
||||||
}
|
|
||||||
result.sparseCheckoutConeMode =
|
|
||||||
(core.getInput('sparse-checkout-cone-mode') || 'true').toUpperCase() ===
|
|
||||||
'TRUE';
|
|
||||||
// Fetch depth
|
// Fetch depth
|
||||||
result.fetchDepth = Math.floor(Number(core.getInput('fetch-depth') || '1'));
|
result.fetchDepth = Math.floor(Number(core.getInput('fetch-depth') || '1'));
|
||||||
if (isNaN(result.fetchDepth) || result.fetchDepth < 0) {
|
if (isNaN(result.fetchDepth) || result.fetchDepth < 0) {
|
||||||
result.fetchDepth = 0;
|
result.fetchDepth = 0;
|
||||||
}
|
}
|
||||||
core.debug(`fetch depth = ${result.fetchDepth}`);
|
core.debug(`fetch depth = ${result.fetchDepth}`);
|
||||||
// Fetch tags
|
|
||||||
result.fetchTags =
|
|
||||||
(core.getInput('fetch-tags') || 'false').toUpperCase() === 'TRUE';
|
|
||||||
core.debug(`fetch tags = ${result.fetchTags}`);
|
|
||||||
// LFS
|
// LFS
|
||||||
result.lfs = (core.getInput('lfs') || 'false').toUpperCase() === 'TRUE';
|
result.lfs = (core.getInput('lfs') || 'false').toUpperCase() === 'TRUE';
|
||||||
core.debug(`lfs = ${result.lfs}`);
|
core.debug(`lfs = ${result.lfs}`);
|
||||||
@ -2103,7 +2026,7 @@ function checkCommitInfo(token, commitInfo, repositoryOwner, repositoryName, ref
|
|||||||
if (actualHeadSha !== expectedHeadSha) {
|
if (actualHeadSha !== expectedHeadSha) {
|
||||||
core.debug(`Expected head sha ${expectedHeadSha}; actual head sha ${actualHeadSha}`);
|
core.debug(`Expected head sha ${expectedHeadSha}; actual head sha ${actualHeadSha}`);
|
||||||
const octokit = github.getOctokit(token, {
|
const octokit = github.getOctokit(token, {
|
||||||
baseUrl: (0, url_helper_1.getServerApiUrl)(baseUrl),
|
baseUrl: baseUrl,
|
||||||
userAgent: `actions-checkout-tracepoint/1.0 (code=STALE_MERGE;owner=${repositoryOwner};repo=${repositoryName};pr=${fromPayload('number')};run_id=${process.env['GITHUB_RUN_ID']};expected_head_sha=${expectedHeadSha};actual_head_sha=${actualHeadSha})`
|
userAgent: `actions-checkout-tracepoint/1.0 (code=STALE_MERGE;owner=${repositoryOwner};repo=${repositoryName};pr=${fromPayload('number')};run_id=${process.env['GITHUB_RUN_ID']};expected_head_sha=${expectedHeadSha};actual_head_sha=${actualHeadSha})`
|
||||||
});
|
});
|
||||||
yield octokit.rest.repos.get({
|
yield octokit.rest.repos.get({
|
||||||
|
@ -52,4 +52,4 @@
|
|||||||
"ts-jest": "^27.0.7",
|
"ts-jest": "^27.0.7",
|
||||||
"typescript": "^4.4.4"
|
"typescript": "^4.4.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
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 fshelper from './fs-helper'
|
import * as fshelper from './fs-helper'
|
||||||
import * as io from '@actions/io'
|
import * as io from '@actions/io'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
@ -17,8 +16,6 @@ export interface IGitCommandManager {
|
|||||||
branchDelete(remote: boolean, branch: string): Promise<void>
|
branchDelete(remote: boolean, branch: string): Promise<void>
|
||||||
branchExists(remote: boolean, pattern: string): Promise<boolean>
|
branchExists(remote: boolean, pattern: string): Promise<boolean>
|
||||||
branchList(remote: boolean): Promise<string[]>
|
branchList(remote: boolean): Promise<string[]>
|
||||||
sparseCheckout(sparseCheckout: string[]): Promise<void>
|
|
||||||
sparseCheckoutNonConeMode(sparseCheckout: string[]): Promise<void>
|
|
||||||
checkout(ref: string, startPoint: string): Promise<void>
|
checkout(ref: string, startPoint: string): Promise<void>
|
||||||
checkoutDetach(): Promise<void>
|
checkoutDetach(): Promise<void>
|
||||||
config(
|
config(
|
||||||
@ -28,14 +25,7 @@ export interface IGitCommandManager {
|
|||||||
add?: boolean
|
add?: boolean
|
||||||
): Promise<void>
|
): Promise<void>
|
||||||
configExists(configKey: string, globalConfig?: boolean): Promise<boolean>
|
configExists(configKey: string, globalConfig?: boolean): Promise<boolean>
|
||||||
fetch(
|
fetch(refSpec: string[], fetchDepth?: number): Promise<void>
|
||||||
refSpec: string[],
|
|
||||||
options: {
|
|
||||||
filter?: string
|
|
||||||
fetchDepth?: number
|
|
||||||
fetchTags?: boolean
|
|
||||||
}
|
|
||||||
): Promise<void>
|
|
||||||
getDefaultBranch(repositoryUrl: string): Promise<string>
|
getDefaultBranch(repositoryUrl: string): Promise<string>
|
||||||
getWorkingDirectory(): string
|
getWorkingDirectory(): string
|
||||||
init(): Promise<void>
|
init(): Promise<void>
|
||||||
@ -51,7 +41,6 @@ export interface IGitCommandManager {
|
|||||||
submoduleForeach(command: string, recursive: boolean): Promise<string>
|
submoduleForeach(command: string, recursive: boolean): Promise<string>
|
||||||
submoduleSync(recursive: boolean): Promise<void>
|
submoduleSync(recursive: boolean): Promise<void>
|
||||||
submoduleUpdate(fetchDepth: number, recursive: boolean): Promise<void>
|
submoduleUpdate(fetchDepth: number, recursive: boolean): Promise<void>
|
||||||
submoduleStatus(): Promise<boolean>
|
|
||||||
tagExists(pattern: string): Promise<boolean>
|
tagExists(pattern: string): Promise<boolean>
|
||||||
tryClean(): Promise<boolean>
|
tryClean(): Promise<boolean>
|
||||||
tryConfigUnset(configKey: string, globalConfig?: boolean): Promise<boolean>
|
tryConfigUnset(configKey: string, globalConfig?: boolean): Promise<boolean>
|
||||||
@ -62,14 +51,9 @@ export interface IGitCommandManager {
|
|||||||
|
|
||||||
export async function createCommandManager(
|
export async function createCommandManager(
|
||||||
workingDirectory: string,
|
workingDirectory: string,
|
||||||
lfs: boolean,
|
lfs: boolean
|
||||||
doSparseCheckout: boolean
|
|
||||||
): Promise<IGitCommandManager> {
|
): Promise<IGitCommandManager> {
|
||||||
return await GitCommandManager.createCommandManager(
|
return await GitCommandManager.createCommandManager(workingDirectory, lfs)
|
||||||
workingDirectory,
|
|
||||||
lfs,
|
|
||||||
doSparseCheckout
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class GitCommandManager {
|
class GitCommandManager {
|
||||||
@ -79,7 +63,6 @@ class GitCommandManager {
|
|||||||
}
|
}
|
||||||
private gitPath = ''
|
private gitPath = ''
|
||||||
private lfs = false
|
private lfs = false
|
||||||
private doSparseCheckout = false
|
|
||||||
private workingDirectory = ''
|
private workingDirectory = ''
|
||||||
|
|
||||||
// Private constructor; use createCommandManager()
|
// Private constructor; use createCommandManager()
|
||||||
@ -170,27 +153,6 @@ class GitCommandManager {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
async sparseCheckout(sparseCheckout: string[]): Promise<void> {
|
|
||||||
await this.execGit(['sparse-checkout', 'set', ...sparseCheckout])
|
|
||||||
}
|
|
||||||
|
|
||||||
async sparseCheckoutNonConeMode(sparseCheckout: string[]): Promise<void> {
|
|
||||||
await this.execGit(['config', 'core.sparseCheckout', 'true'])
|
|
||||||
const output = await this.execGit([
|
|
||||||
'rev-parse',
|
|
||||||
'--git-path',
|
|
||||||
'info/sparse-checkout'
|
|
||||||
])
|
|
||||||
const sparseCheckoutPath = path.join(
|
|
||||||
this.workingDirectory,
|
|
||||||
output.stdout.trimRight()
|
|
||||||
)
|
|
||||||
await fs.promises.appendFile(
|
|
||||||
sparseCheckoutPath,
|
|
||||||
`\n${sparseCheckout.join('\n')}\n`
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
async checkout(ref: string, startPoint: string): Promise<void> {
|
async checkout(ref: string, startPoint: string): Promise<void> {
|
||||||
const args = ['checkout', '--progress', '--force']
|
const args = ['checkout', '--progress', '--force']
|
||||||
if (startPoint) {
|
if (startPoint) {
|
||||||
@ -239,23 +201,15 @@ class GitCommandManager {
|
|||||||
return output.exitCode === 0
|
return output.exitCode === 0
|
||||||
}
|
}
|
||||||
|
|
||||||
async fetch(
|
async fetch(refSpec: string[], fetchDepth?: number): Promise<void> {
|
||||||
refSpec: string[],
|
|
||||||
options: {filter?: string; fetchDepth?: number; fetchTags?: boolean}
|
|
||||||
): Promise<void> {
|
|
||||||
const args = ['-c', 'protocol.version=2', 'fetch']
|
const args = ['-c', 'protocol.version=2', 'fetch']
|
||||||
if (!refSpec.some(x => x === refHelper.tagsRefSpec) && !options.fetchTags) {
|
if (!refSpec.some(x => x === refHelper.tagsRefSpec)) {
|
||||||
args.push('--no-tags')
|
args.push('--no-tags')
|
||||||
}
|
}
|
||||||
|
|
||||||
args.push('--prune', '--progress', '--no-recurse-submodules')
|
args.push('--prune', '--progress', '--no-recurse-submodules')
|
||||||
|
if (fetchDepth && fetchDepth > 0) {
|
||||||
if (options.filter) {
|
args.push(`--depth=${fetchDepth}`)
|
||||||
args.push(`--filter=${options.filter}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options.fetchDepth && options.fetchDepth > 0) {
|
|
||||||
args.push(`--depth=${options.fetchDepth}`)
|
|
||||||
} else if (
|
} else if (
|
||||||
fshelper.fileExistsSync(
|
fshelper.fileExistsSync(
|
||||||
path.join(this.workingDirectory, '.git', 'shallow')
|
path.join(this.workingDirectory, '.git', 'shallow')
|
||||||
@ -334,8 +288,8 @@ class GitCommandManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async log1(format?: string): Promise<string> {
|
async log1(format?: string): Promise<string> {
|
||||||
const args = format ? ['log', '-1', format] : ['log', '-1']
|
var args = format ? ['log', '-1', format] : ['log', '-1']
|
||||||
const silent = format ? false : true
|
var silent = format ? false : true
|
||||||
const output = await this.execGit(args, false, silent)
|
const output = await this.execGit(args, false, silent)
|
||||||
return output.stdout
|
return output.stdout
|
||||||
}
|
}
|
||||||
@ -403,12 +357,6 @@ class GitCommandManager {
|
|||||||
await this.execGit(args)
|
await this.execGit(args)
|
||||||
}
|
}
|
||||||
|
|
||||||
async submoduleStatus(): Promise<boolean> {
|
|
||||||
const output = await this.execGit(['submodule', 'status'], true)
|
|
||||||
core.debug(output.stdout)
|
|
||||||
return output.exitCode === 0
|
|
||||||
}
|
|
||||||
|
|
||||||
async tagExists(pattern: string): Promise<boolean> {
|
async tagExists(pattern: string): Promise<boolean> {
|
||||||
const output = await this.execGit(['tag', '--list', pattern])
|
const output = await this.execGit(['tag', '--list', pattern])
|
||||||
return !!output.stdout.trim()
|
return !!output.stdout.trim()
|
||||||
@ -468,15 +416,10 @@ class GitCommandManager {
|
|||||||
|
|
||||||
static async createCommandManager(
|
static async createCommandManager(
|
||||||
workingDirectory: string,
|
workingDirectory: string,
|
||||||
lfs: boolean,
|
lfs: boolean
|
||||||
doSparseCheckout: boolean
|
|
||||||
): Promise<GitCommandManager> {
|
): Promise<GitCommandManager> {
|
||||||
const result = new GitCommandManager()
|
const result = new GitCommandManager()
|
||||||
await result.initializeCommandManager(
|
await result.initializeCommandManager(workingDirectory, lfs)
|
||||||
workingDirectory,
|
|
||||||
lfs,
|
|
||||||
doSparseCheckout
|
|
||||||
)
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -526,8 +469,7 @@ class GitCommandManager {
|
|||||||
|
|
||||||
private async initializeCommandManager(
|
private async initializeCommandManager(
|
||||||
workingDirectory: string,
|
workingDirectory: string,
|
||||||
lfs: boolean,
|
lfs: boolean
|
||||||
doSparseCheckout: boolean
|
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
this.workingDirectory = workingDirectory
|
this.workingDirectory = workingDirectory
|
||||||
|
|
||||||
@ -590,16 +532,6 @@ class GitCommandManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.doSparseCheckout = doSparseCheckout
|
|
||||||
if (this.doSparseCheckout) {
|
|
||||||
// The `git sparse-checkout` command was introduced in Git v2.25.0
|
|
||||||
const minimumGitSparseCheckoutVersion = new GitVersion('2.25')
|
|
||||||
if (!gitVersion.checkMinimum(minimumGitSparseCheckoutVersion)) {
|
|
||||||
throw new Error(
|
|
||||||
`Minimum Git version required for sparse checkout is ${minimumGitSparseCheckoutVersion}. Your git ('${this.gitPath}') is ${gitVersion}`
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Set the user agent
|
// Set the user agent
|
||||||
const gitHttpUserAgent = `git/${gitVersion} (github-actions-checkout)`
|
const gitHttpUserAgent = `git/${gitVersion} (github-actions-checkout)`
|
||||||
core.debug(`Set git useragent to: ${gitHttpUserAgent}`)
|
core.debug(`Set git useragent to: ${gitHttpUserAgent}`)
|
||||||
|
@ -81,18 +81,12 @@ export async function prepareExistingDirectory(
|
|||||||
}
|
}
|
||||||
core.endGroup()
|
core.endGroup()
|
||||||
|
|
||||||
// Check for submodules and delete any existing files if submodules are present
|
|
||||||
if (!(await git.submoduleStatus())) {
|
|
||||||
remove = true
|
|
||||||
core.info('Bad Submodules found, removing existing files')
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clean
|
// Clean
|
||||||
if (clean) {
|
if (clean) {
|
||||||
core.startGroup('Cleaning the repository')
|
core.startGroup('Cleaning the repository')
|
||||||
if (!(await git.tryClean())) {
|
if (!(await git.tryClean())) {
|
||||||
core.debug(
|
core.debug(
|
||||||
`The clean command failed. This might be caused by: 1) path too long, 2) permission issue, or 3) file in use. For further investigation, manually run 'git clean -ffdx' on the directory '${repositoryPath}'.`
|
`The clean command failed. This might be caused by: 1) path too long, 2) permission issue, or 3) file in use. For futher investigation, manually run 'git clean -ffdx' on the directory '${repositoryPath}'.`
|
||||||
)
|
)
|
||||||
remove = true
|
remove = true
|
||||||
} else if (!(await git.tryReset())) {
|
} else if (!(await git.tryReset())) {
|
||||||
|
@ -153,31 +153,23 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
|
|||||||
|
|
||||||
// Fetch
|
// Fetch
|
||||||
core.startGroup('Fetching the repository')
|
core.startGroup('Fetching the repository')
|
||||||
const fetchOptions: {
|
|
||||||
filter?: string
|
|
||||||
fetchDepth?: number
|
|
||||||
fetchTags?: boolean
|
|
||||||
} = {}
|
|
||||||
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(
|
||||||
settings.ref,
|
settings.ref,
|
||||||
settings.commit
|
settings.commit
|
||||||
)
|
)
|
||||||
await git.fetch(refSpec, fetchOptions)
|
await git.fetch(refSpec)
|
||||||
|
|
||||||
// When all history is fetched, the ref we're interested in may have moved to a different
|
// When all history is fetched, the ref we're interested in may have moved to a different
|
||||||
// commit (push or force push). If so, fetch again with a targeted refspec.
|
// commit (push or force push). If so, fetch again with a targeted refspec.
|
||||||
if (!(await refHelper.testRef(git, settings.ref, settings.commit))) {
|
if (!(await refHelper.testRef(git, settings.ref, settings.commit))) {
|
||||||
refSpec = refHelper.getRefSpec(settings.ref, settings.commit)
|
refSpec = refHelper.getRefSpec(settings.ref, settings.commit)
|
||||||
await git.fetch(refSpec, fetchOptions)
|
await git.fetch(refSpec)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fetchOptions.fetchDepth = settings.fetchDepth
|
|
||||||
fetchOptions.fetchTags = settings.fetchTags
|
|
||||||
const refSpec = refHelper.getRefSpec(settings.ref, settings.commit)
|
const refSpec = refHelper.getRefSpec(settings.ref, settings.commit)
|
||||||
await git.fetch(refSpec, fetchOptions)
|
await git.fetch(refSpec, settings.fetchDepth)
|
||||||
}
|
}
|
||||||
core.endGroup()
|
core.endGroup()
|
||||||
|
|
||||||
@ -193,24 +185,12 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
|
|||||||
// LFS fetch
|
// LFS fetch
|
||||||
// Explicit lfs-fetch to avoid slow checkout (fetches one lfs object at a time).
|
// Explicit lfs-fetch to avoid slow checkout (fetches one lfs object at a time).
|
||||||
// Explicit lfs fetch will fetch lfs objects in parallel.
|
// Explicit lfs fetch will fetch lfs objects in parallel.
|
||||||
// For sparse checkouts, let `checkout` fetch the needed objects lazily.
|
if (settings.lfs) {
|
||||||
if (settings.lfs && !settings.sparseCheckout) {
|
|
||||||
core.startGroup('Fetching LFS objects')
|
core.startGroup('Fetching LFS objects')
|
||||||
await git.lfsFetch(checkoutInfo.startPoint || checkoutInfo.ref)
|
await git.lfsFetch(checkoutInfo.startPoint || checkoutInfo.ref)
|
||||||
core.endGroup()
|
core.endGroup()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sparse checkout
|
|
||||||
if (settings.sparseCheckout) {
|
|
||||||
core.startGroup('Setting up sparse checkout')
|
|
||||||
if (settings.sparseCheckoutConeMode) {
|
|
||||||
await git.sparseCheckout(settings.sparseCheckout)
|
|
||||||
} else {
|
|
||||||
await git.sparseCheckoutNonConeMode(settings.sparseCheckout)
|
|
||||||
}
|
|
||||||
core.endGroup()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Checkout
|
// Checkout
|
||||||
core.startGroup('Checking out the ref')
|
core.startGroup('Checking out the ref')
|
||||||
await git.checkout(checkoutInfo.ref, checkoutInfo.startPoint)
|
await git.checkout(checkoutInfo.ref, checkoutInfo.startPoint)
|
||||||
@ -281,11 +261,7 @@ export async function cleanup(repositoryPath: string): Promise<void> {
|
|||||||
|
|
||||||
let git: IGitCommandManager
|
let git: IGitCommandManager
|
||||||
try {
|
try {
|
||||||
git = await gitCommandManager.createCommandManager(
|
git = await gitCommandManager.createCommandManager(repositoryPath, false)
|
||||||
repositoryPath,
|
|
||||||
false,
|
|
||||||
false
|
|
||||||
)
|
|
||||||
} catch {
|
} catch {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -321,8 +297,7 @@ async function getGitCommandManager(
|
|||||||
try {
|
try {
|
||||||
return await gitCommandManager.createCommandManager(
|
return await gitCommandManager.createCommandManager(
|
||||||
settings.repositoryPath,
|
settings.repositoryPath,
|
||||||
settings.lfs,
|
settings.lfs
|
||||||
settings.sparseCheckout != null
|
|
||||||
)
|
)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// Git is required for LFS
|
// Git is required for LFS
|
||||||
|
@ -29,26 +29,11 @@ export interface IGitSourceSettings {
|
|||||||
*/
|
*/
|
||||||
clean: boolean
|
clean: boolean
|
||||||
|
|
||||||
/**
|
|
||||||
* The array of folders to make the sparse checkout
|
|
||||||
*/
|
|
||||||
sparseCheckout: string[]
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Indicates whether to use cone mode in the sparse checkout (if any)
|
|
||||||
*/
|
|
||||||
sparseCheckoutConeMode: boolean
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The depth when fetching
|
* The depth when fetching
|
||||||
*/
|
*/
|
||||||
fetchDepth: number
|
fetchDepth: number
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetch tags, even if fetchDepth > 0 (default: false)
|
|
||||||
*/
|
|
||||||
fetchTags: boolean
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicates whether to fetch LFS objects
|
* Indicates whether to fetch LFS objects
|
||||||
*/
|
*/
|
||||||
|
@ -7,7 +7,6 @@ import * as path from 'path'
|
|||||||
import * as retryHelper from './retry-helper'
|
import * as retryHelper from './retry-helper'
|
||||||
import * as toolCache from '@actions/tool-cache'
|
import * as toolCache from '@actions/tool-cache'
|
||||||
import {default as uuid} from 'uuid/v4'
|
import {default as uuid} from 'uuid/v4'
|
||||||
import {getServerApiUrl} from './url-helper'
|
|
||||||
|
|
||||||
const IS_WINDOWS = process.platform === 'win32'
|
const IS_WINDOWS = process.platform === 'win32'
|
||||||
|
|
||||||
@ -85,9 +84,7 @@ export async function getDefaultBranch(
|
|||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
return await retryHelper.execute(async () => {
|
return await retryHelper.execute(async () => {
|
||||||
core.info('Retrieving the default branch name')
|
core.info('Retrieving the default branch name')
|
||||||
const octokit = github.getOctokit(authToken, {
|
const octokit = github.getOctokit(authToken, {baseUrl: baseUrl})
|
||||||
baseUrl: getServerApiUrl(baseUrl)
|
|
||||||
})
|
|
||||||
let result: string
|
let result: string
|
||||||
try {
|
try {
|
||||||
// Get the default branch from the repo info
|
// Get the default branch from the repo info
|
||||||
@ -128,9 +125,7 @@ async function downloadArchive(
|
|||||||
commit: string,
|
commit: string,
|
||||||
baseUrl?: string
|
baseUrl?: string
|
||||||
): Promise<Buffer> {
|
): Promise<Buffer> {
|
||||||
const octokit = github.getOctokit(authToken, {
|
const octokit = github.getOctokit(authToken, {baseUrl: baseUrl})
|
||||||
baseUrl: getServerApiUrl(baseUrl)
|
|
||||||
})
|
|
||||||
const download = IS_WINDOWS
|
const download = IS_WINDOWS
|
||||||
? octokit.rest.repos.downloadZipballArchive
|
? octokit.rest.repos.downloadZipballArchive
|
||||||
: octokit.rest.repos.downloadTarballArchive
|
: octokit.rest.repos.downloadTarballArchive
|
||||||
|
@ -82,17 +82,6 @@ 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}`)
|
||||||
|
|
||||||
// Sparse checkout
|
|
||||||
const sparseCheckout = core.getMultilineInput('sparse-checkout')
|
|
||||||
if (sparseCheckout.length) {
|
|
||||||
result.sparseCheckout = sparseCheckout
|
|
||||||
core.debug(`sparse checkout = ${result.sparseCheckout}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
result.sparseCheckoutConeMode =
|
|
||||||
(core.getInput('sparse-checkout-cone-mode') || 'true').toUpperCase() ===
|
|
||||||
'TRUE'
|
|
||||||
|
|
||||||
// Fetch depth
|
// Fetch depth
|
||||||
result.fetchDepth = Math.floor(Number(core.getInput('fetch-depth') || '1'))
|
result.fetchDepth = Math.floor(Number(core.getInput('fetch-depth') || '1'))
|
||||||
if (isNaN(result.fetchDepth) || result.fetchDepth < 0) {
|
if (isNaN(result.fetchDepth) || result.fetchDepth < 0) {
|
||||||
@ -100,11 +89,6 @@ export async function getInputs(): Promise<IGitSourceSettings> {
|
|||||||
}
|
}
|
||||||
core.debug(`fetch depth = ${result.fetchDepth}`)
|
core.debug(`fetch depth = ${result.fetchDepth}`)
|
||||||
|
|
||||||
// Fetch tags
|
|
||||||
result.fetchTags =
|
|
||||||
(core.getInput('fetch-tags') || 'false').toUpperCase() === 'TRUE'
|
|
||||||
core.debug(`fetch tags = ${result.fetchTags}`)
|
|
||||||
|
|
||||||
// LFS
|
// LFS
|
||||||
result.lfs = (core.getInput('lfs') || 'false').toUpperCase() === 'TRUE'
|
result.lfs = (core.getInput('lfs') || 'false').toUpperCase() === 'TRUE'
|
||||||
core.debug(`lfs = ${result.lfs}`)
|
core.debug(`lfs = ${result.lfs}`)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import {IGitCommandManager} from './git-command-manager'
|
import {IGitCommandManager} from './git-command-manager'
|
||||||
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 {isGhes} from './url-helper'
|
||||||
|
|
||||||
export const tagsRefSpec = '+refs/tags/*:refs/tags/*'
|
export const tagsRefSpec = '+refs/tags/*:refs/tags/*'
|
||||||
|
|
||||||
@ -245,7 +245,7 @@ export async function checkCommitInfo(
|
|||||||
`Expected head sha ${expectedHeadSha}; actual head sha ${actualHeadSha}`
|
`Expected head sha ${expectedHeadSha}; actual head sha ${actualHeadSha}`
|
||||||
)
|
)
|
||||||
const octokit = github.getOctokit(token, {
|
const octokit = github.getOctokit(token, {
|
||||||
baseUrl: getServerApiUrl(baseUrl),
|
baseUrl: baseUrl,
|
||||||
userAgent: `actions-checkout-tracepoint/1.0 (code=STALE_MERGE;owner=${repositoryOwner};repo=${repositoryName};pr=${fromPayload(
|
userAgent: `actions-checkout-tracepoint/1.0 (code=STALE_MERGE;owner=${repositoryOwner};repo=${repositoryName};pr=${fromPayload(
|
||||||
'number'
|
'number'
|
||||||
)};run_id=${
|
)};run_id=${
|
||||||
|
Reference in New Issue
Block a user