Skip to content

8331051: Add an @since checker test for java.base module #18934

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed

Conversation

nizarbenalla
Copy link
Member

@nizarbenalla nizarbenalla commented Apr 24, 2024

This checker checks the values of the @since tag found in the documentation comment for an element against the release in which the element first appeared.

Real since value of an API element is computed as the oldest release in which the given API element was introduced. That is:

  • for modules, classes and interfaces, the release in which the element with the given qualified name was introduced
  • for constructors, the release in which the constructor with the given VM descriptor was introduced
  • for methods and fields, the release in which the given method or field with the given VM descriptor became a member of its enclosing class or interface, whether direct or inherited

Effective since value of an API element is computed as follows:

  • if the given element has a @since tag in its javadoc, it is used
  • in all other cases, return the effective since value of the enclosing element

The since checker verifies that for every API element, the real since value and the effective since value are the same, and reports an error if they are not.

Preview method are handled as per JEP 12, if @PreviewFeature is used consistently going forward then the checker doesn't need to be updated with every release. The checker has explicit knowledge of preview elements that came before JDK 14 because they weren't marked in a machine understandable way and preview elements that came before JDK 17 that didn't have @PreviewFeature.

Important note : We only check code written since JDK 9 as the releases used to determine the expected value of @since tags are taken from the historical data built into javac which only goes back that far

The intial comment at the beginning of SinceChecker.java holds more information into the program.

I already have filed issues and fixed some wrong tags like in #18640, #18032, #18030, #18055, #18373, #18954, #18972.


Progress

  • Change must be properly reviewed (1 review required, with at least 1 Reviewer)
  • Change must not contain extraneous whitespace
  • Commit message must refer to an issue

Issue

  • JDK-8331051: Add an @<!---->since checker test for java.base module (Sub-task - P4)

Reviewers

Reviewing

Using git

Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/18934/head:pull/18934
$ git checkout pull/18934

Update a local copy of the PR:
$ git checkout pull/18934
$ git pull https://git.openjdk.org/jdk.git pull/18934/head

Using Skara CLI tools

Checkout this PR locally:
$ git pr checkout 18934

View PR using the GUI difftool:
$ git pr show -t 18934

Using diff file

Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/18934.diff

Webrev

Link to Webrev Comment

@bridgekeeper
Copy link

bridgekeeper bot commented Apr 24, 2024

👋 Welcome back nizarbenalla! A progress list of the required criteria for merging this PR into master will be added to the body of your pull request. There are additional pull request commands available for use with this pull request.

@openjdk
Copy link

openjdk bot commented Apr 24, 2024

@nizarbenalla This change now passes all automated pre-integration checks.

ℹ️ This project also has non-automated pre-integration requirements. Please see the file CONTRIBUTING.md for details.

After integration, the commit message for the final commit will be:

8331051: Add an `@since` checker test for `java.base` module

Reviewed-by: jlahoda, jjg

You can use pull request commands such as /summary, /contributor and /issue to adjust it as needed.

At the time when this comment was updated there had been 189 new commits pushed to the master branch:

  • b9cabbe: 8341997: Tests create files in src tree instead of scratch dir
  • 5eae20f: 8323672: Suppress unwanted autoconf added flags in CC and CXX
  • 6ed6dff: 8341871: Disable G1 for unsupported platforms after JDK-8334060
  • 54c9348: 8336103: Clean up confusing Method::is_initializer
  • 2c0c653: 8342044: Increase timeout of gc/shenandoah/oom/TestClassLoaderLeak.java
  • df7d6e0: 8338603: DiagnosticCommandMBean operations should standardize types for parameters
  • c9a536c: 8337339: gc/arguments/Test*SizeFlags.java timing out with Xcomp
  • f4dccfd: 8338596: Clarify handling of restricted and caller-sensitive methods
  • 3b8a2f8: 8337269: G1ConfidencePercent interpreted inconsistently
  • 521effe: 8340189: 8339531 incorrect for Big Endian platforms
  • ... and 179 more: https://git.openjdk.org/jdk/compare/d6820d1324711eac95a297dd68ec94e6f6be4b35...master

