From b185b99ecef5589c63a37f3ccb1618c2f00cba4e Mon Sep 17 00:00:00 2001 From: guicamest <283778+guicamest@users.noreply.github.com> Date: Fri, 24 Jan 2025 23:21:33 +0100 Subject: [PATCH 1/6] chore(e2e-versions): Add e2e test scenario on `setup-java-version-from-file-major-minor-patch-with-dist` for `.sdkmanrc` --- .github/workflows/e2e-versions.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-versions.yml b/.github/workflows/e2e-versions.yml index 5dde96b0..a5ac0ec7 100644 --- a/.github/workflows/e2e-versions.yml +++ b/.github/workflows/e2e-versions.yml @@ -497,7 +497,7 @@ jobs: matrix: os: [macos-latest, windows-latest, ubuntu-latest] distribution: ['adopt', 'zulu', 'liberica'] - java-version-file: ['.java-version', '.tool-versions'] + java-version-file: ['.java-version', '.tool-versions', '.sdkmanrc'] steps: - name: Checkout uses: actions/checkout@v5 @@ -507,6 +507,9 @@ jobs: - name: Create .tool-versions file shell: bash run: echo "java openjdk64-17.0.10" > .tool-versions + - name: Create .sdkmanrc file + shell: bash + run: echo "java=17.0.10-tem" > .sdkmanrc - name: setup-java uses: ./ id: setup-java From 47407b3a2469c2ed9f5769bf53bc711bea4ea780 Mon Sep 17 00:00:00 2001 From: guicamest <283778+guicamest@users.noreply.github.com> Date: Fri, 24 Jan 2025 23:32:59 +0100 Subject: [PATCH 2/6] chore(e2e-versions): Update `setup-java-version-from-file-major-minor-patch-with-dist` test to include the file name of the java-version-file that is used --- .github/workflows/e2e-versions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-versions.yml b/.github/workflows/e2e-versions.yml index a5ac0ec7..a20c1445 100644 --- a/.github/workflows/e2e-versions.yml +++ b/.github/workflows/e2e-versions.yml @@ -490,7 +490,7 @@ jobs: shell: bash setup-java-version-from-file-major-minor-patch-with-dist: - name: ${{ matrix.distribution }} version from file 'openjdk64-17.0.10' - ${{ matrix.os }} + name: ${{ matrix.distribution }} version from file '${{ matrix.java-version-file }}' - ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false From 556a1132803f67e4d3263a12566133e109220ca3 Mon Sep 17 00:00:00 2001 From: guicamest <283778+guicamest@users.noreply.github.com> Date: Sat, 25 Jan 2025 22:02:44 +0100 Subject: [PATCH 3/6] feat: Add support for `.sdkmanrc` as *Java Version File* --- __tests__/util.test.ts | 17 +++++++++++++++++ dist/cleanup/index.js | 3 +++ dist/setup/index.js | 3 +++ src/util.ts | 2 ++ 4 files changed, 25 insertions(+) diff --git a/__tests__/util.test.ts b/__tests__/util.test.ts index 9c943c2f..c96e6aeb 100644 --- a/__tests__/util.test.ts +++ b/__tests__/util.test.ts @@ -2,6 +2,7 @@ import * as cache from '@actions/cache'; import * as core from '@actions/core'; import { convertVersionToSemver, + getVersionFromFileContent, isVersionSatisfies, isCacheFeatureAvailable, isGhes @@ -82,6 +83,22 @@ describe('convertVersionToSemver', () => { }); }); +describe('getVersionFromFileContent', () => { + describe('.sdkmanrc', () => { + it.each([ + ['java=11.0.20.1-tem', '11.0.20'], + ['java = 11.0.20.1-tem', '11.0.20'], + ['java=11.0.20.1-tem # a comment in sdkmanrc', '11.0.20'], + ['java=11.0.20.1-tem\n#java=21.0.20.1-tem\n', '11.0.20'], // choose first match + ['java=11.0.20.1-tem\njava=21.0.20.1-tem\n', '11.0.20'], // choose first match + ['#java=11.0.20.1-tem\njava=21.0.20.1-tem\n', '21.0.20'] // first one is 'commented' in .sdkmanrc + ])('parsing %s should return %s', (content: string, expected: string) => { + const actual = getVersionFromFileContent(content, 'openjdk', '.sdkmanrc'); + expect(actual).toBe(expected); + }); + }); +}); + describe('isGhes', () => { const pristineEnv = process.env; diff --git a/dist/cleanup/index.js b/dist/cleanup/index.js index 79ad0b5f..063375a4 100644 --- a/dist/cleanup/index.js +++ b/dist/cleanup/index.js @@ -94706,6 +94706,9 @@ function getVersionFromFileContent(content, distributionName, versionFile) { javaVersionRegExp = /^java\s+(?:\S*-)?(?\d+(?:\.\d+)*([+_.-](?:openj9[-._]?\d[\w.-]*|java\d+|jre[-_\w]*|OpenJDK\d+[\w_.-]*|[a-z0-9]+))*)/im; } + else if (versionFileName == '.sdkmanrc') { + javaVersionRegExp = /^java\s*=\s*(?[^-]+)/m; + } else { javaVersionRegExp = /(?(?<=(^|\s|-))(\d+\S*))(\s|$)/; } diff --git a/dist/setup/index.js b/dist/setup/index.js index c4e8ec9e..2efeb81b 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -132741,6 +132741,9 @@ function getVersionFromFileContent(content, distributionName, versionFile) { javaVersionRegExp = /^java\s+(?:\S*-)?(?\d+(?:\.\d+)*([+_.-](?:openj9[-._]?\d[\w.-]*|java\d+|jre[-_\w]*|OpenJDK\d+[\w_.-]*|[a-z0-9]+))*)/im; } + else if (versionFileName == '.sdkmanrc') { + javaVersionRegExp = /^java\s*=\s*(?[^-]+)/m; + } else { javaVersionRegExp = /(?(?<=(^|\s|-))(\d+\S*))(\s|$)/; } diff --git a/src/util.ts b/src/util.ts index 9e5f2f66..7aafee07 100644 --- a/src/util.ts +++ b/src/util.ts @@ -134,6 +134,8 @@ export function getVersionFromFileContent( if (versionFileName == '.tool-versions') { javaVersionRegExp = /^java\s+(?:\S*-)?(?\d+(?:\.\d+)*([+_.-](?:openj9[-._]?\d[\w.-]*|java\d+|jre[-_\w]*|OpenJDK\d+[\w_.-]*|[a-z0-9]+))*)/im; + } else if (versionFileName == '.sdkmanrc') { + javaVersionRegExp = /^java\s*=\s*(?[^-]+)/m; } else { javaVersionRegExp = /(?(?<=(^|\s|-))(\d+\S*))(\s|$)/; } From 3228b7f1f1d590f089642418ec58a471529869cc Mon Sep 17 00:00:00 2001 From: guicamest <283778+guicamest@users.noreply.github.com> Date: Sat, 25 Jan 2025 23:51:06 +0100 Subject: [PATCH 4/6] chore: Add test for the latest known sdkman java versions --- __tests__/data/sdkman-java-versions.csv | 135 ++++++++++++++++++++++++ __tests__/util.test.ts | 23 ++++ 2 files changed, 158 insertions(+) create mode 100644 __tests__/data/sdkman-java-versions.csv diff --git a/__tests__/data/sdkman-java-versions.csv b/__tests__/data/sdkman-java-versions.csv new file mode 100644 index 00000000..5c75a44c --- /dev/null +++ b/__tests__/data/sdkman-java-versions.csv @@ -0,0 +1,135 @@ +6.0.119-zulu, 6.0.119 +7.0.352-zulu, 7.0.352 +8.0.282-trava, 8.0.282 +8.0.432-albba, 8.0.432 +8.0.432-amzn, 8.0.432 +8.0.432-kona, 8.0.432 +8.0.432-librca, 8.0.432 +8.0.432-sem, 8.0.432 +8.0.432-tem, 8.0.432 +8.0.432-zulu, 8.0.432 +8.0.432.fx-librca, 8.0.432 +8.0.432.fx-zulu, 8.0.432 +8.0.442-amzn, 8.0.442 +8.0.442-librca, 8.0.442 +8.0.442-tem, 8.0.442 +8.0.442-zulu, 8.0.442 +8.0.442.fx-librca, 8.0.442 +8.0.442.fx-zulu, 8.0.442 +11.0.14.1-jbr, 11.0.14 +11.0.15-trava, 11.0.15 +11.0.25-albba, 11.0.25 +11.0.25-amzn, 11.0.25 +11.0.25-kona, 11.0.25 +11.0.25-librca, 11.0.25 +11.0.25-ms, 11.0.25 +11.0.25-sapmchn, 11.0.25 +11.0.25-sem, 11.0.25 +11.0.25-tem, 11.0.25 +11.0.25-zulu, 11.0.25 +11.0.25.fx-librca, 11.0.25 +11.0.25.fx-zulu, 11.0.25 +11.0.26-amzn, 11.0.26 +11.0.26-librca, 11.0.26 +11.0.26-ms, 11.0.26 +11.0.26-sapmchn, 11.0.26 +11.0.26-zulu, 11.0.26 +11.0.26.fx-librca, 11.0.26 +11.0.26.fx-zulu, 11.0.26 +17.0.12-graal, 17.0.12 +17.0.12-jbr, 17.0.12 +17.0.12-oracle, 17.0.12 +17.0.13-albba, 17.0.13 +17.0.13-amzn, 17.0.13 +17.0.13-kona, 17.0.13 +17.0.13-librca, 17.0.13 +17.0.13-ms, 17.0.13 +17.0.13-sapmchn, 17.0.13 +17.0.13-sem, 17.0.13 +17.0.13-tem, 17.0.13 +17.0.13-zulu, 17.0.13 +17.0.13.crac-librca, 17.0.13 +17.0.13.crac-zulu, 17.0.13 +17.0.13.fx-librca, 17.0.13 +17.0.13.fx-zulu, 17.0.13 +17.0.14-amzn, 17.0.14 +17.0.14-librca, 17.0.14 +17.0.14-ms, 17.0.14 +17.0.14-sapmchn, 17.0.14 +17.0.14-zulu, 17.0.14 +17.0.14.fx-librca, 17.0.14 +17.0.14.fx-zulu, 17.0.14 +17.0.9-graalce, 17.0.9 +21.0.2-graalce, 21.0.2 +21.0.2-open, 21.0.2 +21.0.5-amzn, 21.0.5 +21.0.5-graal, 21.0.5 +21.0.5-jbr, 21.0.5 +21.0.5-kona, 21.0.5 +21.0.5-librca, 21.0.5 +21.0.5-ms, 21.0.5 +21.0.5-oracle, 21.0.5 +21.0.5-sapmchn, 21.0.5 +21.0.5-sem, 21.0.5 +21.0.5-tem, 21.0.5 +21.0.5-zulu, 21.0.5 +21.0.5.crac-librca, 21.0.5 +21.0.5.crac-zulu, 21.0.5 +21.0.5.fx-librca, 21.0.5 +21.0.5.fx-zulu, 21.0.5 +21.0.6-amzn, 21.0.6 +21.0.6-graal, 21.0.6 +21.0.6-librca, 21.0.6 +21.0.6-ms, 21.0.6 +21.0.6-oracle, 21.0.6 +21.0.6-sapmchn, 21.0.6 +21.0.6-tem, 21.0.6 +21.0.6-zulu, 21.0.6 +21.0.6.fx-librca, 21.0.6 +21.0.6.fx-zulu, 21.0.6 +22.0.2-oracle, 22.0.2 +22.1.0.1.r11-gln, 22.1.0 +22.1.0.1.r17-gln, 22.1.0 +22.3.5.r11-nik, 22.3.5 +22.3.5.r17-mandrel, 22.3.5 +22.3.5.r17-nik, 22.3.5 +23-open, 23 +23.0.1-amzn, 23.0.1 +23.0.1-graal, 23.0.1 +23.0.1-graalce, 23.0.1 +23.0.1-librca, 23.0.1 +23.0.1-open, 23.0.1 +23.0.1-oracle, 23.0.1 +23.0.1-sapmchn, 23.0.1 +23.0.1-tem, 23.0.1 +23.0.1-zulu, 23.0.1 +23.0.1.crac-zulu, 23.0.1 +23.0.1.fx-librca, 23.0.1 +23.0.1.fx-zulu, 23.0.1 +23.0.2-amzn, 23.0.2 +23.0.2-graal, 23.0.2 +23.0.2-graalce, 23.0.2 +23.0.2-librca, 23.0.2 +23.0.2-oracle, 23.0.2 +23.0.2-sapmchn, 23.0.2 +23.0.2-tem, 23.0.2 +23.0.2-zulu, 23.0.2 +23.0.2.fx-librca, 23.0.2 +23.0.2.fx-zulu, 23.0.2 +23.0.6.fx-nik, 23.0.6 +23.0.6.r17-mandrel, 23.0.6 +23.0.6.r17-nik, 23.0.6 +23.1.5.fx-nik, 23.1.5 +23.1.5.r21-mandrel, 23.1.5 +23.1.5.r21-nik, 23.1.5 +24.0.2.r22-mandrel, 24.0.2 +24.ea.27-graal, 24.0.0 +24.ea.28-graal, 24.0.0 +24.ea.31-open, 24.0.0 +24.ea.32-open, 24.0.0 +24.1.1.r23-mandrel, 24.1.1 +24.1.1.r23-nik, 24.1.1 +25.ea.4-graal, 25.0.0 +25.ea.5-graal, 25.0.0 +25.ea.5-open, 25.0.0 +25.ea.6-open, 25.0.0 \ No newline at end of file diff --git a/__tests__/util.test.ts b/__tests__/util.test.ts index c96e6aeb..85b76069 100644 --- a/__tests__/util.test.ts +++ b/__tests__/util.test.ts @@ -1,5 +1,7 @@ import * as cache from '@actions/cache'; import * as core from '@actions/core'; +import * as fs from 'fs'; +import * as path from 'path'; import { convertVersionToSemver, getVersionFromFileContent, @@ -96,6 +98,27 @@ describe('getVersionFromFileContent', () => { const actual = getVersionFromFileContent(content, 'openjdk', '.sdkmanrc'); expect(actual).toBe(expected); }); + + describe('known versions', () => { + const csv = fs.readFileSync( + path.join(__dirname, 'data/sdkman-java-versions.csv'), + 'utf8' + ); + const versions = csv.split('\n').map(r => r.split(', ')); + + it.each(versions)( + 'parsing %s should return %s', + (sdkmanJavaVersion: string, expected: string) => { + const asContent = `java=${sdkmanJavaVersion}`; + const actual = getVersionFromFileContent( + asContent, + 'openjdk', + '.sdkmanrc' + ); + expect(actual).toBe(expected); + } + ); + }); }); }); From b38bd6186dd699bdcb8ea1357232299605b57792 Mon Sep 17 00:00:00 2001 From: guicamest <283778+guicamest@users.noreply.github.com> Date: Sun, 26 Jan 2025 00:02:19 +0100 Subject: [PATCH 5/6] docs(advanced-usage): Document support for `.sdkmanrc` as java-version-file --- docs/advanced-usage.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index a8a0cc06..e231513d 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -601,14 +601,19 @@ steps: ## Java version file If the `java-version-file` input is specified, the action will extract the version from the file and install it. - Supported files are .java-version and .tool-versions. - In .java-version file, only the version should be specified (e.g., 17.0.7). - In .tool-versions file, java version should be preceded by the java keyword (e.g., java 17.0.7). - The `.java-version` file recognizes all variants of the version description according to [jenv](https://github.com/jenv/jenv). Similarly, the `.tool-versions` file supports version specifications in accordance with [asdf](https://github.com/asdf-vm/asdf) standards, adhering to Semantic Versioning ([semver](https://semver.org/)). + Supported files are `.java-version`, `.tool-versions` and `.sdkmanrc`. + In `.java-version` file, only the version should be specified (e.g., 17.0.7). + In `.tool-versions` file, java version should be preceded by the java keyword (e.g., java 17.0.7). + In `.sdkmanrc` file, java version should be preceded by the `java=` prefix (e.g., java=17.0.7-tem) and include the distribution. + The `.java-version` file recognizes all variants of the version description according to [jenv](https://github.com/jenv/jenv). + Similarly, the `.tool-versions` file supports version specifications in accordance with [asdf](https://github.com/asdf-vm/asdf) + standards, adhering to Semantic Versioning ([semver](https://semver.org/)). + The `.sdkmanrc` file supports version specifications in accordance with [file format](https://sdkman.io/usage#env-command), + see [Sdkman! documentation](https://sdkman.io/jdks) for more information. If both java-version and java-version-file inputs are provided, the java-version input will be used. -Valid entry options: +Valid entry options (does not apply to `.sdkmanrc`): ``` major versions: 8, 11, 16, 17, 21 more specific versions: 8.0.282+8, 8.0.232, 11.0, 11.0.4, 17.0 From dd4a6bdd7bc4990efcc8ffc9929b251ff7358551 Mon Sep 17 00:00:00 2001 From: guicamest <283778+guicamest@users.noreply.github.com> Date: Sun, 26 Jan 2025 00:06:41 +0100 Subject: [PATCH 6/6] chore(docs): Anyone can contribute and maintain :shrug: --- docs/contributors.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/contributors.md b/docs/contributors.md index 7196d482..0d49925a 100644 --- a/docs/contributors.md +++ b/docs/contributors.md @@ -68,7 +68,7 @@ Pull requests are the easiest way to contribute changes to git repos at GitHub. Adding or changing tests is an integral part of making a change to the code. Unit tests are in the `__tests__` folder, and end-to-end tests are in the `workflows` folder, particularly take a look at the files with `e2e` prefix, for instance, [e2e-cache.yml](https://github.com/actions/setup-java/blob/main/.github/workflows/e2e-cache.yml). -- The contributor can add various types of tests (like unit tests or end-to-end tests), which, in his opinion, will be necessary and sufficient for testing new or changed functionality +- The contributor can add various types of tests (like unit tests or end-to-end tests), which, in their opinion, will be necessary and sufficient for testing new or changed functionality - Tests should cover a successful execution, as well as some edge cases and possible errors - As already mentioned, pull requests without tests will be considered more carefully by maintainers. If you are sure that in this situation the tests are not needed or cannot be implemented with a commensurate effort - please add this clarification message to your pull request @@ -76,7 +76,7 @@ Unit tests are in the `__tests__` folder, and end-to-end tests are in the `workf - CI will start automatically with some checks. Wait until the end of the execution and make sure that all checks passed successfully. If some checks fail, you can open them one by one, try to find the reason for failing and make changes to your code to resolve the problem - Maintainers will review your pull request -- If a maintainer requests changes, first of all, try to think about his request critically and only after that implement and request another review +- If a maintainer requests changes, first of all, try to think about their request critically and only after that implement and request another review - If your PR gets accepted, it will soon be merged into the main branch. But your contribution will take effect only after the release of a new version of the action and updating the major tag > Sometimes maintainers reject pull requests and that's ok! Usually, along with rejection, we supply the reason for it. Nonetheless, we still really appreciate you taking the time to do it, and we don't take that lightly :heart: