diff --git a/lib/modules/datasource/hackage/index.spec.ts b/lib/modules/datasource/hackage/index.spec.ts index 676e082583da4895d42886025bc434db338467f3..1235b179a91cde0ef64d8bd9a360d27843b30ab6 100644 --- a/lib/modules/datasource/hackage/index.spec.ts +++ b/lib/modules/datasource/hackage/index.spec.ts @@ -8,7 +8,7 @@ describe('modules/datasource/hackage/index', () => { describe('versionToRelease', () => { it('should make release with given version', () => { expect( - versionToRelease('3.1.0', 'base', 'http://localhost').version, + versionToRelease('3.1.0', 'base', 'http://localhost', false).version, ).toBe('3.1.0'); }); }); @@ -33,11 +33,11 @@ describe('modules/datasource/hackage/index', () => { ).toBeNull(); }); - it('returns release for 200', async () => { + it('returns releases for 200', async () => { httpMock .scope(baseUrl) .get('/package/base.json') - .reply(200, { '4.20.0.1': 'normal' }); + .reply(200, { '4.19.0.1': 'deprecated', '4.20.0.1': 'normal' }); expect( await getPkgReleases({ datasource: HackageDatasource.id, @@ -46,9 +46,15 @@ describe('modules/datasource/hackage/index', () => { ).toEqual({ registryUrl: baseUrl, releases: [ + { + changelogUrl: baseUrl + 'package/base-4.19.0.1/changelog', + version: '4.19.0.1', + isDeprecated: true, + }, { changelogUrl: baseUrl + 'package/base-4.20.0.1/changelog', version: '4.20.0.1', + isDeprecated: false, }, ], }); diff --git a/lib/modules/datasource/hackage/index.ts b/lib/modules/datasource/hackage/index.ts index 4a75568d485468af32dc7824df6e4041cbd4c471..481d92b56d426847eeb8d1a088e7fcc9b5f4055b 100644 --- a/lib/modules/datasource/hackage/index.ts +++ b/lib/modules/datasource/hackage/index.ts @@ -28,12 +28,14 @@ export class HackageDatasource extends Datasource { `${massagedPackageName}.json`, ); const res = await this.http.getJson(url, HackagePackageMetadata); - const keys = Object.keys(res.body); - return { - releases: keys.map((version) => - versionToRelease(version, packageName, registryUrl), - ), - }; + const releases = []; + for (const [version, versionStatus] of Object.entries(res.body)) { + const isDeprecated = versionStatus === 'deprecated'; + releases.push( + versionToRelease(version, packageName, registryUrl, isDeprecated), + ); + } + return { releases }; } } @@ -41,6 +43,7 @@ export function versionToRelease( version: string, packageName: string, registryUrl: string, + isDeprecated: boolean, ): Release { return { version, @@ -50,5 +53,6 @@ export function versionToRelease( `${packageName}-${version}`, 'changelog', ), + isDeprecated, }; } diff --git a/lib/modules/datasource/hackage/schema.ts b/lib/modules/datasource/hackage/schema.ts index dcee186743c6020406b676449bee6abffa1fb198..4081d153f3b92aab42e884cf7ae80a4f89cba5df 100644 --- a/lib/modules/datasource/hackage/schema.ts +++ b/lib/modules/datasource/hackage/schema.ts @@ -1,3 +1,8 @@ import { z } from 'zod'; -export const HackagePackageMetadata = z.record(z.string()); +// See https://github.com/haskell/hackage-server +// revision e885d36c +// src/Distribution/Server/Features/PackageInfoJSON/State.hs line 160 +const VersionStatus = z.enum(['normal', 'deprecated', 'unpreferred']); + +export const HackagePackageMetadata = z.record(VersionStatus);