From a3157a73f7bebcb2d3ae3a544afc32d87f90fe7a Mon Sep 17 00:00:00 2001 From: Thomas Wuerthinger Date: Fri, 2 Oct 2026 20:53:07 +0200 Subject: [PATCH 1/2] fix(graalvm): include community innovation releases MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Accept Community archive names with innovation prefixes and additional Java version components. Match Oracle GraalVM by tagging these releases with the innovation feature and keeping version and java_version at the underlying JDK version. For example, 25i4-25.0.4.1.1 becomes graalvm-community-innovation-25.0.4.1.1 in mise. Extend the existing filename parsing cases to cover releases 25.1 through 25.4 across Linux, macOS, and Windows. *AI-assisted — Tool: Codex; model: OpenAI/gpt-6.1-sol; version: 0.160.0.* --- src/jvm/vendor/graalvm.rs | 49 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/src/jvm/vendor/graalvm.rs b/src/jvm/vendor/graalvm.rs index 1ca2d5f5..8cb7cc39 100644 --- a/src/jvm/vendor/graalvm.rs +++ b/src/jvm/vendor/graalvm.rs @@ -120,10 +120,17 @@ fn map_community(asset: &GitHubAsset) -> Result { let filename_meta = meta_from_name_community(&filename)?; let url = asset.browser_download_url.clone(); let version = normalize_version(&filename_meta.version); + // Match Oracle GraalVM's innovation feature and underlying Java version naming. + let features = if regex!(r"graalvm-community-jdk-\d+i").is_match(&filename) { + Some(vec!["innovation".to_string()]) + } else { + None + }; Ok(JvmData { architecture: normalize_architecture(&filename_meta.arch), checksum: sha256sum, checksum_url: Some(sha256_url), + features, filename, file_type: filename_meta.ext.clone(), image_type: "jdk".to_string(), @@ -166,7 +173,7 @@ fn meta_from_name_ce(name: &str) -> Result { fn meta_from_name_community(name: &str) -> Result { debug!("[graalvm] parsing name: {name}"); - let capture = regex!(r"^graalvm-community-jdk-([0-9]{1,2}\.[0-9]{1}\.[0-9]{1,3})_(linux|macos|windows)-(aarch64|x64)_bin\.(zip|tar\.gz)$") + let capture = regex!(r"^graalvm-community-jdk-(?:[0-9]+i[0-9]+-)?([0-9]+\.[0-9]+\.[0-9]+(?:\.[0-9]+)*)_(linux|macos|windows)-(aarch64|x64)_bin\.(zip|tar\.gz)$") .captures(name) .ok_or_else(|| eyre::eyre!("regular expression did not match name: {name}"))?; @@ -239,6 +246,46 @@ mod test { version: "23.0.2".to_string(), }, ), + ( + "graalvm-community-jdk-25i1-25.0.3_linux-aarch64_bin.tar.gz", + FileNameMeta { + arch: "aarch64".to_string(), + ext: "tar.gz".to_string(), + java_version: "25.0.3".to_string(), + os: "linux".to_string(), + version: "25.0.3".to_string(), + }, + ), + ( + "graalvm-community-jdk-25i2-25.0.4_linux-x64_bin.tar.gz", + FileNameMeta { + arch: "x64".to_string(), + ext: "tar.gz".to_string(), + java_version: "25.0.4".to_string(), + os: "linux".to_string(), + version: "25.0.4".to_string(), + }, + ), + ( + "graalvm-community-jdk-25i3-25.0.4.1_macos-aarch64_bin.tar.gz", + FileNameMeta { + arch: "aarch64".to_string(), + ext: "tar.gz".to_string(), + java_version: "25.0.4.1".to_string(), + os: "macos".to_string(), + version: "25.0.4.1".to_string(), + }, + ), + ( + "graalvm-community-jdk-25i4-25.0.4.1.1_windows-x64_bin.zip", + FileNameMeta { + arch: "x64".to_string(), + ext: "zip".to_string(), + java_version: "25.0.4.1.1".to_string(), + os: "windows".to_string(), + version: "25.0.4.1.1".to_string(), + }, + ), ] { assert_eq!(meta_from_name_community(actual).unwrap(), expected); } From bde1904917da21aa02ae8bb381a64a4464691258 Mon Sep 17 00:00:00 2001 From: Thomas Wuerthinger Date: Fri, 2 Oct 2026 21:56:43 +0200 Subject: [PATCH 2/2] test(graalvm): cover community innovation feature mapping MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Separate checksum downloading from Community metadata construction so the mapped records can be tested without network access. Assert the innovation feature and underlying JDK versions for an innovation archive, and verify that a standard Community archive has no innovation feature. Also check that download URLs and checksum metadata are preserved. *AI-assisted — Tool: Codex; model: OpenAI/gpt-6.1-sol; version: 0.160.0.* --- src/jvm/vendor/graalvm.rs | 49 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/jvm/vendor/graalvm.rs b/src/jvm/vendor/graalvm.rs index 8cb7cc39..cfb631ad 100644 --- a/src/jvm/vendor/graalvm.rs +++ b/src/jvm/vendor/graalvm.rs @@ -116,6 +116,10 @@ fn map_community(asset: &GitHubAsset) -> Result { None } }; + map_community_metadata(asset, sha256sum) +} + +fn map_community_metadata(asset: &GitHubAsset, checksum: Option) -> Result { let filename = asset.name.clone(); let filename_meta = meta_from_name_community(&filename)?; let url = asset.browser_download_url.clone(); @@ -128,8 +132,8 @@ fn map_community(asset: &GitHubAsset) -> Result { }; Ok(JvmData { architecture: normalize_architecture(&filename_meta.arch), - checksum: sha256sum, - checksum_url: Some(sha256_url), + checksum, + checksum_url: Some(format!("{url}.sha256")), features, filename, file_type: filename_meta.ext.clone(), @@ -195,6 +199,47 @@ fn meta_from_name_community(name: &str) -> Result { mod test { use super::*; + #[test] + fn test_map_community_innovation_release() { + let asset = community_asset( + "graalvm-community-jdk-25i4-25.0.4.1.1_linux-x64_bin.tar.gz", + "graal-25.4.4.1.1", + ); + let checksum = Some("sha256:abc123".to_string()); + let jvm = map_community_metadata(&asset, checksum.clone()).unwrap(); + + assert_eq!(jvm.features, Some(vec!["innovation".to_string()])); + assert_eq!(jvm.version, "25.0.4.1.1"); + assert_eq!(jvm.java_version, "25.0.4.1.1"); + assert_eq!(jvm.checksum, checksum); + assert_eq!(jvm.checksum_url, Some(format!("{}.sha256", asset.browser_download_url))); + assert_eq!(jvm.url, asset.browser_download_url); + } + + #[test] + fn test_map_community_standard_release() { + let asset = community_asset("graalvm-community-jdk-25.0.2_linux-x64_bin.tar.gz", "jdk-25.0.2"); + let jvm = map_community_metadata(&asset, None).unwrap(); + + assert_eq!(jvm.features, None); + assert_eq!(jvm.version, "25.0.2"); + assert_eq!(jvm.java_version, "25.0.2"); + assert_eq!(jvm.checksum, None); + assert_eq!(jvm.checksum_url, Some(format!("{}.sha256", asset.browser_download_url))); + assert_eq!(jvm.url, asset.browser_download_url); + } + + fn community_asset(name: &str, tag: &str) -> GitHubAsset { + GitHubAsset { + name: name.to_string(), + browser_download_url: format!( + "https://github.com/graalvm/graalvm-ce-builds/releases/download/{tag}/{name}" + ), + content_type: "application/gzip".to_string(), + size: 0, + } + } + #[test] fn test_meta_from_name_ce() { for (actual, expected) in [