mirror of
https://github.com/actions/checkout
synced 2024-12-22 13:12:42 +00: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
6 changed files with 36 additions and 4 deletions
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…
Reference in a new issue