mirror of
				https://github.com/actions/checkout.git
				synced 2025-10-31 19:43:37 +00:00 
			
		
		
		
	Merge 7618b1f4010086b3da48eaecce4a26738f216281 into ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493
This commit is contained in:
		
						commit
						945f899b9c
					
				
							
								
								
									
										11
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							| @ -154,6 +154,17 @@ jobs: | |||||||
|           submodules: true |           submodules: true | ||||||
|       - name: Verify submodules true |       - name: Verify submodules true | ||||||
|         run: __test__/verify-submodules-true.sh |         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 |       # Submodules recursive | ||||||
|       - name: Checkout submodules recursive |       - name: Checkout submodules recursive | ||||||
|  | |||||||
| @ -142,6 +142,10 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/ | |||||||
|     # Default: false |     # Default: false | ||||||
|     submodules: '' |     submodules: '' | ||||||
| 
 | 
 | ||||||
|  |     # A list of submodules to checkout. | ||||||
|  |     # Default: null | ||||||
|  |     submodule-directories: '' | ||||||
|  | 
 | ||||||
|     # Add repository path as safe.directory for Git global config by running `git |     # Add repository path as safe.directory for Git global config by running `git | ||||||
|     # config --global --add safe.directory <path>` |     # config --global --add safe.directory <path>` | ||||||
|     # Default: true |     # Default: true | ||||||
|  | |||||||
| @ -813,6 +813,7 @@ async function setup(testName: string): Promise<void> { | |||||||
|     lfs: false, |     lfs: false, | ||||||
|     submodules: false, |     submodules: false, | ||||||
|     nestedSubmodules: false, |     nestedSubmodules: false, | ||||||
|  |     submoduleDirectories: [], | ||||||
|     persistCredentials: true, |     persistCredentials: true, | ||||||
|     ref: 'refs/heads/main', |     ref: 'refs/heads/main', | ||||||
|     repositoryName: 'my-repo', |     repositoryName: 'my-repo', | ||||||
|  | |||||||
| @ -21,6 +21,13 @@ describe('input-helper tests', () => { | |||||||
|     jest.spyOn(core, 'getInput').mockImplementation((name: string) => { |     jest.spyOn(core, 'getInput').mockImplementation((name: string) => { | ||||||
|       return inputs[name] |       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
 |     // Mock error/warning/info/debug
 | ||||||
|     jest.spyOn(core, 'error').mockImplementation(jest.fn()) |     jest.spyOn(core, 'error').mockImplementation(jest.fn()) | ||||||
| @ -87,6 +94,7 @@ describe('input-helper tests', () => { | |||||||
|     expect(settings.showProgress).toBe(true) |     expect(settings.showProgress).toBe(true) | ||||||
|     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.submoduleDirectories).toStrictEqual([]) | ||||||
|     expect(settings.repositoryName).toBe('some-repo') |     expect(settings.repositoryName).toBe('some-repo') | ||||||
|     expect(settings.repositoryOwner).toBe('some-owner') |     expect(settings.repositoryOwner).toBe('some-owner') | ||||||
|     expect(settings.repositoryPath).toBe(gitHubWorkspace) |     expect(settings.repositoryPath).toBe(gitHubWorkspace) | ||||||
| @ -144,4 +152,13 @@ describe('input-helper tests', () => { | |||||||
|     const settings: IGitSourceSettings = await inputHelper.getInputs() |     const settings: IGitSourceSettings = await inputHelper.getInputs() | ||||||
|     expect(settings.workflowOrganizationId).toBe(123456) |     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 |       When the `ssh-key` input is not provided, SSH URLs beginning with `git@github.com:` are | ||||||
|       converted to HTTPS. |       converted to HTTPS. | ||||||
|     default: false |     default: false | ||||||
|  |   submodule-directories: | ||||||
|  |     description: > | ||||||
|  |       A list of submodules to checkout. | ||||||
|  |     default: null | ||||||
|   set-safe-directory: |   set-safe-directory: | ||||||
|     description: Add repository path as safe.directory for Git global config by running `git config --global --add safe.directory <path>` |     description: Add repository path as safe.directory for Git global config by running `git config --global --add safe.directory <path>` | ||||||
|     default: true |     default: true | ||||||
|  | |||||||
							
								
								
									
										14
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							| @ -793,10 +793,10 @@ class GitCommandManager { | |||||||
|             yield this.execGit(args); |             yield this.execGit(args); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|     submoduleUpdate(fetchDepth, recursive) { |     submoduleUpdate(fetchDepth, recursive, submoduleDirectories) { | ||||||
|         return __awaiter(this, void 0, void 0, function* () { |         return __awaiter(this, void 0, void 0, function* () { | ||||||
|             const args = ['-c', 'protocol.version=2']; |             const args = ['-c', 'protocol.version=2']; | ||||||
|             args.push('submodule', 'update', '--init', '--force'); |             args.push('submodule', 'update', '--init', '--force', ...submoduleDirectories); | ||||||
|             if (fetchDepth > 0) { |             if (fetchDepth > 0) { | ||||||
|                 args.push(`--depth=${fetchDepth}`); |                 args.push(`--depth=${fetchDepth}`); | ||||||
|             } |             } | ||||||
| @ -1340,7 +1340,7 @@ function getSource(settings) { | |||||||
|                 // Checkout submodules
 |                 // Checkout submodules
 | ||||||
|                 core.startGroup('Fetching submodules'); |                 core.startGroup('Fetching submodules'); | ||||||
|                 yield git.submoduleSync(settings.nestedSubmodules); |                 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); |                 yield git.submoduleForeach('git config --local gc.auto 0', settings.nestedSubmodules); | ||||||
|                 core.endGroup(); |                 core.endGroup(); | ||||||
|                 // Persist credentials
 |                 // Persist credentials
 | ||||||
| @ -1801,6 +1801,7 @@ function getInputs() { | |||||||
|         // Submodules
 |         // Submodules
 | ||||||
|         result.submodules = false; |         result.submodules = false; | ||||||
|         result.nestedSubmodules = false; |         result.nestedSubmodules = false; | ||||||
|  |         result.submoduleDirectories = []; | ||||||
|         const submodulesString = (core.getInput('submodules') || '').toUpperCase(); |         const submodulesString = (core.getInput('submodules') || '').toUpperCase(); | ||||||
|         if (submodulesString == 'RECURSIVE') { |         if (submodulesString == 'RECURSIVE') { | ||||||
|             result.submodules = true; |             result.submodules = true; | ||||||
| @ -1809,8 +1810,15 @@ function getInputs() { | |||||||
|         else if (submodulesString == 'TRUE') { |         else if (submodulesString == 'TRUE') { | ||||||
|             result.submodules = true; |             result.submodules = true; | ||||||
|         } |         } | ||||||
|  |         const submoduleDirectories = core.getMultilineInput('submodule-directories'); | ||||||
|  |         if (submoduleDirectories.length > 0) { | ||||||
|  |             result.submoduleDirectories = submoduleDirectories; | ||||||
|  |             if (!result.submodules) | ||||||
|  |                 result.submodules = true; | ||||||
|  |         } | ||||||
|         core.debug(`submodules = ${result.submodules}`); |         core.debug(`submodules = ${result.submodules}`); | ||||||
|         core.debug(`recursive submodules = ${result.nestedSubmodules}`); |         core.debug(`recursive submodules = ${result.nestedSubmodules}`); | ||||||
|  |         core.debug(`submodule directories = ${result.submoduleDirectories}`); | ||||||
|         // Auth token
 |         // Auth token
 | ||||||
|         result.authToken = core.getInput('token', { required: true }); |         result.authToken = core.getInput('token', { required: true }); | ||||||
|         // SSH
 |         // SSH
 | ||||||
|  | |||||||
| @ -54,7 +54,11 @@ export interface IGitCommandManager { | |||||||
|   shaExists(sha: string): Promise<boolean> |   shaExists(sha: string): Promise<boolean> | ||||||
|   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, | ||||||
|  |     submoduleDirectories: string[] | ||||||
|  |   ): Promise<void> | ||||||
|   submoduleStatus(): Promise<boolean> |   submoduleStatus(): Promise<boolean> | ||||||
|   tagExists(pattern: string): Promise<boolean> |   tagExists(pattern: string): Promise<boolean> | ||||||
|   tryClean(): Promise<boolean> |   tryClean(): Promise<boolean> | ||||||
| @ -409,9 +413,19 @@ class GitCommandManager { | |||||||
|     await this.execGit(args) |     await this.execGit(args) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   async submoduleUpdate(fetchDepth: number, recursive: boolean): Promise<void> { |   async submoduleUpdate( | ||||||
|  |     fetchDepth: number, | ||||||
|  |     recursive: boolean, | ||||||
|  |     submoduleDirectories: string[] | ||||||
|  |   ): Promise<void> { | ||||||
|     const args = ['-c', 'protocol.version=2'] |     const args = ['-c', 'protocol.version=2'] | ||||||
|     args.push('submodule', 'update', '--init', '--force') |     args.push( | ||||||
|  |       'submodule', | ||||||
|  |       'update', | ||||||
|  |       '--init', | ||||||
|  |       '--force', | ||||||
|  |       ...submoduleDirectories | ||||||
|  |     ) | ||||||
|     if (fetchDepth > 0) { |     if (fetchDepth > 0) { | ||||||
|       args.push(`--depth=${fetchDepth}`) |       args.push(`--depth=${fetchDepth}`) | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -242,7 +242,11 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> { | |||||||
|       // Checkout submodules
 |       // Checkout submodules
 | ||||||
|       core.startGroup('Fetching submodules') |       core.startGroup('Fetching submodules') | ||||||
|       await git.submoduleSync(settings.nestedSubmodules) |       await git.submoduleSync(settings.nestedSubmodules) | ||||||
|       await git.submoduleUpdate(settings.fetchDepth, settings.nestedSubmodules) |       await git.submoduleUpdate( | ||||||
|  |         settings.fetchDepth, | ||||||
|  |         settings.nestedSubmodules, | ||||||
|  |         settings.submoduleDirectories | ||||||
|  |       ) | ||||||
|       await git.submoduleForeach( |       await git.submoduleForeach( | ||||||
|         'git config --local gc.auto 0', |         'git config --local gc.auto 0', | ||||||
|         settings.nestedSubmodules |         settings.nestedSubmodules | ||||||
|  | |||||||
| @ -74,6 +74,11 @@ export interface IGitSourceSettings { | |||||||
|    */ |    */ | ||||||
|   nestedSubmodules: boolean |   nestedSubmodules: boolean | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * Indicates which submodule paths to checkout | ||||||
|  |    */ | ||||||
|  |   submoduleDirectories: string[] | ||||||
|  | 
 | ||||||
|   /** |   /** | ||||||
|    * The auth token to use when fetching the repository |    * The auth token to use when fetching the repository | ||||||
|    */ |    */ | ||||||
|  | |||||||
| @ -125,6 +125,7 @@ export async function getInputs(): Promise<IGitSourceSettings> { | |||||||
|   // Submodules
 |   // Submodules
 | ||||||
|   result.submodules = false |   result.submodules = false | ||||||
|   result.nestedSubmodules = false |   result.nestedSubmodules = false | ||||||
|  |   result.submoduleDirectories = [] | ||||||
|   const submodulesString = (core.getInput('submodules') || '').toUpperCase() |   const submodulesString = (core.getInput('submodules') || '').toUpperCase() | ||||||
|   if (submodulesString == 'RECURSIVE') { |   if (submodulesString == 'RECURSIVE') { | ||||||
|     result.submodules = true |     result.submodules = true | ||||||
| @ -132,9 +133,16 @@ export async function getInputs(): Promise<IGitSourceSettings> { | |||||||
|   } else if (submodulesString == 'TRUE') { |   } else if (submodulesString == 'TRUE') { | ||||||
|     result.submodules = true |     result.submodules = true | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   const submoduleDirectories = core.getMultilineInput('submodule-directories') | ||||||
|  |   if (submoduleDirectories.length > 0) { | ||||||
|  |     result.submoduleDirectories = submoduleDirectories | ||||||
|  |     if (!result.submodules) result.submodules = true | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   core.debug(`submodules = ${result.submodules}`) |   core.debug(`submodules = ${result.submodules}`) | ||||||
|   core.debug(`recursive submodules = ${result.nestedSubmodules}`) |   core.debug(`recursive submodules = ${result.nestedSubmodules}`) | ||||||
| 
 |   core.debug(`submodule directories = ${result.submoduleDirectories}`) | ||||||
|   // Auth token
 |   // Auth token
 | ||||||
|   result.authToken = core.getInput('token', {required: true}) |   result.authToken = core.getInput('token', {required: true}) | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user