mirror of
				https://github.com/actions/checkout.git
				synced 2025-10-29 05:40:31 +00:00 
			
		
		
		
	Compare commits
	
		
			9 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 8ade135a41 | ||
|   | c533a0a4cf | ||
|   | 72f2cec99f | ||
|   | 3df4ab11eb | ||
|   | 8b5e8b7687 | ||
|   | 97a652b800 | ||
|   | f43a0e5ff2 | ||
|   | 7739b9ba2e | ||
|   | 96f53100ba | 
							
								
								
									
										4
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
								
							| @@ -24,10 +24,10 @@ jobs: | ||||
|     steps: | ||||
|       - uses: actions/checkout@v3 | ||||
|  | ||||
|       - name: Set Node.js 16.x | ||||
|       - name: Set Node.js 20.x | ||||
|         uses: actions/setup-node@v1 | ||||
|         with: | ||||
|           node-version: 16.x | ||||
|           node-version: 20.x | ||||
|  | ||||
|       - name: Install dependencies | ||||
|         run: npm ci | ||||
|   | ||||
							
								
								
									
										12
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							| @@ -13,7 +13,7 @@ jobs: | ||||
|     steps: | ||||
|       - uses: actions/setup-node@v1 | ||||
|         with: | ||||
|           node-version: 16.x | ||||
|           node-version: 20.x | ||||
|       - uses: actions/checkout@v3 | ||||
|       - run: npm ci | ||||
|       - run: npm run build | ||||
| @@ -72,6 +72,16 @@ jobs: | ||||
|         shell: bash | ||||
|         run: __test__/verify-side-by-side.sh | ||||
|  | ||||
|       # Filter | ||||
|       - name: Fetch filter | ||||
|         uses: ./ | ||||
|         with: | ||||
|           filter: 'blob:none' | ||||
|           path: fetch-filter | ||||
|  | ||||
|       - name: Verify fetch filter | ||||
|         run: __test__/verify-fetch-filter.sh | ||||
|  | ||||
|       # Sparse checkout | ||||
|       - name: Sparse checkout | ||||
|         uses: ./ | ||||
|   | ||||
							
								
								
									
										1
									
								
								.github/workflows/update-main-version.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/workflows/update-main-version.yml
									
									
									
									
										vendored
									
									
								
							| @@ -11,6 +11,7 @@ on: | ||||
|         type: choice | ||||
|         description: The major version to update | ||||
|         options: | ||||
|           - v4 | ||||
|           - v3 | ||||
|           - v2 | ||||
|  | ||||
|   | ||||
							
								
								
									
										11
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -1,5 +1,16 @@ | ||||
| # Changelog | ||||
|  | ||||
| ## v4.1.0 | ||||
| - [Add support for partial checkout filters](https://github.com/actions/checkout/pull/1396) | ||||
|  | ||||
| ## v4.0.0 | ||||
| - [Support fetching without the --progress option](https://github.com/actions/checkout/pull/1067) | ||||
| - [Update to node20](https://github.com/actions/checkout/pull/1436) | ||||
|  | ||||
| ## 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) | ||||
|   | ||||
							
								
								
									
										53
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| [](https://github.com/actions/checkout/actions/workflows/test.yml) | ||||
|  | ||||
| # Checkout V3 | ||||
| # Checkout V4 | ||||
|  | ||||
| This action checks-out your repository under `$GITHUB_WORKSPACE`, so your workflow can access it. | ||||
|  | ||||
| @@ -12,14 +12,15 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl | ||||
|  | ||||
| # What's new | ||||
|  | ||||
| - Updated to the node16 runtime by default | ||||
|   - This requires a minimum [Actions Runner](https://github.com/actions/runner/releases/tag/v2.285.0) version of v2.285.0 to run, which is by default available in GHES 3.4 or later. | ||||
| - Updated default runtime to node20 | ||||
|   - This requires a minimum Actions Runner version of [v2.308.0](https://github.com/actions/runner/releases/tag/v2.308.0). | ||||
| - Added support for fetching without the `--progress` option | ||||
|  | ||||
| # Usage | ||||
|  | ||||
| <!-- start usage --> | ||||
| ```yaml | ||||
| - uses: actions/checkout@v3 | ||||
| - uses: actions/checkout@v4 | ||||
|   with: | ||||
|     # Repository name with owner. For example, actions/checkout | ||||
|     # Default: ${{ github.repository }} | ||||
| @@ -74,8 +75,12 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl | ||||
|     # Default: true | ||||
|     clean: '' | ||||
|  | ||||
|     # Partially clone against a given filter. Overrides sparse-checkout if set. | ||||
|     # Default: null | ||||
|     filter: '' | ||||
|  | ||||
|     # Do a sparse checkout on given patterns. Each pattern should be separated with | ||||
|     # new lines | ||||
|     # new lines. | ||||
|     # Default: null | ||||
|     sparse-checkout: '' | ||||
|  | ||||
| @@ -87,6 +92,14 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl | ||||
|     # Default: 1 | ||||
|     fetch-depth: '' | ||||
|  | ||||
|     # Whether to fetch tags, even if fetch-depth > 0. | ||||
|     # Default: false | ||||
|     fetch-tags: '' | ||||
|  | ||||
|     # Whether to show progress status output when fetching. | ||||
|     # Default: true | ||||
|     show-progress: '' | ||||
|  | ||||
|     # Whether to download Git-LFS files | ||||
|     # Default: false | ||||
|     lfs: '' | ||||
| @@ -131,7 +144,7 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl | ||||
| ## Fetch only the root files | ||||
|  | ||||
| ```yaml | ||||
| - uses: actions/checkout@v3 | ||||
| - uses: actions/checkout@v4 | ||||
|   with: | ||||
|     sparse-checkout: . | ||||
| ``` | ||||
| @@ -139,7 +152,7 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl | ||||
| ## Fetch only the root files and `.github` and `src` folder | ||||
|  | ||||
| ```yaml | ||||
| - uses: actions/checkout@v3 | ||||
| - uses: actions/checkout@v4 | ||||
|   with: | ||||
|     sparse-checkout: | | ||||
|       .github | ||||
| @@ -149,7 +162,7 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl | ||||
| ## Fetch only a single file | ||||
|  | ||||
| ```yaml | ||||
| - uses: actions/checkout@v3 | ||||
| - uses: actions/checkout@v4 | ||||
|   with: | ||||
|     sparse-checkout: | | ||||
|       README.md | ||||
| @@ -159,7 +172,7 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl | ||||
| ## Fetch all history for all tags and branches | ||||
|  | ||||
| ```yaml | ||||
| - uses: actions/checkout@v3 | ||||
| - uses: actions/checkout@v4 | ||||
|   with: | ||||
|     fetch-depth: 0 | ||||
| ``` | ||||
| @@ -167,7 +180,7 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl | ||||
| ## Checkout a different branch | ||||
|  | ||||
| ```yaml | ||||
| - uses: actions/checkout@v3 | ||||
| - uses: actions/checkout@v4 | ||||
|   with: | ||||
|     ref: my-branch | ||||
| ``` | ||||
| @@ -175,7 +188,7 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl | ||||
| ## Checkout HEAD^ | ||||
|  | ||||
| ```yaml | ||||
| - uses: actions/checkout@v3 | ||||
| - uses: actions/checkout@v4 | ||||
|   with: | ||||
|     fetch-depth: 2 | ||||
| - run: git checkout HEAD^ | ||||
| @@ -185,12 +198,12 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl | ||||
|  | ||||
| ```yaml | ||||
| - name: Checkout | ||||
|   uses: actions/checkout@v3 | ||||
|   uses: actions/checkout@v4 | ||||
|   with: | ||||
|     path: main | ||||
|  | ||||
| - name: Checkout tools repo | ||||
|   uses: actions/checkout@v3 | ||||
|   uses: actions/checkout@v4 | ||||
|   with: | ||||
|     repository: my-org/my-tools | ||||
|     path: my-tools | ||||
| @@ -201,10 +214,10 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl | ||||
|  | ||||
| ```yaml | ||||
| - name: Checkout | ||||
|   uses: actions/checkout@v3 | ||||
|   uses: actions/checkout@v4 | ||||
|  | ||||
| - name: Checkout tools repo | ||||
|   uses: actions/checkout@v3 | ||||
|   uses: actions/checkout@v4 | ||||
|   with: | ||||
|     repository: my-org/my-tools | ||||
|     path: my-tools | ||||
| @@ -215,12 +228,12 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl | ||||
|  | ||||
| ```yaml | ||||
| - name: Checkout | ||||
|   uses: actions/checkout@v3 | ||||
|   uses: actions/checkout@v4 | ||||
|   with: | ||||
|     path: main | ||||
|  | ||||
| - name: Checkout private tools | ||||
|   uses: actions/checkout@v3 | ||||
|   uses: actions/checkout@v4 | ||||
|   with: | ||||
|     repository: my-org/my-private-tools | ||||
|     token: ${{ secrets.GH_PAT }} # `GH_PAT` is a secret that contains your PAT | ||||
| @@ -233,7 +246,7 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl | ||||
| ## Checkout pull request HEAD commit instead of merge commit | ||||
|  | ||||
| ```yaml | ||||
| - uses: actions/checkout@v3 | ||||
| - uses: actions/checkout@v4 | ||||
|   with: | ||||
|     ref: ${{ github.event.pull_request.head.sha }} | ||||
| ``` | ||||
| @@ -249,7 +262,7 @@ jobs: | ||||
|   build: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@v3 | ||||
|       - uses: actions/checkout@v4 | ||||
| ``` | ||||
|  | ||||
| ## Push a commit using the built-in token | ||||
| @@ -260,7 +273,7 @@ jobs: | ||||
|   build: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@v3 | ||||
|       - uses: actions/checkout@v4 | ||||
|       - run: | | ||||
|           date > generated.txt | ||||
|           git config user.name github-actions | ||||
|   | ||||
| @@ -802,9 +802,12 @@ async function setup(testName: string): Promise<void> { | ||||
|     authToken: 'some auth token', | ||||
|     clean: true, | ||||
|     commit: '', | ||||
|     filter: undefined, | ||||
|     sparseCheckout: [], | ||||
|     sparseCheckoutConeMode: true, | ||||
|     fetchDepth: 1, | ||||
|     fetchTags: false, | ||||
|     showProgress: true, | ||||
|     lfs: false, | ||||
|     submodules: false, | ||||
|     nestedSubmodules: false, | ||||
|   | ||||
| @@ -88,3 +88,291 @@ describe('git-auth-helper tests', () => { | ||||
|     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', | ||||
|         '--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', | ||||
|         '--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', | ||||
|         '--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', | ||||
|         '--no-recurse-submodules', | ||||
|         '--filter=filterValue', | ||||
|         '--depth=1', | ||||
|         'origin', | ||||
|         'refspec1', | ||||
|         'refspec2' | ||||
|       ], | ||||
|       expect.any(Object) | ||||
|     ) | ||||
|   }) | ||||
|  | ||||
|   it('should call execGit with the correct arguments when showProgress 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', | ||||
|       showProgress: true | ||||
|     } | ||||
|  | ||||
|     await git.fetch(refSpec, options) | ||||
|  | ||||
|     expect(mockExec).toHaveBeenCalledWith( | ||||
|       expect.any(String), | ||||
|       [ | ||||
|         '-c', | ||||
|         'protocol.version=2', | ||||
|         'fetch', | ||||
|         '--no-tags', | ||||
|         '--prune', | ||||
|         '--no-recurse-submodules', | ||||
|         '--progress', | ||||
|         '--filter=filterValue', | ||||
|         'origin', | ||||
|         'refspec1', | ||||
|         'refspec2' | ||||
|       ], | ||||
|       expect.any(Object) | ||||
|     ) | ||||
|   }) | ||||
|  | ||||
|   it('should call execGit with the correct arguments when fetchDepth is 42 and showProgress 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: 42, | ||||
|       showProgress: true | ||||
|     } | ||||
|  | ||||
|     await git.fetch(refSpec, options) | ||||
|  | ||||
|     expect(mockExec).toHaveBeenCalledWith( | ||||
|       expect.any(String), | ||||
|       [ | ||||
|         '-c', | ||||
|         'protocol.version=2', | ||||
|         'fetch', | ||||
|         '--no-tags', | ||||
|         '--prune', | ||||
|         '--no-recurse-submodules', | ||||
|         '--progress', | ||||
|         '--filter=filterValue', | ||||
|         '--depth=42', | ||||
|         'origin', | ||||
|         'refspec1', | ||||
|         'refspec2' | ||||
|       ], | ||||
|       expect.any(Object) | ||||
|     ) | ||||
|   }) | ||||
|  | ||||
|   it('should call execGit with the correct arguments when fetchTags is true and showProgress 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', | ||||
|       fetchTags: true, | ||||
|       showProgress: true | ||||
|     } | ||||
|  | ||||
|     await git.fetch(refSpec, options) | ||||
|  | ||||
|     expect(mockExec).toHaveBeenCalledWith( | ||||
|       expect.any(String), | ||||
|       [ | ||||
|         '-c', | ||||
|         'protocol.version=2', | ||||
|         'fetch', | ||||
|         '--prune', | ||||
|         '--no-recurse-submodules', | ||||
|         '--progress', | ||||
|         '--filter=filterValue', | ||||
|         'origin', | ||||
|         'refspec1', | ||||
|         'refspec2' | ||||
|       ], | ||||
|       expect.any(Object) | ||||
|     ) | ||||
|   }) | ||||
| }) | ||||
|   | ||||
| @@ -79,9 +79,12 @@ describe('input-helper tests', () => { | ||||
|     expect(settings.clean).toBe(true) | ||||
|     expect(settings.commit).toBeTruthy() | ||||
|     expect(settings.commit).toBe('1234567890123456789012345678901234567890') | ||||
|     expect(settings.filter).toBe(undefined) | ||||
|     expect(settings.sparseCheckout).toBe(undefined) | ||||
|     expect(settings.sparseCheckoutConeMode).toBe(true) | ||||
|     expect(settings.fetchDepth).toBe(1) | ||||
|     expect(settings.fetchTags).toBe(false) | ||||
|     expect(settings.showProgress).toBe(true) | ||||
|     expect(settings.lfs).toBe(false) | ||||
|     expect(settings.ref).toBe('refs/heads/some-ref') | ||||
|     expect(settings.repositoryName).toBe('some-repo') | ||||
|   | ||||
							
								
								
									
										16
									
								
								__test__/verify-fetch-filter.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										16
									
								
								__test__/verify-fetch-filter.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| # Verify .git folder | ||||
| if [ ! -d "./fetch-filter/.git" ]; then | ||||
|   echo "Expected ./fetch-filter/.git folder to exist" | ||||
|   exit 1 | ||||
| fi | ||||
|  | ||||
| # Verify .git/config contains partialclonefilter | ||||
|  | ||||
| CLONE_FILTER=$(git -C fetch-filter config --local --get remote.origin.partialclonefilter) | ||||
|  | ||||
| if [ "$CLONE_FILTER" != "blob:none" ]; then | ||||
|   echo "Expected ./fetch-filter/.git/config to have 'remote.origin.partialclonefilter' set to 'blob:none'" | ||||
|   exit 1 | ||||
| fi | ||||
| @@ -1,4 +1,4 @@ | ||||
| #!/bin/sh | ||||
| #!/bin/bash | ||||
|  | ||||
| # Verify .git folder | ||||
| if [ ! -d "./sparse-checkout-non-cone-mode/.git" ]; then | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| #!/bin/sh | ||||
| #!/bin/bash | ||||
|  | ||||
| # Verify .git folder | ||||
| if [ ! -d "./sparse-checkout/.git" ]; then | ||||
|   | ||||
							
								
								
									
										15
									
								
								action.yml
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								action.yml
									
									
									
									
									
								
							| @@ -53,10 +53,15 @@ inputs: | ||||
|   clean: | ||||
|     description: 'Whether to execute `git clean -ffdx && git reset --hard HEAD` before fetching' | ||||
|     default: true | ||||
|   filter: | ||||
|     description: > | ||||
|       Partially clone against a given filter. | ||||
|       Overrides sparse-checkout if set. | ||||
|     default: null | ||||
|   sparse-checkout: | ||||
|     description: > | ||||
|       Do a sparse checkout on given patterns. | ||||
|       Each pattern should be separated with new lines | ||||
|       Each pattern should be separated with new lines. | ||||
|     default: null | ||||
|   sparse-checkout-cone-mode: | ||||
|     description: > | ||||
| @@ -65,6 +70,12 @@ inputs: | ||||
|   fetch-depth: | ||||
|     description: 'Number of commits to fetch. 0 indicates all history for all branches and tags.' | ||||
|     default: 1 | ||||
|   fetch-tags: | ||||
|     description: 'Whether to fetch tags, even if fetch-depth > 0.' | ||||
|     default: false | ||||
|   show-progress: | ||||
|     description: 'Whether to show progress status output when fetching.' | ||||
|     default: true | ||||
|   lfs: | ||||
|     description: 'Whether to download Git-LFS files' | ||||
|     default: false | ||||
| @@ -84,6 +95,6 @@ inputs: | ||||
|     description: The base URL for the GitHub instance that you are trying to clone from, will use environment defaults to fetch from the same instance that the workflow is running from unless specified. Example URLs are https://github.com or https://my-ghes-server.example.com | ||||
|     required: false | ||||
| runs: | ||||
|   using: node16 | ||||
|   using: node20 | ||||
|   main: dist/index.js | ||||
|   post: dist/index.js | ||||
|   | ||||
							
								
								
									
										32
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							| @@ -637,10 +637,13 @@ class GitCommandManager { | ||||
|     fetch(refSpec, options) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             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('--prune', '--progress', '--no-recurse-submodules'); | ||||
|             args.push('--prune', '--no-recurse-submodules'); | ||||
|             if (options.showProgress) { | ||||
|                 args.push('--progress'); | ||||
|             } | ||||
|             if (options.filter) { | ||||
|                 args.push(`--filter=${options.filter}`); | ||||
|             } | ||||
| @@ -718,8 +721,8 @@ class GitCommandManager { | ||||
|     } | ||||
|     log1(format) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             var args = format ? ['log', '-1', format] : ['log', '-1']; | ||||
|             var silent = format ? false : true; | ||||
|             const args = format ? ['log', '-1', format] : ['log', '-1']; | ||||
|             const silent = format ? false : true; | ||||
|             const output = yield this.execGit(args, false, silent); | ||||
|             return output.stdout; | ||||
|         }); | ||||
| @@ -1241,8 +1244,12 @@ function getSource(settings) { | ||||
|             // Fetch | ||||
|             core.startGroup('Fetching the repository'); | ||||
|             const fetchOptions = {}; | ||||
|             if (settings.sparseCheckout) | ||||
|             if (settings.filter) { | ||||
|                 fetchOptions.filter = settings.filter; | ||||
|             } | ||||
|             else if (settings.sparseCheckout) { | ||||
|                 fetchOptions.filter = 'blob:none'; | ||||
|             } | ||||
|             if (settings.fetchDepth <= 0) { | ||||
|                 // Fetch all branches and tags | ||||
|                 let refSpec = refHelper.getRefSpecForAllHistory(settings.ref, settings.commit); | ||||
| @@ -1256,6 +1263,7 @@ function getSource(settings) { | ||||
|             } | ||||
|             else { | ||||
|                 fetchOptions.fetchDepth = settings.fetchDepth; | ||||
|                 fetchOptions.fetchTags = settings.fetchTags; | ||||
|                 const refSpec = refHelper.getRefSpec(settings.ref, settings.commit); | ||||
|                 yield git.fetch(refSpec, fetchOptions); | ||||
|             } | ||||
| @@ -1719,6 +1727,12 @@ function getInputs() { | ||||
|         // Clean | ||||
|         result.clean = (core.getInput('clean') || 'true').toUpperCase() === 'TRUE'; | ||||
|         core.debug(`clean = ${result.clean}`); | ||||
|         // Filter | ||||
|         const filter = core.getInput('filter'); | ||||
|         if (filter) { | ||||
|             result.filter = filter; | ||||
|         } | ||||
|         core.debug(`filter = ${result.filter}`); | ||||
|         // Sparse checkout | ||||
|         const sparseCheckout = core.getMultilineInput('sparse-checkout'); | ||||
|         if (sparseCheckout.length) { | ||||
| @@ -1734,6 +1748,14 @@ function getInputs() { | ||||
|             result.fetchDepth = 0; | ||||
|         } | ||||
|         core.debug(`fetch depth = ${result.fetchDepth}`); | ||||
|         // Fetch tags | ||||
|         result.fetchTags = | ||||
|             (core.getInput('fetch-tags') || 'false').toUpperCase() === 'TRUE'; | ||||
|         core.debug(`fetch tags = ${result.fetchTags}`); | ||||
|         // Show fetch progress | ||||
|         result.showProgress = | ||||
|             (core.getInput('show-progress') || 'true').toUpperCase() === 'TRUE'; | ||||
|         core.debug(`show progress = ${result.showProgress}`); | ||||
|         // LFS | ||||
|         result.lfs = (core.getInput('lfs') || 'false').toUpperCase() === 'TRUE'; | ||||
|         core.debug(`lfs = ${result.lfs}`); | ||||
|   | ||||
							
								
								
									
										15919
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										15919
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "checkout", | ||||
|   "version": "3.5.3", | ||||
|   "version": "4.1.0", | ||||
|   "description": "checkout action", | ||||
|   "main": "lib/main.js", | ||||
|   "scripts": { | ||||
| @@ -37,7 +37,7 @@ | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@types/jest": "^27.0.2", | ||||
|     "@types/node": "^12.7.12", | ||||
|     "@types/node": "^20.5.3", | ||||
|     "@types/uuid": "^3.4.6", | ||||
|     "@typescript-eslint/eslint-plugin": "^5.45.0", | ||||
|     "@typescript-eslint/parser": "^5.45.0", | ||||
|   | ||||
| @@ -33,6 +33,8 @@ export interface IGitCommandManager { | ||||
|     options: { | ||||
|       filter?: string | ||||
|       fetchDepth?: number | ||||
|       fetchTags?: boolean | ||||
|       showProgress?: boolean | ||||
|     } | ||||
|   ): Promise<void> | ||||
|   getDefaultBranch(repositoryUrl: string): Promise<string> | ||||
| @@ -240,14 +242,22 @@ class GitCommandManager { | ||||
|  | ||||
|   async fetch( | ||||
|     refSpec: string[], | ||||
|     options: {filter?: string; fetchDepth?: number} | ||||
|     options: { | ||||
|       filter?: string | ||||
|       fetchDepth?: number | ||||
|       fetchTags?: boolean | ||||
|       showProgress?: boolean | ||||
|     } | ||||
|   ): Promise<void> { | ||||
|     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('--prune', '--progress', '--no-recurse-submodules') | ||||
|     args.push('--prune', '--no-recurse-submodules') | ||||
|     if (options.showProgress) { | ||||
|       args.push('--progress') | ||||
|     } | ||||
|  | ||||
|     if (options.filter) { | ||||
|       args.push(`--filter=${options.filter}`) | ||||
| @@ -333,8 +343,8 @@ class GitCommandManager { | ||||
|   } | ||||
|  | ||||
|   async log1(format?: string): Promise<string> { | ||||
|     var args = format ? ['log', '-1', format] : ['log', '-1'] | ||||
|     var silent = format ? false : true | ||||
|     const args = format ? ['log', '-1', format] : ['log', '-1'] | ||||
|     const silent = format ? false : true | ||||
|     const output = await this.execGit(args, false, silent) | ||||
|     return output.stdout | ||||
|   } | ||||
|   | ||||
| @@ -153,8 +153,19 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> { | ||||
|  | ||||
|     // Fetch | ||||
|     core.startGroup('Fetching the repository') | ||||
|     const fetchOptions: {filter?: string; fetchDepth?: number} = {} | ||||
|     if (settings.sparseCheckout) fetchOptions.filter = 'blob:none' | ||||
|     const fetchOptions: { | ||||
|       filter?: string | ||||
|       fetchDepth?: number | ||||
|       fetchTags?: boolean | ||||
|       showProgress?: boolean | ||||
|     } = {} | ||||
|  | ||||
|     if (settings.filter) { | ||||
|       fetchOptions.filter = settings.filter | ||||
|     } else if (settings.sparseCheckout) { | ||||
|       fetchOptions.filter = 'blob:none' | ||||
|     } | ||||
|  | ||||
|     if (settings.fetchDepth <= 0) { | ||||
|       // Fetch all branches and tags | ||||
|       let refSpec = refHelper.getRefSpecForAllHistory( | ||||
| @@ -171,6 +182,7 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> { | ||||
|       } | ||||
|     } else { | ||||
|       fetchOptions.fetchDepth = settings.fetchDepth | ||||
|       fetchOptions.fetchTags = settings.fetchTags | ||||
|       const refSpec = refHelper.getRefSpec(settings.ref, settings.commit) | ||||
|       await git.fetch(refSpec, fetchOptions) | ||||
|     } | ||||
|   | ||||
| @@ -29,6 +29,11 @@ export interface IGitSourceSettings { | ||||
|    */ | ||||
|   clean: boolean | ||||
|  | ||||
|   /** | ||||
|    * The filter determining which objects to include | ||||
|    */ | ||||
|   filter: string | undefined | ||||
|  | ||||
|   /** | ||||
|    * The array of folders to make the sparse checkout | ||||
|    */ | ||||
| @@ -44,6 +49,16 @@ export interface IGitSourceSettings { | ||||
|    */ | ||||
|   fetchDepth: number | ||||
|  | ||||
|   /** | ||||
|    * Fetch tags, even if fetchDepth > 0 (default: false) | ||||
|    */ | ||||
|   fetchTags: boolean | ||||
|  | ||||
|   /** | ||||
|    * Indicates whether to use the --progress option when fetching | ||||
|    */ | ||||
|   showProgress: boolean | ||||
|  | ||||
|   /** | ||||
|    * Indicates whether to fetch LFS objects | ||||
|    */ | ||||
|   | ||||
| @@ -82,6 +82,14 @@ export async function getInputs(): Promise<IGitSourceSettings> { | ||||
|   result.clean = (core.getInput('clean') || 'true').toUpperCase() === 'TRUE' | ||||
|   core.debug(`clean = ${result.clean}`) | ||||
|  | ||||
|   // Filter | ||||
|   const filter = core.getInput('filter') | ||||
|   if (filter) { | ||||
|     result.filter = filter | ||||
|   } | ||||
|  | ||||
|   core.debug(`filter = ${result.filter}`) | ||||
|  | ||||
|   // Sparse checkout | ||||
|   const sparseCheckout = core.getMultilineInput('sparse-checkout') | ||||
|   if (sparseCheckout.length) { | ||||
| @@ -100,6 +108,16 @@ export async function getInputs(): Promise<IGitSourceSettings> { | ||||
|   } | ||||
|   core.debug(`fetch depth = ${result.fetchDepth}`) | ||||
|  | ||||
|   // Fetch tags | ||||
|   result.fetchTags = | ||||
|     (core.getInput('fetch-tags') || 'false').toUpperCase() === 'TRUE' | ||||
|   core.debug(`fetch tags = ${result.fetchTags}`) | ||||
|  | ||||
|   // Show fetch progress | ||||
|   result.showProgress = | ||||
|     (core.getInput('show-progress') || 'true').toUpperCase() === 'TRUE' | ||||
|   core.debug(`show progress = ${result.showProgress}`) | ||||
|  | ||||
|   // LFS | ||||
|   result.lfs = (core.getInput('lfs') || 'false').toUpperCase() === 'TRUE' | ||||
|   core.debug(`lfs = ${result.lfs}`) | ||||
|   | ||||
| @@ -120,7 +120,7 @@ function updateUsage( | ||||
| } | ||||
|  | ||||
| updateUsage( | ||||
|   'actions/checkout@v3', | ||||
|   'actions/checkout@v4', | ||||
|   path.join(__dirname, '..', '..', 'action.yml'), | ||||
|   path.join(__dirname, '..', '..', 'README.md') | ||||
| ) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user