From 99fc22de1fbeab661d12d5a67e59b2397a301949 Mon Sep 17 00:00:00 2001 From: Finley Garton Date: Fri, 30 Jun 2023 17:12:38 +0100 Subject: [PATCH] added filter option & tests --- .github/workflows/test.yml | 11 +++++++++++ __test__/input-helper.test.ts | 1 + __test__/verify-fetch-filter.sh | 15 +++++++++++++++ action.yml | 3 +++ src/git-source-provider.ts | 8 +++++++- src/git-source-settings.ts | 5 +++++ src/input-helper.ts | 4 ++++ 7 files changed, 46 insertions(+), 1 deletion(-) create mode 100755 __test__/verify-fetch-filter.sh diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d8b0b6d..bfd9dcc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -72,6 +72,17 @@ jobs: shell: bash 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 - name: Sparse checkout uses: ./ diff --git a/__test__/input-helper.test.ts b/__test__/input-helper.test.ts index 069fda4..5a74b1c 100644 --- a/__test__/input-helper.test.ts +++ b/__test__/input-helper.test.ts @@ -79,6 +79,7 @@ describe('input-helper tests', () => { expect(settings.clean).toBe(true) expect(settings.commit).toBeTruthy() expect(settings.commit).toBe('1234567890123456789012345678901234567890') + expect(settings.filter).toBe(undefined) expect(settings.sparseCheckout).toBe(undefined) expect(settings.sparseCheckoutConeMode).toBe(true) expect(settings.fetchDepth).toBe(1) diff --git a/__test__/verify-fetch-filter.sh b/__test__/verify-fetch-filter.sh new file mode 100755 index 0000000..fa6eaf1 --- /dev/null +++ b/__test__/verify-fetch-filter.sh @@ -0,0 +1,15 @@ +#!/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 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'" +fi diff --git a/action.yml b/action.yml index e562b56..4d44d67 100644 --- a/action.yml +++ b/action.yml @@ -53,6 +53,9 @@ inputs: clean: description: 'Whether to execute `git clean -ffdx && git reset --hard HEAD` before fetching' default: true + filter: + description: 'Partially clone against a given filter.' + default: null sparse-checkout: description: > Do a sparse checkout on given patterns. diff --git a/src/git-source-provider.ts b/src/git-source-provider.ts index 8f9d63f..19fe564 100644 --- a/src/git-source-provider.ts +++ b/src/git-source-provider.ts @@ -154,7 +154,13 @@ export async function getSource(settings: IGitSourceSettings): Promise { // Fetch core.startGroup('Fetching the repository') const fetchOptions: {filter?: string; fetchDepth?: number} = {} - 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) { // Fetch all branches and tags let refSpec = refHelper.getRefSpecForAllHistory( diff --git a/src/git-source-settings.ts b/src/git-source-settings.ts index 3272e63..f5f3879 100644 --- a/src/git-source-settings.ts +++ b/src/git-source-settings.ts @@ -29,6 +29,11 @@ export interface IGitSourceSettings { */ clean: boolean + /** + * The filter determining which objects to include + */ + filter: string | undefined + /** * The array of folders to make the sparse checkout */ diff --git a/src/input-helper.ts b/src/input-helper.ts index 410e480..8d6d13a 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}`) + // Filter + result.filter = core.getInput('filter') + core.debug(`filter = ${result.filter}`) + // Sparse checkout const sparseCheckout = core.getMultilineInput('sparse-checkout') if (sparseCheckout.length) {