As there are no conflicts, your changes will automatically be rebased on top of these commits when integrating. If you prefer to avoid this automatic rebasing, please check the documentation for the /integrate command for further details.

➡️ To integrate this PR with the above commit message to the master branch, type /integrate in a new comment.

@openjdk
Copy link

openjdk bot commented Apr 24, 2024

@nizarbenalla The following label will be automatically applied to this pull request:

  • core-libs

When this pull request is ready to be reviewed, an "RFR" email will be sent to the corresponding mailing list. If you would like to change these labels, use the /label pull request command.

Copy link
Contributor

@jonathan-gibbons jonathan-gibbons left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Various comments inline. Overall, a great start.
Consider adding more explanatory comments for the bigger items, like classes and long/important methods. Imagine a future-person looking over your shoulder, asking what the more important items do or are for.

));
}

private final class EffectiveSourceSinceHelper implements AutoCloseable {
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons Apr 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider putting a doc comment describing the purpose of this class. The name hints at something useful, but is not specific enough by itself.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added it, thanks

fm.close();
}

private static final class PatchModuleFileManager
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons Apr 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

provide a short doc comment describing the purpose/use of this class

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added it, thanks

try {
fm.close();
} catch (IOException closeEx) {
}
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons Apr 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider using ex.addSuppressed(closeEx); instead of just dropping the exception

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 32edb4d

public String introducedStable;
}

//these were preview in before the introduction of the @PreviewFeature
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons Apr 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just curious: where do you find this information?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Used a script to get all the elements with @Deprecated(forRemoval=true, since=...), @jdk.internal.preview, {@preview Associated with .... in their javadoc.
And then had to cross reference with a document that had all the ids

Copy link
Contributor

@jonathan-gibbons jonathan-gibbons May 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the update

- added more detail to the initial comment
- ordered imports correctly
- renamed methods to be more consistent
- added predicate methods and 'isDocumented' 'isMember'
- added doc comments describing purpose of 'EffectiveSourceSinceHelper'
@nizarbenalla nizarbenalla marked this pull request as ready for review April 29, 2024 09:12
@openjdk openjdk bot added the rfr Pull request is ready for review label Apr 29, 2024
@mlbridge
Copy link

mlbridge bot commented Apr 29, 2024

@jddarcy
Copy link
Member

jddarcy commented Apr 29, 2024

If not already planned, I recommend a much broader discussion/announcement of this test before it goes back. For example, a message to jdk-dev stating "The value of @since tags will be tested now by a tier $N test. This is how you run the test before a push. Here are rules for some tricky cases like introducing a covariant override." etc.

Comment on lines 51 to 53
- This checker checks the values of the `@since` tag found in the documentation comment for an element against the release in which the element first appeared.
- The source code containing the documentation comments is read from `src.zip` in the release of JDK used to run the test.
- The releases used to determine the expected value of `@since` tags are taken from the historical data built into `javac`.
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons May 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Minor, suggest wrapping lines somewhere between 80-100 characters long)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My idea was that, even when comparing files in a merge conflit, there wouldn't be problems here.

But I will fix, some lines in the code are a bit long as well

processModuleCheck(elements.getModuleElement(moduleName), ct, packagePath, javadocHelper);
} catch (Exception e) {
e.printStackTrace();
error("Initiating javadocHelperFailed " + e.getMessage());
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons May 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You probably want just e, not e.getMessage() because e (actually e.toString()) will include the name of the exception as well, whereas e.getMessage() does not.)

URI uri = URI.create("jar:" + srcZip.toUri());
try (FileSystem zipFO = FileSystems.newFileSystem(uri, Collections.emptyMap())) {
Path root = zipFO.getRootDirectories().iterator().next();
Path packagePath = root.resolve(moduleName);
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons May 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here, and in uses of this name, including in method signatures, it is strange to see the variable named packagePath since it appears to be the path of the unnamed package in the module.

modulePath would likely be a better name, unless you are worried about possible confusion with the --module-path option, in which case maybe moduleDir or moduleDirectory would work.

}
}

