diff --git a/lib/workers/repository/update/pr/changelog/release-notes.spec.ts b/lib/workers/repository/update/pr/changelog/release-notes.spec.ts index 226cfb3dd6c792c18ccf009d38b3e7cee55ed941..c138e0d9d0d82cdeca1ea260625fdd7cf2a0b8e7 100644 --- a/lib/workers/repository/update/pr/changelog/release-notes.spec.ts +++ b/lib/workers/repository/update/pr/changelog/release-notes.spec.ts @@ -5,6 +5,7 @@ import { CacheableGithubReleases } from '../../../../../modules/datasource/githu import { clone } from '../../../../../util/clone'; import * as _hostRules from '../../../../../util/host-rules'; import { toBase64 } from '../../../../../util/string'; +import type { BranchUpgradeConfig } from '../../../../types'; import { addReleaseNotes, getReleaseList, @@ -94,9 +95,16 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { describe('addReleaseNotes()', () => { it('returns input if invalid', async () => { const input = { a: 1 }; - expect(await addReleaseNotes(input as never)).toEqual(input); - expect(await addReleaseNotes(null)).toBeNull(); - expect(await addReleaseNotes({ versions: [] } as never)).toStrictEqual({ + expect( + await addReleaseNotes(input as never, {} as BranchUpgradeConfig) + ).toEqual(input); + expect(await addReleaseNotes(null, {} as BranchUpgradeConfig)).toBeNull(); + expect( + await addReleaseNotes( + { versions: [] } as never, + {} as BranchUpgradeConfig + ) + ).toStrictEqual({ versions: [], }); }); @@ -110,7 +118,9 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { }, versions: [{ version: '3.10.0', compare: { url: '' } }], }; - expect(await addReleaseNotes(input as never)).toEqual({ + expect( + await addReleaseNotes(input as never, {} as BranchUpgradeConfig) + ).toEqual({ a: 1, hasReleaseNotes: false, project: { @@ -140,7 +150,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { version: '20.26.0', compare: { url: '' } } as ChangeLogRelease, ], } as ChangeLogResult; - expect(await addReleaseNotes(input)).toEqual({ + expect(await addReleaseNotes(input, {} as BranchUpgradeConfig)).toEqual({ a: 1, hasReleaseNotes: false, project: { @@ -280,7 +290,8 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { version: '1.0.0', gitRef: '1.0.0', - } as ChangeLogRelease + } as ChangeLogRelease, + {} as BranchUpgradeConfig ); expect(res).toBeNull(); }); @@ -303,7 +314,8 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { version: '1.0.1', gitRef: '1.0.1', - } as ChangeLogRelease + } as ChangeLogRelease, + {} as BranchUpgradeConfig ); expect(res).toEqual({ body: 'some body [#123](https://github.com/some/other-repository/issues/123), [#124](https://github.com/some/yet-other-repository/issues/124)\n', @@ -334,7 +346,8 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { version: '1.0.1', gitRef: '1.0.1', - } as ChangeLogRelease + } as ChangeLogRelease, + {} as BranchUpgradeConfig ); expect(res).toEqual({ body: 'some body [#123](https://github.com/some/other-repository/issues/123), [#124](https://github.com/some/yet-other-repository/issues/124)\n', @@ -366,7 +379,8 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { version: '1.0.1', gitRef: '1.0.1', - } as ChangeLogRelease + } as ChangeLogRelease, + {} as BranchUpgradeConfig ); expect(res).toEqual({ body: 'some body [#123](https://github.com/some/other-repository/issues/123), [#124](https://github.com/some/yet-other-repository/issues/124)\n', @@ -398,7 +412,8 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { version: '1.0.1', gitRef: '1.0.1', - } as ChangeLogRelease + } as ChangeLogRelease, + {} as BranchUpgradeConfig ); expect(res).toEqual({ body: 'some body [#123](https://github.com/some/other-repository/issues/123), [#124](https://github.com/some/yet-other-repository/issues/124)\n', @@ -429,7 +444,8 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { version: '1.0.1', gitRef: '1.0.1', - } as ChangeLogRelease + } as ChangeLogRelease, + {} as BranchUpgradeConfig ); expect(res).toEqual({ body: 'some body [#123](https://github.com/some/other-repository/issues/123), [#124](https://github.com/some/yet-other-repository/issues/124)\n', @@ -466,7 +482,8 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { version: '1.0.1', gitRef: '1.0.1', - } as ChangeLogRelease + } as ChangeLogRelease, + {} as BranchUpgradeConfig ); expect(res).toEqual({ body: 'some body #123, [#124](https://gitlab.com/some/yet-other-repository/issues/124)', @@ -502,7 +519,8 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { version: '1.0.1', gitRef: '1.0.1', - } as ChangeLogRelease + } as ChangeLogRelease, + {} as BranchUpgradeConfig ); expect(res).toEqual({ body: 'some body #123, [#124](https://gitlab.com/some/yet-other-repository/issues/124)', @@ -538,7 +556,8 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { version: '1.0.1', gitRef: '1.0.1', - } as ChangeLogRelease + } as ChangeLogRelease, + {} as BranchUpgradeConfig ); expect(res).toEqual({ body: 'some body #123, [#124](https://gitlab.com/some/yet-other-repository/issues/124)', @@ -561,7 +580,8 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { version: '1.0.1', gitRef: '1.0.1', - } as ChangeLogRelease + } as ChangeLogRelease, + {} as BranchUpgradeConfig ); expect(res).toBeNull(); }); @@ -588,7 +608,8 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { version: '1.0.0', gitRef: '1.0.0', - } as ChangeLogRelease + } as ChangeLogRelease, + {} as BranchUpgradeConfig ); expect(res).toEqual({ url: 'correct/url/tag.com', @@ -600,6 +621,37 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { body: 'some body\n', }); }); + + it('fallback to extractVersion', async () => { + githubReleasesMock.mockResolvedValueOnce([ + { + version: `app-1.0.0`, + url: 'correct/url/tag.com', + description: 'some body', + }, + ] as never); + const res = await getReleaseNotes( + { + ...githubProject, + repository: 'some/other-repository', + depName: 'exampleDep', + }, + { + version: '1.0.0', + gitRef: '1.0.0', + } as ChangeLogRelease, + { extractVersion: 'app-(?<version>[0-9.]*)' } as BranchUpgradeConfig + ); + expect(res).toEqual({ + url: 'correct/url/tag.com', + notesSourceUrl: + 'https://api.github.com/repos/some/other-repository/releases', + id: undefined, + tag: 'app-1.0.0', + name: undefined, + body: 'some body\n', + }); + }); }); describe('getReleaseNotesMd()', () => { diff --git a/lib/workers/repository/update/pr/changelog/release-notes.ts b/lib/workers/repository/update/pr/changelog/release-notes.ts index 616f4f63161b3d07b133d3b8775c7160bfdf22fa..561b841192365688ce1c11e3008f362149fab232 100644 --- a/lib/workers/repository/update/pr/changelog/release-notes.ts +++ b/lib/workers/repository/update/pr/changelog/release-notes.ts @@ -7,6 +7,7 @@ import * as memCache from '../../../../../util/cache/memory'; import * as packageCache from '../../../../../util/cache/package'; import { linkify } from '../../../../../util/markdown'; import { newlineRegex, regEx } from '../../../../../util/regex'; +import type { BranchUpgradeConfig } from '../../../../types'; import * as github from './github'; import * as gitlab from './gitlab'; import type { @@ -96,7 +97,8 @@ export function massageBody( export async function getReleaseNotes( project: ChangeLogProject, - release: ChangeLogRelease + release: ChangeLogRelease, + config: BranchUpgradeConfig ): Promise<ChangeLogNotes | null> { const { depName, repository } = project; const { version, gitRef } = release; @@ -116,6 +118,13 @@ export async function getReleaseNotes( r.tag === `v${gitRef}` ); } + if (is.undefined(matchedRelease) && config.extractVersion) { + const extractVersionRegEx = regEx(config.extractVersion); + matchedRelease = releases.find((r) => { + const extractedVersion = extractVersionRegEx.exec(r.tag)?.groups?.version; + return version === extractedVersion; + }); + } releaseNotes = await releaseNotesResult(matchedRelease, project); logger.trace({ releaseNotes }); return releaseNotes; @@ -360,7 +369,8 @@ export function releaseNotesCacheMinutes(releaseDate?: string | Date): number { } export async function addReleaseNotes( - input: ChangeLogResult + input: ChangeLogResult, + config: BranchUpgradeConfig ): Promise<ChangeLogResult> { if (!input?.versions || !input.project?.type) { logger.debug('Missing project or versions'); @@ -383,7 +393,7 @@ export async function addReleaseNotes( releaseNotes = await getReleaseNotesMd(input.project, v); // istanbul ignore else: should be tested if (!releaseNotes) { - releaseNotes = await getReleaseNotes(input.project, v); + releaseNotes = await getReleaseNotes(input.project, v, config); } // Small hack to force display of release notes when there is a compare url if (!releaseNotes && v.compare.url) { diff --git a/lib/workers/repository/update/pr/changelog/source-github.ts b/lib/workers/repository/update/pr/changelog/source-github.ts index 474ae3a46804c4ac56bde3689e03c3e4e157fd15..2dbd02457d722c5937a745befc0345fa0b1f3571 100644 --- a/lib/workers/repository/update/pr/changelog/source-github.ts +++ b/lib/workers/repository/update/pr/changelog/source-github.ts @@ -177,7 +177,7 @@ export async function getChangeLogJSON( versions: changelogReleases, }; - res = await addReleaseNotes(res); + res = await addReleaseNotes(res, config); return res; } diff --git a/lib/workers/repository/update/pr/changelog/source-gitlab.ts b/lib/workers/repository/update/pr/changelog/source-gitlab.ts index 679d7836a7eb1c046607cd8afdf8b2b1573fd66e..1775f8e91ac79cb6b551b2df227806f88a1ae02b 100644 --- a/lib/workers/repository/update/pr/changelog/source-gitlab.ts +++ b/lib/workers/repository/update/pr/changelog/source-gitlab.ts @@ -145,7 +145,7 @@ export async function getChangeLogJSON( versions: changelogReleases, }; - res = await addReleaseNotes(res); + res = await addReleaseNotes(res, config); return res; }