mirror of
				https://github.com/actions/checkout.git
				synced 2025-11-04 07:48:09 +08:00 
			
		
		
		
	Compare commits
	
		
			9 Commits
		
	
	
		
			v3.5.1
			...
			releases/v
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					f43a0e5ff2 | ||
| 
						 | 
					7739b9ba2e | ||
| 
						 | 
					96f53100ba | ||
| 
						 | 
					c85c95e3d7 | ||
| 
						 | 
					d106d4669b | ||
| 
						 | 
					f095bcc56b | ||
| 
						 | 
					47fbe2df0a | ||
| 
						 | 
					8e5e7e5ab8 | ||
| 
						 | 
					eb35239ec2 | 
							
								
								
									
										27
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							@@ -72,6 +72,33 @@ 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: ./
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -1,5 +1,17 @@
 | 
				
			|||||||
# 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
 | 
					## v3.5.1
 | 
				
			||||||
- [Fix slow checkout on Windows](https://github.com/actions/checkout/pull/1246)
 | 
					- [Fix slow checkout on Windows](https://github.com/actions/checkout/pull/1246)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										44
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								README.md
									
									
									
									
									
								
							@@ -74,10 +74,23 @@ 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: ''
 | 
				
			||||||
@@ -106,6 +119,9 @@ 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)
 | 
				
			||||||
@@ -116,6 +132,34 @@ 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,6 +727,8 @@ 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(
 | 
				
			||||||
@@ -770,6 +772,9 @@ 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(),
 | 
				
			||||||
@@ -797,7 +802,10 @@ 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,7 +39,12 @@ 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
 | 
				
			||||||
    git = await commandManager.createCommandManager(workingDirectory, lfs)
 | 
					    const doSparseCheckout = false
 | 
				
			||||||
 | 
					    git = await commandManager.createCommandManager(
 | 
				
			||||||
 | 
					      workingDirectory,
 | 
				
			||||||
 | 
					      lfs,
 | 
				
			||||||
 | 
					      doSparseCheckout
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let branches = await git.branchList(false)
 | 
					    let branches = await git.branchList(false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -70,7 +75,12 @@ 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
 | 
				
			||||||
    git = await commandManager.createCommandManager(workingDirectory, lfs)
 | 
					    const doSparseCheckout = false
 | 
				
			||||||
 | 
					    git = await commandManager.createCommandManager(
 | 
				
			||||||
 | 
					      workingDirectory,
 | 
				
			||||||
 | 
					      lfs,
 | 
				
			||||||
 | 
					      doSparseCheckout
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let branches = await git.branchList(false)
 | 
					    let branches = await git.branchList(false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -78,3 +88,179 @@ 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,6 +281,65 @@ 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
 | 
				
			||||||
@@ -403,6 +462,8 @@ 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(),
 | 
				
			||||||
@@ -423,6 +484,9 @@ 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,7 +79,10 @@ 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')
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										51
									
								
								__test__/verify-sparse-checkout-non-cone-mode.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										51
									
								
								__test__/verify-sparse-checkout-non-cone-mode.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,51 @@
 | 
				
			|||||||
 | 
					#!/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
 | 
				
			||||||
							
								
								
									
										63
									
								
								__test__/verify-sparse-checkout.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										63
									
								
								__test__/verify-sparse-checkout.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					#!/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,9 +53,21 @@ 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 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 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 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										119
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										119
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							@@ -470,6 +470,7 @@ 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));
 | 
				
			||||||
@@ -480,9 +481,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) {
 | 
					function createCommandManager(workingDirectory, lfs, doSparseCheckout) {
 | 
				
			||||||
    return __awaiter(this, void 0, void 0, function* () {
 | 
					    return __awaiter(this, void 0, void 0, function* () {
 | 
				
			||||||
        return yield GitCommandManager.createCommandManager(workingDirectory, lfs);
 | 
					        return yield GitCommandManager.createCommandManager(workingDirectory, lfs, doSparseCheckout);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
exports.createCommandManager = createCommandManager;
 | 
					exports.createCommandManager = createCommandManager;
 | 
				
			||||||
@@ -495,6 +496,7 @@ 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) {
 | 
				
			||||||
@@ -574,6 +576,23 @@ 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'];
 | 
				
			||||||
@@ -615,15 +634,18 @@ class GitCommandManager {
 | 
				
			|||||||
            return output.exitCode === 0;
 | 
					            return output.exitCode === 0;
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    fetch(refSpec, fetchDepth) {
 | 
					    fetch(refSpec, options) {
 | 
				
			||||||
        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)) {
 | 
					            if (!refSpec.some(x => x === refHelper.tagsRefSpec) && !options.fetchTags) {
 | 
				
			||||||
                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 (fshelper.fileExistsSync(path.join(this.workingDirectory, '.git', 'shallow'))) {
 | 
					            else if (fshelper.fileExistsSync(path.join(this.workingDirectory, '.git', 'shallow'))) {
 | 
				
			||||||
                args.push('--unshallow');
 | 
					                args.push('--unshallow');
 | 
				
			||||||
@@ -696,8 +718,8 @@ class GitCommandManager {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    log1(format) {
 | 
					    log1(format) {
 | 
				
			||||||
        return __awaiter(this, void 0, void 0, function* () {
 | 
					        return __awaiter(this, void 0, void 0, function* () {
 | 
				
			||||||
            var args = format ? ['log', '-1', format] : ['log', '-1'];
 | 
					            const args = format ? ['log', '-1', format] : ['log', '-1'];
 | 
				
			||||||
            var silent = format ? false : true;
 | 
					            const 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;
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
@@ -765,6 +787,13 @@ 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]);
 | 
				
			||||||
@@ -813,10 +842,10 @@ class GitCommandManager {
 | 
				
			|||||||
            return output.exitCode === 0;
 | 
					            return output.exitCode === 0;
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    static createCommandManager(workingDirectory, lfs) {
 | 
					    static createCommandManager(workingDirectory, lfs, doSparseCheckout) {
 | 
				
			||||||
        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);
 | 
					            yield result.initializeCommandManager(workingDirectory, lfs, doSparseCheckout);
 | 
				
			||||||
            return result;
 | 
					            return result;
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -852,7 +881,7 @@ class GitCommandManager {
 | 
				
			|||||||
            return result;
 | 
					            return result;
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    initializeCommandManager(workingDirectory, lfs) {
 | 
					    initializeCommandManager(workingDirectory, lfs, doSparseCheckout) {
 | 
				
			||||||
        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.
 | 
				
			||||||
@@ -904,6 +933,14 @@ 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}`);
 | 
				
			||||||
@@ -1023,11 +1060,16 @@ 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 futher 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 further investigation, manually run 'git clean -ffdx' on the directory '${repositoryPath}'.`);
 | 
				
			||||||
                        remove = true;
 | 
					                        remove = true;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    else if (!(yield git.tryReset())) {
 | 
					                    else if (!(yield git.tryReset())) {
 | 
				
			||||||
@@ -1198,20 +1240,25 @@ 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);
 | 
					                yield git.fetch(refSpec, fetchOptions);
 | 
				
			||||||
                // 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);
 | 
					                    yield git.fetch(refSpec, fetchOptions);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            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, settings.fetchDepth);
 | 
					                yield git.fetch(refSpec, fetchOptions);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            core.endGroup();
 | 
					            core.endGroup();
 | 
				
			||||||
            // Checkout info
 | 
					            // Checkout info
 | 
				
			||||||
@@ -1221,11 +1268,23 @@ 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.
 | 
				
			||||||
            if (settings.lfs) {
 | 
					            // For sparse checkouts, let `checkout` fetch the needed objects lazily.
 | 
				
			||||||
 | 
					            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);
 | 
				
			||||||
@@ -1279,7 +1338,7 @@ function cleanup(repositoryPath) {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        let git;
 | 
					        let git;
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            git = yield gitCommandManager.createCommandManager(repositoryPath, false);
 | 
					            git = yield gitCommandManager.createCommandManager(repositoryPath, false, false);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        catch (_a) {
 | 
					        catch (_a) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
@@ -1310,7 +1369,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);
 | 
					            return yield gitCommandManager.createCommandManager(settings.repositoryPath, settings.lfs, settings.sparseCheckout != null);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        catch (err) {
 | 
					        catch (err) {
 | 
				
			||||||
            // Git is required for LFS
 | 
					            // Git is required for LFS
 | 
				
			||||||
@@ -1453,6 +1512,7 @@ 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* () {
 | 
				
			||||||
@@ -1513,7 +1573,9 @@ 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, { baseUrl: baseUrl });
 | 
					            const octokit = github.getOctokit(authToken, {
 | 
				
			||||||
 | 
					                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
 | 
				
			||||||
@@ -1545,7 +1607,9 @@ 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, { baseUrl: baseUrl });
 | 
					        const octokit = github.getOctokit(authToken, {
 | 
				
			||||||
 | 
					            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;
 | 
				
			||||||
@@ -1656,12 +1720,25 @@ 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}`);
 | 
				
			||||||
@@ -2026,7 +2103,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: baseUrl,
 | 
					                    baseUrl: (0, url_helper_1.getServerApiUrl)(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({
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -1,12 +1,12 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "checkout",
 | 
					  "name": "checkout",
 | 
				
			||||||
  "version": "3.5.1",
 | 
					  "version": "3.6.0",
 | 
				
			||||||
  "lockfileVersion": 2,
 | 
					  "lockfileVersion": 2,
 | 
				
			||||||
  "requires": true,
 | 
					  "requires": true,
 | 
				
			||||||
  "packages": {
 | 
					  "packages": {
 | 
				
			||||||
    "": {
 | 
					    "": {
 | 
				
			||||||
      "name": "checkout",
 | 
					      "name": "checkout",
 | 
				
			||||||
      "version": "3.5.1",
 | 
					      "version": "3.6.0",
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@actions/core": "^1.10.0",
 | 
					        "@actions/core": "^1.10.0",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "checkout",
 | 
					  "name": "checkout",
 | 
				
			||||||
  "version": "3.5.1",
 | 
					  "version": "3.6.0",
 | 
				
			||||||
  "description": "checkout action",
 | 
					  "description": "checkout action",
 | 
				
			||||||
  "main": "lib/main.js",
 | 
					  "main": "lib/main.js",
 | 
				
			||||||
  "scripts": {
 | 
					  "scripts": {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
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'
 | 
				
			||||||
@@ -16,6 +17,8 @@ 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(
 | 
				
			||||||
@@ -25,7 +28,14 @@ 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(refSpec: string[], fetchDepth?: number): Promise<void>
 | 
					  fetch(
 | 
				
			||||||
 | 
					    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>
 | 
				
			||||||
@@ -41,6 +51,7 @@ 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>
 | 
				
			||||||
@@ -51,9 +62,14 @@ 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(workingDirectory, lfs)
 | 
					  return await GitCommandManager.createCommandManager(
 | 
				
			||||||
 | 
					    workingDirectory,
 | 
				
			||||||
 | 
					    lfs,
 | 
				
			||||||
 | 
					    doSparseCheckout
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class GitCommandManager {
 | 
					class GitCommandManager {
 | 
				
			||||||
@@ -63,6 +79,7 @@ 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()
 | 
				
			||||||
@@ -153,6 +170,27 @@ 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) {
 | 
				
			||||||
@@ -201,15 +239,23 @@ class GitCommandManager {
 | 
				
			|||||||
    return output.exitCode === 0
 | 
					    return output.exitCode === 0
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async fetch(refSpec: string[], fetchDepth?: number): Promise<void> {
 | 
					  async fetch(
 | 
				
			||||||
 | 
					    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)) {
 | 
					    if (!refSpec.some(x => x === refHelper.tagsRefSpec) && !options.fetchTags) {
 | 
				
			||||||
      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) {
 | 
					
 | 
				
			||||||
      args.push(`--depth=${fetchDepth}`)
 | 
					    if (options.filter) {
 | 
				
			||||||
 | 
					      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')
 | 
				
			||||||
@@ -288,8 +334,8 @@ class GitCommandManager {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async log1(format?: string): Promise<string> {
 | 
					  async log1(format?: string): Promise<string> {
 | 
				
			||||||
    var args = format ? ['log', '-1', format] : ['log', '-1']
 | 
					    const args = format ? ['log', '-1', format] : ['log', '-1']
 | 
				
			||||||
    var silent = format ? false : true
 | 
					    const 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
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -357,6 +403,12 @@ 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()
 | 
				
			||||||
@@ -416,10 +468,15 @@ 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(workingDirectory, lfs)
 | 
					    await result.initializeCommandManager(
 | 
				
			||||||
 | 
					      workingDirectory,
 | 
				
			||||||
 | 
					      lfs,
 | 
				
			||||||
 | 
					      doSparseCheckout
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
    return result
 | 
					    return result
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -469,7 +526,8 @@ 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -532,6 +590,16 @@ 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,12 +81,18 @@ 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 futher 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 further 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,23 +153,31 @@ 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)
 | 
					      await git.fetch(refSpec, fetchOptions)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // 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)
 | 
					        await git.fetch(refSpec, fetchOptions)
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } 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, settings.fetchDepth)
 | 
					      await git.fetch(refSpec, fetchOptions)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    core.endGroup()
 | 
					    core.endGroup()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -185,12 +193,24 @@ 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.
 | 
				
			||||||
    if (settings.lfs) {
 | 
					    // For sparse checkouts, let `checkout` fetch the needed objects lazily.
 | 
				
			||||||
 | 
					    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)
 | 
				
			||||||
@@ -261,7 +281,11 @@ export async function cleanup(repositoryPath: string): Promise<void> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  let git: IGitCommandManager
 | 
					  let git: IGitCommandManager
 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
    git = await gitCommandManager.createCommandManager(repositoryPath, false)
 | 
					    git = await gitCommandManager.createCommandManager(
 | 
				
			||||||
 | 
					      repositoryPath,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
  } catch {
 | 
					  } catch {
 | 
				
			||||||
    return
 | 
					    return
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -297,7 +321,8 @@ 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,11 +29,26 @@ 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,6 +7,7 @@ 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'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -84,7 +85,9 @@ 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, {baseUrl: baseUrl})
 | 
					    const octokit = github.getOctokit(authToken, {
 | 
				
			||||||
 | 
					      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
 | 
				
			||||||
@@ -125,7 +128,9 @@ async function downloadArchive(
 | 
				
			|||||||
  commit: string,
 | 
					  commit: string,
 | 
				
			||||||
  baseUrl?: string
 | 
					  baseUrl?: string
 | 
				
			||||||
): Promise<Buffer> {
 | 
					): Promise<Buffer> {
 | 
				
			||||||
  const octokit = github.getOctokit(authToken, {baseUrl: baseUrl})
 | 
					  const octokit = github.getOctokit(authToken, {
 | 
				
			||||||
 | 
					    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,6 +82,17 @@ 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) {
 | 
				
			||||||
@@ -89,6 +100,11 @@ 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 {isGhes} from './url-helper'
 | 
					import {getServerApiUrl, 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: baseUrl,
 | 
					        baseUrl: getServerApiUrl(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