mirror of
				https://github.com/actions/checkout.git
				synced 2025-10-31 18:18:37 +08:00 
			
		
		
		
	Add string[] option to submodules
Allows checking out only specific submodules instead of all
This commit is contained in:
		
							parent
							
								
									9a9194f871
								
							
						
					
					
						commit
						b6625bb44a
					
				
							
								
								
									
										11
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -154,6 +154,17 @@ jobs: | |||
|           submodules: true | ||||
|       - name: Verify submodules true | ||||
|         run: __test__/verify-submodules-true.sh | ||||
|    | ||||
|       # Submodules limited | ||||
|       - name: Checkout submodules limited | ||||
|         uses: ./ | ||||
|         with: | ||||
|           ref: test-data/v2/submodule-ssh-url | ||||
|           path: submodules-true | ||||
|           submodules: true | ||||
|           submodule-directories: submodule-level-1 | ||||
|       - name: Verify submodules true | ||||
|         run: __test__/verify-submodules-true.sh | ||||
| 
 | ||||
|       # Submodules recursive | ||||
|       - name: Checkout submodules recursive | ||||
|  |  | |||
|  | @ -116,6 +116,10 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/ | |||
|     # Default: false | ||||
|     submodules: '' | ||||
| 
 | ||||
|     # A list of submodules to use when `submodules` is `true`. | ||||
|     # Default: null | ||||
|     submodule-directories: '' | ||||
| 
 | ||||
