From 4475b1ceed89a6de6a7e044bcc53aead585b0404 Mon Sep 17 00:00:00 2001 From: Gonzalo Peci Date: Thu, 14 Dec 2023 16:17:43 +0100 Subject: [PATCH] Allow configuration of fetch.parallel (#2) --- .github/workflows/test.yml | 2 +- README.md | 8 +++++++- __test__/git-auth-helper.test.ts | 3 ++- action.yml | 7 ++++++- dist/index.js | 20 ++++++++++++++++---- src/git-source-provider.ts | 7 ++++++- src/git-source-settings.ts | 7 ++++++- src/input-helper.ts | 22 +++++++++++++++++++--- 8 files changed, 63 insertions(+), 13 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bccfe74..302d50c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -157,7 +157,7 @@ jobs: ref: test-data/v2/submodule-ssh-url path: submodules-true submodules: recursive - submodulesFetchJobs: "10" + submodules-fetch-jobs: "10" - name: Verify submodules true run: __test__/verify-submodules-with-jobs.sh diff --git a/README.md b/README.md index c4c618e..1c0b8d0 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,12 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/ # Default: false fetch-tags: '' + # Specifies the maximal number of fetch operations to be run in parallel at a time + # (submodules, or remotes when the --multiple option of git-fetch is in effect). A + # value of 0 will give some reasonable default. If unset, it defaults to 1. + # Default: 1 + fetch-parallel: '' + # Whether to show progress status output when fetching. # Default: true show-progress: '' @@ -115,7 +121,7 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/ # integer allows up to that number of submodules fetched in parallel. A value of 0 # will give some reasonable default. If unset, it defaults to 1. # Default: 1 - submodulesFetchJobs: '' + submodules-fetch-jobs: '' # Add repository path as safe.directory for Git global config by running `git # config --global --add safe.directory ` diff --git a/__test__/git-auth-helper.test.ts b/__test__/git-auth-helper.test.ts index 94924f1..ae3b7c2 100644 --- a/__test__/git-auth-helper.test.ts +++ b/__test__/git-auth-helper.test.ts @@ -807,11 +807,12 @@ async function setup(testName: string): Promise { sparseCheckoutConeMode: true, fetchDepth: 1, fetchTags: false, + fetchParallel: 1, showProgress: true, lfs: false, submodules: false, nestedSubmodules: false, - submodulesFetchJobs: '1', + submodulesFetchJobs: 1, persistCredentials: true, ref: 'refs/heads/main', repositoryName: 'my-repo', diff --git a/action.yml b/action.yml index 4e27f10..fbe73d8 100644 --- a/action.yml +++ b/action.yml @@ -73,6 +73,11 @@ inputs: fetch-tags: description: 'Whether to fetch tags, even if fetch-depth > 0.' default: false + fetch-parallel: + description: > + Specifies the maximal number of fetch operations to be run in parallel at a time (submodules, or remotes when the --multiple option of git-fetch is in effect). + A value of 0 will give some reasonable default. If unset, it defaults to 1. + default: 1 show-progress: description: 'Whether to show progress status output when fetching.' default: true @@ -88,7 +93,7 @@ inputs: When the `ssh-key` input is not provided, SSH URLs beginning with `git@github.com:` are converted to HTTPS. default: false - submodulesFetchJobs: + submodules-fetch-jobs: description: > Specifies how many submodules are fetched/cloned at the same time. A positive integer allows up to that number of submodules fetched in parallel. A value of 0 will give some reasonable default. If unset, it defaults to 1. default: 1 diff --git a/dist/index.js b/dist/index.js index b27e94a..9b58379 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1243,6 +1243,7 @@ function getSource(settings) { } // Fetch core.startGroup('Fetching the repository'); + yield git.config('fetch.parallel', settings.fetchParallel.toString(), true); const fetchOptions = {}; if (settings.filter) { fetchOptions.filter = settings.filter; @@ -1304,7 +1305,7 @@ function getSource(settings) { core.endGroup(); // Checkout submodules core.startGroup('Fetching submodules'); - yield git.config('submodule.fetchJobs', settings.submodulesFetchJobs); + yield git.config('submodule.fetchJobs', settings.submodulesFetchJobs.toString(), true); yield git.submoduleSync(settings.nestedSubmodules); yield git.submoduleUpdate(settings.fetchDepth, settings.nestedSubmodules); yield git.submoduleForeach('git config --local gc.auto 0', settings.nestedSubmodules); @@ -1753,6 +1754,12 @@ function getInputs() { result.fetchTags = (core.getInput('fetch-tags') || 'false').toUpperCase() === 'TRUE'; core.debug(`fetch tags = ${result.fetchTags}`); + // Fetch tags + result.fetchParallel = Math.floor(Number(core.getInput('fetch-parallel') || '1')); + if (isNaN(result.fetchParallel) || result.fetchParallel < 0) { + result.fetchParallel = 0; + } + core.debug(`fetch parallel = ${result.fetchParallel}`); // Show fetch progress result.showProgress = (core.getInput('show-progress') || 'true').toUpperCase() === 'TRUE'; @@ -1771,12 +1778,17 @@ function getInputs() { else if (submodulesString == 'TRUE') { result.submodules = true; } - result.submodulesFetchJobs = core.getInput('submodulesFetchJobs') || '1'; + result.submodulesFetchJobs = Math.floor(Number(core.getInput('submodules-fetch-jobs') || '1')); + if (isNaN(result.submodulesFetchJobs) || result.submodulesFetchJobs < 0) { + result.submodulesFetchJobs = 0; + } core.debug(`submodules = ${result.submodules}`); core.debug(`recursive submodules = ${result.nestedSubmodules}`); - core.debug(`submodules fetchJobs= ${result.submodulesFetchJobs}`); + core.debug(`submodules submodules-fetch-jobs = ${result.submodulesFetchJobs}`); // Auth token - result.authToken = core.getInput('token', { required: true }); + result.authToken = core.getInput('token', { + required: true + }); // SSH result.sshKey = core.getInput('ssh-key'); result.sshKnownHosts = core.getInput('ssh-known-hosts'); diff --git a/src/git-source-provider.ts b/src/git-source-provider.ts index 58d4292..f80d560 100644 --- a/src/git-source-provider.ts +++ b/src/git-source-provider.ts @@ -153,6 +153,7 @@ export async function getSource(settings: IGitSourceSettings): Promise { // Fetch core.startGroup('Fetching the repository') + await git.config('fetch.parallel', settings.fetchParallel.toString(), true) const fetchOptions: { filter?: string fetchDepth?: number @@ -232,7 +233,11 @@ export async function getSource(settings: IGitSourceSettings): Promise { // Checkout submodules core.startGroup('Fetching submodules') - await git.config('submodule.fetchJobs', settings.submodulesFetchJobs) + await git.config( + 'submodule.fetchJobs', + settings.submodulesFetchJobs.toString(), + true + ) await git.submoduleSync(settings.nestedSubmodules) await git.submoduleUpdate(settings.fetchDepth, settings.nestedSubmodules) await git.submoduleForeach( diff --git a/src/git-source-settings.ts b/src/git-source-settings.ts index ae6bb74..85af342 100644 --- a/src/git-source-settings.ts +++ b/src/git-source-settings.ts @@ -54,6 +54,11 @@ export interface IGitSourceSettings { */ fetchTags: boolean + /** + * Indicates the maximal number of fetch operations to be run in parallel at a time + */ + fetchParallel: number + /** * Indicates whether to use the --progress option when fetching */ @@ -77,7 +82,7 @@ export interface IGitSourceSettings { /** * Indicates the number of parallel jobs to use when fetching submodules */ - submodulesFetchJobs: string + submodulesFetchJobs: number /** * The auth token to use when fetching the repository diff --git a/src/input-helper.ts b/src/input-helper.ts index b2e76a9..dc43aa8 100644 --- a/src/input-helper.ts +++ b/src/input-helper.ts @@ -113,6 +113,15 @@ export async function getInputs(): Promise { (core.getInput('fetch-tags') || 'false').toUpperCase() === 'TRUE' core.debug(`fetch tags = ${result.fetchTags}`) + // Fetch tags + result.fetchParallel = Math.floor( + Number(core.getInput('fetch-parallel') || '1') + ) + if (isNaN(result.fetchParallel) || result.fetchParallel < 0) { + result.fetchParallel = 0 + } + core.debug(`fetch parallel = ${result.fetchParallel}`) + // Show fetch progress result.showProgress = (core.getInput('show-progress') || 'true').toUpperCase() === 'TRUE' @@ -132,13 +141,20 @@ export async function getInputs(): Promise { } else if (submodulesString == 'TRUE') { result.submodules = true } - result.submodulesFetchJobs = core.getInput('submodulesFetchJobs') || '1' + result.submodulesFetchJobs = Math.floor( + Number(core.getInput('submodules-fetch-jobs') || '1') + ) + if (isNaN(result.submodulesFetchJobs) || result.submodulesFetchJobs < 0) { + result.submodulesFetchJobs = 0 + } core.debug(`submodules = ${result.submodules}`) core.debug(`recursive submodules = ${result.nestedSubmodules}`) - core.debug(`submodules fetchJobs= ${result.submodulesFetchJobs}`) + core.debug(`submodules submodules-fetch-jobs = ${result.submodulesFetchJobs}`) // Auth token - result.authToken = core.getInput('token', {required: true}) + result.authToken = core.getInput('token', { + required: true + }) // SSH result.sshKey = core.getInput('ssh-key')