mirror of
				https://github.com/actions/checkout.git
				synced 2025-11-04 05:19:14 +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:
		
				
					committed by
					
						
						GitHub
					
				
			
			
				
	
			
			
			
						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)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user