|     # Add repository path as safe.directory for Git global config by running `git | ||||
|     # config --global --add safe.directory <path>` | ||||
|     # Default: true | ||||
|  |  | |||
|  | @ -813,6 +813,7 @@ async function setup(testName: string): Promise<void> { | |||
|     lfs: false, | ||||
|     submodules: false, | ||||
|     nestedSubmodules: false, | ||||
|     submoduleDirectories: null, | ||||
|     persistCredentials: true, | ||||
|     ref: 'refs/heads/main', | ||||
|     repositoryName: 'my-repo', | ||||
|  |  | |||
|  | @ -21,6 +21,13 @@ describe('input-helper tests', () => { | |||
|     jest.spyOn(core, 'getInput').mockImplementation((name: string) => { | ||||
|       return inputs[name] | ||||
|     }) | ||||
|     // Mock getMultilineInput
 | ||||
|     jest.spyOn(core, 'getMultilineInput').mockImplementation((name: string) => { | ||||
|       const input: string[] = (inputs[name] || '') | ||||
|         .split('\n') | ||||
|         .filter(x => x !== '') | ||||
|       return input.map(inp => inp.trim()) | ||||
|     }) | ||||
| 
 | ||||
|     // Mock error/warning/info/debug
 | ||||
|     jest.spyOn(core, 'error').mockImplementation(jest.fn()) | ||||
|  | @ -87,6 +94,7 @@ describe('input-helper tests', () => { | |||
|     expect(settings.showProgress).toBe(true) | ||||
|     expect(settings.lfs).toBe(false) | ||||
|     expect(settings.ref).toBe('refs/heads/some-ref') | ||||
|     expect(settings.submoduleDirectories).toBe(null) | ||||
|     expect(settings.repositoryName).toBe('some-repo') | ||||
|     expect(settings.repositoryOwner).toBe('some-owner') | ||||
|     expect(settings.repositoryPath).toBe(gitHubWorkspace) | ||||
|  | @ -144,4 +152,13 @@ describe('input-helper tests', () => { | |||
|     const settings: IGitSourceSettings = await inputHelper.getInputs() | ||||
|     expect(settings.workflowOrganizationId).toBe(123456) | ||||
|   }) | ||||
|   it('sets submoduleDirectories', async () => { | ||||
|     inputs['submodule-directories'] = 'submodule1\nsubmodule2' | ||||
|     const settings: IGitSourceSettings = await inputHelper.getInputs() | ||||
|     expect(settings.submoduleDirectories).toStrictEqual([ | ||||
|       'submodule1', | ||||
|       'submodule2' | ||||
|     ]) | ||||
|     expect(settings.submodules).toBe(true) | ||||
|   }) | ||||
| }) | ||||
|  |  | |||
|  | @ -92,6 +92,10 @@ inputs: | |||
|       When the `ssh-key` input is not provided, SSH URLs beginning with `git@github.com:` are | ||||
|       converted to HTTPS. | ||||
|     default: false | ||||
|   submodule-directories: | ||||
|     description: > | ||||
|       A list of submodules to use when `submodules` is `true`. | ||||
|     default: null | ||||
|   set-safe-directory: | ||||
|     description: Add repository path as safe.directory for Git global config by running `git config --global --add safe.directory <path>` | ||||
|     default: true | ||||
|  |  | |||
							
								
								
									
										44
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										44
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							|  | @ -795,17 +795,32 @@ class GitCommandManager { | |||
|             yield this.execGit(args); | ||||
|         }); | ||||
|     } | ||||
|     submoduleUpdate(fetchDepth, recursive) { | ||||
|     submoduleUpdate(fetchDepth, recursive, submoduleDirectories) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             const args = ['-c', 'protocol.version=2']; | ||||
|             args.push('submodule', 'update', '--init', '--force'); | ||||
|             if (fetchDepth > 0) { | ||||
|                 args.push(`--depth=${fetchDepth}`); | ||||
|             if (submoduleDirectories) { | ||||
|                 for (const submodule of submoduleDirectories) { | ||||
|                     const args = ['-c', 'protocol.version=2']; | ||||
|                     args.push('submodule', 'update', '--init', '--force', submodule); | ||||
|                     if (fetchDepth > 0) { | ||||
|                         args.push(`--depth=${fetchDepth}`); | ||||
|                     } | ||||
|                     if (recursive) { | ||||
|                         args.push('--recursive'); | ||||
|                     } | ||||
|                     yield this.execGit(args); | ||||
|                 } | ||||
|             } | ||||
|             if (recursive) { | ||||
|                 args.push('--recursive'); | ||||
|             else { | ||||
|                 const args = ['-c', 'protocol.version=2']; | ||||
|                 args.push('submodule', 'update', '--init', '--force'); | ||||
|                 if (fetchDepth > 0) { | ||||
|                     args.push(`--depth=${fetchDepth}`); | ||||
|                 } | ||||
|                 if (recursive) { | ||||
|                     args.push('--recursive'); | ||||
|                 } | ||||
|                 yield this.execGit(args); | ||||
|             } | ||||
|             yield this.execGit(args); | ||||
|         }); | ||||
|     } | ||||
|     submoduleStatus() { | ||||
|  | @ -1342,7 +1357,7 @@ function getSource(settings) { | |||
|                 // Checkout submodules
 | ||||
|                 core.startGroup('Fetching submodules'); | ||||
|                 yield git.submoduleSync(settings.nestedSubmodules); | ||||
|                 yield git.submoduleUpdate(settings.fetchDepth, settings.nestedSubmodules); | ||||
|                 yield git.submoduleUpdate(settings.fetchDepth, settings.nestedSubmodules, settings.submoduleDirectories); | ||||
|                 yield git.submoduleForeach('git config --local gc.auto 0', settings.nestedSubmodules); | ||||
|                 core.endGroup(); | ||||
|                 // Persist credentials
 | ||||
|  | @ -1805,6 +1820,7 @@ function getInputs() { | |||
|         // Submodules
 | ||||
|         result.submodules = false; | ||||
|         result.nestedSubmodules = false; | ||||
|         result.submoduleDirectories = null; | ||||
|         const submodulesString = (core.getInput('submodules') || '').toUpperCase(); | ||||
|         if (submodulesString == 'RECURSIVE') { | ||||
|             result.submodules = true; | ||||
|  | @ -1813,8 +1829,18 @@ function getInputs() { | |||
|         else if (submodulesString == 'TRUE') { | ||||
|             result.submodules = true; | ||||
|         } | ||||
|         const submoduleDirectories = core.getMultilineInput('submodule-directories'); | ||||
|         if (submoduleDirectories.length > 0) { | ||||
|             result.submoduleDirectories = submoduleDirectories; | ||||
|             if (!result.submodules) | ||||
|                 result.submodules = true; | ||||
|         } | ||||
|         else { | ||||
|             result.submoduleDirectories = null; | ||||
|         } | ||||
|         core.debug(`submodules = ${result.submodules}`); | ||||
|         core.debug(`recursive submodules = ${result.nestedSubmodules}`); | ||||
|         core.debug(`submodule directories = ${result.submoduleDirectories}`); | ||||
|         // Auth token
 | ||||
|         result.authToken = core.getInput('token', { required: true }); | ||||
|         // SSH
 | ||||
|  |  | |||
|  | @ -54,7 +54,11 @@ export interface IGitCommandManager { | |||
|   shaExists(sha: string): Promise<boolean> | ||||
|   submoduleForeach(command: string, recursive: boolean): Promise<string> | ||||
|   submoduleSync(recursive: boolean): Promise<void> | ||||
|   submoduleUpdate(fetchDepth: number, recursive: boolean): Promise<void> | ||||
|   submoduleUpdate( | ||||
|     fetchDepth: number, | ||||
|     recursive: boolean, | ||||
|     submoduleDirectories: string[] | null | ||||
|   ): Promise<void> | ||||
|   submoduleStatus(): Promise<boolean> | ||||
|   tagExists(pattern: string): Promise<boolean> | ||||
|   tryClean(): Promise<boolean> | ||||
|  | @ -409,18 +413,38 @@ class GitCommandManager { | |||
|     await this.execGit(args) | ||||
|   } | ||||
| 
 | ||||
|   async submoduleUpdate(fetchDepth: number, recursive: boolean): Promise<void> { | ||||
|     const args = ['-c', 'protocol.version=2'] | ||||
|     args.push('submodule', 'update', '--init', '--force') | ||||
|     if (fetchDepth > 0) { | ||||
|       args.push(`--depth=${fetchDepth}`) | ||||
|     } | ||||
|   async submoduleUpdate( | ||||
|     fetchDepth: number, | ||||
|     recursive: boolean, | ||||
|     submoduleDirectories: string[] | null | ||||
|   ): Promise<void> { | ||||
|     if (submoduleDirectories) { | ||||
|       for (const submodule of submoduleDirectories) { | ||||
|         const args = ['-c', 'protocol.version=2'] | ||||
|         args.push('submodule', 'update', '--init', '--force', submodule) | ||||
|         if (fetchDepth > 0) { | ||||
|           args.push(`--depth=${fetchDepth}`) | ||||
|         } | ||||
| 
 | ||||
|     if (recursive) { | ||||
|       args.push('--recursive') | ||||
|     } | ||||
|         if (recursive) { | ||||
|           args.push('--recursive') | ||||
|         } | ||||
| 
 | ||||
|     await this.execGit(args) | ||||
|         await this.execGit(args) | ||||
|       } | ||||
|     } else { | ||||
|       const args = ['-c', 'protocol.version=2'] | ||||
|       args.push('submodule', 'update', '--init', '--force') | ||||
|       if (fetchDepth > 0) { | ||||
|         args.push(`--depth=${fetchDepth}`) | ||||
|       } | ||||
| 
 | ||||
|       if (recursive) { | ||||
|         args.push('--recursive') | ||||
|       } | ||||
| 
 | ||||
|       await this.execGit(args) | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   async submoduleStatus(): Promise<boolean> { | ||||
|  |  | |||
|  | @ -242,7 +242,11 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> { | |||
|       // Checkout submodules
 | ||||
|       core.startGroup('Fetching submodules') | ||||
|       await git.submoduleSync(settings.nestedSubmodules) | ||||
|       await git.submoduleUpdate(settings.fetchDepth, settings.nestedSubmodules) | ||||
|       await git.submoduleUpdate( | ||||
|         settings.fetchDepth, | ||||
|         settings.nestedSubmodules, | ||||
|         settings.submoduleDirectories | ||||
|       ) | ||||
|       await git.submoduleForeach( | ||||
|         'git config --local gc.auto 0', | ||||
|         settings.nestedSubmodules | ||||
|  |  | |||
|  | @ -74,6 +74,11 @@ export interface IGitSourceSettings { | |||
|    */ | ||||
|   nestedSubmodules: boolean | ||||
| 
 | ||||
|   /** | ||||
|    * Indicates which submodule paths to checkout | ||||
|    */ | ||||
|   submoduleDirectories: string[] | null | ||||
| 
 | ||||
|   /** | ||||
|    * The auth token to use when fetching the repository | ||||
|    */ | ||||
|  |  | |||
|  | @ -125,6 +125,7 @@ export async function getInputs(): Promise<IGitSourceSettings> { | |||
|   // Submodules
 | ||||
|   result.submodules = false | ||||
|   result.nestedSubmodules = false | ||||
|   result.submoduleDirectories = null | ||||
|   const submodulesString = (core.getInput('submodules') || '').toUpperCase() | ||||
|   if (submodulesString == 'RECURSIVE') { | ||||
|     result.submodules = true | ||||
|  | @ -132,9 +133,18 @@ export async function getInputs(): Promise<IGitSourceSettings> { | |||
|   } else if (submodulesString == 'TRUE') { | ||||
|     result.submodules = true | ||||
|   } | ||||
| 
 | ||||
|   const submoduleDirectories = core.getMultilineInput('submodule-directories') | ||||
|   if (submoduleDirectories.length > 0) { | ||||
|     result.submoduleDirectories = submoduleDirectories | ||||
|     if (!result.submodules) result.submodules = true | ||||
|   } else { | ||||
|     result.submoduleDirectories = null | ||||
|   } | ||||
| 
 | ||||
|   core.debug(`submodules = ${result.submodules}`) | ||||
|   core.debug(`recursive submodules = ${result.nestedSubmodules}`) | ||||
| 
 | ||||
|   core.debug(`submodule directories = ${result.submoduleDirectories}`) | ||||
|   // Auth token
 | ||||
|   result.authToken = core.getInput('token', {required: true}) | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Marcus Tillmanns
						Marcus Tillmanns