mirror of
				https://github.com/actions/checkout.git
				synced 2025-10-25 23:04:08 +08:00 
			
		
		
		
	Compare commits
	
		
			3 Commits
		
	
	
		
			v3.5.3
			...
			releases/v
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | f43a0e5ff2 | ||
|   | 7739b9ba2e | ||
|   | 96f53100ba | 
| @@ -1,5 +1,9 @@ | ||||
| # 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) | ||||
|   | ||||
| @@ -87,6 +87,10 @@ 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 download Git-LFS files | ||||
|     # Default: false | ||||
|     lfs: '' | ||||
|   | ||||
| @@ -805,6 +805,7 @@ async function setup(testName: string): Promise<void> { | ||||
|     sparseCheckout: [], | ||||
|     sparseCheckoutConeMode: true, | ||||
|     fetchDepth: 1, | ||||
|     fetchTags: false, | ||||
|     lfs: false, | ||||
|     submodules: false, | ||||
|     nestedSubmodules: false, | ||||
|   | ||||
| @@ -88,3 +88,179 @@ 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', | ||||
|         '--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) | ||||
|     ) | ||||
|   }) | ||||
| }) | ||||
|   | ||||
| @@ -82,6 +82,7 @@ describe('input-helper tests', () => { | ||||
|     expect(settings.sparseCheckout).toBe(undefined) | ||||
|     expect(settings.sparseCheckoutConeMode).toBe(true) | ||||
|     expect(settings.fetchDepth).toBe(1) | ||||
|     expect(settings.fetchTags).toBe(false) | ||||
|     expect(settings.lfs).toBe(false) | ||||
|     expect(settings.ref).toBe('refs/heads/some-ref') | ||||
|     expect(settings.repositoryName).toBe('some-repo') | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -65,6 +65,9 @@ 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 | ||||
|   lfs: | ||||
|     description: 'Whether to download Git-LFS files' | ||||
|     default: false | ||||
|   | ||||
							
								
								
									
										11
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							| @@ -637,7 +637,7 @@ 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'); | ||||
| @@ -718,8 +718,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; | ||||
|         }); | ||||
| @@ -1256,6 +1256,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); | ||||
|             } | ||||
| @@ -1734,6 +1735,10 @@ 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}`); | ||||
|         // LFS | ||||
|         result.lfs = (core.getInput('lfs') || 'false').toUpperCase() === 'TRUE'; | ||||
|         core.debug(`lfs = ${result.lfs}`); | ||||
|   | ||||
							
								
								
									
										4
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -1,12 +1,12 @@ | ||||
| { | ||||
|   "name": "checkout", | ||||
|   "version": "3.5.3", | ||||
|   "version": "3.6.0", | ||||
|   "lockfileVersion": 2, | ||||
|   "requires": true, | ||||
|   "packages": { | ||||
|     "": { | ||||
|       "name": "checkout", | ||||
|       "version": "3.5.3", | ||||
|       "version": "3.6.0", | ||||
|       "license": "MIT", | ||||
|       "dependencies": { | ||||
|         "@actions/core": "^1.10.0", | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "checkout", | ||||
|   "version": "3.5.3", | ||||
|   "version": "3.6.0", | ||||
|   "description": "checkout action", | ||||
|   "main": "lib/main.js", | ||||
|   "scripts": { | ||||
| @@ -52,4 +52,4 @@ | ||||
|     "ts-jest": "^27.0.7", | ||||
|     "typescript": "^4.4.4" | ||||
|   } | ||||
| } | ||||
| } | ||||
| @@ -33,6 +33,7 @@ export interface IGitCommandManager { | ||||
|     options: { | ||||
|       filter?: string | ||||
|       fetchDepth?: number | ||||
|       fetchTags?: boolean | ||||
|     } | ||||
|   ): Promise<void> | ||||
|   getDefaultBranch(repositoryUrl: string): Promise<string> | ||||
| @@ -240,10 +241,10 @@ class GitCommandManager { | ||||
|  | ||||
|   async fetch( | ||||
|     refSpec: string[], | ||||
|     options: {filter?: string; fetchDepth?: number} | ||||
|     options: {filter?: string; fetchDepth?: number; fetchTags?: 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') | ||||
|     } | ||||
|  | ||||
| @@ -333,8 +334,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,7 +153,11 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> { | ||||
|  | ||||
|     // Fetch | ||||
|     core.startGroup('Fetching the repository') | ||||
|     const fetchOptions: {filter?: string; fetchDepth?: number} = {} | ||||
|     const fetchOptions: { | ||||
|       filter?: string | ||||
|       fetchDepth?: number | ||||
|       fetchTags?: boolean | ||||
|     } = {} | ||||
|     if (settings.sparseCheckout) fetchOptions.filter = 'blob:none' | ||||
|     if (settings.fetchDepth <= 0) { | ||||
|       // Fetch all branches and tags | ||||
| @@ -171,6 +175,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) | ||||
|     } | ||||
|   | ||||
| @@ -44,6 +44,11 @@ export interface IGitSourceSettings { | ||||
|    */ | ||||
|   fetchDepth: number | ||||
|  | ||||
|   /** | ||||
|    * Fetch tags, even if fetchDepth > 0 (default: false) | ||||
|    */ | ||||
|   fetchTags: boolean | ||||
|  | ||||
|   /** | ||||
|    * Indicates whether to fetch LFS objects | ||||
|    */ | ||||
|   | ||||
| @@ -100,6 +100,11 @@ 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}`) | ||||
|  | ||||
|   // LFS | ||||
|   result.lfs = (core.getInput('lfs') || 'false').toUpperCase() === 'TRUE' | ||||
|   core.debug(`lfs = ${result.lfs}`) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user