diff --git a/README.md b/README.md index 8969446..32785ec 100644 --- a/README.md +++ b/README.md @@ -113,6 +113,9 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/ # Default: 1 fetch-depth: '' + # Date like `2days` or `1970-01-01`. Fetch a history after the specified time. + shallow-since: '' + # Whether to fetch tags, even if fetch-depth > 0. # Default: false fetch-tags: '' diff --git a/__test__/git-auth-helper.test.ts b/__test__/git-auth-helper.test.ts index 7633704..602b4a4 100644 --- a/__test__/git-auth-helper.test.ts +++ b/__test__/git-auth-helper.test.ts @@ -808,6 +808,7 @@ async function setup(testName: string): Promise { sparseCheckout: [], sparseCheckoutConeMode: true, fetchDepth: 1, + shallowSince: '', fetchTags: false, showProgress: true, lfs: false, diff --git a/action.yml b/action.yml index 6842eb8..bbdb1ac 100644 --- a/action.yml +++ b/action.yml @@ -74,6 +74,8 @@ inputs: fetch-depth: description: 'Number of commits to fetch. 0 indicates all history for all branches and tags.' default: 1 + shallow-since: + description: 'Date like `2days` or `1970-01-01`. Fetch a history after the specified time.' fetch-tags: description: 'Whether to fetch tags, even if fetch-depth > 0.' default: false diff --git a/adrs/0153-checkout-v2.md b/adrs/0153-checkout-v2.md index c331290..d5d3f54 100644 --- a/adrs/0153-checkout-v2.md +++ b/adrs/0153-checkout-v2.md @@ -72,6 +72,8 @@ We want to take this opportunity to make behavioral changes, from v1. This docum fetch-depth: description: 'Number of commits to fetch. 0 indicates all history for all tags and branches.' default: 1 + shallow-since: + description: 'Date like `2days` or `1970-01-01`. Fetch a history after the specified time.' lfs: description: 'Whether to download Git-LFS files' default: false @@ -155,7 +157,7 @@ Fetch only the SHA being built and set depth=1. This significantly reduces the f If a SHA isn't available (e.g. multi repo), then fetch only the specified ref with depth=1. -The input `fetch-depth` can be used to control the depth. +The input `fetch-depth` and `shallow-since` can be used to control the depth. Note: - Fetching a single commit is supported by Git wire protocol version 2. The git client uses protocol version 0 by default. The desired protocol version can be overridden in the git config or on the fetch command line invocation (`-c protocol.version=2`). We will override on the fetch command line, for transparency. diff --git a/dist/index.js b/dist/index.js index b0db713..f2651f8 100644 --- a/dist/index.js +++ b/dist/index.js @@ -663,6 +663,9 @@ class GitCommandManager { if (options.filter) { args.push(`--filter=${options.filter}`); } + if (options.shallowSince) { + args.push(`--shallow-since=${options.shallowSince}`); + } if (options.fetchDepth && options.fetchDepth > 0) { args.push(`--depth=${options.fetchDepth}`); } @@ -793,13 +796,16 @@ class GitCommandManager { yield this.execGit(args); }); } - submoduleUpdate(fetchDepth, recursive) { + submoduleUpdate(fetchDepth, recursive, shallowSince) { return __awaiter(this, void 0, void 0, function* () { const args = ['-c', 'protocol.version=2']; args.push('submodule', 'update', '--init', '--force'); if (fetchDepth > 0) { args.push(`--depth=${fetchDepth}`); } + if (shallowSince) { + args.push(`--shallow-since=${shallowSince}`); + } if (recursive) { args.push('--recursive'); } @@ -1787,6 +1793,12 @@ function getInputs() { result.fetchDepth = 0; } core.debug(`fetch depth = ${result.fetchDepth}`); + // Shallow since + if (core.getInput('fetch-depth') && core.getInput('shallow-since')) { + throw new Error('`fetch-depth` and `shallow-since` cannot be used at the same time'); + } + result.shallowSince = core.getInput('shallow-since'); + core.debug(`shallow since = ${result.shallowSince}`); // Fetch tags result.fetchTags = (core.getInput('fetch-tags') || 'false').toUpperCase() === 'TRUE'; diff --git a/src/git-command-manager.ts b/src/git-command-manager.ts index 8e42a38..5c5ec2a 100644 --- a/src/git-command-manager.ts +++ b/src/git-command-manager.ts @@ -36,6 +36,7 @@ export interface IGitCommandManager { options: { filter?: string fetchDepth?: number + shallowSince?: string fetchTags?: boolean showProgress?: boolean } @@ -54,8 +55,12 @@ export interface IGitCommandManager { shaExists(sha: string): Promise submoduleForeach(command: string, recursive: boolean): Promise submoduleSync(recursive: boolean): Promise - submoduleUpdate(fetchDepth: number, recursive: boolean): Promise submoduleStatus(): Promise + submoduleUpdate( + fetchDepth: number, + recursive: boolean, + shallowSince?: string + ): Promise tagExists(pattern: string): Promise tryClean(): Promise tryConfigUnset(configKey: string, globalConfig?: boolean): Promise @@ -256,6 +261,7 @@ class GitCommandManager { options: { filter?: string fetchDepth?: number + shallowSince?: string fetchTags?: boolean showProgress?: boolean } @@ -274,6 +280,10 @@ class GitCommandManager { args.push(`--filter=${options.filter}`) } + if (options.shallowSince) { + args.push(`--shallow-since=${options.shallowSince}`) + } + if (options.fetchDepth && options.fetchDepth > 0) { args.push(`--depth=${options.fetchDepth}`) } else if ( @@ -409,13 +419,21 @@ class GitCommandManager { await this.execGit(args) } - async submoduleUpdate(fetchDepth: number, recursive: boolean): Promise { + async submoduleUpdate( + fetchDepth: number, + recursive: boolean, + shallowSince?: string + ): Promise { const args = ['-c', 'protocol.version=2'] args.push('submodule', 'update', '--init', '--force') if (fetchDepth > 0) { args.push(`--depth=${fetchDepth}`) } + if (shallowSince) { + args.push(`--shallow-since=${shallowSince}`) + } + if (recursive) { args.push('--recursive') } diff --git a/src/git-source-settings.ts b/src/git-source-settings.ts index 4e41ac3..8a2ac0b 100644 --- a/src/git-source-settings.ts +++ b/src/git-source-settings.ts @@ -50,7 +50,12 @@ export interface IGitSourceSettings { fetchDepth: number /** - * Fetch tags, even if fetchDepth > 0 (default: false) + * Deepen or shorten the history of a shallow repository to include all reachable commits after + */ + shallowSince: string + + /** + * Fetch tags, even if fetchDepth > 0 (default: false) */ fetchTags: boolean diff --git a/src/input-helper.ts b/src/input-helper.ts index 059232f..d33f2ba 100644 --- a/src/input-helper.ts +++ b/src/input-helper.ts @@ -108,6 +108,15 @@ export async function getInputs(): Promise { } core.debug(`fetch depth = ${result.fetchDepth}`) + // Shallow since + if (core.getInput('fetch-depth') && core.getInput('shallow-since')) { + throw new Error( + '`fetch-depth` and `shallow-since` cannot be used at the same time' + ) + } + result.shallowSince = core.getInput('shallow-since') + core.debug(`shallow since = ${result.shallowSince}`) + // Fetch tags result.fetchTags = (core.getInput('fetch-tags') || 'false').toUpperCase() === 'TRUE'