From 9a73efb9ba8dd1bd7f5450016d7df988e13aa094 Mon Sep 17 00:00:00 2001 From: Gregory Bonaert Date: Wed, 9 Apr 2025 17:24:36 +0200 Subject: [PATCH] Exclude path from clean --- README.md | 9 ++++++++- src/git-command-manager.ts | 11 ++++++++--- src/git-directory-helper.ts | 3 ++- src/git-source-provider.ts | 1 + src/git-source-settings.ts | 5 +++++ src/input-helper.ts | 4 ++++ 6 files changed, 28 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 64dc025..53e1582 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ [![Build and Test](https://github.com/actions/checkout/actions/workflows/test.yml/badge.svg)](https://github.com/actions/checkout/actions/workflows/test.yml) +Changes compared to https://github.com/actions/checkout: +- Can exclude path when cleaning repository + + # Checkout V4 This action checks-out your repository under `$GITHUB_WORKSPACE`, so your workflow can access it. @@ -77,7 +81,10 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/ # Whether to execute `git clean -ffdx && git reset --hard HEAD` before fetching # Default: true clean: '' - + + # Path to exclude from cleaning + exclude_from_clean: '' + # Partially clone against a given filter. Overrides sparse-checkout if set. # Default: null filter: '' diff --git a/src/git-command-manager.ts b/src/git-command-manager.ts index 8e42a38..bcba801 100644 --- a/src/git-command-manager.ts +++ b/src/git-command-manager.ts @@ -57,7 +57,7 @@ export interface IGitCommandManager { submoduleUpdate(fetchDepth: number, recursive: boolean): Promise submoduleStatus(): Promise tagExists(pattern: string): Promise - tryClean(): Promise + tryClean(exclude_from_clean: string | undefined): Promise tryConfigUnset(configKey: string, globalConfig?: boolean): Promise tryDisableAutomaticGarbageCollection(): Promise tryGetFetchUrl(): Promise @@ -434,8 +434,13 @@ class GitCommandManager { return !!output.stdout.trim() } - async tryClean(): Promise { - const output = await this.execGit(['clean', '-ffdx'], true) + async tryClean(exclude_from_clean: string | undefined): Promise { + let output + if (exclude_from_clean === undefined) { + output = await this.execGit(['clean', '-ffdx'], true) + } else { + output = await this.execGit(['clean', '-ffdx', '-e', exclude_from_clean], true) + } return output.exitCode === 0 } diff --git a/src/git-directory-helper.ts b/src/git-directory-helper.ts index 9a0085f..1ecff60 100644 --- a/src/git-directory-helper.ts +++ b/src/git-directory-helper.ts @@ -11,6 +11,7 @@ export async function prepareExistingDirectory( repositoryPath: string, repositoryUrl: string, clean: boolean, + exclude_from_clean: string | undefined, ref: string ): Promise { assert.ok(repositoryPath, 'Expected repositoryPath to be defined') @@ -90,7 +91,7 @@ export async function prepareExistingDirectory( // Clean if (clean) { core.startGroup('Cleaning the repository') - if (!(await git.tryClean())) { + if (!(await git.tryClean(exclude_from_clean))) { core.debug( `The clean command failed. This might be caused by: 1) path too long, 2) permission issue, or 3) file in use. For further investigation, manually run 'git clean -ffdx' on the directory '${repositoryPath}'.` ) diff --git a/src/git-source-provider.ts b/src/git-source-provider.ts index 2d35138..4c8f338 100644 --- a/src/git-source-provider.ts +++ b/src/git-source-provider.ts @@ -70,6 +70,7 @@ export async function getSource(settings: IGitSourceSettings): Promise { settings.repositoryPath, repositoryUrl, settings.clean, + settings.exclude_from_clean, settings.ref ) } diff --git a/src/git-source-settings.ts b/src/git-source-settings.ts index 4e41ac3..047fa2c 100644 --- a/src/git-source-settings.ts +++ b/src/git-source-settings.ts @@ -29,6 +29,11 @@ export interface IGitSourceSettings { */ clean: boolean + /** + * Indicates path to exclude when cleaning + */ + exclude_from_clean: string | undefined + /** * The filter determining which objects to include */ diff --git a/src/input-helper.ts b/src/input-helper.ts index 059232f..701ac94 100644 --- a/src/input-helper.ts +++ b/src/input-helper.ts @@ -82,6 +82,10 @@ export async function getInputs(): Promise { result.clean = (core.getInput('clean') || 'true').toUpperCase() === 'TRUE' core.debug(`clean = ${result.clean}`) + // Clean + result.exclude_from_clean = core.getInput('exclude_from_clean') + core.debug(`exclude_from_clean = ${result.exclude_from_clean}`) + // Filter const filter = core.getInput('filter') if (filter) {