From 72f2cec99f417b1a1c5e2e88945068983b7965f9 Mon Sep 17 00:00:00 2001 From: Varun Sivapalan <5470233+sivapalan@users.noreply.github.com> Date: Tue, 5 Sep 2023 15:21:52 +0200 Subject: [PATCH 1/3] Update README.md for V4 (#1452) * Update README.md for V4 * Update actionReference in generate-docs.ts for v4 --- README.md | 39 ++++++++++++++++++++------------------- src/misc/generate-docs.ts | 2 +- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 982748a6b..7e76cde2b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![Build and Test](https://github.com/actions/checkout/actions/workflows/test.yml/badge.svg)](https://github.com/actions/checkout/actions/workflows/test.yml) -# Checkout V3 +# Checkout V4 This action checks-out your repository under `$GITHUB_WORKSPACE`, so your workflow can access it. @@ -12,14 +12,15 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl # What's new -- Updated to the node16 runtime by default - - This requires a minimum [Actions Runner](https://github.com/actions/runner/releases/tag/v2.285.0) version of v2.285.0 to run, which is by default available in GHES 3.4 or later. +- Updated default runtime to node20 + - This requires a minimum Actions Runner version of [v2.308.0](https://github.com/actions/runner/releases/tag/v2.308.0). +- Added support for fetching without the `--progress` option # Usage ```yaml -- uses: actions/checkout@v3 +- uses: actions/checkout@v4 with: # Repository name with owner. For example, actions/checkout # Default: ${{ github.repository }} @@ -139,7 +140,7 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl ## Fetch only the root files ```yaml -- uses: actions/checkout@v3 +- uses: actions/checkout@v4 with: sparse-checkout: . ``` @@ -147,7 +148,7 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl ## Fetch only the root files and `.github` and `src` folder ```yaml -- uses: actions/checkout@v3 +- uses: actions/checkout@v4 with: sparse-checkout: | .github @@ -157,7 +158,7 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl ## Fetch only a single file ```yaml -- uses: actions/checkout@v3 +- uses: actions/checkout@v4 with: sparse-checkout: | README.md @@ -167,7 +168,7 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl ## Fetch all history for all tags and branches ```yaml -- uses: actions/checkout@v3 +- uses: actions/checkout@v4 with: fetch-depth: 0 ``` @@ -175,7 +176,7 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl ## Checkout a different branch ```yaml -- uses: actions/checkout@v3 +- uses: actions/checkout@v4 with: ref: my-branch ``` @@ -183,7 +184,7 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl ## Checkout HEAD^ ```yaml -- uses: actions/checkout@v3 +- uses: actions/checkout@v4 with: fetch-depth: 2 - run: git checkout HEAD^ @@ -193,12 +194,12 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl ```yaml - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: main - name: Checkout tools repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: my-org/my-tools path: my-tools @@ -209,10 +210,10 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl ```yaml - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Checkout tools repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: my-org/my-tools path: my-tools @@ -223,12 +224,12 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl ```yaml - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: main - name: Checkout private tools - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: my-org/my-private-tools token: ${{ secrets.GH_PAT }} # `GH_PAT` is a secret that contains your PAT @@ -241,7 +242,7 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl ## Checkout pull request HEAD commit instead of merge commit ```yaml -- uses: actions/checkout@v3 +- uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} ``` @@ -257,7 +258,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 ``` ## Push a commit using the built-in token @@ -268,7 +269,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: | date > generated.txt git config user.name github-actions diff --git a/src/misc/generate-docs.ts b/src/misc/generate-docs.ts index 57d28889b..5e67969f5 100644 --- a/src/misc/generate-docs.ts +++ b/src/misc/generate-docs.ts @@ -120,7 +120,7 @@ function updateUsage( } updateUsage( - 'actions/checkout@v3', + 'actions/checkout@v4', path.join(__dirname, '..', '..', 'action.yml'), path.join(__dirname, '..', '..', 'README.md') ) From c533a0a4cfc4962971818edcfac47a2899e69799 Mon Sep 17 00:00:00 2001 From: Finley Garton <35561611+finleygn@users.noreply.github.com> Date: Fri, 22 Sep 2023 18:30:36 +0100 Subject: [PATCH 2/3] 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 <13227161+cory-miller@users.noreply.github.com> --- .github/workflows/test.yml | 10 ++++++++++ README.md | 6 +++++- __test__/git-auth-helper.test.ts | 1 + __test__/input-helper.test.ts | 1 + __test__/verify-fetch-filter.sh | 16 ++++++++++++++++ action.yml | 7 ++++++- dist/index.js | 12 +++++++++++- src/git-source-provider.ts | 8 +++++++- src/git-source-settings.ts | 5 +++++ src/input-helper.ts | 8 ++++++++ 10 files changed, 70 insertions(+), 4 deletions(-) create mode 100755 __test__/verify-fetch-filter.sh diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 68c7118c0..15996ee7e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -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 + run: __test__/verify-fetch-filter.sh + # Sparse checkout - name: Sparse checkout uses: ./ diff --git a/README.md b/README.md index 7e76cde2b..92bc78443 100644 --- a/README.md +++ b/README.md @@ -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: '' diff --git a/__test__/git-auth-helper.test.ts b/__test__/git-auth-helper.test.ts index a0cff63d3..411faed05 100644 --- a/__test__/git-auth-helper.test.ts +++ b/__test__/git-auth-helper.test.ts @@ -802,6 +802,7 @@ async function setup(testName: string): Promise { authToken: 'some auth token', clean: true, commit: '', + filter: undefined, sparseCheckout: [], sparseCheckoutConeMode: true, fetchDepth: 1, diff --git a/__test__/input-helper.test.ts b/__test__/input-helper.test.ts index 21932ca60..9514cb42d 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 000000000..4fc9d9e38 --- /dev/null +++ b/__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 +fi diff --git a/action.yml b/action.yml index 43d408d12..5aa90a738 100644 --- a/action.yml +++ b/action.yml @@ -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: > diff --git a/dist/index.js b/dist/index.js index 67752ae32..ddf2b3d89 100644 --- a/dist/index.js +++ b/dist/index.js @@ -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); @@ -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) { diff --git a/src/git-source-provider.ts b/src/git-source-provider.ts index c1360b82b..5c98e9f73 100644 --- a/src/git-source-provider.ts +++ b/src/git-source-provider.ts @@ -159,7 +159,13 @@ export async function getSource(settings: IGitSourceSettings): Promise { 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( diff --git a/src/git-source-settings.ts b/src/git-source-settings.ts index 2f80b5ec3..629350b2c 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 be9cecdf6..e546c196d 100644 --- a/src/input-helper.ts +++ b/src/input-helper.ts @@ -82,6 +82,14 @@ export async function getInputs(): Promise { 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) { From 8ade135a41bc03ea155e62e844d188df1ea18608 Mon Sep 17 00:00:00 2001 From: Cory Miller <13227161+cory-miller@users.noreply.github.com> Date: Fri, 22 Sep 2023 13:40:21 -0400 Subject: [PATCH 3/3] Prepare 4.1.0 release (#1496) --- CHANGELOG.md | 3 +++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 072f2675f..f2458bdfb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## v4.1.0 +- [Add support for partial checkout filters](https://github.com/actions/checkout/pull/1396) + ## v4.0.0 - [Support fetching without the --progress option](https://github.com/actions/checkout/pull/1067) - [Update to node20](https://github.com/actions/checkout/pull/1436) diff --git a/package-lock.json b/package-lock.json index 6b77be1d4..3a8851a32 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "checkout", - "version": "4.0.0", + "version": "4.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "checkout", - "version": "4.0.0", + "version": "4.1.0", "license": "MIT", "dependencies": { "@actions/core": "^1.10.0", diff --git a/package.json b/package.json index 84d643026..0fd7c5c9c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "checkout", - "version": "4.0.0", + "version": "4.1.0", "description": "checkout action", "main": "lib/main.js", "scripts": {