From 7d18973ae547da8e5ec2e73d135fdc88dddef305 Mon Sep 17 00:00:00 2001 From: Jeff Dickey Date: Thu, 11 Jun 2026 14:52:13 -0500 Subject: [PATCH] fix(openjdk): preserve ea version aliases --- public/api/jvm/ea/linux/aarch64.json | 14 ++++- public/api/jvm/ea/linux/x86_64.json | 14 ++++- public/api/jvm/ea/macosx/aarch64.json | 14 ++++- public/api/jvm/ea/windows/x86_64.json | 14 ++++- src/cli/export/release_type.rs | 91 ++++++++++++++++++++++++++- 5 files changed, 141 insertions(+), 6 deletions(-) diff --git a/public/api/jvm/ea/linux/aarch64.json b/public/api/jvm/ea/linux/aarch64.json index 96cf717d..64cbe9ae 100644 --- a/public/api/jvm/ea/linux/aarch64.json +++ b/public/api/jvm/ea/linux/aarch64.json @@ -25159,5 +25159,17 @@ "url": "https://cdn.azul.com/zulu/bin/zulu19.0.23-ea-jdk19.0.0-ea.7-linux_aarch64.tar.gz", "vendor": "zulu", "version": "19.0.23.0" + }, + { + "checksum": "sha256:642cdb07549c099010edf29631c3ceea1b96000fcd1c15d23598eb99bcb16042", + "created_at": "2026-06-10T21:19:20.321295", + "features": [], + "file_type": "tar.gz", + "image_type": "jdk", + "java_version": "28.0.0-ea", + "jvm_impl": "hotspot", + "url": "https://download.java.net/java/early_access/jdk28/1/GPL/openjdk-28-ea+1_linux-aarch64_bin.tar.gz", + "vendor": "openjdk", + "version": "28.0.0-ea" } -] \ No newline at end of file +] diff --git a/public/api/jvm/ea/linux/x86_64.json b/public/api/jvm/ea/linux/x86_64.json index f031a601..87df57ba 100644 --- a/public/api/jvm/ea/linux/x86_64.json +++ b/public/api/jvm/ea/linux/x86_64.json @@ -52091,5 +52091,17 @@ "url": "https://github.com/SAP/SapMachine/releases/download/sapmachine-13.0.2%2B1/sapmachine-jre-13.0.2-ea.1_linux-x64_bin.tar.gz", "vendor": "sapmachine", "version": "13.0.2-ea.1" + }, + { + "checksum": "sha256:d9b2b25f13a93424625f129bc9725ded401725e36ac819b9f4951f02bc8fc91c", + "created_at": "2026-06-10T21:19:20.321295", + "features": [], + "file_type": "tar.gz", + "image_type": "jdk", + "java_version": "28.0.0-ea", + "jvm_impl": "hotspot", + "url": "https://download.java.net/java/early_access/jdk28/1/GPL/openjdk-28-ea+1_linux-x64_bin.tar.gz", + "vendor": "openjdk", + "version": "28.0.0-ea" } -] \ No newline at end of file +] diff --git a/public/api/jvm/ea/macosx/aarch64.json b/public/api/jvm/ea/macosx/aarch64.json index 2a2d0cfb..5bf8e05a 100644 --- a/public/api/jvm/ea/macosx/aarch64.json +++ b/public/api/jvm/ea/macosx/aarch64.json @@ -22384,5 +22384,17 @@ "url": "https://github.com/bell-sw/Liberica/releases/download/26%2B29-ea/bellsoft-jre26%2B29-ea-macos-aarch64.zip", "vendor": "liberica", "version": "26.0.0+29-ea" + }, + { + "checksum": "sha256:bd5590d508540ee5211ee742cd55a4b060651da545ef6073517f9d6d85c5b9d1", + "created_at": "2026-06-10T21:19:20.321295", + "features": [], + "file_type": "tar.gz", + "image_type": "jdk", + "java_version": "28.0.0-ea", + "jvm_impl": "hotspot", + "url": "https://download.java.net/java/early_access/jdk28/1/GPL/openjdk-28-ea+1_macos-aarch64_bin.tar.gz", + "vendor": "openjdk", + "version": "28.0.0-ea" } -] \ No newline at end of file +] diff --git a/public/api/jvm/ea/windows/x86_64.json b/public/api/jvm/ea/windows/x86_64.json index 119a2f86..7f6eab9b 100644 --- a/public/api/jvm/ea/windows/x86_64.json +++ b/public/api/jvm/ea/windows/x86_64.json @@ -30219,5 +30219,17 @@ "url": "https://github.com/bell-sw/Liberica/releases/download/26%2B29-ea/bellsoft-jre26%2B29-ea-windows-amd64.zip", "vendor": "liberica", "version": "26.0.0+29-ea" + }, + { + "checksum": "sha256:4aaad6cb26305877733b973a209216ad1ed529c381dd88c56e3ab87f579f96cc", + "created_at": "2026-06-10T21:19:20.321295", + "features": [], + "file_type": "zip", + "image_type": "jdk", + "java_version": "28.0.0-ea", + "jvm_impl": "hotspot", + "url": "https://download.java.net/java/early_access/jdk28/1/GPL/openjdk-28-ea+1_windows-x64_bin.zip", + "vendor": "openjdk", + "version": "28.0.0-ea" } -] \ No newline at end of file +] diff --git a/src/cli/export/release_type.rs b/src/cli/export/release_type.rs index af877f7e..e59d38e1 100644 --- a/src/cli/export/release_type.rs +++ b/src/cli/export/release_type.rs @@ -1,4 +1,4 @@ -use std::{fs::File, path::PathBuf}; +use std::{collections::HashMap, fs::File, path::PathBuf}; use eyre::Result; use log::info; @@ -76,7 +76,7 @@ impl ReleaseType { for release_type in &release_types { for os in &oses { for arch in &archs { - let data = db.export_release_type(release_type, arch, os)?; + let data = with_openjdk_ea_aliases(db.export_release_type(release_type, arch, os)?); let export_data = data .into_par_iter() @@ -105,3 +105,90 @@ impl ReleaseType { Ok(()) } } + +fn with_openjdk_ea_aliases(mut data: Vec) -> Vec { + let existing = data + .iter() + .filter(|item| item.vendor == "openjdk") + .map(|item| item.version.as_str()) + .collect::>(); + let mut aliases: HashMap = HashMap::new(); + + for item in &data { + if item.vendor != "openjdk" || item.release_type != "ea" { + continue; + } + let Some((alias, build)) = item.version.split_once('+') else { + continue; + }; + if !alias.ends_with("-ea") || existing.contains(alias) { + continue; + } + let Ok(build) = build.parse::() else { + continue; + }; + + let mut alias_item = item.clone(); + alias_item.java_version = alias.to_string(); + alias_item.version = alias.to_string(); + aliases + .entry(alias.to_string()) + .and_modify(|(existing_build, existing_item)| { + if build > *existing_build { + *existing_build = build; + *existing_item = alias_item.clone(); + } + }) + .or_insert((build, alias_item)); + } + + data.extend(aliases.into_values().map(|(_, item)| item)); + data +} + +#[cfg(test)] +mod tests { + use super::*; + use std::collections::HashSet; + + fn openjdk(version: &str) -> JvmData { + JvmData { + architecture: "x86_64".to_string(), + file_type: "tar.gz".to_string(), + image_type: "jdk".to_string(), + java_version: version.to_string(), + jvm_impl: "hotspot".to_string(), + os: "linux".to_string(), + release_type: "ea".to_string(), + url: format!("https://example.com/openjdk-{version}.tar.gz"), + vendor: "openjdk".to_string(), + version: version.to_string(), + ..Default::default() + } + } + + #[test] + fn test_with_openjdk_ea_aliases() { + let data = with_openjdk_ea_aliases(vec![openjdk("28.0.0-ea+1")]); + let versions = data.iter().map(|item| item.version.as_str()).collect::>(); + + assert!(versions.contains("28.0.0-ea+1")); + assert!(versions.contains("28.0.0-ea")); + } + + #[test] + fn test_with_openjdk_ea_aliases_keeps_existing_alias() { + let data = with_openjdk_ea_aliases(vec![openjdk("28.0.0-ea+1"), openjdk("28.0.0-ea")]); + let aliases = data.iter().filter(|item| item.version == "28.0.0-ea").count(); + + assert_eq!(aliases, 1); + } + + #[test] + fn test_with_openjdk_ea_aliases_uses_highest_build() { + let data = with_openjdk_ea_aliases(vec![openjdk("28.0.0-ea+1"), openjdk("28.0.0-ea+2")]); + let alias = data.iter().find(|item| item.version == "28.0.0-ea").unwrap(); + + assert_eq!(alias.url, "https://example.com/openjdk-28.0.0-ea+2.tar.gz"); + } +}