From 333d9ce35a0bb902d48720da8a0d9fe9647b0ba9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 28 Jul 2026 02:40:37 +0000 Subject: [PATCH] Resolve legacy OpenJDK build metadata --- .../distributors/openjdk-installer.test.ts | 12 +++++++++++ dist/setup/index.js | 12 ++++++++++- src/distributions/openjdk/installer.ts | 21 ++++++++++++++++++- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/__tests__/distributors/openjdk-installer.test.ts b/__tests__/distributors/openjdk-installer.test.ts index b2799e61..7abf64ed 100644 --- a/__tests__/distributors/openjdk-installer.test.ts +++ b/__tests__/distributors/openjdk-installer.test.ts @@ -47,6 +47,8 @@ const archivePage = ` tar.gz tar.gz tar.gz + 9.0.4 (build 9.0.4+11) + tar.gz `; function createDistribution( @@ -111,6 +113,16 @@ describe('OpenJdkDistribution', () => { expect(result.version).toBe('26.0.2+10'); }); + it('resolves an exact build from a legacy archive heading', async () => { + const result = + await createDistribution('9.0.4+11')['findPackageForDownload']( + '9.0.4+11' + ); + + expect(result.version).toBe('9.0.4+11'); + expect(result.url).toContain('/binaries/openjdk-9.0.4_linux-x64_bin'); + }); + it('resolves a four-field Java version', async () => { const result = await createDistribution('18.0.1.1')['findPackageForDownload']( diff --git a/dist/setup/index.js b/dist/setup/index.js index 269d760f..76f07358 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -131939,13 +131939,23 @@ class OpenJdkDistribution extends JavaBase { const pattern = new RegExp(`href="(https://download\\.java\\.net/[^"]+/openjdk-([^"_]+)_${platformPattern}-${arch}_bin\\.${extensionPattern})"`, 'g'); return Array.from(html.matchAll(pattern), match => { const url = match[1]; - const build = url.match(/\/(\d+)\/(?:GPL\/)?openjdk-/)?.[1]; + const build = url.match(/\/(\d+)\/(?:GPL\/)?openjdk-/)?.[1] ?? + this.findBuildInArchiveHeading(html, match.index, match[2]); return { version: this.toSemver(match[2], build), url }; }); } + findBuildInArchiveHeading(html, assetIndex, version) { + const headings = Array.from(html.slice(0, assetIndex).matchAll(/\(build\s+([^)]+)\)/g)); + const headingVersion = headings.at(-1)?.[1]; + if (!headingVersion) { + return undefined; + } + const [javaVersion, build] = headingVersion.split('+'); + return javaVersion === version ? build : undefined; + } toSemver(version, urlBuild) { const [javaVersion, filenameBuild] = version.replace('-ea', '').split('+'); const versionParts = javaVersion.split('.'); diff --git a/src/distributions/openjdk/installer.ts b/src/distributions/openjdk/installer.ts index 5776cddc..3041a563 100644 --- a/src/distributions/openjdk/installer.ts +++ b/src/distributions/openjdk/installer.ts @@ -126,7 +126,9 @@ export class OpenJdkDistribution extends JavaBase { return Array.from(html.matchAll(pattern), match => { const url = match[1]; - const build = url.match(/\/(\d+)\/(?:GPL\/)?openjdk-/)?.[1]; + const build = + url.match(/\/(\d+)\/(?:GPL\/)?openjdk-/)?.[1] ?? + this.findBuildInArchiveHeading(html, match.index, match[2]); return { version: this.toSemver(match[2], build), url @@ -134,6 +136,23 @@ export class OpenJdkDistribution extends JavaBase { }); } + private findBuildInArchiveHeading( + html: string, + assetIndex: number, + version: string + ): string | undefined { + const headings = Array.from( + html.slice(0, assetIndex).matchAll(/\(build\s+([^)]+)\)/g) + ); + const headingVersion = headings.at(-1)?.[1]; + if (!headingVersion) { + return undefined; + } + + const [javaVersion, build] = headingVersion.split('+'); + return javaVersion === version ? build : undefined; + } + private toSemver(version: string, urlBuild?: string): string { const [javaVersion, filenameBuild] = version.replace('-ea', '').split('+'); const versionParts = javaVersion.split('.');