private void processModuleCheck(ModuleElement moduleElement, JavacTask ct, Path packagePath, EffectiveSourceSinceHelper javadocHelper) {
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons May 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see comment line 223, about use of packagePath

}
}

private String getModuleVersionFromFile(Path packagePath) {
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons May 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see comment line 223, about packagePath

return version;
}

private String getPackageVersionFromFile(Path packagePath, ModuleElement.ExportsDirective ed) {
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons May 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see comment line 223, about packagePath

public String introducedStable;
}

//these were preview in before the introduction of the @PreviewFeature
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons May 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the update

# Set of tests for `@since` checks in source code documentation
jdk_since_check = \
tools/sincechecker/testjavabase/CheckSince_javaBase.java
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons May 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally, the symbol of a red line in a red circle is indicative of a missing final newline at the end of the file.
It is recommend that files end with exactly one newline character.

note on rules for Real and effective `@since:

Real since value of an API element is computed as the oldest release in which the given API element was introduced. That is:
- for modules, classes and interfaces, the release in which the element with the given qualified name was introduced
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons May 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about packages? packages should be in this list as well.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Small oversight, will fix

Path pkgInfo = packagePath.resolve(ed.getPackage()
.getQualifiedName()
.toString()
.replaceAll("\\.", "/")
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note for readers: I will change this tomorrow to be more platform agnostic using File.separatorChar instead

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replaced with .replace(".", File.separator)



/*
- This checker checks the values of the `@since` tag found in the documentation comment for an element against the release in which the element first appeared.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In addition to the long lines mentioned by Jon which make the comments hard to read, I find it strange that every sentence is formatted as a list item with a leading dash. I think it's ok when describing different parts/steps of the algorithm, but at least the first sentence in the comment should not be a list item IMO.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed, thanks.


public static void main(String[] args) throws Exception {
if (args.length == 0) {
throw new SkippedException("Test module not specified");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think SkippedException is the right exception to throw here, since invoking the method with a missing argument is probably a configuration error that shouldn't be ignored. Maybe IllegalArgumentException or just RuntimeException?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed it, now throwing IllegalArgumentException.

.forEach(nestedClass -> processClassElement(nestedClass, version, types, elements));
}

public void persistElement(Element explicitOwner, Element element, Types types, String version) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure persistElement is a good name for this, it sounds like the element is being stored permanently (beyond the runtime of this program). I can't think of a really good name, but I think processElement would be ok.

Path testJdk = Paths.get(System.getProperty("test.jdk"));
srcZip = testJdk.getParent().resolve("images").resolve("jdk").resolve("lib").resolve("src.zip");
}
if (!Files.exists(srcZip) && !Files.isDirectory(srcZip)) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This condition looks wrong. If exists returns false, it also implies that isDirectory returns false. I think there's no need to check for a (not-)directory here.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 3f226ef, I now only check if the file is readable.

-Changes `e.getMessages` to `e`
-`File.separator` to be platform indepedant
-Added a newline character at the end of files
-Rename `persistElement` to `processElement`
-Now throwing IllegalArgumentException instead of SkippedException
… (they were incubating)

- Not checking elements enclosed withing a record
- Only check if the file is readable using `Files.isReadable`
- Dropped the use of `Files.exists` and `Files.isDirectory`
- Use `--add-modules` option now to resolve certain modules
…ass will change after being created

- Added a null check as `toString` can return an exception
@nizarbenalla
Copy link
Member Author

I performed a merge and a tiny change to the error message by the test.
The major changes since the last review are that I now skip packages if they are not found, and I added an exclude list to skip certain packages if we wish to do so.

Here is an example of the error output of the tool

STDERR:
src/java.base/java/lang/classfile/TypeKind.java:73 field: java.lang.classfile.TypeKind:BOOLEAN: `@since` version: 22; should be: 24
src/java.base/java/lang/classfile/TypeKind.java:80 field: java.lang.classfile.TypeKind:BYTE: `@since` version: 22; should be: 24
src/java.base/java/lang/classfile/TypeKind.java:87 field: java.lang.classfile.TypeKind:CHAR: `@since` version: 22; should be: 24
src/java.base/java/lang/classfile/TypeKind.java:94 field: java.lang.classfile.TypeKind:SHORT: `@since` version: 22; should be: 24
src/java.base/java/lang/classfile/TypeKind.java:99 field: java.lang.classfile.TypeKind:INT: `@since` version: 22; should be: 24
src/java.base/java/lang/classfile/TypeKind.java:103 field: java.lang.classfile.TypeKind:LONG: `@since` version: 22; should be: 24
src/java.base/java/lang/classfile/TypeKind.java:107 field: java.lang.classfile.TypeKind:FLOAT: `@since` version: 22; should be: 24
src/java.base/java/lang/classfile/TypeKind.java:111 field: java.lang.classfile.TypeKind:DOUBLE: `@since` version: 22; should be: 24
src/java.base/java/lang/classfile/TypeKind.java:117 field: java.lang.classfile.TypeKind:REFERENCE: `@since` version: 22; should be: 24
src/java.base/java/lang/classfile/TypeKind.java:125 field: java.lang.classfile.TypeKind:VOID: `@since` version: 22; should be: 24
src/java.base/java/lang/classfile/TypeKind.java:143 method: java.lang.constant.ClassDesc java.lang.classfile.TypeKind.upperBound(): `@since` version: 22; should be: 24
java.lang.Exception: The `@since` checker found 64 problems
        at SinceChecker.checkModule(SinceChecker.java:265)
        at SinceChecker.main(SinceChecker.java:126)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        at java.base/java.lang.reflect.Method.invoke(Method.java:573)
        at com.sun.javatest.regtest.agent.MainActionHelper$AgentVMRunnable.run(MainActionHelper.java:333)
        at java.base/java.lang.Thread.run(Thread.java:1576)


String version = String.valueOf(i);
Elements elements = ct.getElements();
elements.getModuleElement("java.base"); // forces module graph to be instantiated
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons Sep 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@lahodaj I've always considered this kind of line to be a workaround; it would be nice if we could have an RFE so this kind of line was unnecessary in code that wants to introspect the elements

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

version = effectiveSinceVersion(element.getEnclosingElement().getEnclosingElement(), element.getEnclosingElement(), types, elementUtils);
}
if (version == null) {
//may be null for private elements
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons Sep 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

empty statement for if...

import com.sun.tools.javac.util.Pair;
import jtreg.SkippedException;

/*
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons Sep 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good comment.

Copy link
Contributor

@jonathan-gibbons jonathan-gibbons left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally very good. It's getting to be a really nice piece of functionality.

I added one suggestion for a minor improvement, about setting up the `EXCLUDE_LIST in a more module-specific way. The intent is that if we need to make module-specific changes to the exclude list in times going forward, we should do that in the module-specific test invocation, and not in the main module-independent code.

