From 72c7ceb97a493b1733f8e5a19932a056c29c5dc4 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 d0476606c..e462a941e 100644 --- a/.github/workflows/e2e-versions.yml +++ b/.github/workflows/e2e-versions.yml @@ -488,7 +488,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@v4 @@ -498,6 +498,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 0c2e604cdc2fffd2045889281e0ad6d3fb909792 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 e462a941e..7563f78bf 100644 --- a/.github/workflows/e2e-versions.yml +++ b/.github/workflows/e2e-versions.yml @@ -481,7 +481,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 aa2ee0a47508b3e66f2c6f499787134e901e3f13 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 9c943c2fa..c96e6aeb1 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 5ac78e7fb..d87452d19 100644 --- a/dist/cleanup/index.js +++ b/dist/cleanup/index.js @@ -97069,6 +97069,9 @@ function getVersionFromFileContent(content, distributionName, versionFile) { javaVersionRegExp = /^(java\s+)(?:\S*-)?v?(?(\d+)(\.\d+)?(\.\d+)?(\+\d+)?(-ea(\.\d+)?)?)$/m; } + 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 6e6e205c6..e9c81a457 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -135074,6 +135074,9 @@ function getVersionFromFileContent(content, distributionName, versionFile) { javaVersionRegExp = /^(java\s+)(?:\S*-)?v?(?(\d+)(\.\d+)?(\.\d+)?(\+\d+)?(-ea(\.\d+)?)?)$/m; } + 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 af75aaac1..559a7fe16 100644 --- a/src/util.ts +++ b/src/util.ts @@ -134,6 +134,8 @@ export function getVersionFromFileContent( if (versionFileName == '.tool-versions') { javaVersionRegExp = /^(java\s+)(?:\S*-)?v?(?(\d+)(\.\d+)?(\.\d+)?(\+\d+)?(-ea(\.\d+)?)?)$/m; + } else if (versionFileName == '.sdkmanrc') { + javaVersionRegExp = /^java\s*=\s*(?[^-]+)/m; } else { javaVersionRegExp = /(?(?<=(^|\s|-))(\d+\S*))(\s|$)/; } From b617cc9aa7fbdccfd96b8cac2b9dce7c3f16228c 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 000000000..5c75a44c9 --- /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 c96e6aeb1..85b76069e 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 1792a94d86e6093e2cbf76a976b6e93431e38dfa 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 c868e653e..959ffa7a0 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -615,14 +615,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 77c7e7f1ab280841bb87155f8f87670f2f6f73de 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 7196d482e..0d49925a0 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: