From ad5dc193903d344f874145b3e00ff0c2b4820840 Mon Sep 17 00:00:00 2001 From: Frits Talbot Date: Sun, 9 Aug 2020 23:30:32 +0200 Subject: [PATCH] Add fetchJobs option to parallelize submodule updates --- README.md | 5 +++++ __test__/git-auth-helper.test.ts | 1 + __test__/input-helper.test.ts | 1 + action.yml | 3 +++ dist/index.js | 13 +++++++++++-- src/git-command-manager.ts | 16 ++++++++++++++-- src/git-source-provider.ts | 3 ++- src/git-source-settings.ts | 5 +++++ src/input-helper.ts | 7 +++++++ 9 files changed, 49 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9c56a6f..90eef49 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,11 @@ Refer [here](https://github.com/actions/checkout/blob/v1/README.md) for previous # Default: 1 fetch-depth: '' + # Number of fetches to perform simultaneously when updating submodules. 0 + # indicates default (serial updates). + # Default: 0 + fetch-jobs: '' + # Whether to download Git-LFS files # Default: false lfs: '' diff --git a/__test__/git-auth-helper.test.ts b/__test__/git-auth-helper.test.ts index 2b4830c..889e2b6 100644 --- a/__test__/git-auth-helper.test.ts +++ b/__test__/git-auth-helper.test.ts @@ -760,6 +760,7 @@ async function setup(testName: string): Promise { clean: true, commit: '', fetchDepth: 1, + fetchJobs: 0, lfs: false, submodules: false, nestedSubmodules: false, diff --git a/__test__/input-helper.test.ts b/__test__/input-helper.test.ts index 920bc8e..d9da8b9 100644 --- a/__test__/input-helper.test.ts +++ b/__test__/input-helper.test.ts @@ -75,6 +75,7 @@ describe('input-helper tests', () => { expect(settings.commit).toBeTruthy() expect(settings.commit).toBe('1234567890123456789012345678901234567890') expect(settings.fetchDepth).toBe(1) + expect(settings.fetchJobs).toBe(0) expect(settings.lfs).toBe(false) expect(settings.ref).toBe('refs/heads/some-ref') expect(settings.repositoryName).toBe('some-repo') diff --git a/action.yml b/action.yml index 91d3982..1abd5c8 100644 --- a/action.yml +++ b/action.yml @@ -56,6 +56,9 @@ inputs: fetch-depth: description: 'Number of commits to fetch. 0 indicates all history for all branches and tags.' default: 1 + fetch-jobs: + description: 'Number of fetches to perform simultaneously when updating submodules. 0 indicates default (serial updates).' + default: 0 lfs: description: 'Whether to download Git-LFS files' default: false diff --git a/dist/index.js b/dist/index.js index ae64f3f..2faf9a2 100644 --- a/dist/index.js +++ b/dist/index.js @@ -5939,7 +5939,7 @@ class GitCommandManager { yield this.execGit(args); }); } - submoduleUpdate(fetchDepth, recursive) { + submoduleUpdate(fetchDepth, recursive, fetchJobs) { return __awaiter(this, void 0, void 0, function* () { const args = ['-c', 'protocol.version=2']; args.push('submodule', 'update', '--init', '--force'); @@ -5949,6 +5949,9 @@ class GitCommandManager { if (recursive) { args.push('--recursive'); } + if (fetchJobs > 0) { + args.push(`--jobs=${fetchJobs}`); + } yield this.execGit(args); }); } @@ -6252,7 +6255,7 @@ function getSource(settings) { // Checkout submodules core.startGroup('Fetching submodules'); yield git.submoduleSync(settings.nestedSubmodules); - yield git.submoduleUpdate(settings.fetchDepth, settings.nestedSubmodules); + yield git.submoduleUpdate(settings.fetchDepth, settings.nestedSubmodules, settings.fetchJobs); yield git.submoduleForeach('git config --local gc.auto 0', settings.nestedSubmodules); core.endGroup(); // Persist credentials @@ -14567,6 +14570,12 @@ function getInputs() { result.fetchDepth = 0; } core.debug(`fetch depth = ${result.fetchDepth}`); + // Fetch jobs + result.fetchJobs = Math.floor(Number(core.getInput('fetch-jobs') || '0')); + if (isNaN(result.fetchJobs) || result.fetchJobs < 0) { + result.fetchJobs = 0; + } + core.debug(`fetch jobs = ${result.fetchJobs}`); // LFS result.lfs = (core.getInput('lfs') || 'false').toUpperCase() === 'TRUE'; core.debug(`lfs = ${result.lfs}`); diff --git a/src/git-command-manager.ts b/src/git-command-manager.ts index 059e3d8..92dc3f3 100644 --- a/src/git-command-manager.ts +++ b/src/git-command-manager.ts @@ -39,7 +39,11 @@ export interface IGitCommandManager { shaExists(sha: string): Promise submoduleForeach(command: string, recursive: boolean): Promise submoduleSync(recursive: boolean): Promise - submoduleUpdate(fetchDepth: number, recursive: boolean): Promise + submoduleUpdate( + fetchDepth: number, + recursive: boolean, + fetchJobs: number + ): Promise tagExists(pattern: string): Promise tryClean(): Promise tryConfigUnset(configKey: string, globalConfig?: boolean): Promise @@ -308,7 +312,11 @@ class GitCommandManager { await this.execGit(args) } - async submoduleUpdate(fetchDepth: number, recursive: boolean): Promise { + async submoduleUpdate( + fetchDepth: number, + recursive: boolean, + fetchJobs: number + ): Promise { const args = ['-c', 'protocol.version=2'] args.push('submodule', 'update', '--init', '--force') if (fetchDepth > 0) { @@ -319,6 +327,10 @@ class GitCommandManager { args.push('--recursive') } + if (fetchJobs > 0) { + args.push(`--jobs=${fetchJobs}`) + } + await this.execGit(args) } diff --git a/src/git-source-provider.ts b/src/git-source-provider.ts index 366ff33..eea6624 100644 --- a/src/git-source-provider.ts +++ b/src/git-source-provider.ts @@ -181,7 +181,8 @@ export async function getSource(settings: IGitSourceSettings): Promise { await git.submoduleSync(settings.nestedSubmodules) await git.submoduleUpdate( settings.fetchDepth, - settings.nestedSubmodules + settings.nestedSubmodules, + settings.fetchJobs ) await git.submoduleForeach( 'git config --local gc.auto 0', diff --git a/src/git-source-settings.ts b/src/git-source-settings.ts index 2786222..f5f529a 100644 --- a/src/git-source-settings.ts +++ b/src/git-source-settings.ts @@ -34,6 +34,11 @@ export interface IGitSourceSettings { */ fetchDepth: number + /** + * The number of fetches to perform simultaneously when updating submodules + */ + fetchJobs: number + /** * Indicates whether to fetch LFS objects */ diff --git a/src/input-helper.ts b/src/input-helper.ts index 4c05d6e..8767899 100644 --- a/src/input-helper.ts +++ b/src/input-helper.ts @@ -88,6 +88,13 @@ export function getInputs(): IGitSourceSettings { } core.debug(`fetch depth = ${result.fetchDepth}`) + // Fetch jobs + result.fetchJobs = Math.floor(Number(core.getInput('fetch-jobs') || '0')) + if (isNaN(result.fetchJobs) || result.fetchJobs < 0) { + result.fetchJobs = 0 + } + core.debug(`fetch jobs = ${result.fetchJobs}`) + // LFS result.lfs = (core.getInput('lfs') || 'false').toUpperCase() === 'TRUE' core.debug(`lfs = ${result.lfs}`)