Skip to content

Commit c533a0a

Browse files
Add support for partial checkout filters (#1396)
* added filter option & tests * added build file * fix test oversight * added exit 1 * updated docs to specify override * undo unneeded readme change * set to undefined rather than empty string * run git config in correct di --------- Co-authored-by: Cory Miller <[email protected]>
1 parent 72f2cec commit c533a0a

10 files changed

+70
-4
lines changed

.github/workflows/test.yml

+10
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,16 @@ jobs:
7272
shell: bash
7373
run: __test__/verify-side-by-side.sh
7474

75+
# Filter
76+
- name: Fetch filter
77+
uses: ./
78+
with:
79+
filter: 'blob:none'
80+
path: fetch-filter
81+
82+
- name: Verify fetch filter
83+
run: __test__/verify-fetch-filter.sh
84+
7585
# Sparse checkout
7686
- name: Sparse checkout
7787
uses: ./

README.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,12 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl
7575
# Default: true
7676
clean: ''
7777

78+
# Partially clone against a given filter. Overrides sparse-checkout if set.
79+
# Default: null
80+
filter: ''
81+
7882
# Do a sparse checkout on given patterns. Each pattern should be separated with
79-
# new lines
83+
# new lines.
8084
# Default: null
8185
sparse-checkout: ''
8286

__test__/git-auth-helper.test.ts

+1
Original file line numberDiff line numberDiff line change
@@ -802,6 +802,7 @@ async function setup(testName: string): Promise<void> {
802802
authToken: 'some auth token',
803803
clean: true,
804804
commit: '',
805+
filter: undefined,
805806
sparseCheckout: [],
806807
sparseCheckoutConeMode: true,
807808
fetchDepth: 1,

__test__/input-helper.test.ts

+1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ describe('input-helper tests', () => {
7979
expect(settings.clean).toBe(true)
8080
expect(settings.commit).toBeTruthy()
8181
expect(settings.commit).toBe('1234567890123456789012345678901234567890')
82+
expect(settings.filter).toBe(undefined)
8283
expect(settings.sparseCheckout).toBe(undefined)
8384
expect(settings.sparseCheckoutConeMode).toBe(true)
8485
expect(settings.fetchDepth).toBe(1)

__test__/verify-fetch-filter.sh

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#!/bin/bash
2+
3+
# Verify .git folder
4+
if [ ! -d "./fetch-filter/.git" ]; then
5+
echo "Expected ./fetch-filter/.git folder to exist"
6+
exit 1
7+
fi
8+
9+
# Verify .git/config contains partialclonefilter
10+
11+
CLONE_FILTER=$(git -C fetch-filter config --local --get remote.origin.partialclonefilter)
12+
13+
if [ "$CLONE_FILTER" != "blob:none" ]; then
14+
echo "Expected ./fetch-filter/.git/config to have 'remote.origin.partialclonefilter' set to 'blob:none'"
15+
exit 1
16+
fi

action.yml

+6-1
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,15 @@ inputs:
5353
clean:
5454
description: 'Whether to execute `git clean -ffdx && git reset --hard HEAD` before fetching'
5555
default: true
56+
filter:
57+
description: >
58+
Partially clone against a given filter.
59+
Overrides sparse-checkout if set.
60+
default: null
5661
sparse-checkout:
5762
description: >
5863
Do a sparse checkout on given patterns.
59-
Each pattern should be separated with new lines
64+
Each pattern should be separated with new lines.
6065
default: null
6166
sparse-checkout-cone-mode:
6267
description: >

dist/index.js

+11-1
Original file line numberDiff line numberDiff line change
@@ -1244,8 +1244,12 @@ function getSource(settings) {
12441244
// Fetch
12451245
core.startGroup('Fetching the repository');
12461246
const fetchOptions = {};
1247-
if (settings.sparseCheckout)
1247+
if (settings.filter) {
1248+
fetchOptions.filter = settings.filter;
1249+
}
1250+
else if (settings.sparseCheckout) {
12481251
fetchOptions.filter = 'blob:none';
1252+
}
12491253
if (settings.fetchDepth <= 0) {
12501254
// Fetch all branches and tags
12511255
let refSpec = refHelper.getRefSpecForAllHistory(settings.ref, settings.commit);
@@ -1723,6 +1727,12 @@ function getInputs() {
17231727
// Clean
17241728
result.clean = (core.getInput('clean') || 'true').toUpperCase() === 'TRUE';
17251729
core.debug(`clean = ${result.clean}`);
1730+
// Filter
1731+
const filter = core.getInput('filter');
1732+
if (filter) {
1733+
result.filter = filter;
1734+
}
1735+
core.debug(`filter = ${result.filter}`);
17261736
// Sparse checkout
17271737
const sparseCheckout = core.getMultilineInput('sparse-checkout');
17281738
if (sparseCheckout.length) {

src/git-source-provider.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,13 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
159159
fetchTags?: boolean
160160
showProgress?: boolean
161161
} = {}
162-
if (settings.sparseCheckout) fetchOptions.filter = 'blob:none'
162+
163+
if (settings.filter) {
164+
fetchOptions.filter = settings.filter
165+
} else if (settings.sparseCheckout) {
166+
fetchOptions.filter = 'blob:none'
167+
}
168+
163169
if (settings.fetchDepth <= 0) {
164170
// Fetch all branches and tags
165171
let refSpec = refHelper.getRefSpecForAllHistory(

src/git-source-settings.ts

+5
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ export interface IGitSourceSettings {
2929
*/
3030
clean: boolean
3131

32+
/**
33+
* The filter determining which objects to include
34+
*/
35+
filter: string | undefined
36+
3237
/**
3338
* The array of folders to make the sparse checkout
3439
*/

src/input-helper.ts

+8
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,14 @@ export async function getInputs(): Promise<IGitSourceSettings> {
8282
result.clean = (core.getInput('clean') || 'true').toUpperCase() === 'TRUE'
8383
core.debug(`clean = ${result.clean}`)
8484

85+
// Filter
86+
const filter = core.getInput('filter')
87+
if (filter) {
88+
result.filter = filter
89+
}
90+
91+
core.debug(`filter = ${result.filter}`)
92+
8593
// Sparse checkout
8694
const sparseCheckout = core.getMultilineInput('sparse-checkout')
8795
if (sparseCheckout.length) {

0 commit comments

Comments
 (0)