mirror of
				https://github.com/actions/checkout.git
				synced 2025-10-31 18:34:20 +08:00 
			
		
		
		
	Add support for partial checkout filters (#1396)
* added filter option & tests * added build file * fix test oversight * added exit 1 * updated docs to specify override * undo unneeded readme change * set to undefined rather than empty string * run git config in correct di --------- Co-authored-by: Cory Miller <13227161+cory-miller@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									72f2cec99f
								
							
						
					
					
						commit
						c533a0a4cf
					
				
							
								
								
									
										10
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							| @ -72,6 +72,16 @@ jobs: | |||||||
|         shell: bash |         shell: bash | ||||||
|         run: __test__/verify-side-by-side.sh |         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 |       # Sparse checkout | ||||||
|       - name: Sparse checkout |       - name: Sparse checkout | ||||||
|         uses: ./ |         uses: ./ | ||||||
|  | |||||||
| @ -75,8 +75,12 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl | |||||||
|     # Default: true |     # Default: true | ||||||
|     clean: '' |     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 |     # Do a sparse checkout on given patterns. Each pattern should be separated with | ||||||
|     # new lines |     # new lines. | ||||||
|     # Default: null |     # Default: null | ||||||
|     sparse-checkout: '' |     sparse-checkout: '' | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -802,6 +802,7 @@ async function setup(testName: string): Promise<void> { | |||||||
|     authToken: 'some auth token', |     authToken: 'some auth token', | ||||||
|     clean: true, |     clean: true, | ||||||
|     commit: '', |     commit: '', | ||||||
|  |     filter: undefined, | ||||||
|     sparseCheckout: [], |     sparseCheckout: [], | ||||||
|     sparseCheckoutConeMode: true, |     sparseCheckoutConeMode: true, | ||||||
|     fetchDepth: 1, |     fetchDepth: 1, | ||||||
|  | |||||||
| @ -79,6 +79,7 @@ describe('input-helper tests', () => { | |||||||
|     expect(settings.clean).toBe(true) |     expect(settings.clean).toBe(true) | ||||||
|     expect(settings.commit).toBeTruthy() |     expect(settings.commit).toBeTruthy() | ||||||
|     expect(settings.commit).toBe('1234567890123456789012345678901234567890') |     expect(settings.commit).toBe('1234567890123456789012345678901234567890') | ||||||
|  |     expect(settings.filter).toBe(undefined) | ||||||
|     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) | ||||||
|  | |||||||
							
								
								
									
										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 | ||||||
| @ -53,10 +53,15 @@ inputs: | |||||||
|   clean: |   clean: | ||||||
|     description: 'Whether to execute `git clean -ffdx && git reset --hard HEAD` before fetching' |     description: 'Whether to execute `git clean -ffdx && git reset --hard HEAD` before fetching' | ||||||
|     default: true |     default: true | ||||||
|  |   filter: | ||||||
|  |     description: > | ||||||
|  |       Partially clone against a given filter. | ||||||
|  |       Overrides sparse-checkout if set. | ||||||
|  |     default: null | ||||||
|   sparse-checkout: |   sparse-checkout: | ||||||
|     description: > |     description: > | ||||||
|       Do a sparse checkout on given patterns. |       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 |     default: null | ||||||
|   sparse-checkout-cone-mode: |   sparse-checkout-cone-mode: | ||||||
|     description: > |     description: > | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							| @ -1244,8 +1244,12 @@ function getSource(settings) { | |||||||
|             // Fetch
 |             // Fetch
 | ||||||
|             core.startGroup('Fetching the repository'); |             core.startGroup('Fetching the repository'); | ||||||
|             const fetchOptions = {}; |             const fetchOptions = {}; | ||||||
|             if (settings.sparseCheckout) |             if (settings.filter) { | ||||||
|  |                 fetchOptions.filter = settings.filter; | ||||||
|  |             } | ||||||
|  |             else if (settings.sparseCheckout) { | ||||||
|                 fetchOptions.filter = 'blob:none'; |                 fetchOptions.filter = 'blob:none'; | ||||||
|  |             } | ||||||
|             if (settings.fetchDepth <= 0) { |             if (settings.fetchDepth <= 0) { | ||||||
|                 // Fetch all branches and tags
 |                 // Fetch all branches and tags
 | ||||||
|                 let refSpec = refHelper.getRefSpecForAllHistory(settings.ref, settings.commit); |                 let refSpec = refHelper.getRefSpecForAllHistory(settings.ref, settings.commit); | ||||||
| @ -1723,6 +1727,12 @@ function getInputs() { | |||||||
|         // Clean
 |         // Clean
 | ||||||
|         result.clean = (core.getInput('clean') || 'true').toUpperCase() === 'TRUE'; |         result.clean = (core.getInput('clean') || 'true').toUpperCase() === 'TRUE'; | ||||||
|         core.debug(`clean = ${result.clean}`); |         core.debug(`clean = ${result.clean}`); | ||||||
|  |         // Filter
 | ||||||
|  |         const filter = core.getInput('filter'); | ||||||
|  |         if (filter) { | ||||||
|  |             result.filter = filter; | ||||||
|  |         } | ||||||
|  |         core.debug(`filter = ${result.filter}`); | ||||||
|         // Sparse checkout
 |         // Sparse checkout
 | ||||||
|         const sparseCheckout = core.getMultilineInput('sparse-checkout'); |         const sparseCheckout = core.getMultilineInput('sparse-checkout'); | ||||||
|         if (sparseCheckout.length) { |         if (sparseCheckout.length) { | ||||||
|  | |||||||
| @ -159,7 +159,13 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> { | |||||||
|       fetchTags?: boolean |       fetchTags?: boolean | ||||||
|       showProgress?: boolean |       showProgress?: boolean | ||||||
|     } = {} |     } = {} | ||||||
|     if (settings.sparseCheckout) fetchOptions.filter = 'blob:none' | 
 | ||||||
|  |     if (settings.filter) { | ||||||
|  |       fetchOptions.filter = settings.filter | ||||||
|  |     } else 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
 | ||||||
|       let refSpec = refHelper.getRefSpecForAllHistory( |       let refSpec = refHelper.getRefSpecForAllHistory( | ||||||
|  | |||||||
| @ -29,6 +29,11 @@ export interface IGitSourceSettings { | |||||||
|    */ |    */ | ||||||
|   clean: boolean |   clean: boolean | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * The filter determining which objects to include | ||||||
|  |    */ | ||||||
|  |   filter: string | undefined | ||||||
|  | 
 | ||||||
|   /** |   /** | ||||||
|    * The array of folders to make the sparse checkout |    * The array of folders to make the sparse checkout | ||||||
|    */ |    */ | ||||||
|  | |||||||
| @ -82,6 +82,14 @@ export async function getInputs(): Promise<IGitSourceSettings> { | |||||||
|   result.clean = (core.getInput('clean') || 'true').toUpperCase() === 'TRUE' |   result.clean = (core.getInput('clean') || 'true').toUpperCase() === 'TRUE' | ||||||
|   core.debug(`clean = ${result.clean}`) |   core.debug(`clean = ${result.clean}`) | ||||||
| 
 | 
 | ||||||
|  |   // Filter
 | ||||||
|  |   const filter = core.getInput('filter') | ||||||
|  |   if (filter) { | ||||||
|  |     result.filter = filter | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   core.debug(`filter = ${result.filter}`) | ||||||
|  | 
 | ||||||
|   // Sparse checkout
 |   // Sparse checkout
 | ||||||
|   const sparseCheckout = core.getMultilineInput('sparse-checkout') |   const sparseCheckout = core.getMultilineInput('sparse-checkout') | ||||||
|   if (sparseCheckout.length) { |   if (sparseCheckout.length) { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Finley Garton
						Finley Garton