mirror of
				https://github.com/actions/checkout.git
				synced 2025-10-31 20:23:36 +00:00 
			
		
		
		
	Add option to fetch tags even if fetch-depth > 0 (#579)
* Add option to fetch tags even if fetch-depth > 0 * Add jest tests for fetchDepth and fetchTags options
This commit is contained in:
		
							parent
							
								
									96f53100ba
								
							
						
					
					
						commit
						7739b9ba2e
					
				| @ -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 |     # 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: '' | ||||||
|  | |||||||
| @ -805,6 +805,7 @@ async function setup(testName: string): Promise<void> { | |||||||
|     sparseCheckout: [], |     sparseCheckout: [], | ||||||
|     sparseCheckoutConeMode: true, |     sparseCheckoutConeMode: true, | ||||||
|     fetchDepth: 1, |     fetchDepth: 1, | ||||||
|  |     fetchTags: false, | ||||||
|     lfs: false, |     lfs: false, | ||||||
|     submodules: false, |     submodules: false, | ||||||
|     nestedSubmodules: false, |     nestedSubmodules: false, | ||||||
|  | |||||||
| @ -88,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) | ||||||
|  |     ) | ||||||
|  |   }) | ||||||
|  | }) | ||||||
|  | |||||||
| @ -82,6 +82,7 @@ describe('input-helper tests', () => { | |||||||
|     expect(settings.sparseCheckout).toBe(undefined) |     expect(settings.sparseCheckout).toBe(undefined) | ||||||
|     expect(settings.sparseCheckoutConeMode).toBe(true) |     expect(settings.sparseCheckoutConeMode).toBe(true) | ||||||
|     expect(settings.fetchDepth).toBe(1) |     expect(settings.fetchDepth).toBe(1) | ||||||
|  |     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') | ||||||
|  | |||||||
| @ -65,6 +65,9 @@ inputs: | |||||||
|   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 | ||||||
|  | |||||||
							
								
								
									
										11
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							| @ -637,7 +637,7 @@ class GitCommandManager { | |||||||
|     fetch(refSpec, options) { |     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'); | ||||||
| @ -718,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; | ||||||
|         }); |         }); | ||||||
| @ -1256,6 +1256,7 @@ function getSource(settings) { | |||||||
|             } |             } | ||||||
|             else { |             else { | ||||||
|                 fetchOptions.fetchDepth = settings.fetchDepth; |                 fetchOptions.fetchDepth = settings.fetchDepth; | ||||||
|  |                 fetchOptions.fetchTags = settings.fetchTags; | ||||||
|                 const refSpec = refHelper.getRefSpec(settings.ref, settings.commit); |                 const refSpec = refHelper.getRefSpec(settings.ref, settings.commit); | ||||||
|                 yield git.fetch(refSpec, fetchOptions); |                 yield git.fetch(refSpec, fetchOptions); | ||||||
|             } |             } | ||||||
| @ -1734,6 +1735,10 @@ function getInputs() { | |||||||
|             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}`); | ||||||
|  | |||||||
| @ -33,6 +33,7 @@ export interface IGitCommandManager { | |||||||
|     options: { |     options: { | ||||||
|       filter?: string |       filter?: string | ||||||
|       fetchDepth?: number |       fetchDepth?: number | ||||||
|  |       fetchTags?: boolean | ||||||
|     } |     } | ||||||
|   ): Promise<void> |   ): Promise<void> | ||||||
|   getDefaultBranch(repositoryUrl: string): Promise<string> |   getDefaultBranch(repositoryUrl: string): Promise<string> | ||||||
| @ -240,10 +241,10 @@ class GitCommandManager { | |||||||
| 
 | 
 | ||||||
|   async fetch( |   async fetch( | ||||||
|     refSpec: string[], |     refSpec: string[], | ||||||
|     options: {filter?: string; fetchDepth?: number} |     options: {filter?: string; fetchDepth?: number; fetchTags?: boolean} | ||||||
|   ): Promise<void> { |   ): 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') | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -333,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 | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -153,7 +153,11 @@ 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} = {} |     const fetchOptions: { | ||||||
|  |       filter?: string | ||||||
|  |       fetchDepth?: number | ||||||
|  |       fetchTags?: boolean | ||||||
|  |     } = {} | ||||||
|     if (settings.sparseCheckout) fetchOptions.filter = 'blob:none' |     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
 | ||||||
| @ -171,6 +175,7 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> { | |||||||
|       } |       } | ||||||
|     } else { |     } else { | ||||||
|       fetchOptions.fetchDepth = settings.fetchDepth |       fetchOptions.fetchDepth = settings.fetchDepth | ||||||
|  |       fetchOptions.fetchTags = settings.fetchTags | ||||||
|       const refSpec = refHelper.getRefSpec(settings.ref, settings.commit) |       const refSpec = refHelper.getRefSpec(settings.ref, settings.commit) | ||||||
|       await git.fetch(refSpec, fetchOptions) |       await git.fetch(refSpec, fetchOptions) | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -44,6 +44,11 @@ export interface IGitSourceSettings { | |||||||
|    */ |    */ | ||||||
|   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 | ||||||
|    */ |    */ | ||||||
|  | |||||||
| @ -100,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}`) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user