From 99fc22de1fbeab661d12d5a67e59b2397a301949 Mon Sep 17 00:00:00 2001
From: Finley Garton <finley.garton@starlingbank.com>
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<void> {
     // 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<IGitSourceSettings> {
   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) {