Apply filter options to submodule update

Fixes: https://github.com/actions/checkout/issues/1714
This commit is contained in:
Scott Talbert 2026-07-07 19:47:58 -04:00
parent e8d4307400
commit 057e2c1f09
4 changed files with 90 additions and 5 deletions

View File

@ -403,6 +403,72 @@ describe('Test fetchDepth and fetchTags options', () => {
})
})
describe('Test submoduleUpdate filter option', () => {
beforeEach(async () => {
mockFileExistsSync.mockReset()
mockDirectoryExistsSync.mockReset()
mockExec.mockImplementation((path: any, args: any, options: any) => {
if (args.includes('version')) {
options.listeners.stdout(Buffer.from('2.18'))
}
return 0
})
})
afterEach(() => {
jest.clearAllMocks()
})
it('should call execGit with --filter when a filter option is provided', async () => {
const workingDirectory = 'test'
const lfs = false
const doSparseCheckout = false
git = await commandManager.createCommandManager(
workingDirectory,
lfs,
doSparseCheckout
)
await git.submoduleUpdate(1, true, 'blob:none')
expect(mockExec).toHaveBeenCalledWith(
expect.any(String),
[
'-c',
'protocol.version=2',
'submodule',
'update',
'--init',
'--force',
'--depth=1',
'--recursive',
'--filter=blob:none'
],
expect.any(Object)
)
})
it('should call execGit without --filter when no filter option is provided', async () => {
const workingDirectory = 'test'
const lfs = false
const doSparseCheckout = false
git = await commandManager.createCommandManager(
workingDirectory,
lfs,
doSparseCheckout
)
await git.submoduleUpdate(0, false, undefined)
expect(mockExec).toHaveBeenCalledWith(
expect.any(String),
['-c', 'protocol.version=2', 'submodule', 'update', '--init', '--force'],
expect.any(Object)
)
})
})
describe('repository initialization object format', () => {
beforeEach(async () => {
mockFileExistsSync.mockReset()

7
dist/index.js vendored
View File

@ -35872,7 +35872,7 @@ class GitCommandManager {
}
await this.execGit(args);
}
async submoduleUpdate(fetchDepth, recursive) {
async submoduleUpdate(fetchDepth, recursive, filter) {
const args = ['-c', 'protocol.version=2'];
args.push('submodule', 'update', '--init', '--force');
if (fetchDepth > 0) {
@ -35881,6 +35881,9 @@ class GitCommandManager {
if (recursive) {
args.push('--recursive');
}
if (filter) {
args.push(`--filter=${filter}`);
}
await this.execGit(args);
}
async submoduleStatus() {
@ -41888,7 +41891,7 @@ async function getSource(settings) {
// Checkout submodules
startGroup('Fetching submodules');
await git.submoduleSync(settings.nestedSubmodules);
await git.submoduleUpdate(settings.fetchDepth, settings.nestedSubmodules);
await git.submoduleUpdate(settings.fetchDepth, settings.nestedSubmodules, fetchOptions.filter);
await git.submoduleForeach('git config --local gc.auto 0', settings.nestedSubmodules);
endGroup();
// Persist credentials

View File

@ -55,7 +55,11 @@ export interface IGitCommandManager {
shaExists(sha: string): Promise<boolean>
submoduleForeach(command: string, recursive: boolean): Promise<string>
submoduleSync(recursive: boolean): Promise<void>
submoduleUpdate(fetchDepth: number, recursive: boolean): Promise<void>
submoduleUpdate(
fetchDepth: number,
recursive: boolean,
filter: string | undefined
): Promise<void>
submoduleStatus(): Promise<boolean>
tagExists(pattern: string): Promise<boolean>
tryClean(): Promise<boolean>
@ -452,7 +456,11 @@ class GitCommandManager {
await this.execGit(args)
}
async submoduleUpdate(fetchDepth: number, recursive: boolean): Promise<void> {
async submoduleUpdate(
fetchDepth: number,
recursive: boolean,
filter: string | undefined
): Promise<void> {
const args = ['-c', 'protocol.version=2']
args.push('submodule', 'update', '--init', '--force')
if (fetchDepth > 0) {
@ -463,6 +471,10 @@ class GitCommandManager {
args.push('--recursive')
}
if (filter) {
args.push(`--filter=${filter}`)
}
await this.execGit(args)
}

View File

@ -281,7 +281,11 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
// Checkout submodules
core.startGroup('Fetching submodules')
await git.submoduleSync(settings.nestedSubmodules)
await git.submoduleUpdate(settings.fetchDepth, settings.nestedSubmodules)
await git.submoduleUpdate(
settings.fetchDepth,
settings.nestedSubmodules,
fetchOptions.filter
)
await git.submoduleForeach(
'git config --local gc.auto 0',
settings.nestedSubmodules