Comment on lines 112 to 114
private static final Set<String> EXCLUDE_LIST = Set.of(
"java.lang.classfile"
);
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons Sep 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should not really be here, in the general code for a SinceChecker for all modules.

It would be better if this info was provided in command-line options, given when the test is run from the module-specific test (i.e. CheckSince_javaBase.java).

This means you will have to write some additional simple option decoding in the main method, starting line 21.

* @modules jdk.compiler/com.sun.tools.javac.api
* jdk.compiler/com.sun.tools.javac.util
* jdk.compiler/com.sun.tools.javac.code
* @run main SinceChecker java.base
Copy link
Contributor

@jonathan-gibbons jonathan-gibbons Sep 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See the comment about init-ing the EXCLUDE_LIST in the main SinceChecker, at about line 112.

You are already passing a module name as an option to the main test. Maybe the command here on line 33 could be something like

@run main SinceChecker java.base --exclude java.lang.classfile

where the argument after --exclude is (logically) a comma-separated list of items to exclude. You could also do a whitespace-separated list up to the next option (i.e. item beginning with -) or end of the list. In other words make it future-proof against adding more options in future.

@jonathan-gibbons
Copy link
Contributor

jonathan-gibbons commented Sep 19, 2024

For discussion:

I see that in GitHub Actions, the test passes on all platforms. (That's good!). But it's not clear to me that it needs to run on all platforms. Generally, the API should be the same on all platforms, right (After all, we only generate one set of API documentation.)

So, the question becomes, can a test determine if it is being run in a multi-platform context? We presumably don't want to stop the test running whenever a user runs it locally on their platform of choice, but equally, if the test is being run on many platforms, that's an unnecessary use/waste of resources. But, I guess we run a lot of tests that are essentially platform-independent on all platforms, although I guess there're are also testing the product running on top of the JVM, whereas here. we're primarily just checking the source.

Anyway, this is really just an abstract academic discussion, not a blocker in any way for the PR.

Copy link
Contributor

@lahodaj lahodaj left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks reasonable to me.

@openjdk openjdk bot added the ready Pull request is ready to be integrated label Oct 1, 2024
@openjdk openjdk bot removed the ready Pull request is ready to be integrated label Oct 2, 2024
Copy link
Contributor

@lahodaj lahodaj left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Still looks good to me.

@nizarbenalla
Copy link
Member Author

Can we maybe set the reviewer count to 1? This needs an additional review and the last change was small.

@lahodaj
Copy link
Contributor

lahodaj commented Oct 15, 2024

/reviewers 1

@openjdk
Copy link

openjdk bot commented Oct 15, 2024

@lahodaj
The total number of required reviews for this PR (including the jcheck configuration and the last /reviewers command) is now set to 1 (with at least 1 Reviewer).

@openjdk openjdk bot added the ready Pull request is ready to be integrated label Oct 15, 2024
@nizarbenalla
Copy link
Member Author

Thank you for the reviews; all. And the help to getting this work integrated.

/integrate

@openjdk
Copy link

openjdk bot commented Oct 16, 2024

Going to push as commit c81aa75.
Since your change was applied there have been 198 commits pushed to the master branch:

  • ebc17c7: 8339637: (tz) Update Timezone Data to 2024b
  • e7cf25c: 8340801: Disable ubsan checks in some awt/2d coding
  • 577babf: 8334010: VM crashes with ObjectAlignmentInBytes > GCCardSizeInBytes
  • b9b0bd0: 8337221: CompileFramework: test library to conveniently compile java and jasm sources for fuzzing
  • 724de68: 8342081: Shenandoah: Remove extra ShenandoahMarkUpdateRefsSuperClosure
  • e4ff553: 8341931: os_linux gtest uses lambdas with explicit capture lists
  • e94e3bb: 8324672: Update jdk/java/time/tck/java/time/TCKInstant.java now() to be more robust
  • 6d7e679: 8340790: Open source several AWT Dialog tests - Batch 4
  • 86ce19e: 8341142: Maintain a single source file for sun.net.www.protocol.jar.JarFileFactory
  • b9cabbe: 8341997: Tests create files in src tree instead of scratch dir
  • ... and 188 more: https://git.openjdk.org/jdk/compare/d6820d1324711eac95a297dd68ec94e6f6be4b35...master

Your commit was automatically rebased without conflicts.

@openjdk openjdk bot added the integrated Pull request has been integrated label Oct 16, 2024
@openjdk openjdk bot closed this Oct 16, 2024
@openjdk openjdk bot removed ready Pull request is ready to be integrated rfr Pull request is ready for review labels Oct 16, 2024
@openjdk
Copy link

openjdk bot commented Oct 16, 2024

@nizarbenalla Pushed as commit c81aa75.

💡 You may see a message that your pull request was closed with unmerged commits. This can be safely ignored.

@nizarbenalla nizarbenalla deleted the source-based-since-checker branch October 16, 2024 13:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
core-libs [email protected] integrated Pull request has been integrated
Development

Successfully merging this pull request may close these issues.

5 participants