diff --git a/lib/modules/manager/git-submodules/__fixtures__/.gitmodules.5 b/lib/modules/manager/git-submodules/__fixtures__/.gitmodules.5 index eb85ce493d435c..9ae692206fd56c 100644 --- a/lib/modules/manager/git-submodules/__fixtures__/.gitmodules.5 +++ b/lib/modules/manager/git-submodules/__fixtures__/.gitmodules.5 @@ -7,3 +7,10 @@ [submodule "renovate-config"] path = deps/renovate-config url = git@github.com:renovatebot/renovate-config.git +[submodule "some-other"] + path = some-other + url = https://domain.test/some/other.git + +[submodule "some-gitlab"] + path = some-gitlab + url = https://gitlab.com/some/repo.git diff --git a/lib/modules/manager/git-submodules/extract.spec.ts b/lib/modules/manager/git-submodules/extract.spec.ts index 8ea9e76d32ceb0..08776774857ecb 100644 --- a/lib/modules/manager/git-submodules/extract.spec.ts +++ b/lib/modules/manager/git-submodules/extract.spec.ts @@ -18,11 +18,16 @@ const Git = jest.requireActual('simple-git') as SimpleGitFactory; describe('modules/manager/git-submodules/extract', () => { // flaky ci tests - jest.setTimeout(10 * 1000); + //jest.setTimeout(10 * 1000); beforeAll(() => { simpleGit.mockImplementation((basePath: string) => { const git = Git(basePath); + const lsRemote: Record = { + 'https://abc@domain.test/some/other.git': '', + 'https://gitlab-ci-token:xyz@gitlab.com/some/repo.git': + 'ref: refs/heads/dev HEAD\n', + }; return { subModule(): Response { return Promise.resolve( @@ -40,7 +45,13 @@ describe('modules/manager/git-submodules/extract', () => { } return git.raw(options); }, - listRemote(): Response { + listRemote(options: TaskOptions): Response { + if ( + is.array(options, is.string) && + lsRemote[options[1]] !== undefined + ) { + return Promise.resolve(lsRemote[options[1]]) as Response; + } return Promise.resolve( 'ref: refs/heads/main HEAD\n5701164b9f5edba1f6ca114c491a564ffb55a964 HEAD' ) as Response; @@ -54,6 +65,16 @@ describe('modules/manager/git-submodules/extract', () => { it('extracts submodules', async () => { GlobalConfig.set({ localDir: `${__dirname}/__fixtures__` }); hostRules.add({ matchHost: 'github.com', token: '123test' }); + hostRules.add({ + matchHost: 'domain.test', + token: 'abc', + hostType: 'git-refs', + }); + hostRules.add({ + matchHost: 'gitlab.com', + token: 'xyz', + hostType: 'gitlab', + }); let res: PackageFileContent | null; expect(await extractPackageFile('', '.gitmodules.1', {})).toBeNull(); res = await extractPackageFile('', '.gitmodules.2', {}); @@ -64,10 +85,41 @@ describe('modules/manager/git-submodules/extract', () => { res = await extractPackageFile('', '.gitmodules.4', {}); expect(res?.deps).toHaveLength(1); res = await extractPackageFile('', '.gitmodules.5', {}); - expect(res?.deps).toHaveLength(3); - expect(res?.deps[2].packageName).toBe( - 'https://github.com/renovatebot/renovate-config.git' - ); + expect(res).toEqual({ + datasource: 'git-refs', + deps: [ + { + currentDigest: '4b825dc642cb6eb9a060e54bf8d69288fbee4904', + currentValue: 'main', + depName: 'deps/renovate', + packageName: 'https://github.com/renovatebot/renovate.git', + }, + { + currentDigest: '4b825dc642cb6eb9a060e54bf8d69288fbee4904', + currentValue: 'main', + depName: 'deps/renovate-pro', + packageName: 'https://github.com/renovatebot/pro.git', + }, + { + currentDigest: '4b825dc642cb6eb9a060e54bf8d69288fbee4904', + currentValue: 'main', + depName: 'deps/renovate-config', + packageName: 'https://github.com/renovatebot/renovate-config.git', + }, + { + currentDigest: '4b825dc642cb6eb9a060e54bf8d69288fbee4904', + currentValue: 'master', + depName: 'some-other', + packageName: 'https://domain.test/some/other.git', + }, + { + currentDigest: '4b825dc642cb6eb9a060e54bf8d69288fbee4904', + currentValue: 'dev', + depName: 'some-gitlab', + packageName: 'https://gitlab.com/some/repo.git', + }, + ], + }); }); }); }); diff --git a/lib/modules/manager/git-submodules/extract.ts b/lib/modules/manager/git-submodules/extract.ts index 82902cd1b61ca0..8cb5f1ff6cb76a 100644 --- a/lib/modules/manager/git-submodules/extract.ts +++ b/lib/modules/manager/git-submodules/extract.ts @@ -3,6 +3,7 @@ import Git, { SimpleGit } from 'simple-git'; import upath from 'upath'; import { GlobalConfig } from '../../../config/global'; import { logger } from '../../../logger'; +import { detectPlatform } from '../../../util/common'; import { simpleGitConfig } from '../../../util/git/config'; import { getHttpUrl, getRemoteUrlWithToken } from '../../../util/git/url'; import { regEx } from '../../../util/regex'; @@ -115,7 +116,8 @@ export default async function extractPackageFile( // hostRules only understands HTTP URLs // Find HTTP URL, then apply token let httpSubModuleUrl = getHttpUrl(subModuleUrl); - httpSubModuleUrl = getRemoteUrlWithToken(httpSubModuleUrl); + const hostType = detectPlatform(httpSubModuleUrl) ?? GitRefsDatasource.id; + httpSubModuleUrl = getRemoteUrlWithToken(httpSubModuleUrl, hostType); const currentValue = await getBranch( gitModulesPath, name,