Skip to content

Commit dcabd52

Browse files
jamietannaClaude Sonnet 4.5
andauthored
fix(gomod): skip placeholder pseudo versions (#41521)
As a follow-up to #41517, when we have a placeholder pseudo version, we attempt to look up updates for the module. However, because these are handled by a `replace` directive, there's no point attempting to look them up. Especially, as noted in #41517, this could be a non-public module, so the lookup will fail unnecessarily. Co-authored-by: Claude Sonnet 4.5 <jamie.tanna+github-copilot@mend.io>
1 parent dda653f commit dcabd52

File tree

3 files changed

+138
-0
lines changed

3 files changed

+138
-0
lines changed

lib/modules/manager/gomod/extract.spec.ts

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,4 +348,99 @@ describe('modules/manager/gomod/extract', () => {
348348
const res = extractPackageFile(goMod);
349349
expect(res).toBeNull();
350350
});
351+
352+
it('marks placeholder pseudo versions with skipReason invalid-version', () => {
353+
const goMod = codeBlock`
354+
module github.com/renovate-tests/gomod
355+
go 1.19
356+
require (
357+
github.com/foo/bar v1.2.3
358+
github.com/baz/qux v0.0.0-00010101000000-000000000000
359+
github.com/example/local v0.0.0-00010101000000-000000000000 // indirect
360+
github.com/non/placeholder v1.2.4-0.20230101120000-abcdef123456
361+
monorepo v0.0.0-00010101000000-000000000000
362+
)
363+
`;
364+
const res = extractPackageFile(goMod);
365+
expect(res).toEqual({
366+
deps: [
367+
{
368+
managerData: {
369+
lineNumber: 1,
370+
},
371+
depName: 'go',
372+
depType: 'golang',
373+
currentValue: '1.19',
374+
datasource: 'golang-version',
375+
versioning: 'go-mod-directive',
376+
},
377+
{
378+
managerData: {
379+
lineNumber: 3,
380+
multiLine: true,
381+
},
382+
depName: 'github.com/foo/bar',
383+
depType: 'require',
384+
currentValue: 'v1.2.3',
385+
datasource: 'go',
386+
},
387+
{
388+
managerData: {
389+
lineNumber: 4,
390+
multiLine: true,
391+
},
392+
depName: 'github.com/baz/qux',
393+
depType: 'require',
394+
currentValue: 'v0.0.0-00010101000000-000000000000',
395+
datasource: 'go',
396+
skipReason: 'invalid-version',
397+
currentDigest: '000000000000',
398+
digestOneAndOnly: true,
399+
versioning: 'loose',
400+
},
401+
{
402+
managerData: {
403+
lineNumber: 5,
404+
multiLine: true,
405+
},
406+
depName: 'github.com/example/local',
407+
depType: 'indirect',
408+
currentValue: 'v0.0.0-00010101000000-000000000000',
409+
datasource: 'go',
410+
skipReason: 'invalid-version',
411+
enabled: false,
412+
currentDigest: '000000000000',
413+
digestOneAndOnly: true,
414+
versioning: 'loose',
415+
},
416+
{
417+
managerData: {
418+
lineNumber: 6,
419+
multiLine: true,
420+
},
421+
depName: 'github.com/non/placeholder',
422+
depType: 'require',
423+
currentValue: 'v1.2.4-0.20230101120000-abcdef123456',
424+
datasource: 'go',
425+
currentDigest: 'abcdef123456',
426+
digestOneAndOnly: true,
427+
versioning: 'loose',
428+
},
429+
{
430+
managerData: {
431+
lineNumber: 7,
432+
multiLine: true,
433+
},
434+
depName: 'monorepo',
435+
depType: 'require',
436+
currentValue: 'v0.0.0-00010101000000-000000000000',
437+
datasource: 'go',
438+
currentDigest: '000000000000',
439+
digestOneAndOnly: true,
440+
versioning: 'loose',
441+
skipReason: 'invalid-version',
442+
},
443+
],
444+
});
445+
});
351446
});

lib/modules/manager/gomod/line-parser.spec.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,21 @@ describe('modules/manager/gomod/line-parser', () => {
8080
});
8181
});
8282

83+
it('should parse require definition with placeholder pseudo-version', () => {
84+
const line = 'require foo/foo v0.0.0-00010101000000-000000000000';
85+
const res = parseLine(line);
86+
expect(res).toStrictEqual({
87+
currentDigest: '000000000000',
88+
currentValue: 'v0.0.0-00010101000000-000000000000',
89+
datasource: 'go',
90+
depName: 'foo/foo',
91+
depType: 'require',
92+
digestOneAndOnly: true,
93+
skipReason: 'invalid-version',
94+
versioning: 'loose',
95+
});
96+
});
97+
8398
it('should parse require multi-line', () => {
8499
const line = ' foo/foo v1.2';
85100
const res = parseLine(line);
@@ -250,6 +265,22 @@ describe('modules/manager/gomod/line-parser', () => {
250265
});
251266
});
252267

268+
it('should parse replace definition with placeholder pseudo-version', () => {
269+
const line =
270+
'replace foo/foo => bar/bar v0.0.0-00010101000000-000000000000';
271+
const res = parseLine(line);
272+
expect(res).toStrictEqual({
273+
currentDigest: '000000000000',
274+
currentValue: 'v0.0.0-00010101000000-000000000000',
275+
datasource: 'go',
276+
depName: 'bar/bar',
277+
depType: 'replace',
278+
digestOneAndOnly: true,
279+
skipReason: 'invalid-version',
280+
versioning: 'loose',
281+
});
282+
});
283+
253284
it('should parse replace indirect definition', () => {
254285
const line = 'replace foo/foo => bar/bar v1.2 // indirect';
255286
const res = parseLine(line);

lib/modules/manager/gomod/line-parser.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,17 @@ const toolchainVersionRegex = regEx(/^\s*toolchain\s+go(?<version>[^\s]+)\s*$/);
2929

3030
const pseudoVersionRegex = regEx(GoDatasource.pversionRegexp);
3131

32+
const placeholderPseudoVersion = 'v0.0.0-00010101000000-000000000000';
33+
3234
function extractDigest(input: string): string | undefined {
3335
const match = pseudoVersionRegex.exec(input);
3436
return match?.groups?.digest;
3537
}
3638

39+
function isPlaceholderPseudoVersion(version: string): boolean {
40+
return version === placeholderPseudoVersion;
41+
}
42+
3743
export function parseLine(input: string): PackageDependency | null {
3844
const goVersionMatches = goVersionRegex.exec(input)?.groups;
3945
if (goVersionMatches) {
@@ -91,6 +97,9 @@ export function parseLine(input: string): PackageDependency | null {
9197
dep.currentDigest = digest;
9298
dep.digestOneAndOnly = true;
9399
dep.versioning = 'loose';
100+
if (isPlaceholderPseudoVersion(currentValue)) {
101+
dep.skipReason = 'invalid-version';
102+
}
94103
}
95104
} else {
96105
dep.skipReason = 'invalid-version';
@@ -132,6 +141,9 @@ export function parseLine(input: string): PackageDependency | null {
132141
dep.currentDigest = digest;
133142
dep.digestOneAndOnly = true;
134143
dep.versioning = 'loose';
144+
if (isPlaceholderPseudoVersion(currentValue)) {
145+
dep.skipReason = 'invalid-version';
146+
}
135147
}
136148
} else if (currentValue) {
137149
dep.skipReason = 'invalid-version';

0 commit comments

Comments
 (0)