Fix gu integration for GraalVM for JDK 21.

Fixes #62.
This commit is contained in:
Fabio Niephaus 2023-09-20 12:59:33 +02:00
parent 2fb264a6b0
commit 8dd4f51a5e
No known key found for this signature in database
GPG Key ID: F21CF5275F31DFD6
4 changed files with 94 additions and 36 deletions

55
dist/cleanup/index.js generated vendored
View File

@ -58304,7 +58304,7 @@ class Range {
this.set = this.raw this.set = this.raw
.split('||') .split('||')
// map the range to a 2d array of comparators // map the range to a 2d array of comparators
.map(r => this.parseRange(r)) .map(r => this.parseRange(r.trim()))
// throw out any comparator lists that are empty // throw out any comparator lists that are empty
// this generally means that it was not a valid range, which is allowed // this generally means that it was not a valid range, which is allowed
// in loose mode, but will still throw if the WHOLE range is invalid. // in loose mode, but will still throw if the WHOLE range is invalid.
@ -58364,15 +58364,18 @@ class Range {
const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]
range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) range = range.replace(hr, hyphenReplace(this.options.includePrerelease))
debug('hyphen replace', range) debug('hyphen replace', range)
// `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)
debug('comparator trim', range) debug('comparator trim', range)
// `~ 1.2.3` => `~1.2.3` // `~ 1.2.3` => `~1.2.3`
range = range.replace(re[t.TILDETRIM], tildeTrimReplace) range = range.replace(re[t.TILDETRIM], tildeTrimReplace)
debug('tilde trim', range)
// `^ 1.2.3` => `^1.2.3` // `^ 1.2.3` => `^1.2.3`
range = range.replace(re[t.CARETTRIM], caretTrimReplace) range = range.replace(re[t.CARETTRIM], caretTrimReplace)
debug('caret trim', range)
// At this point, the range is completely trimmed and // At this point, the range is completely trimmed and
// ready to be split into comparators. // ready to be split into comparators.
@ -59674,6 +59677,10 @@ const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
// Max safe segment length for coercion. // Max safe segment length for coercion.
const MAX_SAFE_COMPONENT_LENGTH = 16 const MAX_SAFE_COMPONENT_LENGTH = 16
// Max safe length for a build identifier. The max length minus 6 characters for
// the shortest version with a build 0.0.0+BUILD.
const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6
const RELEASE_TYPES = [ const RELEASE_TYPES = [
'major', 'major',
'premajor', 'premajor',
@ -59687,6 +59694,7 @@ const RELEASE_TYPES = [
module.exports = { module.exports = {
MAX_LENGTH, MAX_LENGTH,
MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_COMPONENT_LENGTH,
MAX_SAFE_BUILD_LENGTH,
MAX_SAFE_INTEGER, MAX_SAFE_INTEGER,
RELEASE_TYPES, RELEASE_TYPES,
SEMVER_SPEC_VERSION, SEMVER_SPEC_VERSION,
@ -59768,7 +59776,11 @@ module.exports = parseOptions
/***/ 9523: /***/ 9523:
/***/ ((module, exports, __nccwpck_require__) => { /***/ ((module, exports, __nccwpck_require__) => {
const { MAX_SAFE_COMPONENT_LENGTH } = __nccwpck_require__(2293) const {
MAX_SAFE_COMPONENT_LENGTH,
MAX_SAFE_BUILD_LENGTH,
MAX_LENGTH,
} = __nccwpck_require__(2293)
const debug = __nccwpck_require__(427) const debug = __nccwpck_require__(427)
exports = module.exports = {} exports = module.exports = {}
@ -59779,16 +59791,31 @@ const src = exports.src = []
const t = exports.t = {} const t = exports.t = {}
let R = 0 let R = 0
const LETTERDASHNUMBER = '[a-zA-Z0-9-]'
// Replace some greedy regex tokens to prevent regex dos issues. These regex are
// used internally via the safeRe object since all inputs in this library get
// normalized first to trim and collapse all extra whitespace. The original
// regexes are exported for userland consumption and lower level usage. A
// future breaking change could export the safer regex only with a note that
// all input should have extra whitespace removed.
const safeRegexReplacements = [
['\\s', 1],
['\\d', MAX_LENGTH],
[LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],
]
const makeSafeRegex = (value) => {
for (const [token, max] of safeRegexReplacements) {
value = value
.split(`${token}*`).join(`${token}{0,${max}}`)
.split(`${token}+`).join(`${token}{1,${max}}`)
}
return value
}
const createToken = (name, value, isGlobal) => { const createToken = (name, value, isGlobal) => {
// Replace all greedy whitespace to prevent regex dos issues. These regex are const safe = makeSafeRegex(value)
// used internally via the safeRe object since all inputs in this library get
// normalized first to trim and collapse all extra whitespace. The original
// regexes are exported for userland consumption and lower level usage. A
// future breaking change could export the safer regex only with a note that
// all input should have extra whitespace removed.
const safe = value
.split('\\s*').join('\\s{0,1}')
.split('\\s+').join('\\s')
const index = R++ const index = R++
debug(name, index, value) debug(name, index, value)
t[name] = index t[name] = index
@ -59804,13 +59831,13 @@ const createToken = (name, value, isGlobal) => {
// A single `0`, or a non-zero digit followed by zero or more digits. // A single `0`, or a non-zero digit followed by zero or more digits.
createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*')
createToken('NUMERICIDENTIFIERLOOSE', '[0-9]+') createToken('NUMERICIDENTIFIERLOOSE', '\\d+')
// ## Non-numeric Identifier // ## Non-numeric Identifier
// Zero or more digits, followed by a letter or hyphen, and then zero or // Zero or more digits, followed by a letter or hyphen, and then zero or
// more letters, digits, or hyphens. // more letters, digits, or hyphens.
createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*') createToken('NONNUMERICIDENTIFIER', `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)
// ## Main Version // ## Main Version
// Three dot-separated numeric identifiers. // Three dot-separated numeric identifiers.
@ -59845,7 +59872,7 @@ createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]
// ## Build Metadata Identifier // ## Build Metadata Identifier
// Any combination of digits, letters, or hyphens. // Any combination of digits, letters, or hyphens.
createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+') createToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)
// ## Build Metadata // ## Build Metadata
// Plus sign, followed by one or more period-separated build metadata // Plus sign, followed by one or more period-separated build metadata

65
dist/main/index.js generated vendored
View File

@ -58304,7 +58304,7 @@ class Range {
this.set = this.raw this.set = this.raw
.split('||') .split('||')
// map the range to a 2d array of comparators // map the range to a 2d array of comparators
.map(r => this.parseRange(r)) .map(r => this.parseRange(r.trim()))
// throw out any comparator lists that are empty // throw out any comparator lists that are empty
// this generally means that it was not a valid range, which is allowed // this generally means that it was not a valid range, which is allowed
// in loose mode, but will still throw if the WHOLE range is invalid. // in loose mode, but will still throw if the WHOLE range is invalid.
@ -58364,15 +58364,18 @@ class Range {
const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]
range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) range = range.replace(hr, hyphenReplace(this.options.includePrerelease))
debug('hyphen replace', range) debug('hyphen replace', range)
// `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)
debug('comparator trim', range) debug('comparator trim', range)
// `~ 1.2.3` => `~1.2.3` // `~ 1.2.3` => `~1.2.3`
range = range.replace(re[t.TILDETRIM], tildeTrimReplace) range = range.replace(re[t.TILDETRIM], tildeTrimReplace)
debug('tilde trim', range)
// `^ 1.2.3` => `^1.2.3` // `^ 1.2.3` => `^1.2.3`
range = range.replace(re[t.CARETTRIM], caretTrimReplace) range = range.replace(re[t.CARETTRIM], caretTrimReplace)
debug('caret trim', range)
// At this point, the range is completely trimmed and // At this point, the range is completely trimmed and
// ready to be split into comparators. // ready to be split into comparators.
@ -59674,6 +59677,10 @@ const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
// Max safe segment length for coercion. // Max safe segment length for coercion.
const MAX_SAFE_COMPONENT_LENGTH = 16 const MAX_SAFE_COMPONENT_LENGTH = 16
// Max safe length for a build identifier. The max length minus 6 characters for
// the shortest version with a build 0.0.0+BUILD.
const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6
const RELEASE_TYPES = [ const RELEASE_TYPES = [
'major', 'major',
'premajor', 'premajor',
@ -59687,6 +59694,7 @@ const RELEASE_TYPES = [
module.exports = { module.exports = {
MAX_LENGTH, MAX_LENGTH,
MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_COMPONENT_LENGTH,
MAX_SAFE_BUILD_LENGTH,
MAX_SAFE_INTEGER, MAX_SAFE_INTEGER,
RELEASE_TYPES, RELEASE_TYPES,
SEMVER_SPEC_VERSION, SEMVER_SPEC_VERSION,
@ -59768,7 +59776,11 @@ module.exports = parseOptions
/***/ 9523: /***/ 9523:
/***/ ((module, exports, __nccwpck_require__) => { /***/ ((module, exports, __nccwpck_require__) => {
const { MAX_SAFE_COMPONENT_LENGTH } = __nccwpck_require__(2293) const {
MAX_SAFE_COMPONENT_LENGTH,
MAX_SAFE_BUILD_LENGTH,
MAX_LENGTH,
} = __nccwpck_require__(2293)
const debug = __nccwpck_require__(427) const debug = __nccwpck_require__(427)
exports = module.exports = {} exports = module.exports = {}
@ -59779,16 +59791,31 @@ const src = exports.src = []
const t = exports.t = {} const t = exports.t = {}
let R = 0 let R = 0
const LETTERDASHNUMBER = '[a-zA-Z0-9-]'
// Replace some greedy regex tokens to prevent regex dos issues. These regex are
// used internally via the safeRe object since all inputs in this library get
// normalized first to trim and collapse all extra whitespace. The original
// regexes are exported for userland consumption and lower level usage. A
// future breaking change could export the safer regex only with a note that
// all input should have extra whitespace removed.
const safeRegexReplacements = [
['\\s', 1],
['\\d', MAX_LENGTH],
[LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],
]
const makeSafeRegex = (value) => {
for (const [token, max] of safeRegexReplacements) {
value = value
.split(`${token}*`).join(`${token}{0,${max}}`)
.split(`${token}+`).join(`${token}{1,${max}}`)
}
return value
}
const createToken = (name, value, isGlobal) => { const createToken = (name, value, isGlobal) => {
// Replace all greedy whitespace to prevent regex dos issues. These regex are const safe = makeSafeRegex(value)
// used internally via the safeRe object since all inputs in this library get
// normalized first to trim and collapse all extra whitespace. The original
// regexes are exported for userland consumption and lower level usage. A
// future breaking change could export the safer regex only with a note that
// all input should have extra whitespace removed.
const safe = value
.split('\\s*').join('\\s{0,1}')
.split('\\s+').join('\\s')
const index = R++ const index = R++
debug(name, index, value) debug(name, index, value)
t[name] = index t[name] = index
@ -59804,13 +59831,13 @@ const createToken = (name, value, isGlobal) => {
// A single `0`, or a non-zero digit followed by zero or more digits. // A single `0`, or a non-zero digit followed by zero or more digits.
createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*')
createToken('NUMERICIDENTIFIERLOOSE', '[0-9]+') createToken('NUMERICIDENTIFIERLOOSE', '\\d+')
// ## Non-numeric Identifier // ## Non-numeric Identifier
// Zero or more digits, followed by a letter or hyphen, and then zero or // Zero or more digits, followed by a letter or hyphen, and then zero or
// more letters, digits, or hyphens. // more letters, digits, or hyphens.
createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*') createToken('NONNUMERICIDENTIFIER', `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)
// ## Main Version // ## Main Version
// Three dot-separated numeric identifiers. // Three dot-separated numeric identifiers.
@ -59845,7 +59872,7 @@ createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]
// ## Build Metadata Identifier // ## Build Metadata Identifier
// Any combination of digits, letters, or hyphens. // Any combination of digits, letters, or hyphens.
createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+') createToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)
// ## Build Metadata // ## Build Metadata
// Plus sign, followed by one or more period-separated build metadata // Plus sign, followed by one or more period-separated build metadata
@ -71233,10 +71260,10 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.setUpGUComponents = void 0; exports.setUpGUComponents = void 0;
const c = __importStar(__nccwpck_require__(9042)); const c = __importStar(__nccwpck_require__(9042));
const core = __importStar(__nccwpck_require__(2186)); const core = __importStar(__nccwpck_require__(2186));
const semver = __importStar(__nccwpck_require__(1383));
const constants_1 = __nccwpck_require__(9042); const constants_1 = __nccwpck_require__(9042);
const utils_1 = __nccwpck_require__(1314); const utils_1 = __nccwpck_require__(1314);
const path_1 = __nccwpck_require__(1017); const path_1 = __nccwpck_require__(1017);
const semver_1 = __nccwpck_require__(1383);
const BASE_FLAGS = ['--non-interactive', 'install', '--no-progress']; const BASE_FLAGS = ['--non-interactive', 'install', '--no-progress'];
const COMPONENT_TO_POST_INSTALL_HOOK = new Map([ const COMPONENT_TO_POST_INSTALL_HOOK = new Map([
[ [
@ -71260,9 +71287,10 @@ function setUpGUComponents(javaVersion, graalVMVersion, graalVMHome, components,
if (components.length == 0) { if (components.length == 0) {
return; // nothing to do return; // nothing to do
} }
const coercedJavaVersion = semver.coerce(javaVersion);
if (graalVMVersion === c.VERSION_DEV || if (graalVMVersion === c.VERSION_DEV ||
javaVersion === c.VERSION_DEV || javaVersion === c.VERSION_DEV ||
((0, semver_1.valid)(javaVersion) && (0, semver_1.gte)(javaVersion, '21.0.0'))) { (coercedJavaVersion != null && semver.gte(coercedJavaVersion, '21.0.0'))) {
if (components.length == 1 && components[0] === 'native-image') { if (components.length == 1 && components[0] === 'native-image') {
core.warning(`Please remove "components: 'native-image'" from your workflow file. It is automatically included since GraalVM for JDK 17: https://github.com/oracle/graal/pull/5995`); core.warning(`Please remove "components: 'native-image'" from your workflow file. It is automatically included since GraalVM for JDK 17: https://github.com/oracle/graal/pull/5995`);
} }
@ -71412,10 +71440,12 @@ function run() {
} }
} }
else { else {
const coercedJavaVersion = semver.coerce(javaVersion);
switch (graalVMVersion) { switch (graalVMVersion) {
case c.VERSION_LATEST: case c.VERSION_LATEST:
if (javaVersion.startsWith('17') || if (javaVersion.startsWith('17') ||
(semver.valid(javaVersion) && semver.gte(javaVersion, '20.0.0'))) { (coercedJavaVersion !== null &&
semver.gte(coercedJavaVersion, '20.0.0'))) {
core.info(`This build is using the new Oracle GraalVM. To select a specific distribution, use the 'distribution' option (see https://github.com/graalvm/setup-graalvm/tree/main#options).`); core.info(`This build is using the new Oracle GraalVM. To select a specific distribution, use the 'distribution' option (see https://github.com/graalvm/setup-graalvm/tree/main#options).`);
graalVMHome = yield graalvm.setUpGraalVMJDK(javaVersion); graalVMHome = yield graalvm.setUpGraalVMJDK(javaVersion);
} }
@ -71427,7 +71457,6 @@ function run() {
if (gdsToken.length > 0) { if (gdsToken.length > 0) {
throw new Error('Downloading GraalVM EE dev builds is not supported'); throw new Error('Downloading GraalVM EE dev builds is not supported');
} }
const coercedJavaVersion = semver.coerce(javaVersion);
if (coercedJavaVersion !== null && if (coercedJavaVersion !== null &&
!semver.gte(coercedJavaVersion, '21.0.0')) { !semver.gte(coercedJavaVersion, '21.0.0')) {
core.warning(`GraalVM dev builds are only available for JDK 21. This build is now using a stable release of GraalVM for JDK ${javaVersion}.`); core.warning(`GraalVM dev builds are only available for JDK 21. This build is now using a stable release of GraalVM for JDK ${javaVersion}.`);

View File

@ -1,9 +1,9 @@
import * as c from './constants' import * as c from './constants'
import * as core from '@actions/core' import * as core from '@actions/core'
import * as semver from 'semver'
import {GRAALVM_PLATFORM} from './constants' import {GRAALVM_PLATFORM} from './constants'
import {exec} from './utils' import {exec} from './utils'
import {join} from 'path' import {join} from 'path'
import {gte as semverGte, valid as semverValid} from 'semver'
const BASE_FLAGS = ['--non-interactive', 'install', '--no-progress'] const BASE_FLAGS = ['--non-interactive', 'install', '--no-progress']
const COMPONENT_TO_POST_INSTALL_HOOK = new Map<string, Map<string, string>>([ const COMPONENT_TO_POST_INSTALL_HOOK = new Map<string, Map<string, string>>([
@ -34,10 +34,11 @@ export async function setUpGUComponents(
if (components.length == 0) { if (components.length == 0) {
return // nothing to do return // nothing to do
} }
const coercedJavaVersion = semver.coerce(javaVersion)
if ( if (
graalVMVersion === c.VERSION_DEV || graalVMVersion === c.VERSION_DEV ||
javaVersion === c.VERSION_DEV || javaVersion === c.VERSION_DEV ||
(semverValid(javaVersion) && semverGte(javaVersion, '21.0.0')) (coercedJavaVersion != null && semver.gte(coercedJavaVersion, '21.0.0'))
) { ) {
if (components.length == 1 && components[0] === 'native-image') { if (components.length == 1 && components[0] === 'native-image') {
core.warning( core.warning(

View File

@ -83,11 +83,13 @@ async function run(): Promise<void> {
throw new Error(`Unsupported distribution: ${distribution}`) throw new Error(`Unsupported distribution: ${distribution}`)
} }
} else { } else {
const coercedJavaVersion = semver.coerce(javaVersion)
switch (graalVMVersion) { switch (graalVMVersion) {
case c.VERSION_LATEST: case c.VERSION_LATEST:
if ( if (
javaVersion.startsWith('17') || javaVersion.startsWith('17') ||
(semver.valid(javaVersion) && semver.gte(javaVersion, '20.0.0')) (coercedJavaVersion !== null &&
semver.gte(coercedJavaVersion, '20.0.0'))
) { ) {
core.info( core.info(
`This build is using the new Oracle GraalVM. To select a specific distribution, use the 'distribution' option (see https://github.com/graalvm/setup-graalvm/tree/main#options).` `This build is using the new Oracle GraalVM. To select a specific distribution, use the 'distribution' option (see https://github.com/graalvm/setup-graalvm/tree/main#options).`
@ -106,7 +108,6 @@ async function run(): Promise<void> {
'Downloading GraalVM EE dev builds is not supported' 'Downloading GraalVM EE dev builds is not supported'
) )
} }
const coercedJavaVersion = semver.coerce(javaVersion)
if ( if (
coercedJavaVersion !== null && coercedJavaVersion !== null &&
!semver.gte(coercedJavaVersion, '21.0.0') !semver.gte(coercedJavaVersion, '21.0.0')