Skip to content

Commit

Permalink
Add support for partial checkout filters (#1396)
Browse files Browse the repository at this point in the history
* 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 <13227161+cory-miller@users.noreply.github.com>
  • Loading branch information
finleygn and cory-miller committed Sep 22, 2023
1 parent 72f2cec commit c533a0a
Show file tree
Hide file tree
Showing 10 changed files with 70 additions and 4 deletions.
10 changes: 10 additions & 0 deletions .github/workflows/test.yml
Expand Up @@ -72,6 +72,16 @@ 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

This comment has been minimized.

Copy link
@DA-GM-RamiBitar

DA-GM-RamiBitar Oct 10, 2023

path

run: __test__/verify-fetch-filter.sh

# Sparse checkout
- name: Sparse checkout
uses: ./
Expand Down
6 changes: 5 additions & 1 deletion README.md
Expand Up @@ -75,8 +75,12 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl
# Default: true
clean: ''

# Partially clone against a given filter. Overrides sparse-checkout if set.
# Default: null
filter: ''

# Do a sparse checkout on given patterns. Each pattern should be separated with
# new lines
# new lines.
# Default: null
sparse-checkout: ''

Expand Down
1 change: 1 addition & 0 deletions __test__/git-auth-helper.test.ts
Expand Up @@ -802,6 +802,7 @@ async function setup(testName: string): Promise<void> {
authToken: 'some auth token',
clean: true,
commit: '',
filter: undefined,
sparseCheckout: [],
sparseCheckoutConeMode: true,
fetchDepth: 1,
Expand Down
1 change: 1 addition & 0 deletions __test__/input-helper.test.ts
Expand Up @@ -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)
Expand Down
16 changes: 16 additions & 0 deletions __test__/verify-fetch-filter.sh
@@ -0,0 +1,16 @@
#!/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 -C fetch-filter 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'"
exit 1

This comment has been minimized.

Copy link
@DA-GM-RamiBitar

DA-GM-RamiBitar Oct 10, 2023

cimment

fi
7 changes: 6 additions & 1 deletion action.yml
Expand Up @@ -53,10 +53,15 @@ 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.
Overrides sparse-checkout if set.
default: null
sparse-checkout:
description: >
Do a sparse checkout on given patterns.
Each pattern should be separated with new lines
Each pattern should be separated with new lines.
default: null
sparse-checkout-cone-mode:
description: >
Expand Down
12 changes: 11 additions & 1 deletion dist/index.js
Expand Up @@ -1244,8 +1244,12 @@ function getSource(settings) {
// Fetch
core.startGroup('Fetching the repository');
const fetchOptions = {};
if (settings.sparseCheckout)
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(settings.ref, settings.commit);
Expand Down Expand Up @@ -1723,6 +1727,12 @@ function getInputs() {
// Clean
result.clean = (core.getInput('clean') || 'true').toUpperCase() === 'TRUE';
core.debug(`clean = ${result.clean}`);
// Filter
const filter = core.getInput('filter');
if (filter) {
result.filter = filter;
}
core.debug(`filter = ${result.filter}`);
// Sparse checkout
const sparseCheckout = core.getMultilineInput('sparse-checkout');
if (sparseCheckout.length) {
Expand Down
8 changes: 7 additions & 1 deletion src/git-source-provider.ts
Expand Up @@ -159,7 +159,13 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
fetchTags?: boolean
showProgress?: boolean
} = {}
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(
Expand Down
5 changes: 5 additions & 0 deletions src/git-source-settings.ts
Expand Up @@ -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
*/
Expand Down
8 changes: 8 additions & 0 deletions src/input-helper.ts
Expand Up @@ -82,6 +82,14 @@ export async function getInputs(): Promise<IGitSourceSettings> {
result.clean = (core.getInput('clean') || 'true').toUpperCase() === 'TRUE'
core.debug(`clean = ${result.clean}`)

// Filter
const filter = core.getInput('filter')

This comment has been minimized.

Copy link
@DA-GM-RamiBitar

DA-GM-RamiBitar Oct 10, 2023

CALL OFFICE

This comment has been minimized.

Copy link
@DA-GM-RamiBitar

DA-GM-RamiBitar Oct 10, 2023

CHECK FOR DEADLINE DATE

if (filter) {
result.filter = filter
}

core.debug(`filter = ${result.filter}`)

// Sparse checkout
const sparseCheckout = core.getMultilineInput('sparse-checkout')
if (sparseCheckout.length) {
Expand Down

0 comments on commit c533a0a

Please sign in to comment.