mirror of
				https://github.com/actions/checkout.git
				synced 2025-10-31 02:14:20 +08:00 
			
		
		
		
	Explicitly disable sparse checkout unless asked for (#1598)
When a worktree is reused by actions/checkout and the first time sparse checkout was enabled, we need to ensure that the second time it is only a sparse checkout if explicitly asked for. Otherwise, we need to disable the sparse checkout so that a full checkout is the outcome of this Action. ## Details * If no `sparse-checkout` parameter is specified, disable it This should allow users to reuse existing folders when running `actions/checkout` where a previous run asked for a sparse checkout but the current run does not ask for a sparse checkout. This fixes https://github.com/actions/checkout/issues/1475 There are use cases in particular with non-ephemeral (self-hosted) runners where an existing worktree (that has been initialized as a sparse checkout) is reused in subsequent CI runs (where `actions/checkout` is run _without_ any `sparse-checkout` parameter). In these scenarios, we need to make sure that the sparse checkout is disabled before checking out the files. ### Also includes: * npm run build * ci: verify that an existing sparse checkout can be made unsparse * Added a clarifying comment about test branches. * `test-proxy` now uses newly-minted `test-ubuntu-git` container image from ghcr.io --------- Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Co-authored-by: John Wesley Walker III <81404201+jww3@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									df0bcddf6d
								
							
						
					
					
						commit
						aadec89964
					
				
							
								
								
									
										19
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							| @ -7,6 +7,11 @@ on: | |||||||
|       - main |       - main | ||||||
|       - releases/* |       - releases/* | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | # Note that when you see patterns like "ref: test-data/v2/basic" within this workflow,  | ||||||
|  | # these refer to "test-data" branches on this actions/checkout repo. | ||||||
|  | # (For example, test-data/v2/basic -> https://github.com/actions/checkout/tree/test-data/v2/basic) | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   build: |   build: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
| @ -95,6 +100,16 @@ jobs: | |||||||
|       - name: Verify sparse checkout |       - name: Verify sparse checkout | ||||||
|         run: __test__/verify-sparse-checkout.sh |         run: __test__/verify-sparse-checkout.sh | ||||||
| 
 | 
 | ||||||
|  |       # Disabled sparse checkout in existing checkout | ||||||
|  |       - name: Disabled sparse checkout | ||||||
|  |         uses: ./ | ||||||
|  |         with: | ||||||
|  |           path: sparse-checkout | ||||||
|  | 
 | ||||||
|  |       - name: Verify disabled sparse checkout | ||||||
|  |         shell: bash | ||||||
|  |         run: set -x && ls -l sparse-checkout/src/git-command-manager.ts | ||||||
|  | 
 | ||||||
|       # Sparse checkout (non-cone mode) |       # Sparse checkout (non-cone mode) | ||||||
|       - name: Sparse checkout (non-cone mode) |       - name: Sparse checkout (non-cone mode) | ||||||
|         uses: ./ |         uses: ./ | ||||||
| @ -175,7 +190,7 @@ jobs: | |||||||
|   test-proxy: |   test-proxy: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     container: |     container: | ||||||
|       image: alpine/git:latest |       image: ghcr.io/actions/test-ubuntu-git:main.20240221.114913.703z | ||||||
|       options: --dns 127.0.0.1 |       options: --dns 127.0.0.1 | ||||||
|     services: |     services: | ||||||
|       squid-proxy: |       squid-proxy: | ||||||
| @ -279,4 +294,4 @@ jobs: | |||||||
|       - name: Fix Checkout v3 |       - name: Fix Checkout v3 | ||||||
|         uses: actions/checkout@v3 |         uses: actions/checkout@v3 | ||||||
|         with: |         with: | ||||||
|           path: v3 |           path: v3 | ||||||
|  | |||||||
| @ -727,6 +727,7 @@ async function setup(testName: string): Promise<void> { | |||||||
|     branchDelete: jest.fn(), |     branchDelete: jest.fn(), | ||||||
|     branchExists: jest.fn(), |     branchExists: jest.fn(), | ||||||
|     branchList: jest.fn(), |     branchList: jest.fn(), | ||||||
|  |     disableSparseCheckout: jest.fn(), | ||||||
|     sparseCheckout: jest.fn(), |     sparseCheckout: jest.fn(), | ||||||
|     sparseCheckoutNonConeMode: jest.fn(), |     sparseCheckoutNonConeMode: jest.fn(), | ||||||
|     checkout: jest.fn(), |     checkout: jest.fn(), | ||||||
|  | |||||||
| @ -462,6 +462,7 @@ async function setup(testName: string): Promise<void> { | |||||||
|     branchList: jest.fn(async () => { |     branchList: jest.fn(async () => { | ||||||
|       return [] |       return [] | ||||||
|     }), |     }), | ||||||
|  |     disableSparseCheckout: jest.fn(), | ||||||
|     sparseCheckout: jest.fn(), |     sparseCheckout: jest.fn(), | ||||||
|     sparseCheckoutNonConeMode: jest.fn(), |     sparseCheckoutNonConeMode: jest.fn(), | ||||||
|     checkout: jest.fn(), |     checkout: jest.fn(), | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							| @ -576,6 +576,11 @@ class GitCommandManager { | |||||||
|             return result; |             return result; | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  |     disableSparseCheckout() { | ||||||
|  |         return __awaiter(this, void 0, void 0, function* () { | ||||||
|  |             yield this.execGit(['sparse-checkout', 'disable']); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|     sparseCheckout(sparseCheckout) { |     sparseCheckout(sparseCheckout) { | ||||||
|         return __awaiter(this, void 0, void 0, function* () { |         return __awaiter(this, void 0, void 0, function* () { | ||||||
|             yield this.execGit(['sparse-checkout', 'set', ...sparseCheckout]); |             yield this.execGit(['sparse-checkout', 'set', ...sparseCheckout]); | ||||||
| @ -1282,7 +1287,10 @@ function getSource(settings) { | |||||||
|                 core.endGroup(); |                 core.endGroup(); | ||||||
|             } |             } | ||||||
|             // Sparse checkout
 |             // Sparse checkout
 | ||||||
|             if (settings.sparseCheckout) { |             if (!settings.sparseCheckout) { | ||||||
|  |                 yield git.disableSparseCheckout(); | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|                 core.startGroup('Setting up sparse checkout'); |                 core.startGroup('Setting up sparse checkout'); | ||||||
|                 if (settings.sparseCheckoutConeMode) { |                 if (settings.sparseCheckoutConeMode) { | ||||||
|                     yield git.sparseCheckout(settings.sparseCheckout); |                     yield git.sparseCheckout(settings.sparseCheckout); | ||||||
|  | |||||||
| @ -17,6 +17,7 @@ export interface IGitCommandManager { | |||||||
|   branchDelete(remote: boolean, branch: string): Promise<void> |   branchDelete(remote: boolean, branch: string): Promise<void> | ||||||
|   branchExists(remote: boolean, pattern: string): Promise<boolean> |   branchExists(remote: boolean, pattern: string): Promise<boolean> | ||||||
|   branchList(remote: boolean): Promise<string[]> |   branchList(remote: boolean): Promise<string[]> | ||||||
|  |   disableSparseCheckout(): Promise<void> | ||||||
|   sparseCheckout(sparseCheckout: string[]): Promise<void> |   sparseCheckout(sparseCheckout: string[]): Promise<void> | ||||||
|   sparseCheckoutNonConeMode(sparseCheckout: string[]): Promise<void> |   sparseCheckoutNonConeMode(sparseCheckout: string[]): Promise<void> | ||||||
|   checkout(ref: string, startPoint: string): Promise<void> |   checkout(ref: string, startPoint: string): Promise<void> | ||||||
| @ -171,6 +172,10 @@ class GitCommandManager { | |||||||
|     return result |     return result | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   async disableSparseCheckout(): Promise<void> { | ||||||
|  |     await this.execGit(['sparse-checkout', 'disable']) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   async sparseCheckout(sparseCheckout: string[]): Promise<void> { |   async sparseCheckout(sparseCheckout: string[]): Promise<void> { | ||||||
|     await this.execGit(['sparse-checkout', 'set', ...sparseCheckout]) |     await this.execGit(['sparse-checkout', 'set', ...sparseCheckout]) | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -208,7 +208,9 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Sparse checkout
 |     // Sparse checkout
 | ||||||
|     if (settings.sparseCheckout) { |     if (!settings.sparseCheckout) { | ||||||
|  |       await git.disableSparseCheckout() | ||||||
|  |     } else { | ||||||
|       core.startGroup('Setting up sparse checkout') |       core.startGroup('Setting up sparse checkout') | ||||||
|       if (settings.sparseCheckoutConeMode) { |       if (settings.sparseCheckoutConeMode) { | ||||||
|         await git.sparseCheckout(settings.sparseCheckout) |         await git.sparseCheckout(settings.sparseCheckout) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Johannes Schindelin
						Johannes Schindelin