Compare commits

...
Author SHA1 Message Date
Jen Basch 53e03d2b7c Fix release notes links (#1970) 2026-11-05 13:26:19 -08:00
Dan Chao 20f7cb24d4 Add 0.33 nav link to index page 2026-11-05 12:43:43 -08:00
Dan Chao 5ee1f296e3 Prepare 0.33.0 release 2026-11-05 12:30:53 -08:00
Daniel Chao 72b237e204 Fix link in binary encoding docs (#1967) 2026-11-05 12:30:49 -08:00
Daniel Chao c43feddbac Update release date changelog (#1966) 2026-11-05 12:23:07 -08:00
c39b1e7a59 Add release notes for 0.33 (#1939)
Co-authored-by: Jen Basch <jbasch@apple.com>
Co-authored-by: Dan Chao <dan.chao@apple.com>
2026-11-05 12:20:48 -08:00
Daniel Chao 3dccfe3d8b Make publish pipeline create draft GitHub releases (#1965)
If something goes wrong with the maven publish, we can delete the
draft and try again.
2026-11-05 12:20:16 -08:00
Islon Scherer fc5d658aa3 Add an s-exp renderer to pkl:syntax (#1955) 2026-11-05 17:10:33 +00:00
Daniel Chao 85b4a4669a Rename render to renderValue (#1964)
Motivation: preserve a possible API change to have `FormattingRenderer`
extend `ValueRenderer`.
2026-11-05 08:39:33 -08:00
Daniel Chao 1f5c62ecef Refine requirements around const and this type (#1962)
This introduces a rule that const properties cannot use the `this` type if that referenced type exceeds the scope.

This code is an error:

```pkl
const foo: this
```

This is not:

```pkl
const foo = new {
  local myself: this
}
```

Additionally, this fixes:

* const depth logic to account for eager scopes
* behavior of `this` type inside custom this scopes
2026-11-04 11:30:50 -08:00
Daniel Chao 7e8e5f648d Remove logic to publish libpkl (#1960)
For reasons, we can't publish this just yet.
2026-11-03 17:00:51 -08:00
Daniel Chao 875fac857c Generic parser fixes (#1959)
This fixes some issues with the handling of separators in GenericParser
2026-11-03 16:31:40 -08:00
Jen Basch 7fa1ce7852 upgrade musl, apply patches (#1958) 2026-11-03 15:02:49 -08:00
Daniel Chao 70947166a3 Mark pkl:ref as no longer experimental (#1957)
This API is considered stable and usable for production use-cases.
2026-11-03 19:49:38 +00:00
Daniel Chao 56e178934a Fix flakey GenericParserTest (#1956)
The 10ms timeout will fail on slower machines.
2026-11-03 10:06:18 -08:00
Daniel Chao ffd8a5d484 Remove treatment of %5c as a slash on Windows (#1954)
We reject any filepath that contains a `\` character;
all Pkl code must use `/` as the path separator.

So, we don't need to normalize `%5c` as a path sep on Windows.
2026-11-03 13:21:36 +00:00
Daniel Chao a9b7fe3a33 Switch type argument syntax (#1940)
This changes type argument syntax to "standard" style, and away from turbofish.

The motivation here is that turbofish-style type arguments are hard to read, and developers who are not already deeply knowledgeable about Pkl might struggle to understand such code.
In most languages, the grammar for "method call with type args" don't introduce any additional symbols between the identifier and the type argument list (e.g. C++, TypeScript, C#, Scala, Go).
2026-11-03 05:09:40 -08:00
Daniel Chao 6ad50eb589 Make stack overflows more robust (#1953)
Fixes an issue where we fail to initialize class
`VmStackOverflowException` when re-throwing a StackOverflowEexception.
2026-11-03 05:07:24 -08:00
Daniel Chao d54dda0d83 Fix macOS native builds (#1952)
`cc` is borked on some macOS runners right now.
This adds a workaround until the issue is fixed.
2026-11-02 15:19:41 -08:00
Daniel Chao 89cb6c98a1 Improve normalization of URIs (#1937)
This adds changes such that URIs like `file:///path/to/%2E%2E/bar.txt`
are considered path traversal sequences.

These URIs are treated as dot segments, and normalized prior to calling
into security checks.

For package URIs, the same treatment is applied to the
URI fragment.

jar-file URIs are special-cased and normalized as well.

Additionally, `%2f` is treated as `/` for file, jar-file and asset path segments.
However, these are left alone for other URIs (RFC-3986 treats `%2e` as identical to `.`, but `%2f` as distinct from `/`)..
2026-10-30 21:04:27 -07:00
Daniel Chao 5cb5d41a44 Fix VmDynamicCursor (#1948)
This fixes an issue where it fails to iterate over this entry:
`new Dynamic { [-1] = 2 }`
2026-10-30 21:45:36 +00:00
Daniel Chao b1b36b09ac Fix computation of hash codes for Listing, Duration, DataSize (#1922)
These are currently breaking the principle of: if two objects are
`equals`, then they have the same hash code.
2026-10-30 10:31:06 -07:00
Daniel Chao 0b582b50b4 Fix some GraalVM PE issues (#1944)
* VmObject.getRootFirstObject() is a recursive call, which sometimes
  fails with "too deep inlining"
* Incorrect loop condition profile usage in some places
* Need to mark `checkedReturnTypeNode` final so that GraalVM knows
  that it is PE constant
2026-10-30 10:27:18 -07:00
Daniel Chao 99c2d84c43 Fix enforcement of const member access inside methods (#1945) 2026-10-30 16:57:49 +00:00
Aashish Mahato ec2d12a654 Fix toString/.value saturation for Duration and DataSize values too large for a long (#1935) 2026-10-29 09:11:21 -07:00
Aashish Mahato e0d727be60 Fix toString/.value saturation for Duration and DataSize values too large for a long (#1935) 2026-10-29 08:23:50 -07:00
Jen Basch ea68f7b258 Fix evaluating dependency notation URIs with multiple file output (#1942) 2026-10-28 16:46:27 -07:00
Islon Scherer 434f699887 Add limits to parser recursion (#1918) 2026-10-27 16:57:36 +01:00
Jen Basch 3e703995ca Add user generic methods (#1849) 2026-10-27 07:44:03 -07:00
Jen Basch 21d278eba5 Add user generic methods (#1849) 2026-10-27 07:17:08 -07:00
Islon Scherer 939e844c03 Add pkl:syntax stdlib module (#1821) 2026-10-23 15:51:22 +02:00
Jen Basch 0cb9843af7 Fix module type check defined in parent member bodies (#1936) 2026-10-22 12:00:49 -07:00
Jen Basch 05d8e88592 Fix checking of subscript key types references to Map/Mapping (#1933) 2026-10-22 17:01:46 +00:00
Daniel Chao dd026c7023 Minimize thrown IllegalStateException when profiling (#1931)
Sometimes we see a thrown IllegalStateException when CPU profiling,
where the underlying cause is a ConcurrentModificationException in
the underlying GraalVM internals.

This attempts to minimize the chances of this exception being thrown
by starting proiling after the evaluator and its context have been
created.
2026-10-22 09:44:10 -07:00
Aashish Mahato dd83b9ab4f Fix hashCode/equals inconsistency for negative zero in Duration and DataSize (#1932) 2026-10-22 09:07:34 -07:00
Daniel Chao 3f5797de6f Fix changelog links (#1929) 2026-10-21 15:32:55 -07:00
Daniel Chao ac0d9f1d31 Run GitHub release in parallel with Maven (#1928) 2026-10-21 15:09:53 -07:00
Jen Basch 95d7a4bcc9 Prepare 0.32.2 release (#1924) (#1926) 2026-10-21 14:12:21 -07:00
Jen Basch 23897fd8c3 Remove extra checkout from java executable build jobs (#1925) 2026-10-21 20:35:39 +00:00
Jen Basch f7adfceaeb Update bundled CA certs (#1923) 2026-10-21 16:45:39 +00:00
Daniel Chao a06684b2c0 Improve error message thrown for "cannot instantiate" (#1916)
If the parent comes from an implicit node (e.g. read super entry node),
Pkl will currently bury its source section when rendering the error
message.
2026-10-20 08:42:18 -07:00
Goutam Adwant ce977f1ffe Fix parameterized type checks in alias constraints (#1906)
Fixes an issue where a constraint inside a typealias that writes to frame slots is unable to resolve type arguments.
2026-10-19 23:29:30 +00:00
Daniel Chao 08f0c3781b Improve error messages when typealiases fail to check (#1914)
This adds the typealias' usage site to the stack frame.
2026-10-19 12:34:04 -07:00
Daniel Chao 97c73e7c28 Fix qualified type resolution (#1915)
Fixes an issue where `GetModuleOwnerNode` resolves to levelsUp == 0,
but its enclosing owner is a parse-time invisible scope.
2026-10-19 12:23:38 -07:00
Sam Gammon 78c0ebce9d Add summaries and groups to gradle tasks (#190)
Fixes and closes apple/pkl#188 by adding task names and groups to
major Pkl Gradle Plugin tasks

Signed-off-by: Sam Gammon <sam@elide.ventures>
2026-10-18 16:48:20 +00:00
Daniel Chao ef5e34c210 Fix failing Windows build (#1912)
This test is failing, but is also moot now because file URIs now
forbid authority components.
2026-10-16 19:18:11 +00:00
Aagam Shah e18d962033 Force the returned value in test.catch() and test.catchOrNull() (#1910) 2026-10-16 12:02:33 -07:00
9f79fe47da Replace VmObjectLike.iterateMemberValues() with VmObjectCursor (#1879)
Motivation:
- VmObjectLike.iterateMemberValues() is an internal iterator whose loop body is a Java lambda.
  It suffers from the following limitations:
  - `continue` and `break` cannot be used.
  - `return` becomes an (awkward) replacement for `continue` and `break`.
    It cannot be used to return from the enclosing method.
  - Mutating variables requires hoisting them (MutableBoolean, etc.).
  - Node.execute() calls are very slow because they are behind a Truffle boundary.
  - Callers of iterateMemberValues() do not specify what and how they want to iterate.
    This obscures the iteration code and makes it difficult (often impossible) to optimize.

Changes:
- Add interface VmObjectCursor, an external iterator that iterates over VmObject members.
  Its design is inspired by org.graalvm.collections.MapCursor.
- Add VmObjectCursor implementations specialized for different members, VmObject subclasses, and cursor options.
- Replace VmObjectLike.iterateMemberValues() with the following methods that return VmObjectCursor:
  - properties()
  - properties(CursorOption)
  - elements()
  - elements(CursorOption)
  - entries()
  - entries(CursorOption)
  - members
  - members(CursorOption)
- Replace all usages of iterateMemberValues() with one of the above methods.
  Before: object.iterateMembersValues((key, member, value) -> { if (member.isProp()) {...} });
  After : for (var cursor = object.properties(); cursor.advance(); ) {...}

Result:
- Iteration code is much simpler and clearer.
- Iteration code that calls Node.execute() is much faster because it is no longer behind a Truffle boundary.
- Other iteration code is potentially faster and can be better optimized in the future.

Co-authored-by: translatenix <119817707+translatenix@users.noreply.github.com>
Co-authored-by: Jen Basch <jbasch94@gmail.com>
2026-10-16 17:47:18 +00:00
Islon Scherer b97abe13bc Fix formatter instability (#1911) 2026-10-16 17:32:49 +02:00
Daniel Chao fe96e0b1b0 Bump Gradle to 9.8.1 (#1904) 2026-10-15 21:00:04 -07:00
Carpe-WangandJen Basch eff9a9e164 [fix] Add support for handling remote file URIs. (#629)
Co-authored-by: Jen Basch <jbasch@apple.com>
2026-10-15 14:05:46 -07:00
Maycon Campos 8399f11186 Document public module APIs (#1813) 2026-10-15 13:27:05 -07:00
Aagam ShahandJen Basch 6811abf11c feat: don't truncate pkldoc module names that lack the package prefix (#1909)
Co-authored-by: Jen Basch <jbasch@apple.com>
2026-10-15 11:36:44 -07:00
f96fba00e1 Add a CPU profiler (#1823)
This introduces a way to run CPU profiling.

The profiler produces output in pprof format.

CLI users can enable CPU profiling via command line flags.
Profiling is otherwise not offered as an API.

Co-authored-by: Jen Basch <jbasch94@gmail.com>
Co-authored-by: Islon Scherer <islonscherer@gmail.com>
2026-10-15 15:57:55 +00:00
Daniel ChaoandJen Basch d062312df9 Add sourceBundle task to download and prepare source bundles (#1902)
* Add tasks to generate source jars for java executables

* native source bundles

* source bundles in separate plugin

* Wire up sourceBundle task

* Produce bundles on a per-variant basis (Java fat jar, each native variant)
* Introduce `pklNativeSourceBundle` and `pklJvmSourceBundle` plugins for handling fat jar vs. GraalVM bits
* Download compiled classes list, and exclude Java sources for executable stuff specifically
* Include native sources when appropriate (GraalVM, JDK, zlib, musl, libpkl)

---------

Co-authored-by: Jen Basch <jbasch@apple.com>
2026-10-14 10:03:45 -07:00
Alexandre Kohler f4ad0da658 Fix lookaround regexes in String.lastIndexOf and replaceLast (#1908) 2026-10-13 11:32:12 -07:00
Daniel Chao 88a50d167e Add support for customizing spring boot ConfigurationProperties (#1897)
This adds an option which allows users to control exactly how
`@ConfigurationProperties` annotations are attached to classes.

This helps when:

* Spring Boot users don't have a single root class, but multiple
  classes that are injected in disparate places
* Pkl's module structure doesn't match the resulting `.properties`
  layout
2026-10-08 20:42:59 +00:00
Daniel Chao f973fd6717 Change how VmValueRenderer renders Typed values (#1412)
This changes it to render the qualified name instead of the simple name.

* Module classes render the module name
* Classes within module render the module name and the class name joined by `#`
* Rendering of members of `pkl:base` does not change

For example:

* `new k8s.core.v1.Service {}` instead of `new ModuleClass {}`.
* `new k8s.core.v1.Service#ServiceSpec {}` instead of `new ServiceSpec {}`
* `new pkl.Project {}` instead of `new ModuleClass {}`

This affects the following:

* `toString()`
* `trace()`
* Error messages
* REPL
2026-10-08 13:32:26 -07:00
Vladimir Matveev 66fb5c133b Module cache directory propagation (#1900)
Currently the module cache directory in CLI commands (and thus in Gradle tasks, since they use CLI commands under the hood) is only used for the "primary" task. For example, for an eval command, the module cache directory will be used for the evaluation of the target module.

However, most commands also work with projects, and for projects the `PklProject` file must be evaluated. This is done via `Project.loadFromPath`, which internally builds an evaluator with the default module cache path. Therefore, all evaluations of project manifests always use default cache path instead of whatever is configured through the CLI option/Gradle task property. This, in turn, may result in unexpected behavior: in general, the user would expect that if they specify the cache directory, it will be used for all evaluations (e.g. when they pre-populate the cache and expect evaluations to work offline).

The same is true for settings evaluation, although for settings it is significantly less important since settings scripts can't have remote dependencies.

This PR propagates cache path into the project evaluator (as well as the settings evaluator, for consistency). This will result in the user-specified cache directory being used for `PklProject` evaluations as well.
2026-10-07 13:58:40 -07:00
Daniel Chao 1a3d7a1a76 Produce compiled classes list (#1898)
This adjusts Gradle logic so that it produces a list of compiled classes
in each of the various native image builds.
2026-10-06 15:18:20 -07:00
Islon Scherer 862c61f2e2 Add net stdlib module with URL support (#1834) 2026-10-06 15:23:32 +02:00
Daniel Chao dbcecd9677 Fix decoding of pkl-binary into Java Pattern (#1895)
Patterns that originate from the language runtime will add
`Pattern.UNICODE_CHARACTER_CLASS | Pattern.UNICODE_CASE` as implicit
regex flags, so we need to do the same on the binary decoding side.
2026-10-05 09:09:30 -07:00
Daniel Chao ba25f4820c Perf improvements for String.endWith(Regex) (#1884)
* Compute a derived regex expression with `\z` anchor
* Ensure derived regex can't be messed up with comments (in extended mode) or quote start

Follow up to #1880
2026-10-05 09:09:03 -07:00
Jen Basch adaafc4045 Fix external reader process leak in pkl-server (#1885) 2026-10-02 14:16:25 -07:00
Daniel Chao 82fe176c69 Improve cases where type nodes can turn into TypeNode.UnionOfStringLiterals (#1875)
This adds logic to UnresolvedTypeNode to create a `UnionOfStringLiterals`
type node if a member is a typealias who is a string or a string literal union.

Also, this fixes an issue where marking a duplicate string literal with the
default marker throws an index out of bounds exception.
2026-10-02 09:16:25 -07:00
dependabot[bot]andJen Basch 6423b2add5 Bump commonMark from 0.29.0 to 0.30.0 (#1887)
* Bump commonMark from 0.29.0 to 0.30.0

Bumps `commonMark` from 0.29.0 to 0.30.0.

Updates `org.commonmark:commonmark` from 0.29.0 to 0.30.0
- [Release notes](https://github.com/commonmark/commonmark-java/releases)
- [Changelog](https://github.com/commonmark/commonmark-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/commonmark/commonmark-java/compare/commonmark-parent-0.29.0...commonmark-parent-0.30.0)

Updates `org.commonmark:commonmark-ext-gfm-tables` from 0.29.0 to 0.30.0
- [Release notes](https://github.com/commonmark/commonmark-java/releases)
- [Changelog](https://github.com/commonmark/commonmark-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/commonmark/commonmark-java/compare/commonmark-parent-0.29.0...commonmark-parent-0.30.0)

---
updated-dependencies:
- dependency-name: org.commonmark:commonmark
  dependency-version: 0.30.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: org.commonmark:commonmark-ext-gfm-tables
  dependency-version: 0.30.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* implement missing method

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jen Basch <jbasch@apple.com>
2026-10-01 18:25:05 +00:00
dependabot[bot] b9dd3c4de1 Bump junit from 6.1.1 to 6.1.3 (#1890)
Bumps `junit` from 6.1.1 to 6.1.3.

Updates `org.junit.jupiter:junit-jupiter-api` from 6.1.1 to 6.1.3
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.1...r6.1.3)

Updates `org.junit.jupiter:junit-jupiter-engine` from 6.1.1 to 6.1.3
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.1...r6.1.3)

Updates `org.junit.jupiter:junit-jupiter-params` from 6.1.1 to 6.1.3
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.1...r6.1.3)

Updates `org.junit.platform:junit-platform-launcher` from 6.1.1 to 6.1.3
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.1...r6.1.3)

---
updated-dependencies:
- dependency-name: org.junit.jupiter:junit-jupiter-api
  dependency-version: 6.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.junit.jupiter:junit-jupiter-engine
  dependency-version: 6.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.junit.jupiter:junit-jupiter-params
  dependency-version: 6.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.junit.platform:junit-platform-launcher
  dependency-version: 6.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-01 09:26:31 -07:00
dependabot[bot] d4dac43e30 Bump gradle/actions/dependency-submission from 6.1.0 to 6.3.0 (#1892)
Bumps [gradle/actions/dependency-submission](https://github.com/gradle/actions) from 6.1.0 to 6.3.0.
- [Release notes](https://github.com/gradle/actions/releases)
- [Commits](https://github.com/gradle/actions/compare/50e97c2cd7a37755bbfafc9c5b7cafaece252f6e...9c971963bec38e04b3d30dcc455b5382be2fdbfb)

---
updated-dependencies:
- dependency-name: gradle/actions/dependency-submission
  dependency-version: 6.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-01 09:05:54 -07:00
dependabot[bot] 15c070621e Bump the first-party group across 1 directory with 2 updates (#1886)
Bumps the first-party group with 2 updates in the / directory: [actions/checkout](https://github.com/actions/checkout) and [actions/setup-java](https://github.com/actions/setup-java).


Updates `actions/checkout` from 6.0.3 to 6.1.0
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/df4cb1c069e1874edd31b4311f1884172cec0e10...d23441a48e516b6c34aea4fa41551a30e30af803)

Updates `actions/setup-java` from 5.5.0 to 5.7.0
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/0f481fcb613427c0f801b606911222b5b6f3083a...b6effb05e454b25005698d916606bdc6ffcbf961)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: first-party
- dependency-name: actions/setup-java
  dependency-version: 5.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: first-party
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-01 08:49:10 -07:00
dependabot[bot] 74c5ded7db Bump slf4j from 2.0.18 to 2.0.20 (#1888)
Bumps `slf4j` from 2.0.18 to 2.0.20.

Updates `org.slf4j:slf4j-api` from 2.0.18 to 2.0.20

Updates `org.slf4j:slf4j-simple` from 2.0.18 to 2.0.20

---
updated-dependencies:
- dependency-name: org.slf4j:slf4j-api
  dependency-version: 2.0.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.slf4j:slf4j-simple
  dependency-version: 2.0.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-01 08:45:52 -07:00
dependabot[bot] a5bcacf91d Bump jline from 4.3.1 to 4.4.6 (#1889)
Bumps `jline` from 4.3.1 to 4.4.6.

Updates `org.jline:jline-reader` from 4.3.1 to 4.4.6
- [Release notes](https://github.com/jline/jline3/releases)
- [Commits](https://github.com/jline/jline3/compare/4.3.1...4.4.6)

Updates `org.jline:jline-terminal` from 4.3.1 to 4.4.6
- [Release notes](https://github.com/jline/jline3/releases)
- [Commits](https://github.com/jline/jline3/compare/4.3.1...4.4.6)

Updates `org.jline:jline-terminal-jni` from 4.3.1 to 4.4.6
- [Release notes](https://github.com/jline/jline3/releases)
- [Commits](https://github.com/jline/jline3/compare/4.3.1...4.4.6)

---
updated-dependencies:
- dependency-name: org.jline:jline-reader
  dependency-version: 4.4.6
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: org.jline:jline-terminal
  dependency-version: 4.4.6
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: org.jline:jline-terminal-jni
  dependency-version: 4.4.6
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-01 08:43:35 -07:00
dependabot[bot] d839bff713 Bump the codeql group with 2 updates (#1891)
Bumps the codeql group with 2 updates: [github/codeql-action/analyze](https://github.com/github/codeql-action) and [github/codeql-action/init](https://github.com/github/codeql-action).


Updates `github/codeql-action/analyze` from 4.36.3 to 4.38.2
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/54f647b7e1bb85c95cddabcd46b0c578ec92bc1a...2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2)

Updates `github/codeql-action/init` from 4.36.3 to 4.38.2
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/54f647b7e1bb85c95cddabcd46b0c578ec92bc1a...2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2)

---
updated-dependencies:
- dependency-name: github/codeql-action/analyze
  dependency-version: 4.38.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: codeql
- dependency-name: github/codeql-action/init
  dependency-version: 4.38.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: codeql
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-01 08:36:56 -07:00
Rushikesh 5747506f3a Suppress pkl-gradle POM metadata warning (#1807) 2026-09-30 09:43:59 -07:00
Daniel Chao b8c7a42318 Make typechecking more PE friendly (#1871)
This makes various improvements to help truffle do partial
evaluation of code related to typechecking.

* Split `UnionTypeNode` into `UnionTypeNodeExploded` and
 `UnionTypeNodeLooped` to avoid gigantic graphs. This especially helps
  in the case of typealiases, because they are inlined into their usage
  sites.

* Move constraint-failure exception construction in
  `TypeConstraintNode` behind `@TruffleBoundary` helper methods
  instead of `transferToInterpreterAndInvalidate`, since building the
  exception is a rare, off-hot-path operation.

* Move `ClassNode`'s one-time class-initialization logic behind a
  `@TruffleBoundary` method (`initClass`), store `VmLanguage` as a
  field instead of recomputing it via `VmLanguage.get(this)`, and use
  `transferToInterpreterAndInvalidate` since class init never needs to
  re-run on the compiled path.

* Pass `VmLanguage` explicitly into `TypeTestNode` and `ClassNode`
  (via `AstBuilder`) rather than resolving it with
  `VmLanguage.get(this)` on a hot path.

* Fix various issues where the partial evaluator determines that a frame
  should have been materialized but was not.

* Pre-initialize call targets in `ObjectMember.setMemberNode()` and
  `FunctionLiteralNode` so the first invocation doesn't trigger a
  compilation invalidation.

* Fix truffle node tree issues (don't mark `@RootNode` as child,
  deepCopy instead of passing an already adopted node).

* Remove unnecessary interpreter transfers when throwing type mismatch exceptions
2026-09-30 07:16:54 -07:00
Alexandre Kohler 8331570aaf Fix String.endsWith for overlapping regex matches (#1880) 2026-09-29 21:52:12 -07:00
Jen Basch 1271da2741 Fixes to commands where (sub)commands never extend pkl:Command (#1882) 2026-09-29 23:19:28 +00:00
apple-ospo[bot] e83d8fa14b Replace repo-level CODE_OF_CONDUCT file with the inherited org-wide Code of Conduct in .github repo. (#1878)
Co-authored-by: apple-ospo[bot] <326325757+apple-ospo[bot]@users.noreply.github.com>
2026-09-25 10:51:20 -07:00
Daniel Chao d1e043be4e Make join call overriden toString() (#1872)
This changes the `join` method in `List`/`Set`/`Listing` to
call the overridden `toString()` method.

This is a breaking change, but is considered a bugfix.
2026-09-25 09:24:16 -07:00
Daniel Chao 43e132a383 Fix "unchecked or unsafe operations" warning in javac (#1874)
Fix this printed warning during java compilation:

"Note: Some input files use unchecked or unsafe operations. Recompile with -Xlint:unchecked for details"

* Add `-Xlint:unchecked` as a javac flag
* Fix the various warnings
2026-09-24 09:28:49 -07:00
Daniel Chao 119b1571bb Switch ad-hoc vmobject building to use VmObjectBuilder (#1873) 2026-09-24 07:32:30 -07:00
Daniel Chao d5a7dc021e Switch inferred new {} expressions in method args to using frame slots (#1857)
This changes the logic for inferring `new {}` expressions in method
arguments to using regular frame slots, instead of auxiliary slots.

Overall, this is a performance improvement: no looking up auxiliary slot
numbers, which makes this code much more PE friendly.

* At parse time, get or create a frame slot that holds the method
* Introduce `ArgInfo` record (preserve primitive int) over using `Pair`
* Remove unneeded `isImplicitNewExpr` method; this is not needed because
  we can just keep track of the method slot on the frame descriptor
  builder.
2026-09-22 12:12:57 -07:00
Jen Basch 7ed88e250b Add VmType intermediate representation for types (#1838) 2026-09-22 08:26:03 -07:00
Daniel Chao cbffd6c114 Improve error message when amending a property with no value set (#1867)
Improve error message when amending a property with no value set

This decorates error messages with the amendment node.
2026-09-21 06:54:22 -07:00
Daniel Chao e0b3b87e19 Fix native image build (#1865)
PE code can't call `Object.equals`
2026-09-17 21:57:35 -07:00
Daniel Chao cec08c651e Optimize super property and super subscript nodes (#1853)
This adds cacheing to ReadSuper* nodes so that the same
node being executed can possibly re-use a previously cached value.
2026-09-17 20:46:03 -07:00
Jen Basch 397183a620 Mark overridable external properties as const (#1864) 2026-09-17 12:52:53 -07:00
Jen Basch c71b107e32 Add inference for let bindings (#1824) 2026-09-15 05:20:42 +00:00
Daniel Chao d0de24b85b Avoid using Object.toString() for in-language API (#1850)
This changes code so that the in-language `toString()` doesn't use
Java's `Object.toString()`.
Additionally, the existing `toString()` implementation is switched over
to using `VmValueRenderer`, which does not force (leaves `?` in place of
unforced values).

This helps improve ergonomics when working on the language (can enable
automatically calling `toString()` on debug values).

Additionally, external tools might call toString(); for example,
Truffle's compiler sometimes will stringify node fields (e.g.
when -Dengine.CompilationFailureAction=Throw) is set.
2026-09-11 23:08:26 +00:00
Daniel Chao e3881f6149 Fix invalid prefix when generating spring boot config (#1862)
Fix invalid prefix when generating spring boot config

In Spring Boot, the prefix passed to `@ConfigurationProperties` must
be in "canonical form".

The presence of this annotation allows spring boot to directly inject
properties into a class, but is not actually needed.

The correct behavior here is to omit this annotation if the property
name does not match Spring Boot's canonical form.
2026-09-11 15:49:04 -07:00
Daniel Chao 9b52a4fd82 Fix CI on Windows (#1861)
Fix bad assertion: `IoUtils.getSystemModuleCacheDir()` uses the actual
OS env, but the test hard-codes `isWindows` to false.
2026-09-11 11:09:37 -07:00
Daniel Chao 8fba228790 Fix failing test on Windows (#1858) 2026-09-10 21:31:19 -07:00
Jen Basch 574ad844f3 Use ChoiceFormat for better plurals in error messages (#1848) 2026-09-10 22:03:05 +00:00
Daniel Chao 90245589b6 Improve documentation on netRcHeaders method (#1854) 2026-09-09 15:30:08 -07:00
Yarden Bar c95b3d11f4 Add netrc helpers in EvaluatorSettings.pkl (#1817)
This adds the `netRcHeaders` helper method that parses netrc file contents, and returns a mapping suitable to be used as Http headers.
2026-09-09 14:25:06 -07:00
Daniel Chao 713adac824 Make generator nodes more PE friendly (#1844)
* In GeneratorWhenNode, need to move individual iterations into their
  own methods so that the @ExplodeLoop sees a constant number of
  iterations whenever that method is called.
* In the other nodes, the lambda passed to
  `forceAndIterateMemberValues` needs to capture the materialized frame,
  not the virtual frame.
2026-09-08 15:11:10 -07:00
Dylan Pulver f3efcbfc9b Escape characters that YAML cannot carry literally (#1846)
YamlEmitter only routed a string into YamlEscaper when it held a
character below 0x20, so 0x7F, the C1 block, U+2028 and U+2029 went out
as plain scalars. They are not `c-printable` (YAML 1.2 spec 5.1), and
NEL, LS and PS are line breaks in YAML 1.1, so the rendered document is
either rejected or silently split by a reader.

The escapes added in #1165 for 0x85, 0xA0, U+2028, and U+2029 could only
fire when some other character happened to open that gate. Share one
predicate between the two sites that decide, and give 0x7F-0x9F the
8-bit escape they lack.
2026-09-04 13:46:09 -07:00
Jen Basch f284a0560a Error when inferring a self type in a method argument (#1847) 2026-09-03 23:03:34 +00:00
Jen Basch 249e563291 Optimize new inference in method args (#1845) 2026-09-03 13:16:17 -07:00
Jen Basch 7f5ae2a712 Add inference for implicitly typed new in method arguments (#1768) 2026-09-02 23:55:24 +00:00
Daniel Chao 92b26aca17 Optimize annotations without object bodies (#1843)
This skips some unnecessary steps when evaluating annotations that
have no attached object bodies by returning an EmptyObjectLiteralNode
instead of a PropertiesLiteralNode
2026-09-02 13:04:26 -07:00
Daniel Chao 0035199176 Improve partial-evaluation when amending null parents (#1836)
GraalVM's partial evaulator can't handle recursive calls into the same
node.

The current implementation around evaluating `VmNull` as a parent causes
the partial evaluator to bail out, leaving Pkl stuck in interpreter
mode.

This rewrites the various object literals to add individual
specializations for each type of default value we can see from a VmNull
parent.

Also:
* Fix `isTypeObjectClass` impl
* Fix bug when amending with generator object literal node with object params
2026-09-02 18:18:55 +00:00
Daniel Chao 2c2f50113d Make enclosing frame lookup more PE friendly (#1842)
The truffle compiler currently _always_ bails out of compilation for
`VmUtils.getFrame()` calls, because it determines that some branch
of this code can possibly return a materialized frame.

This adjusts the code so that the hot path (levelsUp == 0)
does not touch `VmUtils.getFrame()`, and avoids unnecessarily
materializing the frame.
2026-09-02 10:01:25 -07:00
Daniel Chao 9f28c1cb11 Make listing/mapping typecasts more PE-friendly (#1837)
This rewrites the listing/mapping typecast nodes to be more friendly
to partial-evaluation.

This is because the compiler bails out of deeply recursive calls.
2026-09-02 10:00:59 -07:00
Daniel Chao adee565a8c Mark protobuf module as deprecated (#1778)
This moves the protobuf module from experimental to deprecated

Rationale:

* This is very seldom used, if used at all
* Not fully fleshed out (this really should be paired with a protoc-gen-pkl, which doesn't exist)
* There is a ProtoJSON wire format that we can already render to
2026-09-02 09:26:51 -07:00
Jen Basch 2b697015c7 Add this as a self type (#1708) 2026-09-02 09:04:15 -07:00
Daniel Chao 1208fa9438 Improve reading of const members (#1835)
The previous implementation can cause the JIT compiler to permanently
bail out when reading const memebrs.
2026-08-28 09:18:56 -07:00
Jen Basch 1cfdd3d30d Fix native build (#1832) 2026-08-26 22:45:18 +00:00
Jen Basch cb01d6275b Correctly type check Class<T> (#1698) 2026-08-26 05:29:34 +00:00
Sergio Salvi a90eb74c2d Fix reflect crash on modules using glob imports (#1816)
This excludes glob imports when creating a module's mirror
2026-08-25 12:04:45 -07:00
Jen Basch ae9160df51 Enforce max collection sizes when decoding pkl-binary (#1831) 2026-08-25 08:28:28 -07:00
Jen Basch 79af6b1676 Sanitize block comment endings in generated Kotlin doc comments (#1830) 2026-08-25 08:27:30 -07:00
Sergio Salvi 7404f7d160 Fix block comment at EOF without trailing newline (#1828) 2026-08-21 15:46:37 -07:00
Daniel ChaoandFlorin Ungur 6551a59f9e Use XDG base directories and Known Folders on Windows (#1809)
This changes logic that previously read/wrote from `~/.pkl` to use
XDG base directories (all OSes), and Known Folders locations on Windows.

For example, Pkl will look for `settings.pkl` in:

1. `$XDG_CONFIG_HOME/pkl/settings.pkl`
2. `%APPDATA/pkl/settings.pkl`
3. `~/.pkl/settings.pkl`
4. Path pkl/settings/pkl within `$XDG_CONFIG_DIRS`
5. `/etc/xdg/pkl/settings.pkl`

---------

Co-authored-by: Florin Ungur <florin@florinungur.com>
2026-08-20 21:50:24 +00:00
Daniel ChaoandIslon Scherer 4dd37219c0 Fix name resolution of types in constraints (#1826)
This fixes an issue where type names are resolved incorrectly
in typealias constraints.

Co-authored-by: Islon Scherer <islonscherer@gmail.com>
2026-08-19 11:10:32 -07:00
Jen Basch ac43bdbb17 Add hex/binary/octal support to String.toInt() (#1808) 2026-08-18 09:44:02 -04:00
Jen BaschandDan Chao 762db144ce Enforce that abstract methods are implemented (#1785)
This adds a check that abstract members must be implemented.
If any members lack an implementation, an error is thrown describing
the missing members.

Co-authored-by: Dan Chao <dan.chao@apple.com>
2026-08-17 21:52:54 +00:00
Daniel Chao 99c9f53063 Remove community.adoc page (#1820)
This is being moved to pkl-lang.org
(see https://github.com/apple/pkl-lang.org/pull/172).
2026-08-10 11:23:24 -07:00
Daniel ChaoandIslon Scherer c5896d76d0 Split libpkl libraries between shared and static libs (#1812)
This adds a `libpkl-static.pc` so pkg-config users can link either
statically or dynamically via `pkg-config --libs libpkl`, or
`pkg-config --libs libpkl-static`.

Additionally, this fixes an issue where the replace tokens wasn't
doing anything, leaving the `@version@` token intact in the archive.

Additionally, this adds an `-install_name` when building the dylib for macOS.

Co-authored-by: Islon Scherer <islonscherer@gmail.com>
2026-08-07 15:47:16 +00:00
Jen Basch b3698683ab Upgrade to GraalVM 25.2.4 (#1804) 2026-08-03 09:24:53 -07:00
Daniel Chao 417c08ae11 Fix various issues in libpkl (#1805)
* Fix possible SIGSEGV from host process.
   - Require that the same `pkl_exec_t` be used in the same OS thread; returning meaningful error if this fails
* Remove `System.exitProcess(1)` logic in NativeTransport; this would kill the host process too and isn't an appropriate action for a received ProtocolException
* Allow multiple calls to pkl_init without pkl_close; this limitation doesn't really make any sense
* Prefer calling methods defined in graal_isolate.h, instead of creating the same method via CEntryPoint
* Add a CMakeLists.txt so that CLion can follow the code and provide proper diagnostics
* Improve doc comments; describe params as either in or out
2026-07-31 16:23:37 +00:00
Jen Basch 5333d55269 Skip loading known-bad certs (#1806) 2026-07-30 22:54:08 +00:00
043f0e129b Add documentation for libpkl (#1801)
This adds a new Antora module for libpkl, and updates the language
bindings documentation.

Co-authored-by: Jen Basch <jbasch94@gmail.com>
Co-authored-by: Islon Scherer <islonscherer@gmail.com>
2026-07-30 17:24:27 +00:00
Daniel Chao a55a3d7c33 Improve evaluation of typealiases (#1796)
This simplifies the resolution of names in typealias constraints.
This removes the existing logic around swapping out the frame's
owner/receiver, and instead favors resolving the variable at parse time.

* During variable resolution, create read variable nodes that read off of
  a receiver node
* Introduce `GetTypeAliasModuleNode` that provides the typealias's
  enclosing module
* Inject the enclosing module during typealias instantiation
2026-07-30 17:22:45 +00:00
Jen Basch 2ca2aaf9ec Add pkl project package --install to local cache (#1795) 2026-07-30 07:26:21 +00:00
Jen Basch 8ad5759630 Use EnumSet internal for Token type checks (#1803) 2026-07-29 16:09:52 -07:00
Rushikesh 871041e655 Avoid duplicate pkl-gradle publication (#1777)
The java-gradle-plugin already creates the pluginMaven publication. Applying the library publishing convention creates another publication with the same coordinates, causing an overwrite warning during Sonatype publishing.

Configure the shared POM metadata, validation, signing, and archive artifacts directly so pkl-gradle retains the convention behavior without creating the duplicate library publication.

Fixes #1742
2026-07-29 22:26:51 +00:00
Jen Basch 50a09f59dc Remove abstract properties (#1781) 2026-07-29 15:05:19 -07:00
Daniel Chao f6107b6e86 Fix libpkl and windows builds (#1799)
* Fix issue where linker can't find object files
* Fix issue where macOS libpkl builds time out due to exhausting host resources
2026-07-28 23:32:19 +00:00
Daniel Chao 79dd95c4e6 Fix deploy build (#1798)
* Fix issue where the DeployJob and GithubRelease jobs download
  artifacts using a glob that only matches one artifact
* Make NativeImageBuild task only produce outputs as declared by build;
  ensure there's no build_artifacts.txt, sources/ dir, etc.
2026-07-28 20:42:50 +00:00
Daniel Chao be03023499 Fix snippet test mismatch between hotspot and native test (#1797) 2026-07-28 18:18:36 +00:00
Islon Scherer 1a3dc52a96 Fix bug in force (#1790) 2026-07-28 09:19:15 +02:00
67df676359 Introduce C library for Pkl (#1238)
This uses native-image to generate a C library for Pkl.
This generated library from native-image is wrapped with our own library,
in `pkl.h`.

This produces a static and a dynamic library for each os/arch variant
that Pkl currently supports.

Co-authored-by: Kushal Pisavadia <kushal.p@apple.com>
Co-authored-by: Jen Basch <jbasch94@gmail.com>
Co-authored-by: Islon Scherer <i_desouzascherer@apple.com>
2026-07-25 04:15:26 +00:00
David TeslerandDan Chao 175e2b6273 Fix negative caret width rendering multi-line expression errors (#1793)
The expression preamble length was subtracted from endColumn even
when endColumn came from the already-stripped sourceLine.length(),
so multi-line frames got a negative caret width and String.repeat
threw. Apply the offset only to the frame-derived columns.

---------

Co-authored-by: Dan Chao <dan.chao@apple.com>
2026-07-24 20:57:05 +00:00
Islon SchererandDaniel Chao 2c9e3161d8 Import release notes for 0.32.1 (#1789) (#1791)
Co-authored-by: Daniel Chao <dan.chao@apple.com>
2026-07-23 19:06:15 +02:00
Daniel Chao 2242cc9c82 Fix variable resolution of object body params (#1788)
Fixes a regression introduced in Pkl 0.32.
2026-07-22 13:04:36 -07:00
Daniel Chao 03792be984 Add more third party licenses (#1784)
Some new third-party libs ended up in our distributions, but we didn't
add them to our third party notices.
2026-07-17 18:59:11 +00:00
Daniel Chao 3b5e9df0da Migrate Gradle delegated properties (#1782)
There were some more that we missed last time around
2026-07-16 15:41:28 -07:00
Kushal Pisavadia 50cfc0bcde Close intermediate redirect response bodies before following (#1749)
When following redirects, `RequestRewritingClient` discarded each 3xx
response without closing its body, leaking the underlying connection.

Close the body as soon as we know the status is a redirect and won't
be returned, so the too-many-redirects, missing-`Location`,
invalid-URI and downgrade error paths all release the connection too.

This prevents leaking one `BodyHandlers.ofInputStream()` connection
per hop. Now the code closes the body before following the redirect.
2026-07-16 21:11:53 +00:00
Jen BaschandVinayak 3d03a47933 Revert "Revert "Reject abstract members in non-abstract classes" (#1688)" (#1780)
This reverts commit 1bf00b84ea.

Co-authored-by: Vinayak <vinayak@vama.app>
2026-07-16 11:34:20 -07:00
dependabot[bot] a1421ff667 Bump shadowPlugin from 9.4.2 to 9.5.1 (#1772)
Bumps `shadowPlugin` from 9.4.2 to 9.5.1.

Updates `com.gradleup.shadow:com.gradleup.shadow.gradle.plugin` from 9.4.2 to 9.5.1
- [Release notes](https://github.com/GradleUp/shadow/releases)
- [Commits](https://github.com/GradleUp/shadow/compare/9.4.2...9.5.1)

Updates `com.gradleup.shadow` from 9.4.2 to 9.5.1
- [Release notes](https://github.com/GradleUp/shadow/releases)
- [Commits](https://github.com/GradleUp/shadow/compare/9.4.2...9.5.1)

---
updated-dependencies:
- dependency-name: com.gradleup.shadow:com.gradleup.shadow.gradle.plugin
  dependency-version: 9.5.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.gradleup.shadow
  dependency-version: 9.5.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-14 23:36:31 +00:00
dependabot[bot] 773e964ea2 Bump com.diffplug.spotless:spotless-plugin-gradle from 8.7.0 to 8.8.0 (#1773)
Bumps [com.diffplug.spotless:spotless-plugin-gradle](https://github.com/diffplug/spotless) from 8.7.0 to 8.8.0.
- [Release notes](https://github.com/diffplug/spotless/releases)
- [Changelog](https://github.com/diffplug/spotless/blob/main/CHANGES.md)
- [Commits](https://github.com/diffplug/spotless/compare/gradle/8.7.0...gradle/8.8.0)

---
updated-dependencies:
- dependency-name: com.diffplug.spotless:spotless-plugin-gradle
  dependency-version: 8.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-14 23:35:45 +00:00
dependabot[bot] c44cbc546b Bump nu.validator:validator from 26.6.24 to 26.7.3 (#1776)
Bumps [nu.validator:validator](https://github.com/validator/validator) from 26.6.24 to 26.7.3.
- [Release notes](https://github.com/validator/validator/releases)
- [Commits](https://github.com/validator/validator/compare/26.6.24...26.7.3)

---
updated-dependencies:
- dependency-name: nu.validator:validator
  dependency-version: 26.7.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-14 23:35:16 +00:00
dependabot[bot] 71a0b6d113 Bump gradle-wrapper from 9.6.0 to 9.6.1 (#1775)
Bumps [gradle-wrapper](https://github.com/gradle/gradle) from 9.6.0 to 9.6.1.
- [Release notes](https://github.com/gradle/gradle/releases)
- [Commits](https://github.com/gradle/gradle/compare/v9.6.0...v9.6.1)

---
updated-dependencies:
- dependency-name: gradle-wrapper
  dependency-version: 9.6.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-14 23:34:59 +00:00
dependabot[bot] 4f2d2873ae Bump actions/setup-java from 5.4.0 to 5.5.0 in the first-party group (#1774)
Bumps the first-party group with 1 update: [actions/setup-java](https://github.com/actions/setup-java).


Updates `actions/setup-java` from 5.4.0 to 5.5.0
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/1bcf9fb12cf4aa7d266a90ae39939e61372fe520...0f481fcb613427c0f801b606911222b5b6f3083a)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-version: 5.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: first-party
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-14 23:34:39 +00:00
Jen Basch 42f107881f Update dependabot schedule (#1771) 2026-07-14 16:23:14 -07:00
Jen Basch 71948d69c4 Upgrade to GraalVM 25.1.3, drop macOS Intel builds (#1769) 2026-07-13 15:52:02 -07:00
Daniel Chao 60b0d86b5f Fix eval -x of local members (#1760)
This fixes a regression where local members cannot be seen by the
expression evaluator.

Because variable are now parse-time resolved, this builds a truffle node
by first constructing a synthetic module of all defined local members,
and calls AstBuilder on this synthetic module first.
2026-07-11 00:03:15 +00:00
dependabot[bot] b4ca82bf36 Bump kotlinToolchain from 2.3.21 to 2.4.0 (#1678)
Bumps `kotlinToolchain` from 2.3.21 to 2.4.0.

Updates `org.jetbrains.kotlin:kotlin-gradle-plugin` from 2.3.21 to 2.4.0
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.3.21...v2.4.0)

Updates `org.jetbrains.kotlin.plugin.serialization` from 2.3.21 to 2.4.0
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.3.21...v2.4.0)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.plugin.serialization
  dependency-version: 2.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: org.jetbrains.kotlin:kotlin-gradle-plugin
  dependency-version: 2.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-09 16:19:56 -07:00
dependabot[bot] 1cc47faac3 Bump junit from 6.1.0 to 6.1.1 (#1750)
Bumps `junit` from 6.1.0 to 6.1.1.

Updates `org.junit.jupiter:junit-jupiter-api` from 6.1.0 to 6.1.1
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.0...r6.1.1)

Updates `org.junit.jupiter:junit-jupiter-engine` from 6.1.0 to 6.1.1
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.0...r6.1.1)

Updates `org.junit.jupiter:junit-jupiter-params` from 6.1.0 to 6.1.1
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.0...r6.1.1)

Updates `org.junit.platform:junit-platform-launcher` from 6.1.0 to 6.1.1
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.0...r6.1.1)

---
updated-dependencies:
- dependency-name: org.junit.jupiter:junit-jupiter-api
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.junit.jupiter:junit-jupiter-engine
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.junit.jupiter:junit-jupiter-params
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.junit.platform:junit-platform-launcher
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-09 15:51:53 -07:00
dependabot[bot] d6107c071b Bump com.palantir.javapoet:javapoet from 0.16.0 to 0.17.0 (#1751)
Bumps [com.palantir.javapoet:javapoet](https://github.com/palantir/javapoet) from 0.16.0 to 0.17.0.
- [Release notes](https://github.com/palantir/javapoet/releases)
- [Commits](https://github.com/palantir/javapoet/compare/0.16.0...0.17.0)

---
updated-dependencies:
- dependency-name: com.palantir.javapoet:javapoet
  dependency-version: 0.17.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-09 15:51:33 -07:00
dependabot[bot] f21175df9a Bump jline from 4.2.1 to 4.3.1 (#1752)
Bumps `jline` from 4.2.1 to 4.3.1.

Updates `org.jline:jline-reader` from 4.2.1 to 4.3.1
- [Release notes](https://github.com/jline/jline3/releases)
- [Commits](https://github.com/jline/jline3/compare/4.2.1...4.3.1)

Updates `org.jline:jline-terminal` from 4.2.1 to 4.3.1
- [Release notes](https://github.com/jline/jline3/releases)
- [Commits](https://github.com/jline/jline3/compare/4.2.1...4.3.1)

Updates `org.jline:jline-terminal-jni` from 4.2.1 to 4.3.1
- [Release notes](https://github.com/jline/jline3/releases)
- [Commits](https://github.com/jline/jline3/compare/4.2.1...4.3.1)

---
updated-dependencies:
- dependency-name: org.jline:jline-reader
  dependency-version: 4.3.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: org.jline:jline-terminal
  dependency-version: 4.3.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: org.jline:jline-terminal-jni
  dependency-version: 4.3.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-09 15:51:11 -07:00
dependabot[bot] a59fd9d2ad Bump the codeql group with 2 updates (#1757)
Bumps the codeql group with 2 updates: [github/codeql-action/analyze](https://github.com/github/codeql-action) and [github/codeql-action/init](https://github.com/github/codeql-action).


Updates `github/codeql-action/analyze` from 4.36.2 to 4.36.3
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/8aad20d150bbac5944a9f9d289da16a4b0d87c1e...54f647b7e1bb85c95cddabcd46b0c578ec92bc1a)

Updates `github/codeql-action/init` from 4.36.2 to 4.36.3
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/8aad20d150bbac5944a9f9d289da16a4b0d87c1e...54f647b7e1bb85c95cddabcd46b0c578ec92bc1a)

---
updated-dependencies:
- dependency-name: github/codeql-action/analyze
  dependency-version: 4.36.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: codeql
- dependency-name: github/codeql-action/init
  dependency-version: 4.36.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: codeql
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-09 15:09:48 -07:00
Jen Basch ed1d600779 Bump pkl.impl.ghactions to version 1.8.2 (#1756) 2026-07-09 13:50:20 -07:00
Daniel Chao 7a7f3abc50 Migrate Gradle deprecations (#1745) 2026-07-08 12:05:19 -07:00
Dan Chao 25d86db416 Update changelog with release notes link 2026-07-08 10:29:48 -07:00
Dan Chao 997cfc9ae2 Start next dev iteration 2026-07-08 10:29:48 -07:00
Dan Chao 9916c23cfc Prepare 0.32.0 release 2026-07-08 10:29:48 -07:00
Daniel Chao c3d570c769 Fix docsite (#1740) 2026-07-08 09:45:07 -07:00
Daniel Chao 7499a89d83 Add 0.32 release notes (#1699)
This adds release notes for the 0.32 release
2026-07-08 09:38:37 -07:00
Daniel Chao 010d971af0 Add tests for empty IntSeq iteration (#1739) 2026-07-08 06:37:56 -07:00
Daniel Chao bd83e29641 Normalize asset paths in local dependencies (#1737)
This changes local asset path resolution so that `..` segments at the
dependency root just resolves to the dependency root.

This makes import resolution work the same between local and remote dependencies.
2026-07-08 05:43:36 -07:00
Daniel Chao 2ec62c99a7 Enforce stricter rules on reference access (#1718)
This changes the following:

1. If given a union type, the member must exist on each member of that type
2. If accessing a member off `Reference<D, Null>`, give a `Reference<D, Null>`

Also:
* Improve error messages thrown during member access.
* Add test around accessing members off of a function type
2026-07-06 19:24:14 -07:00
Daniel Chao 3fc97d8dad Allow projectpackage: resource reads by default in Gradle plugin (#1735)
Fix an inconsistency: they are allowed as imports, but not reads.
2026-07-06 14:41:52 -07:00
Daniel Chao eaf73af247 Improve thread safety for pkl:base (#1719)
Stdlib modules are singletons that are shared across multiple evaluators.
This improves thread safety by evaluating its `output.bytes` during
initialization, which initializes truffle nodes (e.g. TypeTestNode),
and also initializes the member cache of the module output of `pkl:base`
2026-07-06 11:19:29 -07:00
Daniel Chao 2ec83198f5 Fix replacements of types nested within nested constraints (#1731)
Also, adjust tests
2026-07-06 08:58:56 -07:00
dependabot[bot] 26c115aea6 Bump gradle-wrapper from 9.5.1 to 9.6.0 (#1727)
Bumps [gradle-wrapper](https://github.com/gradle/gradle) from 9.5.1 to 9.6.0.
- [Release notes](https://github.com/gradle/gradle/releases)
- [Commits](https://github.com/gradle/gradle/compare/v9.5.1...v9.6.0)

---
updated-dependencies:
- dependency-name: gradle-wrapper
  dependency-version: 9.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-02 22:19:24 +00:00
Jen Basch 6a4d3acf21 Fix incorrect isNoopTypeCheck() calls (#1717)
`isNoopTypeCheck()` is not reliable when inside a TypeNode's constructor. This defers these calls to node execution time.
2026-07-02 14:24:55 -07:00
dependabot[bot] 08b0975af9 Bump actions/setup-java from 5.3.0 to 5.4.0 (#1726)
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 5.3.0 to 5.4.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/ad2b38190b15e4d6bdf0c97fb4fca8412226d287...1bcf9fb12cf4aa7d266a90ae39939e61372fe520)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-version: 5.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-02 11:29:36 -07:00
dependabot[bot] 1ad63d32b3 Bump nu.validator:validator from 26.5.29 to 26.6.24 (#1725)
Bumps [nu.validator:validator](https://github.com/validator/validator) from 26.5.29 to 26.6.24.
- [Release notes](https://github.com/validator/validator/releases)
- [Commits](https://github.com/validator/validator/compare/26.5.29...26.6.24)

---
updated-dependencies:
- dependency-name: nu.validator:validator
  dependency-version: 26.6.24
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-02 11:29:14 -07:00
dependabot[bot] f44ff9904d Bump commonMark from 0.28.0 to 0.29.0 (#1724)
Bumps `commonMark` from 0.28.0 to 0.29.0.

Updates `org.commonmark:commonmark` from 0.28.0 to 0.29.0
- [Release notes](https://github.com/commonmark/commonmark-java/releases)
- [Changelog](https://github.com/commonmark/commonmark-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/commonmark/commonmark-java/compare/commonmark-parent-0.28.0...commonmark-parent-0.29.0)

Updates `org.commonmark:commonmark-ext-gfm-tables` from 0.28.0 to 0.29.0
- [Release notes](https://github.com/commonmark/commonmark-java/releases)
- [Changelog](https://github.com/commonmark/commonmark-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/commonmark/commonmark-java/compare/commonmark-parent-0.28.0...commonmark-parent-0.29.0)

---
updated-dependencies:
- dependency-name: org.commonmark:commonmark
  dependency-version: 0.29.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: org.commonmark:commonmark-ext-gfm-tables
  dependency-version: 0.29.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-02 11:28:45 -07:00
Daniel Chao 45912c504f Fix incorrect member links (#1723)
This fixes various incorrect member links in the stdlib.
2026-07-02 11:04:01 -07:00
adityabagchi24andDaniel Chao 1c1a39e37f Fix type argument lost in constraint expressions within generic typealiases (#1709)
Co-authored-by: Daniel Chao <daniel.h.chao@gmail.com>
2026-07-01 10:10:03 -07:00
Jen Basch bfa6a989be Generalize TypeNode validation (#1715) 2026-06-30 08:50:35 -07:00
Jen Basch 70fc1d4ba3 Correctly handle type aliases with a type variable as the root (#1714) 2026-06-30 06:49:21 +00:00
Daniel Chao 139d1ae8ec Fix many editor diagnostics (#1707)
This addresses many IDE warnings resulting from the switch to JSpecify.

Also, this changes the behavior of exporting VmObject; there's no place
in our code that does not force a VmObject prior to export, so
the existing logic around handling nullable values has been removed.
2026-06-29 16:22:19 +00:00
Daniel Chao 742a8e88da Fix for-generator variable resolution in nested eager scope (#1706)
Fixes an issue around resolving for-generator variables in some cases
2026-06-29 09:07:51 -07:00
Islon Scherer 6239981869 Improve error message for aliased references (#1695) 2026-06-29 18:06:34 +02:00
dependabot[bot] f470903389 Bump EnricoMi/publish-unit-test-result-action from 2.23.0 to 2.24.0 (#1700)
Bumps [EnricoMi/publish-unit-test-result-action](https://github.com/enricomi/publish-unit-test-result-action) from 2.23.0 to 2.24.0.
- [Release notes](https://github.com/enricomi/publish-unit-test-result-action/releases)
- [Commits](https://github.com/enricomi/publish-unit-test-result-action/compare/c950f6fb443cb5af20a377fd0dfaa78838901040...d0a4676d0e0b938bc201470d88276b7c74c712b3)

---
updated-dependencies:
- dependency-name: EnricoMi/publish-unit-test-result-action
  dependency-version: 2.24.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-26 09:51:24 -07:00
Daniel Chao 158f709ed4 Adjust doc comments on ref.pkl (#1693)
This adjusts the doc comments in ref.pkl

* Fix incorrect code snippets
* Clean up examples
* Remove some sections
* Make phrasing consistent with the rest of the stdlib
2026-06-25 21:31:54 +00:00
dependabot[bot] 601a8f424c Bump jline from 4.1.3 to 4.2.1 (#1702)
Bumps `jline` from 4.1.3 to 4.2.1.

Updates `org.jline:jline-reader` from 4.1.3 to 4.2.1
- [Release notes](https://github.com/jline/jline3/releases)
- [Commits](https://github.com/jline/jline3/compare/4.1.3...4.2.1)

Updates `org.jline:jline-terminal` from 4.1.3 to 4.2.1
- [Release notes](https://github.com/jline/jline3/releases)
- [Commits](https://github.com/jline/jline3/compare/4.1.3...4.2.1)

Updates `org.jline:jline-terminal-jni` from 4.1.3 to 4.2.1
- [Release notes](https://github.com/jline/jline3/releases)
- [Commits](https://github.com/jline/jline3/compare/4.1.3...4.2.1)

---
updated-dependencies:
- dependency-name: org.jline:jline-reader
  dependency-version: 4.2.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: org.jline:jline-terminal
  dependency-version: 4.2.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: org.jline:jline-terminal-jni
  dependency-version: 4.2.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-25 14:13:41 -07:00
dependabot[bot] 34c58efe4c Bump actions/setup-java from 5.2.0 to 5.3.0 (#1701)
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 5.2.0 to 5.3.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/be666c2fcd27ec809703dec50e508c2fdc7f6654...ad2b38190b15e4d6bdf0c97fb4fca8412226d287)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-version: 5.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-25 13:51:17 -07:00
dependabot[bot] 7903a072ea Bump com.diffplug.spotless:spotless-plugin-gradle from 8.6.0 to 8.7.0 (#1704)
Bumps [com.diffplug.spotless:spotless-plugin-gradle](https://github.com/diffplug/spotless) from 8.6.0 to 8.7.0.
- [Release notes](https://github.com/diffplug/spotless/releases)
- [Changelog](https://github.com/diffplug/spotless/blob/main/CHANGES.md)
- [Commits](https://github.com/diffplug/spotless/compare/gradle/8.6.0...gradle/8.7.0)

---
updated-dependencies:
- dependency-name: com.diffplug.spotless:spotless-plugin-gradle
  dependency-version: 8.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-25 13:50:50 -07:00
dependabot[bot] bda36f0c32 Bump com.uber.nullaway:nullaway from 0.13.6 to 0.13.7 (#1703)
Bumps [com.uber.nullaway:nullaway](https://github.com/uber/NullAway) from 0.13.6 to 0.13.7.
- [Release notes](https://github.com/uber/NullAway/releases)
- [Changelog](https://github.com/uber/NullAway/blob/master/CHANGELOG.md)
- [Commits](https://github.com/uber/NullAway/compare/v0.13.6...v0.13.7)

---
updated-dependencies:
- dependency-name: com.uber.nullaway:nullaway
  dependency-version: 0.13.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-25 13:50:28 -07:00
Islon Scherer d42e199da3 Fix wrong error key in ReflectNodes (#1694) 2026-06-25 09:21:03 +02:00
Daniel Chao f61a5cf541 Check if receiver is a module object in relativePathTo (#1650)
Closes #1649
2026-06-24 11:48:57 +02:00
Islon Scherer dd6939ab3f Add equals and hashcode to PType (#1691) 2026-06-24 11:31:11 +02:00
Minh Vu f7cac257ad Fix Windows GraalVM installation (#1687)
## What changed

This updates the GraalVM install task so Windows installs use ZIP extraction instead of the Unix tar path. Windows now publishes the extracted directory by moving it into place, while macOS and Linux keep the existing tar extraction and symlink-based install flow.

## Why

BuildInfo.GraalVm downloads .zip archives on Windows, but InstallGraalVm always ran tar --strip-components=1 -xzf and then tried to install by creating a symbolic link. That combination is fragile on Windows: the archive format does not match the extraction command, and symlink creation can require special privileges.
2026-06-23 15:36:01 -07:00
Daniel Chao 1bf00b84ea Revert "Reject abstract members in non-abstract classes" (#1688)
The changes made in this commit are good, but we're going to kick this out
to the next release.
This is because:

1. There's a couple more issues around the `abstract` modifier that is not
implemented yet, and need design considerations
2. These are breaking changes, and we want to minimize the amount of breakages
for users.
3. The main branch is still the develop branch for Pkl 0.32

We will apply a re-revert of this commit after Pkl 0.32 is released.
2026-06-23 09:46:14 -07:00
Daniel Chao 15f089b275 Implement toString() on VmReference (#1692)
This is still needed right now, because some methods call through to
`toString()`.
2026-06-23 09:45:13 -07:00
Jen Basch 8a43e51e6b SPICE-0020: Deferred, type-safe references (#1354) 2026-06-23 15:26:06 +02:00
Vladimir Matveev b3015a09cc Catching exceptions during property evaluation (#1684)
The eval task, unlike other tasks, creates the evaluator when the property is evaluated, not just when the task is executed (in the `getEffective*` properties). The problem here is that property evaluation can and will happen before the task is executed, because Gradle needs property values for caching and sometimes task dependency information.

Therefore, if due to misconfiguration or due to intentional configuration the evaluator cannot be created - for example, when the `PklProject` module doesn't exist, but the project directory is configured - then the task will fail with an exception which looks _very_ similar to a regular execution exception, but which actually is not, because it is thrown not during task execution, but during preparation for the execution.

This distinction matters a lot when you rely on conditional task execution. If you use the `onlyIf` predicate on tasks to define a condition for the task execution, this predicate will be evaluated before the task actions are run, but *after* properties are evaluated. Thus, if property evaluation fails with an exception, it will *look* as if the `onlyIf` predicate is completely ignored and not even evaluated, and the task action is run regardless of the predicate.

This error mode is extremely confusing and is actually wrong: if I use `onlyIf` to gate the task execution, I don't want *any* of its logic to run. In fact, in my case I specifically use `onlyIf` on the evaluation task to only execute it if a prerequisite is met, and the same predicate guards a bunch of other tasks which prepare the Pkl project, so my Pkl project isn't even generated if the predicate fails. But due to this behavior of properties evaluation which are not controlled by `onlyIf`, the project is still attempted to be evaluated, and this results in a very unexpected build failure.

The solution is to ignore the evaluation exception, because for all intents and purposes, if the project can't be properly evaluated, it will fail during the task execution as it should, so the values of output properties don't really matter as the task will never be run.
2026-06-22 14:30:27 -07:00
dependabot[bot] ffc755f9c1 Bump errorProne from 2.49.0 to 2.50.0 (#1685)
Bumps `errorProne` from 2.49.0 to 2.50.0.

Updates `com.google.errorprone:error_prone_core` from 2.49.0 to 2.50.0
- [Release notes](https://github.com/google/error-prone/releases)
- [Commits](https://github.com/google/error-prone/compare/v2.49.0...v2.50.0)

Updates `com.google.errorprone:error_prone_annotations` from 2.49.0 to 2.50.0
- [Release notes](https://github.com/google/error-prone/releases)
- [Commits](https://github.com/google/error-prone/compare/v2.49.0...v2.50.0)

---
updated-dependencies:
- dependency-name: com.google.errorprone:error_prone_core
  dependency-version: 2.50.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.google.errorprone:error_prone_annotations
  dependency-version: 2.50.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 10:33:28 -07:00
dependabot[bot] 112a89468f Bump com.uber.nullaway:nullaway from 0.13.4 to 0.13.6 (#1686)
Bumps [com.uber.nullaway:nullaway](https://github.com/uber/NullAway) from 0.13.4 to 0.13.6.
- [Release notes](https://github.com/uber/NullAway/releases)
- [Changelog](https://github.com/uber/NullAway/blob/master/CHANGELOG.md)
- [Commits](uber/NullAway@v0.13.4...v0.13.6)

---
updated-dependencies:
- dependency-name: com.uber.nullaway:nullaway
  dependency-version: 0.13.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-22 10:31:12 -07:00
Islon Scherer bfac0d66ed Reject relative package URIs (#1683) 2026-06-17 15:39:03 +02:00
Daniel Chao fc8fe86e5a Remove incorrectly placed index methods on Collection (#1681)
These methods aren't implemented in `Set`, and don't really make sense because `Set` types can't be accessed by index.

Note: although this removes methods, this actually isn't a breaking change:
1. Calling `Set.findIndex()` currently throws an error around "cannot invoke abstract method"
2. `List` and `Set` are the only subclasses of `Collection`.

The following code isn't breaking at runtime, although static analysis tooling (like our IDE plugins) will now flag this as an error:

```pkl
myCollection: Collection

idx = myCollection.indexOf(1)
```
2026-06-15 08:56:55 -07:00
Aditya Singh a9c98e4396 Fix incorrect Facts in pkl:base doc comments (#1669)
Several `Facts:` examples in the `pkl:base` standard library docs assert
statements that are false when evaluated. Since these examples are not
run by any test, the mistakes went unnoticed and are rendered verbatim
into the generated API docs, where they mislead readers.

The corrected examples:

- `String.isNotBlank`: `"\t\n\r".isNotBlank` was listed as holding, but
a string of only whitespace is blank, so it is false. Negated it to
match the neighboring `!"".isNotBlank` and `!" ".isNotBlank` examples.
- `DataSize.toBinaryUnit` / `toDecimalUnit`: the `mb`/`mib` lines
mirrored the `kb`/`kib` lines, but the identity only holds for adjacent
units. `1024.kb == 1000.kib` (both 1,024,000 b), whereas `1024.mb` is
1,024,000,000 b and `1000.mib` is 1,048,576,000 b, so they are not
equal. There is no clean round-number equivalent at this magnitude, so I
removed the two false lines; the remaining examples still demonstrate
the conversion.
- `Collection.any`: `!List(1, 2, 3).any((n) -> n.isEven)` is false
because 2 is even. Changed the list to `List(1, 3, 5)` so the negation
holds.
- `IntSeq.end`: the example read `IntSeq(2, 5).start == 5`, which
documents the wrong property and is false (`start` is 2). Corrected it
to `IntSeq(2, 5).end == 5`.
- `List.isDistinctBy` / `distinctBy`: `List("a", "b", "abc")` is not
distinct by length, since `"a"` and `"b"` both have length 1. Switched
to `List("a", "bb", "ccc")` so the distinctness examples hold.
- `Map`: `Map(...).values` returns a `List`, not a `Set`. Corrected the
expected type.

I verified that each corrected example evaluates to `true`, and that the
neighboring examples I kept still pass, using the released Pkl 0.31.1
binary. The changes are confined to doc-comment text, so formatting is
unaffected.

---------

Signed-off-by: Aditya Singh <adisin650@gmail.com>
2026-06-11 17:10:14 +00:00
dependabot[bot] 8be37ae606 Bump github/codeql-action from 4.36.0 to 4.36.2 (#1676)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.36.0 to 4.36.2.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@7211b7c...8aad20d)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.36.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-11 16:06:18 +00:00
dependabot[bot] e012266372 Bump actions/checkout from 6.0.2 to 6.0.3 (#1677)
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@de0fac2...df4cb1c)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-11 08:52:25 -07:00
dependabot[bot] b3a12cb138 Bump nu.validator:validator from 26.5.22 to 26.5.29 (#1679)
Bumps [nu.validator:validator](https://github.com/validator/validator) from 26.5.22 to 26.5.29.
- [Release notes](https://github.com/validator/validator/releases)
- [Commits](validator/validator@26.5.22...26.5.29)

---
updated-dependencies:
- dependency-name: nu.validator:validator
  dependency-version: 26.5.29
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-11 08:51:45 -07:00
dependabot[bot] 1fa4e5e761 Bump com.palantir.javapoet:javapoet from 0.15.0 to 0.16.0 (#1680)
Bumps [com.palantir.javapoet:javapoet](https://github.com/palantir/javapoet) from 0.15.0 to 0.16.0.
- [Release notes](https://github.com/palantir/javapoet/releases)
- [Commits](palantir/javapoet@0.15.0...0.16.0)

---
updated-dependencies:
- dependency-name: com.palantir.javapoet:javapoet
  dependency-version: 0.16.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-11 08:50:46 -07:00
Daniel Chao 84d2c32d10 Improve handling of frame slots (#1634)
This makes various improvements to the handling of frame slot vars, and
includes some bug fixes introduced by
https://github.com/apple/pkl/pull/1622

* Refactor SymbolTable to track for-generator and parameter slots in
each scope
* Execute let expressions in their own root node in some places
* Unify how frame slots are managed; they are all represented as
`FrameSlotVariable`, created in `AstBuilder`, and passed into
`SymbolTable`.
* Fix how let expressions are executed in custom this scopes (introduce
a new root node when needed)
2026-06-11 03:02:42 +00:00
Daniel Chao 27fe06c796 Fix errors around strings with lone high or low surrogates (#1673)
This fixes some errors around treatment of strings with lone high/low
surrogates.
2026-06-10 08:35:22 -07:00
Daniel Chao 1a1e1cfea9 Fix String.padStart/padEnd (#1672)
Fixes the following two bugs:

* Pads to incorrect string length
* Does not append full code point
2026-06-10 08:34:50 -07:00
Daniel Chao 44f8706616 Fix visiting element type node of Collection (#1675)
This is a bug in the visitor logic, but currently doesn't impact any
language behavior.
2026-06-10 06:53:26 -07:00
Daniel Chao ac822f11eb Improve handling of evaluator in multi-file output (#1670)
* Re-use same evaluator across output dirs
* Close evaluator after all files are written
2026-06-10 06:52:47 -07:00
Daniel Chao f6e3f5e00b Fix VmIntSeq.length (#1666)
This fixes an internal optimization.

No language-observable change results from this fix, so no tests are
introduced.
2026-06-10 06:52:25 -07:00
ce0383837a Reject abstract members in non-abstract classes (#1647)
Fixes #1614.

## Context

A non-abstract `class` (or `module`) was allowed to declare `abstract`
properties and methods.
Because such an enclosing type is instantiable, an `abstract` member
there can never be guaranteed
an implementation — so the contradiction surfaced only as a runtime
error when the member was
accessed (`Cannot invoke abstract method`), or not at all.

This makes it a compile-time error to declare an `abstract` member
unless its enclosing class or
module is also `abstract`. This is consistent with how Pkl already
rejects instantiating an abstract
class, and mirrors how Java and Kotlin treat abstract members.

## Before

```pkl
class Foo {
  abstract bar: Int
}
res = new Foo { bar = 5 }   // evaluated successfully (should fail)
```

```pkl
class Foo {
  abstract function bar(): Int
}
res = new Foo {}            // evaluated successfully; res.bar() failed only at runtime
```

## After

```
–– Pkl Error ––
Cannot define an abstract member in a non-abstract class.

2 | abstract bar: Int
    ^^^^^^^^
at Foo

A member can only be `abstract` if its enclosing class is also `abstract`.
```

## Implementation

- `AstBuilder` now validates, while building the AST, that a
non-abstract class/module declares no
`abstract` members. The check runs in both `visitClass` and
`visitModule`, and the error points at
  the `abstract` keyword.
- Adds the `abstractMemberInNonAbstractClass` error message.

## Scope: classes and modules

The issue describes classes; I applied the same rule to modules as well,
since a module is a class
in Pkl and a non-abstract module is likewise directly evaluatable. Happy
to narrow this to classes
only if you'd prefer — it's a one-line change either way.

The `moduleMethodModifiers` pkl-doc test fixture declared an abstract
method at non-abstract module
level (relying on the old behavior); it's updated to an `abstract
module`, and its expected
documentation output is regenerated.

## Tests

- New `LanguageSnippetTests` error cases: abstract property in a class,
abstract method in a class,
  and abstract member in a module.
- `./gradlew build` passes (`pkl-core` and `pkl-doc` included).

---------

Co-authored-by: Vinayak <vinayak@vama.app>
Co-authored-by: Daniel Chao <daniel.h.chao@gmail.com>
2026-06-10 10:36:40 +02:00
Daniel Chao 16a640ed80 Bump pkl.impl.ghactions to version 1.8.1 (#1668)
Updates pkl.impl.ghactions package to version 1.8.1
2026-06-09 09:28:22 +02:00
Daniel Chao 391329c1fa Fix test (#1667)
The previous PR (https://github.com/apple/pkl/pull/1637) got auto-merged
by mistake; there's a failing test here
2026-06-08 16:11:49 -05:00
Daniel ChaoandIslon Scherer d012285f7d Improve HTTP redirect following (#1637)
This implements HTTP redirect following ourselves.

The goal is:

1. All I/O is checked against `--allowed-resources` and
`--allowed-modules`, including HTTP redirects
2. HTTP rewrite rules can affect redirect following
3. HTTP headers can affect redirect following

---------

Co-authored-by: Islon Scherer <islonscherer@gmail.com>
2026-06-08 18:13:48 +00:00
Daniel Chao b993cc3bb1 Fix doIsEquivalentTo for IntMaskSlotTypeNode (#1664)
This fixes an internal optimization; doesn't result in a
language-observable change, so no test case is introduced.
2026-06-07 12:51:31 -07:00
Daniel Chao 1cc20b611f Revert configuration cache (#1659)
This reverts the commits that enabled Gradle's configuration cache
feature.

IMO: this feature is too hard to use. We don't know if a task is valid
for the configuration cache until it runs, and it's very hard to tell if
something is safe when authoring Gradle code.
For example, our publish tasks are currently failing; I don't know how I
would fix this without running the publish task again on my dev machine.

Also, some of our build scripts become more brittle because of this; for
example, see
https://github.com/apple/pkl/blob/bb07589eae0b3195a589559a3245cbc12c29b394/build-logic/src/main/kotlin/BuildInfo.kt#L291-L296
2026-06-05 23:31:40 +00:00
Daniel Chao bb07589eae Fix gradle configuration cache issues for gradle-compatibility (#1658) 2026-06-05 14:17:06 -07:00
Daniel Chao 01f8fcae7b Catch correct exception type in MultiplicationNode (#1652)
Closes #1651
2026-06-05 12:55:27 -07:00
Daniel Chao 41e012a0f0 Fix toRadixString on math.minInt (#1656)
Closes #1655
2026-06-05 18:27:03 +00:00
Daniel Chao aa01241068 Fix eager typecheck of Map (#1654)
Closes #1653
2026-06-05 11:24:00 -07:00
Daniel Chao 87ec8ee730 Enable Gradle configuration cache (#1646)
Enable the configuration cache feature in Gradle, and adjust various
pieces of build logic that aren't configuration cache compatible.
2026-06-05 11:05:19 -07:00
Jen Basch 74eae0388e Fix error rendering @ConvertProperty annotations during error reporting (#1648)
The added snippet test originally produced error "A value of type
`Function2` cannot be exported."

This PR actually fixes the bug twice:
* By marking `ConvertProperty.render` as `hidden` so that it is skipped
when the enclosing object is exported. This broke any attempts to obtain
the module schema because this requires exporting all annotations on all
class properties.
* By changing the way that `VmUndefinedValueException.fillInHint()`
obtains the module URI to avoid obtaining the module schema (and
triggering the more expensive module schema generation process).

It also makes function-typed annotation properties in `pkl:Command` hidden to avoid similar issues there.
2026-06-05 16:50:34 +00:00
dependabot[bot] 8b6b90d889 Bump jline from 4.0.14 to 4.1.3 (#1640)
Bumps `jline` from 4.0.14 to 4.1.3.
Updates `org.jline:jline-reader` from 4.0.14 to 4.1.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/jline/jline3/releases">org.jline:jline-reader's
releases</a>.</em></p>
<blockquote>
<p>JLine 4.1.3 is a patch release with important fixes for terminal
close handling, raw mode signal behavior, FFM memory management, and
shell command argument parsing.</p>
<h2>Bug Fixes</h2>
<ul>
<li>fix: terminal.close() blocks when pump thread is reading stdin (<a
href="https://redirect.github.com/jline/jline3/pull/1911">#1911</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1909">#1909</a>)</li>
<li>fix: clear ISIG in enterRawMode so Ctrl+C reaches raw-mode readers
(<a
href="https://redirect.github.com/jline/jline3/pull/1912">#1912</a>)</li>
<li>fix: use confined arenas instead of auto arenas in FFM CLibrary (<a
href="https://redirect.github.com/jline/jline3/pull/1913">#1913</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1872">#1872</a>)</li>
<li>fix: swap rows/columns in openpty winsize constructor call (<a
href="https://redirect.github.com/jline/jline3/pull/1914">#1914</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1910">#1910</a>)</li>
<li>fix: fix command argument parsing in DefaultCommandDispatcher (<a
href="https://redirect.github.com/jline/jline3/pull/1924">#1924</a>)</li>
</ul>
<h2>Chores</h2>
<ul>
<li>chore: add OSS AI helper rules for project conventions (<a
href="https://redirect.github.com/jline/jline3/pull/1917">#1917</a>)</li>
</ul>
<h2>Dependencies</h2>
<ul>
<li>chore: Bump org.graalvm.buildtools:native-maven-plugin from 1.1.0 to
1.1.1 (<a
href="https://redirect.github.com/jline/jline3/pull/1915">#1915</a>)</li>
<li>chore: Bump org.apache.maven.plugins:maven-surefire-plugin from
3.5.5 to 3.5.6 (<a
href="https://redirect.github.com/jline/jline3/pull/1918">#1918</a>)</li>
<li>chore: Bump com.diffplug.spotless:spotless-maven-plugin from 3.5.1
to 3.6.0 (<a
href="https://redirect.github.com/jline/jline3/pull/1919">#1919</a>)</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/jline/jline3/compare/4.1.2...4.1.3">https://github.com/jline/jline3/compare/4.1.2...4.1.3</a></p>
<p>JLine 4.1.2 is a patch release focused on correctness fixes across
the parser, terminal I/O, and shell modules.</p>
<h2>Bug Fixes</h2>
<ul>
<li>fix: echo preserves backslash before unrecognised escape sequences
(<a
href="https://redirect.github.com/jline/jline3/issues/1901">#1901</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1863">#1863</a>)</li>
<li>fix: DefaultParser preserves backslashes inside quotes (<a
href="https://redirect.github.com/jline/jline3/issues/1902">#1902</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1877">#1877</a>)</li>
<li>fix: NonBlockingInputStream keeps thread alive after EOF (<a
href="https://redirect.github.com/jline/jline3/issues/1903">#1903</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1879">#1879</a>)</li>
<li>fix: ensure cursor position after alternate screen init (<a
href="https://redirect.github.com/jline/jline3/issues/1904">#1904</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1883">#1883</a>)</li>
<li>fix: use parser for command argument splitting (<a
href="https://redirect.github.com/jline/jline3/issues/1907">#1907</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1876">#1876</a>)</li>
</ul>
<h2>Dependencies</h2>
<ul>
<li>chore: Bump eu.maveniverse.maven.nisse:extension from 0.9.1 to 0.9.2
(<a
href="https://redirect.github.com/jline/jline3/issues/1905">#1905</a>)</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/jline/jline3/compare/4.1.1...4.1.2">https://github.com/jline/jline3/compare/4.1.1...4.1.2</a></p>
<p>JLine 4.1.1 is a patch release focused on stability fixes. The most
notable change corrects the POSIX raw mode defaults (VMIN/VTIME) in
<code>enterRawMode</code>, which could cause shell REPL sessions to hang
or malfunction on certain platforms. This release also fixes a Display
bug where the internal line buffer could alias or reject immutable
caller-provided lists, hardens signal registration against null returns,
and corrects alternate charset handling in ScreenTerminal.</p>
<h2>🐛 Bug Fixes</h2>
<ul>
<li>fix: Fixed Display oldLines being set as possible immutable lists.
(<a href="https://redirect.github.com/jline/jline3/pull/1878">#1878</a>)
<a href="https://github.com/Elec332"><code>@​Elec332</code></a></li>
<li>fix: use POSIX cfmakeraw defaults (VMIN=1, VTIME=0) in enterRawMode
(<a href="https://redirect.github.com/jline/jline3/pull/1871">#1871</a>)
<a href="https://github.com/BryanSant"><code>@​BryanSant</code></a></li>
<li>fix: skip null returns from signal registration in
AbstractUnixSysTerminal (<a
href="https://redirect.github.com/jline/jline3/pull/1869">#1869</a>) <a
href="https://github.com/BryanSant"><code>@​BryanSant</code></a></li>
<li>fix: Fixed ScreenTerminal alt-charset (<a
href="https://redirect.github.com/jline/jline3/pull/1867">#1867</a>) <a
href="https://github.com/Elec332"><code>@​Elec332</code></a></li>
</ul>
<h2>📦 Dependency updates</h2>
<ul>
<li>chore: Bump com.palantir.javaformat:palantir-java-format from 2.90.0
to 2.91.0 (<a
href="https://redirect.github.com/jline/jline3/pull/1898">#1898</a>) <a
href="https://github.com/dependabot"><code>@​dependabot</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/jline/jline3/commit/7f44a23f0da569e33fe9a632e982f94274bfb25d"><code>7f44a23</code></a>
fix: fix command argument parsing in DefaultCommandDispatcher (<a
href="https://redirect.github.com/jline/jline3/issues/1924">#1924</a>)</li>
<li><a
href="https://github.com/jline/jline3/commit/911e3d6d3101858629b9d8f74752d8b09475b65f"><code>911e3d6</code></a>
chore: Bump com.diffplug.spotless:spotless-maven-plugin from 3.5.1 to
3.6.0 (...</li>
<li><a
href="https://github.com/jline/jline3/commit/15cdac548ce65afdad84d15096d8e5183b1a8577"><code>15cdac5</code></a>
chore: Bump org.apache.maven.plugins:maven-surefire-plugin from 3.5.5 to
3.5....</li>
<li><a
href="https://github.com/jline/jline3/commit/2d3e1ffee5d895f0c407d838bf54da924640af4f"><code>2d3e1ff</code></a>
chore: Bump org.graalvm.buildtools:native-maven-plugin from 1.1.0 to
1.1.1 (#...</li>
<li><a
href="https://github.com/jline/jline3/commit/0ac019ab8c44da3ae4ee47bccd216791e6ccb35d"><code>0ac019a</code></a>
fix: terminal.close() blocks when pump thread is reading stdin (<a
href="https://redirect.github.com/jline/jline3/issues/1911">#1911</a>)</li>
<li><a
href="https://github.com/jline/jline3/commit/1d637408d2cdd479a5abede3ce88710be3e611ae"><code>1d63740</code></a>
fix: use confined arenas instead of auto arenas in FFM CLibrary (fixes
<a
href="https://redirect.github.com/jline/jline3/issues/1872">#1872</a>)</li>
<li><a
href="https://github.com/jline/jline3/commit/1604643d04a6ae56fdd6758757c18e968c7ff59d"><code>1604643</code></a>
Merge pull request <a
href="https://redirect.github.com/jline/jline3/issues/1912">#1912</a>
from jline/dot-tarragon</li>
<li><a
href="https://github.com/jline/jline3/commit/147ee9c7024af2caed1a306e48fd236beef475df"><code>147ee9c</code></a>
chore: add OSS AI helper rules for project conventions (<a
href="https://redirect.github.com/jline/jline3/issues/1917">#1917</a>)</li>
<li><a
href="https://github.com/jline/jline3/commit/1735c1f2a22808a1a3d7837db0eca9714a66f4e8"><code>1735c1f</code></a>
fix: swap rows/columns in openpty winsize constructor call (fixes <a
href="https://redirect.github.com/jline/jline3/issues/1910">#1910</a>)</li>
<li><a
href="https://github.com/jline/jline3/commit/d9f6b86589760807162862d289685ea7673f0e41"><code>d9f6b86</code></a>
fix: add PromptCancelTest from <a
href="https://redirect.github.com/jline/jline3/issues/1908">#1908</a>
with timeout and fixture patterns</li>
<li>Additional commits viewable in <a
href="https://github.com/jline/jline3/compare/4.0.14...4.1.3">compare
view</a></li>
</ul>
</details>
<br />

Updates `org.jline:jline-terminal` from 4.0.14 to 4.1.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/jline/jline3/releases">org.jline:jline-terminal's
releases</a>.</em></p>
<blockquote>
<p>JLine 4.1.3 is a patch release with important fixes for terminal
close handling, raw mode signal behavior, FFM memory management, and
shell command argument parsing.</p>
<h2>Bug Fixes</h2>
<ul>
<li>fix: terminal.close() blocks when pump thread is reading stdin (<a
href="https://redirect.github.com/jline/jline3/pull/1911">#1911</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1909">#1909</a>)</li>
<li>fix: clear ISIG in enterRawMode so Ctrl+C reaches raw-mode readers
(<a
href="https://redirect.github.com/jline/jline3/pull/1912">#1912</a>)</li>
<li>fix: use confined arenas instead of auto arenas in FFM CLibrary (<a
href="https://redirect.github.com/jline/jline3/pull/1913">#1913</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1872">#1872</a>)</li>
<li>fix: swap rows/columns in openpty winsize constructor call (<a
href="https://redirect.github.com/jline/jline3/pull/1914">#1914</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1910">#1910</a>)</li>
<li>fix: fix command argument parsing in DefaultCommandDispatcher (<a
href="https://redirect.github.com/jline/jline3/pull/1924">#1924</a>)</li>
</ul>
<h2>Chores</h2>
<ul>
<li>chore: add OSS AI helper rules for project conventions (<a
href="https://redirect.github.com/jline/jline3/pull/1917">#1917</a>)</li>
</ul>
<h2>Dependencies</h2>
<ul>
<li>chore: Bump org.graalvm.buildtools:native-maven-plugin from 1.1.0 to
1.1.1 (<a
href="https://redirect.github.com/jline/jline3/pull/1915">#1915</a>)</li>
<li>chore: Bump org.apache.maven.plugins:maven-surefire-plugin from
3.5.5 to 3.5.6 (<a
href="https://redirect.github.com/jline/jline3/pull/1918">#1918</a>)</li>
<li>chore: Bump com.diffplug.spotless:spotless-maven-plugin from 3.5.1
to 3.6.0 (<a
href="https://redirect.github.com/jline/jline3/pull/1919">#1919</a>)</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/jline/jline3/compare/4.1.2...4.1.3">https://github.com/jline/jline3/compare/4.1.2...4.1.3</a></p>
<p>JLine 4.1.2 is a patch release focused on correctness fixes across
the parser, terminal I/O, and shell modules.</p>
<h2>Bug Fixes</h2>
<ul>
<li>fix: echo preserves backslash before unrecognised escape sequences
(<a
href="https://redirect.github.com/jline/jline3/issues/1901">#1901</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1863">#1863</a>)</li>
<li>fix: DefaultParser preserves backslashes inside quotes (<a
href="https://redirect.github.com/jline/jline3/issues/1902">#1902</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1877">#1877</a>)</li>
<li>fix: NonBlockingInputStream keeps thread alive after EOF (<a
href="https://redirect.github.com/jline/jline3/issues/1903">#1903</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1879">#1879</a>)</li>
<li>fix: ensure cursor position after alternate screen init (<a
href="https://redirect.github.com/jline/jline3/issues/1904">#1904</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1883">#1883</a>)</li>
<li>fix: use parser for command argument splitting (<a
href="https://redirect.github.com/jline/jline3/issues/1907">#1907</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1876">#1876</a>)</li>
</ul>
<h2>Dependencies</h2>
<ul>
<li>chore: Bump eu.maveniverse.maven.nisse:extension from 0.9.1 to 0.9.2
(<a
href="https://redirect.github.com/jline/jline3/issues/1905">#1905</a>)</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/jline/jline3/compare/4.1.1...4.1.2">https://github.com/jline/jline3/compare/4.1.1...4.1.2</a></p>
<p>JLine 4.1.1 is a patch release focused on stability fixes. The most
notable change corrects the POSIX raw mode defaults (VMIN/VTIME) in
<code>enterRawMode</code>, which could cause shell REPL sessions to hang
or malfunction on certain platforms. This release also fixes a Display
bug where the internal line buffer could alias or reject immutable
caller-provided lists, hardens signal registration against null returns,
and corrects alternate charset handling in ScreenTerminal.</p>
<h2>🐛 Bug Fixes</h2>
<ul>
<li>fix: Fixed Display oldLines being set as possible immutable lists.
(<a href="https://redirect.github.com/jline/jline3/pull/1878">#1878</a>)
<a href="https://github.com/Elec332"><code>@​Elec332</code></a></li>
<li>fix: use POSIX cfmakeraw defaults (VMIN=1, VTIME=0) in enterRawMode
(<a href="https://redirect.github.com/jline/jline3/pull/1871">#1871</a>)
<a href="https://github.com/BryanSant"><code>@​BryanSant</code></a></li>
<li>fix: skip null returns from signal registration in
AbstractUnixSysTerminal (<a
href="https://redirect.github.com/jline/jline3/pull/1869">#1869</a>) <a
href="https://github.com/BryanSant"><code>@​BryanSant</code></a></li>
<li>fix: Fixed ScreenTerminal alt-charset (<a
href="https://redirect.github.com/jline/jline3/pull/1867">#1867</a>) <a
href="https://github.com/Elec332"><code>@​Elec332</code></a></li>
</ul>
<h2>📦 Dependency updates</h2>
<ul>
<li>chore: Bump com.palantir.javaformat:palantir-java-format from 2.90.0
to 2.91.0 (<a
href="https://redirect.github.com/jline/jline3/pull/1898">#1898</a>) <a
href="https://github.com/dependabot"><code>@​dependabot</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/jline/jline3/commit/7f44a23f0da569e33fe9a632e982f94274bfb25d"><code>7f44a23</code></a>
fix: fix command argument parsing in DefaultCommandDispatcher (<a
href="https://redirect.github.com/jline/jline3/issues/1924">#1924</a>)</li>
<li><a
href="https://github.com/jline/jline3/commit/911e3d6d3101858629b9d8f74752d8b09475b65f"><code>911e3d6</code></a>
chore: Bump com.diffplug.spotless:spotless-maven-plugin from 3.5.1 to
3.6.0 (...</li>
<li><a
href="https://github.com/jline/jline3/commit/15cdac548ce65afdad84d15096d8e5183b1a8577"><code>15cdac5</code></a>
chore: Bump org.apache.maven.plugins:maven-surefire-plugin from 3.5.5 to
3.5....</li>
<li><a
href="https://github.com/jline/jline3/commit/2d3e1ffee5d895f0c407d838bf54da924640af4f"><code>2d3e1ff</code></a>
chore: Bump org.graalvm.buildtools:native-maven-plugin from 1.1.0 to
1.1.1 (#...</li>
<li><a
href="https://github.com/jline/jline3/commit/0ac019ab8c44da3ae4ee47bccd216791e6ccb35d"><code>0ac019a</code></a>
fix: terminal.close() blocks when pump thread is reading stdin (<a
href="https://redirect.github.com/jline/jline3/issues/1911">#1911</a>)</li>
<li><a
href="https://github.com/jline/jline3/commit/1d637408d2cdd479a5abede3ce88710be3e611ae"><code>1d63740</code></a>
fix: use confined arenas instead of auto arenas in FFM CLibrary (fixes
<a
href="https://redirect.github.com/jline/jline3/issues/1872">#1872</a>)</li>
<li><a
href="https://github.com/jline/jline3/commit/1604643d04a6ae56fdd6758757c18e968c7ff59d"><code>1604643</code></a>
Merge pull request <a
href="https://redirect.github.com/jline/jline3/issues/1912">#1912</a>
from jline/dot-tarragon</li>
<li><a
href="https://github.com/jline/jline3/commit/147ee9c7024af2caed1a306e48fd236beef475df"><code>147ee9c</code></a>
chore: add OSS AI helper rules for project conventions (<a
href="https://redirect.github.com/jline/jline3/issues/1917">#1917</a>)</li>
<li><a
href="https://github.com/jline/jline3/commit/1735c1f2a22808a1a3d7837db0eca9714a66f4e8"><code>1735c1f</code></a>
fix: swap rows/columns in openpty winsize constructor call (fixes <a
href="https://redirect.github.com/jline/jline3/issues/1910">#1910</a>)</li>
<li><a
href="https://github.com/jline/jline3/commit/d9f6b86589760807162862d289685ea7673f0e41"><code>d9f6b86</code></a>
fix: add PromptCancelTest from <a
href="https://redirect.github.com/jline/jline3/issues/1908">#1908</a>
with timeout and fixture patterns</li>
<li>Additional commits viewable in <a
href="https://github.com/jline/jline3/compare/4.0.14...4.1.3">compare
view</a></li>
</ul>
</details>
<br />

Updates `org.jline:jline-terminal-jni` from 4.0.14 to 4.1.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/jline/jline3/releases">org.jline:jline-terminal-jni's
releases</a>.</em></p>
<blockquote>
<p>JLine 4.1.3 is a patch release with important fixes for terminal
close handling, raw mode signal behavior, FFM memory management, and
shell command argument parsing.</p>
<h2>Bug Fixes</h2>
<ul>
<li>fix: terminal.close() blocks when pump thread is reading stdin (<a
href="https://redirect.github.com/jline/jline3/pull/1911">#1911</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1909">#1909</a>)</li>
<li>fix: clear ISIG in enterRawMode so Ctrl+C reaches raw-mode readers
(<a
href="https://redirect.github.com/jline/jline3/pull/1912">#1912</a>)</li>
<li>fix: use confined arenas instead of auto arenas in FFM CLibrary (<a
href="https://redirect.github.com/jline/jline3/pull/1913">#1913</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1872">#1872</a>)</li>
<li>fix: swap rows/columns in openpty winsize constructor call (<a
href="https://redirect.github.com/jline/jline3/pull/1914">#1914</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1910">#1910</a>)</li>
<li>fix: fix command argument parsing in DefaultCommandDispatcher (<a
href="https://redirect.github.com/jline/jline3/pull/1924">#1924</a>)</li>
</ul>
<h2>Chores</h2>
<ul>
<li>chore: add OSS AI helper rules for project conventions (<a
href="https://redirect.github.com/jline/jline3/pull/1917">#1917</a>)</li>
</ul>
<h2>Dependencies</h2>
<ul>
<li>chore: Bump org.graalvm.buildtools:native-maven-plugin from 1.1.0 to
1.1.1 (<a
href="https://redirect.github.com/jline/jline3/pull/1915">#1915</a>)</li>
<li>chore: Bump org.apache.maven.plugins:maven-surefire-plugin from
3.5.5 to 3.5.6 (<a
href="https://redirect.github.com/jline/jline3/pull/1918">#1918</a>)</li>
<li>chore: Bump com.diffplug.spotless:spotless-maven-plugin from 3.5.1
to 3.6.0 (<a
href="https://redirect.github.com/jline/jline3/pull/1919">#1919</a>)</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/jline/jline3/compare/4.1.2...4.1.3">https://github.com/jline/jline3/compare/4.1.2...4.1.3</a></p>
<p>JLine 4.1.2 is a patch release focused on correctness fixes across
the parser, terminal I/O, and shell modules.</p>
<h2>Bug Fixes</h2>
<ul>
<li>fix: echo preserves backslash before unrecognised escape sequences
(<a
href="https://redirect.github.com/jline/jline3/issues/1901">#1901</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1863">#1863</a>)</li>
<li>fix: DefaultParser preserves backslashes inside quotes (<a
href="https://redirect.github.com/jline/jline3/issues/1902">#1902</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1877">#1877</a>)</li>
<li>fix: NonBlockingInputStream keeps thread alive after EOF (<a
href="https://redirect.github.com/jline/jline3/issues/1903">#1903</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1879">#1879</a>)</li>
<li>fix: ensure cursor position after alternate screen init (<a
href="https://redirect.github.com/jline/jline3/issues/1904">#1904</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1883">#1883</a>)</li>
<li>fix: use parser for command argument splitting (<a
href="https://redirect.github.com/jline/jline3/issues/1907">#1907</a>,
fixes <a
href="https://redirect.github.com/jline/jline3/issues/1876">#1876</a>)</li>
</ul>
<h2>Dependencies</h2>
<ul>
<li>chore: Bump eu.maveniverse.maven.nisse:extension from 0.9.1 to 0.9.2
(<a
href="https://redirect.github.com/jline/jline3/issues/1905">#1905</a>)</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/jline/jline3/compare/4.1.1...4.1.2">https://github.com/jline/jline3/compare/4.1.1...4.1.2</a></p>
<p>JLine 4.1.1 is a patch release focused on stability fixes. The most
notable change corrects the POSIX raw mode defaults (VMIN/VTIME) in
<code>enterRawMode</code>, which could cause shell REPL sessions to hang
or malfunction on certain platforms. This release also fixes a Display
bug where the internal line buffer could alias or reject immutable
caller-provided lists, hardens signal registration against null returns,
and corrects alternate charset handling in ScreenTerminal.</p>
<h2>🐛 Bug Fixes</h2>
<ul>
<li>fix: Fixed Display oldLines being set as possible immutable lists.
(<a href="https://redirect.github.com/jline/jline3/pull/1878">#1878</a>)
<a href="https://github.com/Elec332"><code>@​Elec332</code></a></li>
<li>fix: use POSIX cfmakeraw defaults (VMIN=1, VTIME=0) in enterRawMode
(<a href="https://redirect.github.com/jline/jline3/pull/1871">#1871</a>)
<a href="https://github.com/BryanSant"><code>@​BryanSant</code></a></li>
<li>fix: skip null returns from signal registration in
AbstractUnixSysTerminal (<a
href="https://redirect.github.com/jline/jline3/pull/1869">#1869</a>) <a
href="https://github.com/BryanSant"><code>@​BryanSant</code></a></li>
<li>fix: Fixed ScreenTerminal alt-charset (<a
href="https://redirect.github.com/jline/jline3/pull/1867">#1867</a>) <a
href="https://github.com/Elec332"><code>@​Elec332</code></a></li>
</ul>
<h2>📦 Dependency updates</h2>
<ul>
<li>chore: Bump com.palantir.javaformat:palantir-java-format from 2.90.0
to 2.91.0 (<a
href="https://redirect.github.com/jline/jline3/pull/1898">#1898</a>) <a
href="https://github.com/dependabot"><code>@​dependabot</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/jline/jline3/commit/7f44a23f0da569e33fe9a632e982f94274bfb25d"><code>7f44a23</code></a>
fix: fix command argument parsing in DefaultCommandDispatcher (<a
href="https://redirect.github.com/jline/jline3/issues/1924">#1924</a>)</li>
<li><a
href="https://github.com/jline/jline3/commit/911e3d6d3101858629b9d8f74752d8b09475b65f"><code>911e3d6</code></a>
chore: Bump com.diffplug.spotless:spotless-maven-plugin from 3.5.1 to
3.6.0 (...</li>
<li><a
href="https://github.com/jline/jline3/commit/15cdac548ce65afdad84d15096d8e5183b1a8577"><code>15cdac5</code></a>
chore: Bump org.apache.maven.plugins:maven-surefire-plugin from 3.5.5 to
3.5....</li>
<li><a
href="https://github.com/jline/jline3/commit/2d3e1ffee5d895f0c407d838bf54da924640af4f"><code>2d3e1ff</code></a>
chore: Bump org.graalvm.buildtools:native-maven-plugin from 1.1.0 to
1.1.1 (#...</li>
<li><a
href="https://github.com/jline/jline3/commit/0ac019ab8c44da3ae4ee47bccd216791e6ccb35d"><code>0ac019a</code></a>
fix: terminal.close() blocks when pump thread is reading stdin (<a
href="https://redirect.github.com/jline/jline3/issues/1911">#1911</a>)</li>
<li><a
href="https://github.com/jline/jline3/commit/1d637408d2cdd479a5abede3ce88710be3e611ae"><code>1d63740</code></a>
fix: use confined arenas instead of auto arenas in FFM CLibrary (fixes
<a
href="https://redirect.github.com/jline/jline3/issues/1872">#1872</a>)</li>
<li><a
href="https://github.com/jline/jline3/commit/1604643d04a6ae56fdd6758757c18e968c7ff59d"><code>1604643</code></a>
Merge pull request <a
href="https://redirect.github.com/jline/jline3/issues/1912">#1912</a>
from jline/dot-tarragon</li>
<li><a
href="https://github.com/jline/jline3/commit/147ee9c7024af2caed1a306e48fd236beef475df"><code>147ee9c</code></a>
chore: add OSS AI helper rules for project conventions (<a
href="https://redirect.github.com/jline/jline3/issues/1917">#1917</a>)</li>
<li><a
href="https://github.com/jline/jline3/commit/1735c1f2a22808a1a3d7837db0eca9714a66f4e8"><code>1735c1f</code></a>
fix: swap rows/columns in openpty winsize constructor call (fixes <a
href="https://redirect.github.com/jline/jline3/issues/1910">#1910</a>)</li>
<li><a
href="https://github.com/jline/jline3/commit/d9f6b86589760807162862d289685ea7673f0e41"><code>d9f6b86</code></a>
fix: add PromptCancelTest from <a
href="https://redirect.github.com/jline/jline3/issues/1908">#1908</a>
with timeout and fixture patterns</li>
<li>Additional commits viewable in <a
href="https://github.com/jline/jline3/compare/4.0.14...4.1.3">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-04 10:47:28 -07:00
dependabot[bot] 7cf827005d Bump nu.validator:validator from 26.5.21 to 26.5.22 (#1641)
Bumps [nu.validator:validator](https://github.com/validator/validator)
from 26.5.21 to 26.5.22.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/validator/validator/releases">nu.validator:validator's
releases</a>.</em></p>
<blockquote>
<h2>latest</h2>
<blockquote>
<p>[!IMPORTANT]
<strong>The <a
href="https://github.com/validator/validator/releases/tag/latest">release
named <em>“latest”</em></a> is “production-ready” and is the only
release you want to use.</strong> This project no longer does “major”
version-numbered releases. Release 20.6.30 (30 June 2020) was the final
such release.
For a changelog of the latest changes, see <a
href="https://github.com/validator/validator/commits/latest/">https://github.com/validator/validator/commits/latest/</a>.</p>
</blockquote>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/validator/validator/commit/d3efb7d93855d9c12fdc7b764e81f873f6e47186"><code>d3efb7d</code></a>
chore(htmlparser): Remove some things the HTML checker doesn’t need</li>
<li><a
href="https://github.com/validator/validator/commit/058d0e74743b27a34c97991bcd30d4434b3caa27"><code>058d0e7</code></a>
fix(htmlparser): Ignore inputs inside select fragment context</li>
<li><a
href="https://github.com/validator/validator/commit/8a0ec92fa6258e5831e18d55a897889d6dc2f3c9"><code>8a0ec92</code></a>
feat(htmlparser): Add NS_NewHTMLSelectedContentElement content
creator</li>
<li><a
href="https://github.com/validator/validator/commit/a41fe4e78b13f65119f099c936c8e3a49459d44a"><code>a41fe4e</code></a>
fix(npm): Make the Java auto-installer survive download failures</li>
<li>See full diff in <a
href="https://github.com/validator/validator/compare/26.5.21...26.5.22">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=nu.validator:validator&package-manager=gradle&previous-version=26.5.21&new-version=26.5.22)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-04 08:57:50 -07:00
dependabot[bot] 1f89f49caf Bump shadowPlugin from 9.4.1 to 9.4.2 (#1642)
Bumps `shadowPlugin` from 9.4.1 to 9.4.2.
Updates `com.gradleup.shadow:com.gradleup.shadow.gradle.plugin` from
9.4.1 to 9.4.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/GradleUp/shadow/releases">com.gradleup.shadow:com.gradleup.shadow.gradle.plugin's
releases</a>.</em></p>
<blockquote>
<h2>9.4.2</h2>
<h3>Changed</h3>
<ul>
<li>Update jdependency to support Java 27. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/2033">#2033</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/GradleUp/shadow/commit/29c432a7b6824b6fef23d46dc067e5c14112ff90"><code>29c432a</code></a>
Prepare version 9.4.2</li>
<li><a
href="https://github.com/GradleUp/shadow/commit/8aa8e6c1fb2ac0c17f0ff77e521cbe599cf64245"><code>8aa8e6c</code></a>
Update dependency org.vafer:jdependency to v2.16 (<a
href="https://redirect.github.com/GradleUp/shadow/issues/2033">#2033</a>)</li>
<li>See full diff in <a
href="https://github.com/GradleUp/shadow/compare/9.4.1...9.4.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `com.gradleup.shadow` from 9.4.1 to 9.4.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/GradleUp/shadow/releases">com.gradleup.shadow's
releases</a>.</em></p>
<blockquote>
<h2>9.4.2</h2>
<h3>Changed</h3>
<ul>
<li>Update jdependency to support Java 27. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/2033">#2033</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/GradleUp/shadow/commit/29c432a7b6824b6fef23d46dc067e5c14112ff90"><code>29c432a</code></a>
Prepare version 9.4.2</li>
<li><a
href="https://github.com/GradleUp/shadow/commit/8aa8e6c1fb2ac0c17f0ff77e521cbe599cf64245"><code>8aa8e6c</code></a>
Update dependency org.vafer:jdependency to v2.16 (<a
href="https://redirect.github.com/GradleUp/shadow/issues/2033">#2033</a>)</li>
<li>See full diff in <a
href="https://github.com/GradleUp/shadow/compare/9.4.1...9.4.2">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-04 08:57:27 -07:00
dependabot[bot] 2687b431e3 Bump com.diffplug.spotless:spotless-plugin-gradle from 8.5.1 to 8.6.0 (#1643)
Bumps
[com.diffplug.spotless:spotless-plugin-gradle](https://github.com/diffplug/spotless)
from 8.5.1 to 8.6.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/diffplug/spotless/releases">com.diffplug.spotless:spotless-plugin-gradle's
releases</a>.</em></p>
<blockquote>
<h2>Gradle Plugin v8.6.0</h2>
<h3>Added</h3>
<ul>
<li>Add <code>cacheDirectory(...)</code> to <code>eclipse()</code>,
<code>eclipseCdt()</code>, and <code>greclipse()</code>; the default P2
cache is <code>$GRADLE_USER_HOME/caches/p2-data</code>. (<a
href="https://redirect.github.com/diffplug/spotless/pull/2944">#2944</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li><code>forbidWildcardImports</code> and
<code>forbidModuleImports</code> now detect imports that have leading
whitespace (indentation/tabs). (<a
href="https://redirect.github.com/diffplug/spotless/pull/2939">#2939</a>)</li>
<li><code>versionCatalog()</code> no longer splits long inline tables
across multiple lines — Gradle's TOML 1.0 parser cannot read multi-line
inline tables. The <code>maxLineLength</code> option has been removed.
(<a
href="https://redirect.github.com/diffplug/spotless/issues/2948">#2948</a>)</li>
<li><code>EclipseJdtFormtterStep</code> now can conditionally set
compiler source/compliance options. Allows for better parsing of AST
Node for newer language features and more correct sorting; e.g. records
or seal classes. (<a
href="https://redirect.github.com/diffplug/spotless/pull/2942">#2942</a>)</li>
</ul>
<h3>Changes</h3>
<ul>
<li>Improved formatting performance by eliminating redundant per-step
line-ending normalization in the core formatter loop. (<a
href="https://redirect.github.com/diffplug/spotless/pull/2934">#2934</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/diffplug/spotless/commit/3a0f1017dcdfd49042a638119c1b6d998b28c67f"><code>3a0f101</code></a>
Published gradle/8.6.0</li>
<li><a
href="https://github.com/diffplug/spotless/commit/007e9d858177c93a3c7b6f9d1eb068937022613f"><code>007e9d8</code></a>
Published lib/4.6.2</li>
<li><a
href="https://github.com/diffplug/spotless/commit/a074d53565e0f523c3bba7f5135ba0d8f959f98b"><code>a074d53</code></a>
Allow setting the local P2 cache dir in the Spotless Gradle plugin (<a
href="https://redirect.github.com/diffplug/spotless/issues/2944">#2944</a>)</li>
<li><a
href="https://github.com/diffplug/spotless/commit/a266fc2b97098aed703300ecfb00a7fc6ab57467"><code>a266fc2</code></a>
Merge branch 'main' into add-cache-directory-dsl</li>
<li><a
href="https://github.com/diffplug/spotless/commit/e0d466e5c157d41208ba84f3b0c767a4ad3d4330"><code>e0d466e</code></a>
Fix: sort members treats record declarations as types (<a
href="https://redirect.github.com/diffplug/spotless/issues/2942">#2942</a>)</li>
<li><a
href="https://github.com/diffplug/spotless/commit/3936b6f2f9290bfe946a890c1efc791eb969c7db"><code>3936b6f</code></a>
Merge branch 'main' into main</li>
<li><a
href="https://github.com/diffplug/spotless/commit/278765fcbbdc91d9bbcd3bff41005a350746792c"><code>278765f</code></a>
fix: expandWildcardImports support pom type dependency, fix <a
href="https://redirect.github.com/diffplug/spotless/issues/2839">#2839</a>
(<a
href="https://redirect.github.com/diffplug/spotless/issues/2935">#2935</a>)</li>
<li><a
href="https://github.com/diffplug/spotless/commit/a18ddec9bd578c77177c9478207892d63f942826"><code>a18ddec</code></a>
Remove maxLineLength from versionCatalog step (<a
href="https://redirect.github.com/diffplug/spotless/issues/2949">#2949</a>)</li>
<li><a
href="https://github.com/diffplug/spotless/commit/b91ad871a69bb7c3722120c81f9dae3e1ee11836"><code>b91ad87</code></a>
Add changelog entries for versionCatalog maxLineLength removal</li>
<li><a
href="https://github.com/diffplug/spotless/commit/5408d5c42020a5a8dd1c03e7daf74703e564a867"><code>5408d5c</code></a>
Remove maxLineLength from versionCatalog step</li>
<li>Additional commits viewable in <a
href="https://github.com/diffplug/spotless/compare/gradle/8.5.1...gradle/8.6.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=com.diffplug.spotless:spotless-plugin-gradle&package-manager=gradle&previous-version=8.5.1&new-version=8.6.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-04 08:56:58 -07:00
dependabot[bot] 82c2c162ba Bump github/codeql-action from 4.35.5 to 4.36.0 (#1644)
Bumps [github/codeql-action](https://github.com/github/codeql-action)
from 4.35.5 to 4.36.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/github/codeql-action/releases">github/codeql-action's
releases</a>.</em></p>
<blockquote>
<h2>v4.36.0</h2>
<ul>
<li><em>Breaking change</em>: Bump the minimum required CodeQL bundle
version to 2.19.4. <a
href="https://redirect.github.com/github/codeql-action/pull/3894">#3894</a></li>
<li>Add support for SHA-256 Git object IDs. <a
href="https://redirect.github.com/github/codeql-action/pull/3893">#3893</a></li>
<li>Update default CodeQL bundle version to <a
href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.5">2.25.5</a>.
<a
href="https://redirect.github.com/github/codeql-action/pull/3926">#3926</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/github/codeql-action/blob/main/CHANGELOG.md">github/codeql-action's
changelog</a>.</em></p>
<blockquote>
<h1>CodeQL Action Changelog</h1>
<p>See the <a
href="https://github.com/github/codeql-action/releases">releases
page</a> for the relevant changes to the CodeQL CLI and language
packs.</p>
<h2>[UNRELEASED]</h2>
<ul>
<li>Update default CodeQL bundle version to <a
href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.6">2.25.6</a>.
<a
href="https://redirect.github.com/github/codeql-action/pull/3948">#3948</a></li>
</ul>
<h2>4.36.1 - 02 Jun 2026</h2>
<p>No user facing changes.</p>
<h2>4.36.0 - 22 May 2026</h2>
<ul>
<li><em>Breaking change</em>: Bump the minimum required CodeQL bundle
version to 2.19.4. <a
href="https://redirect.github.com/github/codeql-action/pull/3894">#3894</a></li>
<li>Add support for SHA-256 Git object IDs. <a
href="https://redirect.github.com/github/codeql-action/pull/3893">#3893</a></li>
<li>Update default CodeQL bundle version to <a
href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.5">2.25.5</a>.
<a
href="https://redirect.github.com/github/codeql-action/pull/3926">#3926</a></li>
</ul>
<h2>4.35.5 - 15 May 2026</h2>
<ul>
<li>We have improved how the JavaScript bundles for the CodeQL Action
are generated to avoid duplication across bundles and reduce the size of
the repository by around 70%. This should have no effect on the runtime
behaviour of the CodeQL Action. <a
href="https://redirect.github.com/github/codeql-action/pull/3899">#3899</a></li>
<li>For performance and accuracy reasons, <a
href="https://redirect.github.com/github/roadmap/issues/1158">improved
incremental analysis</a> will now only be enabled on a pull request when
diff-informed analysis is also enabled for that run. If diff-informed
analysis is unavailable (for example, because the PR diff ranges could
not be computed), the action will fall back to a full analysis. <a
href="https://redirect.github.com/github/codeql-action/pull/3791">#3791</a></li>
<li>If multiple inputs are provided for the GitHub-internal
<code>analysis-kinds</code> input, only <code>code-scanning</code> will
be enabled. The <code>analysis-kinds</code> input is experimental, for
GitHub-internal use only, and may change without notice at any time. <a
href="https://redirect.github.com/github/codeql-action/pull/3892">#3892</a></li>
<li>Added an experimental change which, when running a Code Scanning
analysis for a PR with <a
href="https://redirect.github.com/github/roadmap/issues/1158">improved
incremental analysis</a> enabled, prefers CodeQL CLI versions that have
a cached overlay-base database for the configured languages. This speeds
up analysis for a repository when there is not yet a cached overlay-base
database for the latest CLI version. We expect to roll this change out
to everyone in May. <a
href="https://redirect.github.com/github/codeql-action/pull/3880">#3880</a></li>
</ul>
<h2>4.35.4 - 07 May 2026</h2>
<ul>
<li>Update default CodeQL bundle version to <a
href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.4">2.25.4</a>.
<a
href="https://redirect.github.com/github/codeql-action/pull/3881">#3881</a></li>
</ul>
<h2>4.35.3 - 01 May 2026</h2>
<ul>
<li><em>Upcoming breaking change</em>: Add a deprecation warning for
customers using CodeQL version 2.19.3 and earlier. These versions of
CodeQL were discontinued on 9 April 2026 alongside GitHub Enterprise
Server 3.15, and will be unsupported by the next minor release of the
CodeQL Action. <a
href="https://redirect.github.com/github/codeql-action/pull/3837">#3837</a></li>
<li>Configurations for private registries that use Cloudsmith or GCP
OIDC are now accepted. <a
href="https://redirect.github.com/github/codeql-action/pull/3850">#3850</a></li>
<li>Best-effort connection tests for private registries now use
<code>GET</code> requests instead of <code>HEAD</code> for better
compatibility with various registry implementations. For NuGet feeds,
the test is now always performed against the service index. <a
href="https://redirect.github.com/github/codeql-action/pull/3853">#3853</a></li>
<li>Fixed a bug where two diagnostics produced within the same
millisecond could overwrite each other on disk, causing one of them to
be lost. <a
href="https://redirect.github.com/github/codeql-action/pull/3852">#3852</a></li>
<li>Update default CodeQL bundle version to <a
href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.3">2.25.3</a>.
<a
href="https://redirect.github.com/github/codeql-action/pull/3865">#3865</a></li>
</ul>
<h2>4.35.2 - 15 Apr 2026</h2>
<ul>
<li>The undocumented TRAP cache cleanup feature that could be enabled
using the <code>CODEQL_ACTION_CLEANUP_TRAP_CACHES</code> environment
variable is deprecated and will be removed in May 2026. If you are
affected by this, we recommend disabling TRAP caching by passing the
<code>trap-caching: false</code> input to the <code>init</code> Action.
<a
href="https://redirect.github.com/github/codeql-action/pull/3795">#3795</a></li>
<li>The Git version 2.36.0 requirement for improved incremental analysis
now only applies to repositories that contain submodules. <a
href="https://redirect.github.com/github/codeql-action/pull/3789">#3789</a></li>
<li>Python analysis on GHES no longer extracts the standard library,
relying instead on models of the standard library. This should result in
significantly faster extraction and analysis times, while the effect on
alerts should be minimal. <a
href="https://redirect.github.com/github/codeql-action/pull/3794">#3794</a></li>
<li>Fixed a bug in the validation of OIDC configurations for private
registries that was added in CodeQL Action 4.33.0 / 3.33.0. <a
href="https://redirect.github.com/github/codeql-action/pull/3807">#3807</a></li>
<li>Update default CodeQL bundle version to <a
href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.2">2.25.2</a>.
<a
href="https://redirect.github.com/github/codeql-action/pull/3823">#3823</a></li>
</ul>
<h2>4.35.1 - 27 Mar 2026</h2>
<ul>
<li>Fix incorrect minimum required Git version for <a
href="https://redirect.github.com/github/roadmap/issues/1158">improved
incremental analysis</a>: it should have been 2.36.0, not 2.11.0. <a
href="https://redirect.github.com/github/codeql-action/pull/3781">#3781</a></li>
</ul>
<h2>4.35.0 - 27 Mar 2026</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/github/codeql-action/commit/7211b7c8077ea37d8641b6271f6a365a22a5fbfa"><code>7211b7c</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3927">#3927</a>
from github/update-v4.36.0-ebc2d9e2b</li>
<li><a
href="https://github.com/github/codeql-action/commit/7740f2fb21add1d46278215acea47540db22f022"><code>7740f2f</code></a>
Update changelog for v4.36.0</li>
<li><a
href="https://github.com/github/codeql-action/commit/ebc2d9e2bc247eec51bee8d4df806c4030eb0761"><code>ebc2d9e</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3926">#3926</a>
from github/update-bundle/codeql-bundle-v2.25.5</li>
<li><a
href="https://github.com/github/codeql-action/commit/d1f74b777c95c777bf4f42ce4b250bc916e745c7"><code>d1f74b7</code></a>
Add changelog note</li>
<li><a
href="https://github.com/github/codeql-action/commit/2dc40cec39bdc63d3561d74fa6100cebb0418ff4"><code>2dc40ce</code></a>
Update default bundle to codeql-bundle-v2.25.5</li>
<li><a
href="https://github.com/github/codeql-action/commit/84498526a009a99c875e83ef4821a8ba52de7c22"><code>8449852</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3910">#3910</a>
from github/henrymercer/repo-size-diff-check</li>
<li><a
href="https://github.com/github/codeql-action/commit/72ac23c6d16b29fbe801e87e3439941558c53094"><code>72ac23c</code></a>
Update excluded required check list</li>
<li><a
href="https://github.com/github/codeql-action/commit/c5297a28a2c3e6a8062041b58858bd7117cebe37"><code>c5297a2</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3919">#3919</a>
from github/henrymercer/workflow-concurrency</li>
<li><a
href="https://github.com/github/codeql-action/commit/8ffeae7d05bc1b914a009d197e64e4f5c9e14503"><code>8ffeae7</code></a>
CI: Automatically cancel non-generated workflows</li>
<li><a
href="https://github.com/github/codeql-action/commit/f3f52bf568dc44a1069faafa538caa6b1fec40c9"><code>f3f52bf</code></a>
Revert <code>getErrorMessage</code> import</li>
<li>Additional commits viewable in <a
href="https://github.com/github/codeql-action/compare/9e0d7b8d25671d64c341c19c0152d693099fb5ba...7211b7c8077ea37d8641b6271f6a365a22a5fbfa">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github/codeql-action&package-manager=github_actions&previous-version=4.35.5&new-version=4.36.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-04 08:56:24 -07:00
Jen Basch 68f7d06eed Improve error message when parsing truncated let expressions (#1639)
This previously yielded
```
Unexpected token `}`. Expected `}`.
```
Pretty confusing, no?

Now it's just
```
Unexpected token `}`.
```

Resolves #1638
2026-06-02 16:00:46 -07:00
Daniel Chao 99cac1f886 Fix native build (#1636) 2026-06-02 15:57:52 -07:00
Daniel Chao 035ef0a789 Change loading of external readers (#1394)
This introduces breaking changes for external readers are loaded:

1. In PklProject, relative paths are resolved relative to the enclosing
PklProject file (make behavior consistent with how other settings work)
2. Make CLI flags blow away any settings set on a PklProject
3. Introduce a new `workingDir` property, which defaults to the
PklProject dir

The overall goal is to make this behavior consistent with how other
settings work.
For example, relative paths for other evaluator settings are already
relative to the project directory.
Additionally, in every other case, CLI flags will overwrite any setting
set within PklProject.
2026-06-02 18:02:52 +00:00
Daniel Chao c9f3823952 Touch ups around local members (#1633)
* Add assertion if ObjectMember key in cachedValues is not local (should never happen)
* Move test to snippet tests
2026-06-02 03:47:46 +00:00
Jen Basch 18af04c2ec Correctly count regular members of Dynamic (#1632)
Previously, `VmDynamic.isHiddenOrLocalProperty` didn't correctly
identify locals whose cache key is an `ObjectMember` instead of an
`Identifier`, causing `VmDynamic. getRegularMemberCount` to return an
incorrect value. This caused some renderers to produce incorrect output.

Resolves #1631
2026-06-01 20:27:19 -07:00
Daniel Chao 7dd2bc67de Optimize let expressions as frame slot vars (#1622)
This introduces an optimization to write let expressions to frame slots
of the current frame, rather than transforming them into lambdas. As a
result, let expressions are _much_ faster to execute.
2026-06-01 16:53:30 -07:00
Islon Scherer bfda4cc8c8 Fix forcing of VmValue during error rendering (#1629) 2026-06-01 18:25:33 +02:00
Jen Basch c2652e0722 Bump pkl.impl.ghactions to version 1.8.0 (#1630)
Updates pkl.impl.ghactions package to version 1.8.0
2026-05-31 21:46:55 -07:00
dependabot[bot] 1d6ad8a0bf Bump nu.validator:validator from 26.5.7 to 26.5.21 (#1626)
Bumps [nu.validator:validator](https://github.com/validator/validator)
from 26.5.7 to 26.5.21.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/validator/validator/releases">nu.validator:validator's
releases</a>.</em></p>
<blockquote>
<h2>latest</h2>
<blockquote>
<p>[!IMPORTANT]
<strong>The <a
href="https://github.com/validator/validator/releases/tag/latest">release
named <em>“latest”</em></a> is “production-ready” and is the only
release you want to use.</strong> This project no longer does “major”
version-numbered releases. Release 20.6.30 (30 June 2020) was the final
such release.
For a changelog of the latest changes, see <a
href="https://github.com/validator/validator/commits/latest/">https://github.com/validator/validator/commits/latest/</a>.</p>
</blockquote>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/validator/validator/commit/8c3400a27fbf06611dfc0fe138975065a54bd82b"><code>8c3400a</code></a>
fix: Flag interactive descendants of more ARIA roles</li>
<li><a
href="https://github.com/validator/validator/commit/15a1cc300622b7afa59d9fbe8011a2aea6a2e8a2"><code>15a1cc3</code></a>
fix: Flag interactive descendants of role=tab</li>
<li><a
href="https://github.com/validator/validator/commit/85de7c858b5501673bd74f2c89738834fb6b27e3"><code>85de7c8</code></a>
ci: Add Java 26</li>
<li><a
href="https://github.com/validator/validator/commit/974a10df5344d240b9b3deb6c6f4c7fa846b6d75"><code>974a10d</code></a>
fix(release): GPG-sign the “latest” tag/release</li>
<li><a
href="https://github.com/validator/validator/commit/e5e95ebab05bb9d42a0a74be53e8ebc2a5e4a32a"><code>e5e95eb</code></a>
fix: Allow aria-expanded etc. on input[type=checkbox] with
role=switch</li>
<li><a
href="https://github.com/validator/validator/commit/536d9157f74074b0ff4e6be1b978131da00932d0"><code>536d915</code></a>
fix: Require href when area has hreflang, type, target, ping, rel, or
download</li>
<li><a
href="https://github.com/validator/validator/commit/55e52510a2ee891665ab4e57c7974d7a9952a725"><code>55e5251</code></a>
feat: Allow hreflang and type attributes on the area element</li>
<li><a
href="https://github.com/validator/validator/commit/ffe40e0100a33b25471f14f016cd974b4c171e10"><code>ffe40e0</code></a>
fix: Flag interactive descendants of role=option (issue 2099)</li>
<li><a
href="https://github.com/validator/validator/commit/4c0e326edd7cf30a4408a0e1fe13503bdc1bc5f0"><code>4c0e326</code></a>
fix: Allow role=group as a child of role=listitem (issue 2097)</li>
<li><a
href="https://github.com/validator/validator/commit/02621f3dcc86658eba4aa139539b7bd0de292900"><code>02621f3</code></a>
feat(htmlparser): Ensure mode is always set to INITIAL during
startTokenization</li>
<li>Additional commits viewable in <a
href="https://github.com/validator/validator/compare/26.5.7...26.5.21">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=nu.validator:validator&package-manager=gradle&previous-version=26.5.7&new-version=26.5.21)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-28 10:43:43 -07:00
dependabot[bot] ad02b2a099 Bump com.diffplug.spotless:spotless-plugin-gradle from 8.4.0 to 8.5.1 (#1628)
Bumps
[com.diffplug.spotless:spotless-plugin-gradle](https://github.com/diffplug/spotless)
from 8.4.0 to 8.5.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/diffplug/spotless/releases">com.diffplug.spotless:spotless-plugin-gradle's
releases</a>.</em></p>
<blockquote>
<h2>Gradle Plugin v8.5.1</h2>
<h3>Fixed</h3>
<ul>
<li><code>licenseHeader</code> with
<code>setLicenseHeaderYearsFromGitHistory()</code> no longer runs
<code>git log</code> through a shell, eliminating a shell-injection
vector when formatting files whose names contain shell
metacharacters.</li>
</ul>
<h2>Gradle Plugin v8.5.0</h2>
<h3>Added</h3>
<ul>
<li><code>scalafmt()</code> now reads the version from the
<code>version</code> field in the scalafmt config file when no version
is explicitly set in the plugin config, falling back to the built-in
default only if neither is available. (<a
href="https://redirect.github.com/diffplug/spotless/pull/2922">#2922</a>)</li>
<li>Add <code>toml</code> format type with <code>versionCatalog()</code>
step for formatting and sorting Gradle version catalog files. (<a
href="https://redirect.github.com/diffplug/spotless/issues/2916">#2916</a>)</li>
<li>Add <code>withIndentStyle</code> and <code>withIndentSize</code>
configuration to <code>tableTestFormatter</code> for setting the
fallback indent when no <code>.editorconfig</code> is found. (<a
href="https://redirect.github.com/diffplug/spotless/pull/2893">#2893</a>)</li>
<li>Add <code>javaparserVersion(...)</code> to <code>cleanthat</code>,
allowing users to override the JavaParser version pulled in transitively
by Cleanthat. (<a
href="https://redirect.github.com/diffplug/spotless/pull/2903">#2903</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix <code>tableTestFormatter</code> editorconfig cache not honoring
<code>.editorconfig</code> changes across Gradle daemon runs due to a
shared static <code>EditorConfigProvider</code>. (<a
href="https://redirect.github.com/diffplug/spotless/pull/2893">#2893</a>)</li>
<li>Preserve case of JDBI named bind params that collide with SQL
keywords (e.g. <code>:limit</code>, <code>:offset</code>) in the DBeaver
SQL formatter. (<a
href="https://redirect.github.com/diffplug/spotless/pull/2899">#2899</a>)</li>
<li>Fix non-idempotent formatting when <code>importOrder()</code> is
combined with <code>greclipse()</code>: a single catch-all group no
longer strips blank lines that <code>greclipse()</code> independently
inserted between import groups. (<a
href="https://redirect.github.com/diffplug/spotless/pull/2914">#2914</a>)</li>
<li>Fix <code>predeclareDepsFromBuildscript()</code> on Gradle 9 by
avoiding mutation of the root buildscript configuration container. (<a
href="https://redirect.github.com/diffplug/spotless/pull/2929">#2929</a>,
fixes <a
href="https://redirect.github.com/diffplug/spotless/issues/2599">#2599</a>)</li>
</ul>
<h3>Changes</h3>
<ul>
<li>Fix <code>expandWildcardImports</code> failing on JDK XML types such
as <code>org.xml.sax.InputSource</code>. (<a
href="https://redirect.github.com/diffplug/spotless/pull/2921">#2921</a>)</li>
<li>Use Eclipse JDT's collator-based comparison when sorting Java
members to better match Eclipse save actions. (<a
href="https://redirect.github.com/diffplug/spotless/pull/2920">#2920</a>)</li>
<li>Bump default <code>cleanthat</code> version <code>2.24</code> -&gt;
<code>2.25</code>. (<a
href="https://redirect.github.com/diffplug/spotless/pull/2903">#2903</a>)</li>
<li>Bump default <code>eclipse-jdt</code> version from <code>4.35</code>
to <code>4.39</code>. (<a
href="https://redirect.github.com/diffplug/spotless/pull/2912">#2912</a>)</li>
<li>Make <code>spotlessPredeclare</code> visible to Gradle Kotlin DSL
type-safe accessors. (<a
href="https://redirect.github.com/diffplug/spotless/pull/2925">#2925</a>)</li>
<li>Allow <code>spotlessPredeclare</code> to be used directly without
enabling it first in spotless extension. (<a
href="https://redirect.github.com/diffplug/spotless/pull/2925">#2925</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/diffplug/spotless/commit/c1595c815d5fdd344505792aa4df588f467f0ca9"><code>c1595c8</code></a>
Published gradle/8.5.1</li>
<li><a
href="https://github.com/diffplug/spotless/commit/b26b570f7eba32554061b036206f675180cd2384"><code>b26b570</code></a>
Published lib/4.6.1</li>
<li><a
href="https://github.com/diffplug/spotless/commit/ac3f6f14a2e007c2d36223335df96a2c9ba92719"><code>ac3f6f1</code></a>
Bump plexus-utils to 4.0.3 to address CVE-2025-67030 (<a
href="https://redirect.github.com/diffplug/spotless/issues/2932">#2932</a>)</li>
<li><a
href="https://github.com/diffplug/spotless/commit/f5039f633d436a8831d09a934a3490d68968d684"><code>f5039f6</code></a>
Bump plexus-utils to 4.0.3 to address CVE-2025-67030</li>
<li><a
href="https://github.com/diffplug/spotless/commit/0e77837d4789cb43b83c21d566fe4185adc4ae2b"><code>0e77837</code></a>
Fix shell-injection in LicenseHeaderStep SET_FROM_GIT mode (<a
href="https://redirect.github.com/diffplug/spotless/issues/2931">#2931</a>)</li>
<li><a
href="https://github.com/diffplug/spotless/commit/84f642329de804615ff16f34d12a2249f1890850"><code>84f6423</code></a>
Fix shell-injection in LicenseHeaderStep SET_FROM_GIT mode</li>
<li><a
href="https://github.com/diffplug/spotless/commit/b87eb75efe54e94a7248ff5e2d07231bcc3a1b55"><code>b87eb75</code></a>
Published maven/3.5.0</li>
<li><a
href="https://github.com/diffplug/spotless/commit/97c3baf34b79d0028a343776bb2c2fb223930355"><code>97c3baf</code></a>
Published gradle/8.5.0</li>
<li><a
href="https://github.com/diffplug/spotless/commit/3dd1a9690270e7191f2c7db8314a9079b127ee76"><code>3dd1a96</code></a>
Published lib/4.6.0</li>
<li><a
href="https://github.com/diffplug/spotless/commit/05d89540ea573eae5c937ca1e9b015b78df83d9f"><code>05d8954</code></a>
Feature maven expand wildcard import (<a
href="https://redirect.github.com/diffplug/spotless/issues/2930">#2930</a>
fixes <a
href="https://redirect.github.com/diffplug/spotless/issues/2829">#2829</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/diffplug/spotless/compare/gradle/8.4.0...gradle/8.5.1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=com.diffplug.spotless:spotless-plugin-gradle&package-manager=gradle&previous-version=8.4.0&new-version=8.5.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-28 10:41:59 -07:00
dependabot[bot] 929688ba37 Bump org.jetbrains.kotlinx:kotlinx-coroutines-core from 1.10.2 to 1.11.0 (#1625)
Bumps
[org.jetbrains.kotlinx:kotlinx-coroutines-core](https://github.com/Kotlin/kotlinx.coroutines)
from 1.10.2 to 1.11.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/Kotlin/kotlinx.coroutines/releases">org.jetbrains.kotlinx:kotlinx-coroutines-core's
releases</a>.</em></p>
<blockquote>
<h2>1.11.0</h2>
<h3>Various</h3>
<ul>
<li>Kotlin was updated to 2.2.20 (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4545">#4545</a>).</li>
<li>Improved the published jar files (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/3842">#3842</a>,
<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4599">#4599</a>).</li>
<li>Various documentation improvements, including complete rewrites of
structured concurrency and error handling-related KDoc (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4433">#4433</a>,
<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4596">#4596</a>).</li>
</ul>
<h3>Breaking changes and deprecations</h3>
<ul>
<li>Moved <code>Promise</code>-related functions from JS and Wasm/JS to
the new <code>web</code> target. On Wasm/JS, this is a breaking change.
Before the change, <code>Promise</code> on Wasm/JS could work with
arbitrary Kotlin types, but now, only <code>JsAny</code> subtypes are
accepted (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4563">#4563</a>).</li>
<li>Changed handling of coroutine exceptions that can't be propagated on
JS and Wasm/JS. B
efore, exceptions were logged, but now, they are reported to the JS
runtime (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4451">#4451</a>,
<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4631">#4631</a>).</li>
<li>Deprecated using <code>CoroutineDispatcher</code> as the coroutine
context key; now, <code>ContinuationInterceptor</code> has to be used
instead (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4333">#4333</a>).</li>
<li>Advanced the deprecation levels on
<code>kotlinx-coroutines-test</code> APIs (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4604">#4604</a>).</li>
<li>Added lint functions that mark passing a <code>Job</code> to
coroutine builders as deprecated (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4435">#4435</a>).</li>
</ul>
<h3>Bug fixes and improvements</h3>
<ul>
<li>Added a <code>callsInPlace(EXACTLY_ONCE)</code> contract to
<code>runBlocking</code> in code shared between JVM and Native (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4368">#4368</a>).</li>
<li>Added a <code>callsInPlace(EXACTLY_ONCE)</code> contract to
<code>suspendCancellableCoroutine</code> (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4574">#4574</a>).</li>
<li>Fixed <code>flowOn</code> incorrectly handling
<code>ThreadContextElement</code> updates (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4403">#4403</a>).</li>
<li>Fixed exceptions in user-supplied
<code>Thread.UncaughtExceptionHandler</code> instances causing the
internal coroutines machinery to fail (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4516">#4516</a>).</li>
<li>Fixed <code>CoroutineDispatcher.asScheduler</code> in the RxJava
integration not cancelling outstanding work when a <code>Worker</code>
gets cancelled, which led to memory leaks in some scenarios (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4615">#4615</a>).</li>
<li>Fixed <code>SharedFlow</code> entering an invalid state when a
subscriber and an emitter are cancelled simultaneously (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4583">#4583</a>).</li>
<li>Fixed an R8 optimization leading to
<code>shareIn</code>/<code>stateIn</code> coroutines getting
garbage-collected (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4646">#4646</a>).
Thanks, <a
href="https://github.com/solevic"><code>@​solevic</code></a>!</li>
</ul>
<h3>Small additions</h3>
<ul>
<li>Added <code>CompletableDeferred.asDeferred</code> for obtaining a
read-only <code>Deferred</code> view (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4408">#4408</a>).</li>
<li>Added <code>SharedFlow.asFlow</code> for obtaining a
<code>Flow</code> view with hidden hot flow semantics (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4530">#4530</a>).
Thanks, <a
href="https://github.com/g000sha256"><code>@​g000sha256</code></a>!</li>
<li>Added a <code>StateFlow.collectLatest</code> overload returning
<code>Nothing</code> to assist with finding unreachable code (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4454">#4454</a>).</li>
<li>Added <code>ReceiveChannel.consumeTo</code> for consuming a
<code>ReceiveChannel</code> into a <code>MutableCollection</code> (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4520">#4520</a>).</li>
<li>Added a <code>StateFlow&lt;T&gt;.onSubscription</code> overload
returning a <code>StateFlow&lt;T&gt;</code>, similar to
<code>SharedFlow&lt;T&gt;.onSubscription</code> returning
<code>SharedFlow&lt;T&gt;</code> (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4275">#4275</a>).
Thanks, <a
href="https://github.com/xit0c"><code>@​xit0c</code></a>!</li>
<li>Added terminal <code>Flow</code> operators for collecting a
<code>Flow</code> to a <code>Map</code> (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/1541">#1541</a>).</li>
</ul>
<h3>Changelog relative to version 1.11.0</h3>
<p>No changes, only the version is increased.</p>
<h2>1.11.0-rc02</h2>
<p>Restored binary compatibility with 1.10.2 and older versions on
Wasm/JS for usages of <code>Promise</code>-related functions (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4661">#4661</a>).</p>
<h2>1.11.0-rc01</h2>
<h3>Various</h3>
<ul>
<li>Kotlin was updated to 2.2.20 (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4545">#4545</a>).</li>
<li>Improved the published jar files (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/3842">#3842</a>,
<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4599">#4599</a>).</li>
<li>Various documentation improvements, including complete rewrites of
structured concurrency and error handling-related KDoc (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4433">#4433</a>,
<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4596">#4596</a>).</li>
</ul>
<h3>Breaking changes and deprecations</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/Kotlin/kotlinx.coroutines/blob/master/CHANGES.md">org.jetbrains.kotlinx:kotlinx-coroutines-core's
changelog</a>.</em></p>
<blockquote>
<h2>Version 1.11.0</h2>
<h3>Various</h3>
<ul>
<li>Kotlin was updated to 2.2.20 (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4545">#4545</a>).</li>
<li>Improved the published jar files (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/3842">#3842</a>,
<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4599">#4599</a>).</li>
<li>Various documentation improvements, including complete rewrites of
structured concurrency and error handling-related KDoc (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4433">#4433</a>,
<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4596">#4596</a>).</li>
</ul>
<h3>Breaking changes and deprecations</h3>
<ul>
<li>Moved <code>Promise</code>-related functions from JS and Wasm/JS to
the new <code>web</code> target. On Wasm/JS, this is a breaking change.
Before the change, <code>Promise</code> on Wasm/JS could work with
arbitrary Kotlin types, but now, only <code>JsAny</code> subtypes are
accepted (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4563">#4563</a>).</li>
<li>Changed handling of coroutine exceptions that can't be propagated on
JS and Wasm/JS. Before, exceptions were logged, but now, they are
reported to the JS runtime (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4451">#4451</a>,
<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4631">#4631</a>).</li>
<li>Deprecated using <code>CoroutineDispatcher</code> as the coroutine
context key; now, <code>ContinuationInterceptor</code> has to be used
instead (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4333">#4333</a>).</li>
<li>Advanced the deprecation levels on
<code>kotlinx-coroutines-test</code> APIs (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4604">#4604</a>).</li>
<li>Added lint functions that mark passing a <code>Job</code> to
coroutine builders as deprecated (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4435">#4435</a>).</li>
</ul>
<h3>Bug fixes and improvements</h3>
<ul>
<li>Added a <code>callsInPlace(EXACTLY_ONCE)</code> contract to
<code>runBlocking</code> in code shared between JVM and Native (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4368">#4368</a>).</li>
<li>Added a <code>callsInPlace(EXACTLY_ONCE)</code> contract to
<code>suspendCancellableCoroutine</code> (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4574">#4574</a>).</li>
<li>Fixed <code>flowOn</code> incorrectly handling
<code>ThreadContextElement</code> updates (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4403">#4403</a>).</li>
<li>Fixed exceptions in user-supplied
<code>Thread.UncaughtExceptionHandler</code> instances causing the
internal coroutines machinery to fail (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4516">#4516</a>).</li>
<li>Fixed <code>CoroutineDispatcher.asScheduler</code> in the RxJava
integration not cancelling outstanding work when a <code>Worker</code>
gets cancelled, which led to memory leaks in some scenarios (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4615">#4615</a>).</li>
<li>Fixed <code>SharedFlow</code> entering an invalid state when a
subscriber and an emitter are cancelled simultaneously (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4583">#4583</a>).</li>
<li>Fixed an R8 optimization leading to
<code>shareIn</code>/<code>stateIn</code> coroutines getting
garbage-collected (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4646">#4646</a>).
Thanks, <a
href="https://github.com/solevic"><code>@​solevic</code></a>!</li>
</ul>
<h3>Small additions</h3>
<ul>
<li>Added <code>CompletableDeferred.asDeferred</code> for obtaining a
read-only <code>Deferred</code> view (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4408">#4408</a>).</li>
<li>Added <code>SharedFlow.asFlow</code> for obtaining a
<code>Flow</code> view with hidden hot flow semantics (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4530">#4530</a>).
Thanks, <a
href="https://github.com/g000sha256"><code>@​g000sha256</code></a>!</li>
<li>Added a <code>StateFlow.collectLatest</code> overload returning
<code>Nothing</code> to assist with finding unreachable code (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4454">#4454</a>).</li>
<li>Added <code>ReceiveChannel.consumeTo</code> for consuming a
<code>ReceiveChannel</code> into a <code>MutableCollection</code> (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4520">#4520</a>).</li>
<li>Added a <code>StateFlow&lt;T&gt;.onSubscription</code> overload
returning a <code>StateFlow&lt;T&gt;</code>, similar to
<code>SharedFlow&lt;T&gt;.onSubscription</code> returning
<code>SharedFlow&lt;T&gt;</code> (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4275">#4275</a>).
Thanks, <a
href="https://github.com/xit0c"><code>@​xit0c</code></a>!</li>
<li>Added terminal <code>Flow</code> operators for collecting a
<code>Flow</code> to a <code>Map</code> (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/1541">#1541</a>).</li>
</ul>
<h3>Changelog relative to version 1.11.0</h3>
<p>No changes, only the version is increased.</p>
<h2>Version 1.11.0-rc02</h2>
<p>Restored binary compatibility with 1.10.2 and older versions on
Wasm/JS for usages of <code>Promise</code>-related functions (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4661">#4661</a>).</p>
<h2>Version 1.11.0-rc01</h2>
<h3>Various</h3>
<ul>
<li>Kotlin was updated to 2.2.20 (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4545">#4545</a>).</li>
<li>Improved the published jar files (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/3842">#3842</a>,
<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4599">#4599</a>).</li>
<li>Various documentation improvements, including complete rewrites of
structured concurrency and error handling-related KDoc (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4433">#4433</a>,
<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4596">#4596</a>).</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/Kotlin/kotlinx.coroutines/commit/8564f65764d3d05893cec026c6e94250e2b23874"><code>8564f65</code></a>
Version 1.11.0</li>
<li><a
href="https://github.com/Kotlin/kotlinx.coroutines/commit/a4c6af96c15fe30f5d4e8b810ea74f8babd5805c"><code>a4c6af9</code></a>
Merge remote-tracking branch 'origin/master' into develop</li>
<li><a
href="https://github.com/Kotlin/kotlinx.coroutines/commit/ef917b460aa741691fbf991ee1b813049cae18c9"><code>ef917b4</code></a>
KT-84955: mark apple x64 tagets as deprecated error (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4645">#4645</a>)</li>
<li><a
href="https://github.com/Kotlin/kotlinx.coroutines/commit/5ebc421e341bf2ddce734d369da87df1985e80bd"><code>5ebc421</code></a>
Update the release procedure description (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4670">#4670</a>)</li>
<li><a
href="https://github.com/Kotlin/kotlinx.coroutines/commit/95f46a073bc4a1230352108cea1835fd22219a80"><code>95f46a0</code></a>
Remove old maven repository settings (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4672">#4672</a>)</li>
<li><a
href="https://github.com/Kotlin/kotlinx.coroutines/commit/b4f4f0aa6acb692f3fbcadd70e4958e3e9d370fc"><code>b4f4f0a</code></a>
Fix package name of <code>ToMapCollectionSamplesTest</code>. (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4674">#4674</a>)</li>
<li><a
href="https://github.com/Kotlin/kotlinx.coroutines/commit/86738dca7dc9ac82249abc8206263fa0065ee631"><code>86738dc</code></a>
Added templates to the issue creation wizard (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4654">#4654</a>)</li>
<li><a
href="https://github.com/Kotlin/kotlinx.coroutines/commit/330fcc221fb583f0b119f34191f735a73b827378"><code>330fcc2</code></a>
Version 1.11.0-rc02</li>
<li><a
href="https://github.com/Kotlin/kotlinx.coroutines/commit/e31cef6e9f2d26794be7d75ecbf3033b6432d582"><code>e31cef6</code></a>
Merge remote-tracking branch 'origin/master' into develop</li>
<li><a
href="https://github.com/Kotlin/kotlinx.coroutines/commit/dc6e9f61eaf3a67f4bf474a7987aedc3f16cef37"><code>dc6e9f6</code></a>
Restore Promise-related functions on Wasm/JS as HIDDEN (<a
href="https://redirect.github.com/Kotlin/kotlinx.coroutines/issues/4661">#4661</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/Kotlin/kotlinx.coroutines/compare/1.10.2...1.11.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=org.jetbrains.kotlinx:kotlinx-coroutines-core&package-manager=gradle&previous-version=1.10.2&new-version=1.11.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-28 10:35:51 -07:00
dependabot[bot] e408cee7d0 Bump junit from 6.0.3 to 6.1.0 (#1627)
Bumps `junit` from 6.0.3 to 6.1.0.
Updates `org.junit.jupiter:junit-jupiter-api` from 6.0.3 to 6.1.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/junit-team/junit-framework/releases">org.junit.jupiter:junit-jupiter-api's
releases</a>.</em></p>
<blockquote>
<p>JUnit 6.1.0 = Platform 6.1.0 + Jupiter 6.1.0 + Vintage 6.1.0</p>
<p>See <a href="https://docs.junit.org/6.1.0/release-notes.html">Release
Notes</a>.</p>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/JarvisCraft"><code>@​JarvisCraft</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5633">junit-team/junit-framework#5633</a></li>
<li><a href="https://github.com/Maran23"><code>@​Maran23</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5644">junit-team/junit-framework#5644</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/junit-team/junit-framework/compare/r6.0.3...r6.1.0">https://github.com/junit-team/junit-framework/compare/r6.0.3...r6.1.0</a></p>
<p>JUnit 6.1.0-RC1 = Platform 6.1.0-RC1 + Jupiter 6.1.0-RC1 + Vintage
6.1.0-RC1</p>
<p>See <a href="https://docs.junit.org/6.1.0-RC1/release-notes/">Release
Notes</a>.</p>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/mariokhoury4"><code>@​mariokhoury4</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/4574">junit-team/junit-framework#4574</a></li>
<li><a href="https://github.com/Ogu1208"><code>@​Ogu1208</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5145">junit-team/junit-framework#5145</a></li>
<li><a
href="https://github.com/HyungGeun94"><code>@​HyungGeun94</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5271">junit-team/junit-framework#5271</a></li>
<li><a
href="https://github.com/yalishevant"><code>@​yalishevant</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5316">junit-team/junit-framework#5316</a></li>
<li><a
href="https://github.com/JINU-CHANG"><code>@​JINU-CHANG</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5290">junit-team/junit-framework#5290</a></li>
<li><a href="https://github.com/jaschdoc"><code>@​jaschdoc</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5427">junit-team/junit-framework#5427</a></li>
<li><a
href="https://github.com/kawshikbuet17"><code>@​kawshikbuet17</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5561">junit-team/junit-framework#5561</a></li>
<li><a href="https://github.com/msridhar"><code>@​msridhar</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5602">junit-team/junit-framework#5602</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/junit-team/junit-framework/compare/r6.1.0-M1...r6.1.0-RC1">https://github.com/junit-team/junit-framework/compare/r6.1.0-M1...r6.1.0-RC1</a></p>
<p>JUnit 6.1.0-M1 = Platform 6.1.0-M1 + Jupiter 6.1.0-M1 + Vintage
6.1.0-M1</p>
<p>See <a href="https://docs.junit.org/6.1.0-M1/release-notes/">Release
Notes</a>.</p>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/vy"><code>@​vy</code></a> made their
first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5041">junit-team/junit-framework#5041</a></li>
<li><a href="https://github.com/Pankraz76"><code>@​Pankraz76</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5006">junit-team/junit-framework#5006</a></li>
<li><a href="https://github.com/arukiidou"><code>@​arukiidou</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5066">junit-team/junit-framework#5066</a></li>
<li><a href="https://github.com/laeubi"><code>@​laeubi</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5092">junit-team/junit-framework#5092</a></li>
<li><a href="https://github.com/jihun4452"><code>@​jihun4452</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5088">junit-team/junit-framework#5088</a></li>
<li><a
href="https://github.com/TWiStErRob"><code>@​TWiStErRob</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5133">junit-team/junit-framework#5133</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/junit-team/junit-framework/compare/r6.0.0...r6.1.0-M1">https://github.com/junit-team/junit-framework/compare/r6.0.0...r6.1.0-M1</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/junit-team/junit-framework/commit/0dc3af1cb1973d257b5bc75d81e02454d5e4e556"><code>0dc3af1</code></a>
Release 6.1.0</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/1d130020c85170edcb46ce7ed1f7f78824e37c04"><code>1d13002</code></a>
Prepare 6.1.0 release notes</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/072b2175bbd7b0b3b26f5d928550ec7a21e68268"><code>072b217</code></a>
Update plugin spotless to v8.5.0 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5668">#5668</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/3a53480218f4b752a9ca77506e10632cd483c0f8"><code>3a53480</code></a>
Update Gradle to v9.5.1 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5666">#5666</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/0e18a20a9f98d063ae02b3ba19329143f5c7f034"><code>0e18a20</code></a>
Update zizmorcore/zizmor-action action to v0.5.4 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5669">#5669</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/0a2634fb9cbbd057b02cf629d7d272c16d62be4b"><code>0a2634f</code></a>
Update github/codeql-action action to v4.35.5 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5671">#5671</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/4dbd5561b00ac761a62c516bfaec51c212a2d60c"><code>4dbd556</code></a>
Restructure workflows to have single &quot;status&quot; job (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5670">#5670</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/f2194cebe377512cb0ade388c62a881a0bcf5d3e"><code>f2194ce</code></a>
Increase timeout to reduce flakiness</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/5c8fdd2df65b763151cccbe669ea9e1c3155efcd"><code>5c8fdd2</code></a>
Update dependency org.apache.groovy:groovy to v5.0.6 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5659">#5659</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/43c6982324602582902c9bdb213fd5e007f9cf3d"><code>43c6982</code></a>
Update dependency org.slf4j:slf4j-jdk14 to v2.0.18 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5667">#5667</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/junit-team/junit-framework/compare/r6.0.3...r6.1.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `org.junit.jupiter:junit-jupiter-engine` from 6.0.3 to 6.1.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/junit-team/junit-framework/releases">org.junit.jupiter:junit-jupiter-engine's
releases</a>.</em></p>
<blockquote>
<p>JUnit 6.1.0 = Platform 6.1.0 + Jupiter 6.1.0 + Vintage 6.1.0</p>
<p>See <a href="https://docs.junit.org/6.1.0/release-notes.html">Release
Notes</a>.</p>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/JarvisCraft"><code>@​JarvisCraft</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5633">junit-team/junit-framework#5633</a></li>
<li><a href="https://github.com/Maran23"><code>@​Maran23</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5644">junit-team/junit-framework#5644</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/junit-team/junit-framework/compare/r6.0.3...r6.1.0">https://github.com/junit-team/junit-framework/compare/r6.0.3...r6.1.0</a></p>
<p>JUnit 6.1.0-RC1 = Platform 6.1.0-RC1 + Jupiter 6.1.0-RC1 + Vintage
6.1.0-RC1</p>
<p>See <a href="https://docs.junit.org/6.1.0-RC1/release-notes/">Release
Notes</a>.</p>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/mariokhoury4"><code>@​mariokhoury4</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/4574">junit-team/junit-framework#4574</a></li>
<li><a href="https://github.com/Ogu1208"><code>@​Ogu1208</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5145">junit-team/junit-framework#5145</a></li>
<li><a
href="https://github.com/HyungGeun94"><code>@​HyungGeun94</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5271">junit-team/junit-framework#5271</a></li>
<li><a
href="https://github.com/yalishevant"><code>@​yalishevant</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5316">junit-team/junit-framework#5316</a></li>
<li><a
href="https://github.com/JINU-CHANG"><code>@​JINU-CHANG</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5290">junit-team/junit-framework#5290</a></li>
<li><a href="https://github.com/jaschdoc"><code>@​jaschdoc</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5427">junit-team/junit-framework#5427</a></li>
<li><a
href="https://github.com/kawshikbuet17"><code>@​kawshikbuet17</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5561">junit-team/junit-framework#5561</a></li>
<li><a href="https://github.com/msridhar"><code>@​msridhar</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5602">junit-team/junit-framework#5602</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/junit-team/junit-framework/compare/r6.1.0-M1...r6.1.0-RC1">https://github.com/junit-team/junit-framework/compare/r6.1.0-M1...r6.1.0-RC1</a></p>
<p>JUnit 6.1.0-M1 = Platform 6.1.0-M1 + Jupiter 6.1.0-M1 + Vintage
6.1.0-M1</p>
<p>See <a href="https://docs.junit.org/6.1.0-M1/release-notes/">Release
Notes</a>.</p>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/vy"><code>@​vy</code></a> made their
first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5041">junit-team/junit-framework#5041</a></li>
<li><a href="https://github.com/Pankraz76"><code>@​Pankraz76</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5006">junit-team/junit-framework#5006</a></li>
<li><a href="https://github.com/arukiidou"><code>@​arukiidou</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5066">junit-team/junit-framework#5066</a></li>
<li><a href="https://github.com/laeubi"><code>@​laeubi</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5092">junit-team/junit-framework#5092</a></li>
<li><a href="https://github.com/jihun4452"><code>@​jihun4452</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5088">junit-team/junit-framework#5088</a></li>
<li><a
href="https://github.com/TWiStErRob"><code>@​TWiStErRob</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5133">junit-team/junit-framework#5133</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/junit-team/junit-framework/compare/r6.0.0...r6.1.0-M1">https://github.com/junit-team/junit-framework/compare/r6.0.0...r6.1.0-M1</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/junit-team/junit-framework/commit/0dc3af1cb1973d257b5bc75d81e02454d5e4e556"><code>0dc3af1</code></a>
Release 6.1.0</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/1d130020c85170edcb46ce7ed1f7f78824e37c04"><code>1d13002</code></a>
Prepare 6.1.0 release notes</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/072b2175bbd7b0b3b26f5d928550ec7a21e68268"><code>072b217</code></a>
Update plugin spotless to v8.5.0 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5668">#5668</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/3a53480218f4b752a9ca77506e10632cd483c0f8"><code>3a53480</code></a>
Update Gradle to v9.5.1 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5666">#5666</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/0e18a20a9f98d063ae02b3ba19329143f5c7f034"><code>0e18a20</code></a>
Update zizmorcore/zizmor-action action to v0.5.4 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5669">#5669</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/0a2634fb9cbbd057b02cf629d7d272c16d62be4b"><code>0a2634f</code></a>
Update github/codeql-action action to v4.35.5 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5671">#5671</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/4dbd5561b00ac761a62c516bfaec51c212a2d60c"><code>4dbd556</code></a>
Restructure workflows to have single &quot;status&quot; job (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5670">#5670</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/f2194cebe377512cb0ade388c62a881a0bcf5d3e"><code>f2194ce</code></a>
Increase timeout to reduce flakiness</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/5c8fdd2df65b763151cccbe669ea9e1c3155efcd"><code>5c8fdd2</code></a>
Update dependency org.apache.groovy:groovy to v5.0.6 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5659">#5659</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/43c6982324602582902c9bdb213fd5e007f9cf3d"><code>43c6982</code></a>
Update dependency org.slf4j:slf4j-jdk14 to v2.0.18 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5667">#5667</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/junit-team/junit-framework/compare/r6.0.3...r6.1.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `org.junit.jupiter:junit-jupiter-params` from 6.0.3 to 6.1.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/junit-team/junit-framework/releases">org.junit.jupiter:junit-jupiter-params's
releases</a>.</em></p>
<blockquote>
<p>JUnit 6.1.0 = Platform 6.1.0 + Jupiter 6.1.0 + Vintage 6.1.0</p>
<p>See <a href="https://docs.junit.org/6.1.0/release-notes.html">Release
Notes</a>.</p>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/JarvisCraft"><code>@​JarvisCraft</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5633">junit-team/junit-framework#5633</a></li>
<li><a href="https://github.com/Maran23"><code>@​Maran23</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5644">junit-team/junit-framework#5644</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/junit-team/junit-framework/compare/r6.0.3...r6.1.0">https://github.com/junit-team/junit-framework/compare/r6.0.3...r6.1.0</a></p>
<p>JUnit 6.1.0-RC1 = Platform 6.1.0-RC1 + Jupiter 6.1.0-RC1 + Vintage
6.1.0-RC1</p>
<p>See <a href="https://docs.junit.org/6.1.0-RC1/release-notes/">Release
Notes</a>.</p>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/mariokhoury4"><code>@​mariokhoury4</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/4574">junit-team/junit-framework#4574</a></li>
<li><a href="https://github.com/Ogu1208"><code>@​Ogu1208</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5145">junit-team/junit-framework#5145</a></li>
<li><a
href="https://github.com/HyungGeun94"><code>@​HyungGeun94</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5271">junit-team/junit-framework#5271</a></li>
<li><a
href="https://github.com/yalishevant"><code>@​yalishevant</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5316">junit-team/junit-framework#5316</a></li>
<li><a
href="https://github.com/JINU-CHANG"><code>@​JINU-CHANG</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5290">junit-team/junit-framework#5290</a></li>
<li><a href="https://github.com/jaschdoc"><code>@​jaschdoc</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5427">junit-team/junit-framework#5427</a></li>
<li><a
href="https://github.com/kawshikbuet17"><code>@​kawshikbuet17</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5561">junit-team/junit-framework#5561</a></li>
<li><a href="https://github.com/msridhar"><code>@​msridhar</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5602">junit-team/junit-framework#5602</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/junit-team/junit-framework/compare/r6.1.0-M1...r6.1.0-RC1">https://github.com/junit-team/junit-framework/compare/r6.1.0-M1...r6.1.0-RC1</a></p>
<p>JUnit 6.1.0-M1 = Platform 6.1.0-M1 + Jupiter 6.1.0-M1 + Vintage
6.1.0-M1</p>
<p>See <a href="https://docs.junit.org/6.1.0-M1/release-notes/">Release
Notes</a>.</p>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/vy"><code>@​vy</code></a> made their
first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5041">junit-team/junit-framework#5041</a></li>
<li><a href="https://github.com/Pankraz76"><code>@​Pankraz76</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5006">junit-team/junit-framework#5006</a></li>
<li><a href="https://github.com/arukiidou"><code>@​arukiidou</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5066">junit-team/junit-framework#5066</a></li>
<li><a href="https://github.com/laeubi"><code>@​laeubi</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5092">junit-team/junit-framework#5092</a></li>
<li><a href="https://github.com/jihun4452"><code>@​jihun4452</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5088">junit-team/junit-framework#5088</a></li>
<li><a
href="https://github.com/TWiStErRob"><code>@​TWiStErRob</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5133">junit-team/junit-framework#5133</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/junit-team/junit-framework/compare/r6.0.0...r6.1.0-M1">https://github.com/junit-team/junit-framework/compare/r6.0.0...r6.1.0-M1</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/junit-team/junit-framework/commit/0dc3af1cb1973d257b5bc75d81e02454d5e4e556"><code>0dc3af1</code></a>
Release 6.1.0</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/1d130020c85170edcb46ce7ed1f7f78824e37c04"><code>1d13002</code></a>
Prepare 6.1.0 release notes</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/072b2175bbd7b0b3b26f5d928550ec7a21e68268"><code>072b217</code></a>
Update plugin spotless to v8.5.0 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5668">#5668</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/3a53480218f4b752a9ca77506e10632cd483c0f8"><code>3a53480</code></a>
Update Gradle to v9.5.1 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5666">#5666</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/0e18a20a9f98d063ae02b3ba19329143f5c7f034"><code>0e18a20</code></a>
Update zizmorcore/zizmor-action action to v0.5.4 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5669">#5669</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/0a2634fb9cbbd057b02cf629d7d272c16d62be4b"><code>0a2634f</code></a>
Update github/codeql-action action to v4.35.5 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5671">#5671</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/4dbd5561b00ac761a62c516bfaec51c212a2d60c"><code>4dbd556</code></a>
Restructure workflows to have single &quot;status&quot; job (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5670">#5670</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/f2194cebe377512cb0ade388c62a881a0bcf5d3e"><code>f2194ce</code></a>
Increase timeout to reduce flakiness</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/5c8fdd2df65b763151cccbe669ea9e1c3155efcd"><code>5c8fdd2</code></a>
Update dependency org.apache.groovy:groovy to v5.0.6 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5659">#5659</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/43c6982324602582902c9bdb213fd5e007f9cf3d"><code>43c6982</code></a>
Update dependency org.slf4j:slf4j-jdk14 to v2.0.18 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5667">#5667</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/junit-team/junit-framework/compare/r6.0.3...r6.1.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `org.junit.platform:junit-platform-launcher` from 6.0.3 to 6.1.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/junit-team/junit-framework/releases">org.junit.platform:junit-platform-launcher's
releases</a>.</em></p>
<blockquote>
<p>JUnit 6.1.0 = Platform 6.1.0 + Jupiter 6.1.0 + Vintage 6.1.0</p>
<p>See <a href="https://docs.junit.org/6.1.0/release-notes.html">Release
Notes</a>.</p>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/JarvisCraft"><code>@​JarvisCraft</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5633">junit-team/junit-framework#5633</a></li>
<li><a href="https://github.com/Maran23"><code>@​Maran23</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5644">junit-team/junit-framework#5644</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/junit-team/junit-framework/compare/r6.0.3...r6.1.0">https://github.com/junit-team/junit-framework/compare/r6.0.3...r6.1.0</a></p>
<p>JUnit 6.1.0-RC1 = Platform 6.1.0-RC1 + Jupiter 6.1.0-RC1 + Vintage
6.1.0-RC1</p>
<p>See <a href="https://docs.junit.org/6.1.0-RC1/release-notes/">Release
Notes</a>.</p>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/mariokhoury4"><code>@​mariokhoury4</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/4574">junit-team/junit-framework#4574</a></li>
<li><a href="https://github.com/Ogu1208"><code>@​Ogu1208</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5145">junit-team/junit-framework#5145</a></li>
<li><a
href="https://github.com/HyungGeun94"><code>@​HyungGeun94</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5271">junit-team/junit-framework#5271</a></li>
<li><a
href="https://github.com/yalishevant"><code>@​yalishevant</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5316">junit-team/junit-framework#5316</a></li>
<li><a
href="https://github.com/JINU-CHANG"><code>@​JINU-CHANG</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5290">junit-team/junit-framework#5290</a></li>
<li><a href="https://github.com/jaschdoc"><code>@​jaschdoc</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5427">junit-team/junit-framework#5427</a></li>
<li><a
href="https://github.com/kawshikbuet17"><code>@​kawshikbuet17</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5561">junit-team/junit-framework#5561</a></li>
<li><a href="https://github.com/msridhar"><code>@​msridhar</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5602">junit-team/junit-framework#5602</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/junit-team/junit-framework/compare/r6.1.0-M1...r6.1.0-RC1">https://github.com/junit-team/junit-framework/compare/r6.1.0-M1...r6.1.0-RC1</a></p>
<p>JUnit 6.1.0-M1 = Platform 6.1.0-M1 + Jupiter 6.1.0-M1 + Vintage
6.1.0-M1</p>
<p>See <a href="https://docs.junit.org/6.1.0-M1/release-notes/">Release
Notes</a>.</p>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/vy"><code>@​vy</code></a> made their
first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5041">junit-team/junit-framework#5041</a></li>
<li><a href="https://github.com/Pankraz76"><code>@​Pankraz76</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5006">junit-team/junit-framework#5006</a></li>
<li><a href="https://github.com/arukiidou"><code>@​arukiidou</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5066">junit-team/junit-framework#5066</a></li>
<li><a href="https://github.com/laeubi"><code>@​laeubi</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5092">junit-team/junit-framework#5092</a></li>
<li><a href="https://github.com/jihun4452"><code>@​jihun4452</code></a>
made their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5088">junit-team/junit-framework#5088</a></li>
<li><a
href="https://github.com/TWiStErRob"><code>@​TWiStErRob</code></a> made
their first contribution in <a
href="https://redirect.github.com/junit-team/junit-framework/pull/5133">junit-team/junit-framework#5133</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/junit-team/junit-framework/compare/r6.0.0...r6.1.0-M1">https://github.com/junit-team/junit-framework/compare/r6.0.0...r6.1.0-M1</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/junit-team/junit-framework/commit/0dc3af1cb1973d257b5bc75d81e02454d5e4e556"><code>0dc3af1</code></a>
Release 6.1.0</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/1d130020c85170edcb46ce7ed1f7f78824e37c04"><code>1d13002</code></a>
Prepare 6.1.0 release notes</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/072b2175bbd7b0b3b26f5d928550ec7a21e68268"><code>072b217</code></a>
Update plugin spotless to v8.5.0 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5668">#5668</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/3a53480218f4b752a9ca77506e10632cd483c0f8"><code>3a53480</code></a>
Update Gradle to v9.5.1 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5666">#5666</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/0e18a20a9f98d063ae02b3ba19329143f5c7f034"><code>0e18a20</code></a>
Update zizmorcore/zizmor-action action to v0.5.4 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5669">#5669</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/0a2634fb9cbbd057b02cf629d7d272c16d62be4b"><code>0a2634f</code></a>
Update github/codeql-action action to v4.35.5 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5671">#5671</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/4dbd5561b00ac761a62c516bfaec51c212a2d60c"><code>4dbd556</code></a>
Restructure workflows to have single &quot;status&quot; job (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5670">#5670</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/f2194cebe377512cb0ade388c62a881a0bcf5d3e"><code>f2194ce</code></a>
Increase timeout to reduce flakiness</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/5c8fdd2df65b763151cccbe669ea9e1c3155efcd"><code>5c8fdd2</code></a>
Update dependency org.apache.groovy:groovy to v5.0.6 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5659">#5659</a>)</li>
<li><a
href="https://github.com/junit-team/junit-framework/commit/43c6982324602582902c9bdb213fd5e007f9cf3d"><code>43c6982</code></a>
Update dependency org.slf4j:slf4j-jdk14 to v2.0.18 (<a
href="https://redirect.github.com/junit-team/junit-framework/issues/5667">#5667</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/junit-team/junit-framework/compare/r6.0.3...r6.1.0">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-28 10:35:39 -07:00
dependabot[bot] 2f4128a31c Bump github/codeql-action from 4.35.4 to 4.35.5 (#1624)
Bumps [github/codeql-action](https://github.com/github/codeql-action)
from 4.35.4 to 4.35.5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/github/codeql-action/releases">github/codeql-action's
releases</a>.</em></p>
<blockquote>
<h2>v4.35.5</h2>
<ul>
<li>We have improved how the JavaScript bundles for the CodeQL Action
are generated to avoid duplication across bundles and reduce the size of
the repository by around 70%. This should have no effect on the runtime
behaviour of the CodeQL Action. <a
href="https://redirect.github.com/github/codeql-action/pull/3899">#3899</a></li>
<li>For performance and accuracy reasons, <a
href="https://redirect.github.com/github/roadmap/issues/1158">improved
incremental analysis</a> will now only be enabled on a pull request when
diff-informed analysis is also enabled for that run. If diff-informed
analysis is unavailable (for example, because the PR diff ranges could
not be computed), the action will fall back to a full analysis. <a
href="https://redirect.github.com/github/codeql-action/pull/3791">#3791</a></li>
<li>If multiple inputs are provided for the GitHub-internal
<code>analysis-kinds</code> input, only <code>code-scanning</code> will
be enabled. The <code>analysis-kinds</code> input is experimental, for
GitHub-internal use only, and may change without notice at any time. <a
href="https://redirect.github.com/github/codeql-action/pull/3892">#3892</a></li>
<li>Added an experimental change which, when running a Code Scanning
analysis for a PR with <a
href="https://redirect.github.com/github/roadmap/issues/1158">improved
incremental analysis</a> enabled, prefers CodeQL CLI versions that have
a cached overlay-base database for the configured languages. This speeds
up analysis for a repository when there is not yet a cached overlay-base
database for the latest CLI version. We expect to roll this change out
to everyone in May. <a
href="https://redirect.github.com/github/codeql-action/pull/3880">#3880</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/github/codeql-action/blob/main/CHANGELOG.md">github/codeql-action's
changelog</a>.</em></p>
<blockquote>
<h1>CodeQL Action Changelog</h1>
<p>See the <a
href="https://github.com/github/codeql-action/releases">releases
page</a> for the relevant changes to the CodeQL CLI and language
packs.</p>
<h2>[UNRELEASED]</h2>
<p>No user facing changes.</p>
<h2>4.36.0 - 22 May 2026</h2>
<ul>
<li><em>Breaking change</em>: Bump the minimum required CodeQL bundle
version to 2.19.4. <a
href="https://redirect.github.com/github/codeql-action/pull/3894">#3894</a></li>
<li>Add support for SHA-256 Git object IDs. <a
href="https://redirect.github.com/github/codeql-action/pull/3893">#3893</a></li>
<li>Update default CodeQL bundle version to <a
href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.5">2.25.5</a>.
<a
href="https://redirect.github.com/github/codeql-action/pull/3926">#3926</a></li>
</ul>
<h2>4.35.5 - 15 May 2026</h2>
<ul>
<li>We have improved how the JavaScript bundles for the CodeQL Action
are generated to avoid duplication across bundles and reduce the size of
the repository by around 70%. This should have no effect on the runtime
behaviour of the CodeQL Action. <a
href="https://redirect.github.com/github/codeql-action/pull/3899">#3899</a></li>
<li>For performance and accuracy reasons, <a
href="https://redirect.github.com/github/roadmap/issues/1158">improved
incremental analysis</a> will now only be enabled on a pull request when
diff-informed analysis is also enabled for that run. If diff-informed
analysis is unavailable (for example, because the PR diff ranges could
not be computed), the action will fall back to a full analysis. <a
href="https://redirect.github.com/github/codeql-action/pull/3791">#3791</a></li>
<li>If multiple inputs are provided for the GitHub-internal
<code>analysis-kinds</code> input, only <code>code-scanning</code> will
be enabled. The <code>analysis-kinds</code> input is experimental, for
GitHub-internal use only, and may change without notice at any time. <a
href="https://redirect.github.com/github/codeql-action/pull/3892">#3892</a></li>
<li>Added an experimental change which, when running a Code Scanning
analysis for a PR with <a
href="https://redirect.github.com/github/roadmap/issues/1158">improved
incremental analysis</a> enabled, prefers CodeQL CLI versions that have
a cached overlay-base database for the configured languages. This speeds
up analysis for a repository when there is not yet a cached overlay-base
database for the latest CLI version. We expect to roll this change out
to everyone in May. <a
href="https://redirect.github.com/github/codeql-action/pull/3880">#3880</a></li>
</ul>
<h2>4.35.4 - 07 May 2026</h2>
<ul>
<li>Update default CodeQL bundle version to <a
href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.4">2.25.4</a>.
<a
href="https://redirect.github.com/github/codeql-action/pull/3881">#3881</a></li>
</ul>
<h2>4.35.3 - 01 May 2026</h2>
<ul>
<li><em>Upcoming breaking change</em>: Add a deprecation warning for
customers using CodeQL version 2.19.3 and earlier. These versions of
CodeQL were discontinued on 9 April 2026 alongside GitHub Enterprise
Server 3.15, and will be unsupported by the next minor release of the
CodeQL Action. <a
href="https://redirect.github.com/github/codeql-action/pull/3837">#3837</a></li>
<li>Configurations for private registries that use Cloudsmith or GCP
OIDC are now accepted. <a
href="https://redirect.github.com/github/codeql-action/pull/3850">#3850</a></li>
<li>Best-effort connection tests for private registries now use
<code>GET</code> requests instead of <code>HEAD</code> for better
compatibility with various registry implementations. For NuGet feeds,
the test is now always performed against the service index. <a
href="https://redirect.github.com/github/codeql-action/pull/3853">#3853</a></li>
<li>Fixed a bug where two diagnostics produced within the same
millisecond could overwrite each other on disk, causing one of them to
be lost. <a
href="https://redirect.github.com/github/codeql-action/pull/3852">#3852</a></li>
<li>Update default CodeQL bundle version to <a
href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.3">2.25.3</a>.
<a
href="https://redirect.github.com/github/codeql-action/pull/3865">#3865</a></li>
</ul>
<h2>4.35.2 - 15 Apr 2026</h2>
<ul>
<li>The undocumented TRAP cache cleanup feature that could be enabled
using the <code>CODEQL_ACTION_CLEANUP_TRAP_CACHES</code> environment
variable is deprecated and will be removed in May 2026. If you are
affected by this, we recommend disabling TRAP caching by passing the
<code>trap-caching: false</code> input to the <code>init</code> Action.
<a
href="https://redirect.github.com/github/codeql-action/pull/3795">#3795</a></li>
<li>The Git version 2.36.0 requirement for improved incremental analysis
now only applies to repositories that contain submodules. <a
href="https://redirect.github.com/github/codeql-action/pull/3789">#3789</a></li>
<li>Python analysis on GHES no longer extracts the standard library,
relying instead on models of the standard library. This should result in
significantly faster extraction and analysis times, while the effect on
alerts should be minimal. <a
href="https://redirect.github.com/github/codeql-action/pull/3794">#3794</a></li>
<li>Fixed a bug in the validation of OIDC configurations for private
registries that was added in CodeQL Action 4.33.0 / 3.33.0. <a
href="https://redirect.github.com/github/codeql-action/pull/3807">#3807</a></li>
<li>Update default CodeQL bundle version to <a
href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.2">2.25.2</a>.
<a
href="https://redirect.github.com/github/codeql-action/pull/3823">#3823</a></li>
</ul>
<h2>4.35.1 - 27 Mar 2026</h2>
<ul>
<li>Fix incorrect minimum required Git version for <a
href="https://redirect.github.com/github/roadmap/issues/1158">improved
incremental analysis</a>: it should have been 2.36.0, not 2.11.0. <a
href="https://redirect.github.com/github/codeql-action/pull/3781">#3781</a></li>
</ul>
<h2>4.35.0 - 27 Mar 2026</h2>
<ul>
<li>Reduced the minimum Git version required for <a
href="https://redirect.github.com/github/roadmap/issues/1158">improved
incremental analysis</a> from 2.38.0 to 2.11.0. <a
href="https://redirect.github.com/github/codeql-action/pull/3767">#3767</a></li>
<li>Update default CodeQL bundle version to <a
href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.1">2.25.1</a>.
<a
href="https://redirect.github.com/github/codeql-action/pull/3773">#3773</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/github/codeql-action/commit/9e0d7b8d25671d64c341c19c0152d693099fb5ba"><code>9e0d7b8</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3905">#3905</a>
from github/update-v4.35.5-d4b485515</li>
<li><a
href="https://github.com/github/codeql-action/commit/6d7d59927c0c7336c1d1247c7e159e79edbf7684"><code>6d7d599</code></a>
Add changelog entry for <a
href="https://redirect.github.com/github/codeql-action/issues/3899">#3899</a></li>
<li><a
href="https://github.com/github/codeql-action/commit/51f7e38c69d3cd7966375fe0ffff19669f22bd14"><code>51f7e38</code></a>
Update changelog for v4.35.5</li>
<li><a
href="https://github.com/github/codeql-action/commit/d4b485515e8531d7071a39d526213eb5b2e74a11"><code>d4b4855</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3899">#3899</a>
from github/mbg/esbuild/split</li>
<li><a
href="https://github.com/github/codeql-action/commit/127de8117f134e8809c127d53e940b3ffc1db8e9"><code>127de81</code></a>
Merge remote-tracking branch 'origin/main' into mbg/esbuild/split</li>
<li><a
href="https://github.com/github/codeql-action/commit/7fde13f26ad3f7008e8fe6755cb997b54f7a2f3b"><code>7fde13f</code></a>
Use src + basename in header to avoid issues on Windows</li>
<li><a
href="https://github.com/github/codeql-action/commit/dfa61e7305ed28b74dcc2c68bd665b36751ad933"><code>dfa61e7</code></a>
Improve pattern matching and error handling</li>
<li><a
href="https://github.com/github/codeql-action/commit/52aafec07347933a26e670390c3f894c5c05e64a"><code>52aafec</code></a>
Import and call <code>runWrapper</code> normally in <code>analyze</code>
tests</li>
<li><a
href="https://github.com/github/codeql-action/commit/0d08c01f7874da2f932e4d4e4d42b1c43be88111"><code>0d08c01</code></a>
Auto-generate shared bundle</li>
<li><a
href="https://github.com/github/codeql-action/commit/14085a675cb6d8cddc805b946cc1d51e3232a204"><code>14085a6</code></a>
Auto-generate entry points</li>
<li>Additional commits viewable in <a
href="https://github.com/github/codeql-action/compare/68bde559dea0fdcac2102bfdf6230c5f70eb485e...9e0d7b8d25671d64c341c19c0152d693099fb5ba">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github/codeql-action&package-manager=github_actions&previous-version=4.35.4&new-version=4.35.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-28 10:27:18 -07:00
Daniel Chao 7c927b0a43 Fix deploy build (#1623)
Fixes the following error:

```
A problem was found with the configuration of task ':pkl-core:sourcesJar' (type 'Jar').
Deprecated Gradle features were used in this build, making it incompatible with Gradle 10.
  - Gradle detected a problem with the following location: '/home/runner/work/pkl/pkl/pkl-core/build/generated/sources/baseModuleMembers'.

    
You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.
    Reason: Task ':pkl-core:sourcesJar' uses this output of task ':pkl-core:generateBaseModuleMembers' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed.

    
For more on this, please refer to https://docs.gradle.org/9.5.1/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.
    Possible solutions:
94 actionable tasks: 76 executed, 18 from cache
      1. Declare task ':pkl-core:generateBaseModuleMembers' as an input of ':pkl-core:sourcesJar'.
      2. Declare an explicit dependency on ':pkl-core:generateBaseModuleMembers' from ':pkl-core:sourcesJar' using Task#dependsOn.
      3. Declare an explicit dependency on ':pkl-core:generateBaseModuleMembers' from ':pkl-core:sourcesJar' using Task#mustRunAfter.
```
2026-05-26 15:20:54 -07:00
Islon Scherer dbf04f6598 Resolve variables at parse time (#1429)
This replaces `ResolveVariableNode` and `ResolveMethodNode` with their resolution.
When we build the truffle node tree, we determine whether names resolve to:

* lexical scope
* base module
* implicit this

Then, we use this information to directly construct the underlying nodes (`ReadPropertyNode`, `ReadLocalPropertyNode`, etc).

Additionally, `AstBuilder` determines whether the property access must be const or not.

This introduces a `BaseModuleMembers` registry, which gets generated as part of Java compilation.
2026-05-26 14:08:20 -07:00
Daniel Chao b2f005d11d Enable error-prone check for GuardedBy, fix errors (#1621) 2026-05-26 13:39:15 -07:00
Daniel Chao 72948e50fe Fix calls to string case api (#1620)
* Enable IntelliJ inspection for calls to `String.toLowerCase()` and
`String.toUpperCase()`
* Enable error prone check
* Fix all issues
2026-05-26 11:20:02 -07:00
Islon Scherer d6f35dd49e Fix formatter bugs (#1619) 2026-05-26 19:38:35 +02:00
Mirko Alicastro ff319faef3 Use Locale.ROOT when lowercasing rewrite URIs (#1618)
Use Locale.ROOT to apply the lowecase format. For URI scheme and host
locale-neutral casing is the semantically the correct choice. Added a
unit test that sets the default locale to tr-TR and that would fail
without the fix.
2026-05-26 09:37:42 -07:00
Daniel Chao a1eea47b3f Restore @ThreadSafe and @Immutable annotations (#1613) 2026-05-22 15:58:09 -07:00
dependabot[bot] 648f9143bf Bump io.leangen.geantyref:geantyref from 1.3.16 to 2.0.1 (#1566)
Bumps [io.leangen.geantyref:geantyref](https://github.com/leangen/geantyref) from 1.3.16 to 2.0.1.
- [Release notes](https://github.com/leangen/geantyref/releases)
- [Commits](leangen/geantyref@geantyref-v1.3.16...geantyref-v2.0.1)

---
updated-dependencies:
- dependency-name: io.leangen.geantyref:geantyref
  dependency-version: 2.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-22 15:54:27 -07:00
Daniel Chaoandodenix 95bcd6a463 Remove jsr305; switch GuardedBy to com.google.errorprone (#1611)
- Remove single usage of @immutable without replacement
- Remove HttpClient's usages of @threadsafe without replacement
- Replace javax.annotation.concurrent.GuardedBy
  with com.google.errorprone.annotations.concurrent.GuardedBy

Also:
- Remove redundant final modifiers from members of a final class

---------

Co-authored-by: odenix <self@odenix.org>
2026-05-22 14:15:18 -07:00
Daniel Chao a800072441 Fix native build (#1610)
Fix native executable build; there was a missing truffle boundary
2026-05-22 11:50:40 -07:00
Daniel Chao b070d56741 Remove public modifier on LazyHttpClient and RequestRewritingClient (#1609)
This introduces a test helper to expose configured HTTP settings, and
makes the underlying classes package-private again.
2026-05-22 10:17:26 -07:00
Daniel Chao da4dd4c4f8 Make codegen default to jspecify NonNull annotations (#1607)
With JSpecify now a dependency of pkl-config-java, this moves the
non-null annotation to jspecify's.
This makes it simpler for users to do nullness checks, as tooling
already understands JSpecify nullness annotations.
2026-05-21 21:12:15 -07:00
Daniel Chao 8e2e5e4ba8 Improve HTTP headers logic (#1584)
* Relax forbidden headers constraints
  - remove restriction on browser-related headers
- allow any glob pattern (no need to end with `/` or `*`, because glob
patterns already require users to explicitly declare prefix matches if
that's the intention)
* Replace `List<Pair<, ...>>`; use `Map<String, ...>` instead
* Use glob pattern strings as an API throughout, instead of `Pattern`
(e.g. in `HttpClientBuilder`)
* Add HTTP headers to message passing API
* Add HTTP headers to executor API (introduces `ExecutorSpiOptions4`)
* Add tests for Gradle, CLI, and pkl-executor invocations
* Improve documentation
* Add `isGlobPattern` API to class `String` for in-language validation
of http headers
* Behavior change: make sure explicitly configured `User-Agent` in
`HttpClientBuilder` can be shadowed by headers (allows users to set
`--http-header "**=User-Agent: My User Agent"` and for this to be the
only user agent).

CC @kyokuping
2026-05-21 20:07:06 -07:00
Daniel Chao 87ea28260b Configure IntelliJ to respect @LateInit annotations (#1606)
IntelliJ can understand that some annotations on fields mean that they
are implicitly initialized, which means we don't get the "field XXX is
not initialized" warning for `@LateInit` fields.

This setting, unfortunately, is recorded into `.idea/misc.xml`, which
contains a bunch of arbitrary stuff that we don't want to check into
source control

This adds some logic to touch up that file to mark `@LateInit` as
implicitly initialized fields, so we don't get any editor warnings.

Also, suppress some warnings.
2026-05-21 14:34:11 -07:00
odenix 3dc93cbd4a pkl-core: Migrate nullness to JSpecify (#1601)
Replace pkl-core's local nullness annotations with JSpecify annotations.
Enable NullAway checking for pkl-core packages except org.pkl.core.ast
and org.pkl.core.stdlib.

Notable code changes:
- Add a dedicated late-init constructor to VmTyped
- Move VmExceptionBuilder's fallback message derivation from withCause()
to build()
- Split VmException rendering between builder-provided messages and
string-backed messages
- Initialize MessageTransport handlers with default throwing handlers
- Update JSON helper collection types to allow nullable values JSON
arrays and objects can contain JSON null,
so the Java Map/List element types need to model nullable elements
explicitly
- Make public command transform APIs accept nullable transformed values 
   Command transforms can produce null for optional/default handling,
so the BiFunction and options-map element types now model that
explicitly
- Make ExecutorSpiException accept nullable message and cause 
Existing call sites can pass nullable causes from Throwable.getCause()
- Remove JSR-305 semantics from `@LateInit`
   JSpecify does not support the same type-qualifier-nickname pattern,
so `@LateInit` is now documentation plus a NullAway
constructor-initialization exemption

Out of scope:
- NullAway checking of org.pkl.core.ast and org.pkl.core.stdlib
- IntelliJ warnings related to `@LateInit` fields
- Removing the JSR-305 dependency, since concurrency annotations are
still in use
2026-05-21 13:57:20 -07:00
dependabot[bot] 63ef60f3c4 Bump slf4j from 2.0.17 to 2.0.18 (#1605)
Bumps `slf4j` from 2.0.17 to 2.0.18.

Updates `org.slf4j:slf4j-api` from 2.0.17 to 2.0.18

Updates `org.slf4j:slf4j-simple` from 2.0.17 to 2.0.18

---
updated-dependencies:
- dependency-name: org.slf4j:slf4j-api
  dependency-version: 2.0.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.slf4j:slf4j-simple
  dependency-version: 2.0.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-21 09:56:49 -07:00
dependabot[bot] f10b235002 Bump gradle-wrapper from 9.5.0 to 9.5.1 (#1604) 2026-05-21 09:46:41 -07:00
Daniel Chao 1e33179ecc Update codestyles (#1602)
IntelliJ keeps touching this file; these settings must be obsolete.
2026-05-21 08:18:29 -07:00
Daniel Chao 1733a4c6e7 Fix: docsite-info is an optional input (#1598) 2026-05-19 15:20:02 -07:00
odenix dc9003d0f1 pkl-config-java: Refine nullness handling in Config and JavaType (#1544)
Motivation:
Config.as() causes nullness warnings when its result is intentionally assigned
to a non-null variable

Changes:

* Introduce Config.asNullable(Class<T>), asNullable(JavaType<T>), and
  asNullable(Type) to explicitly opt into nullable values
* Keep the signatures of Config.as(Class<T>) and Config.as(JavaType<T>)
  unchanged from 0.31 by adding @NullUnmarked
  * This gives users time to migrate from as() to asNullable() where appropriate
  * Avoids introducing new spurious warnings
* Change `<T> T Config.as(Type)` to `<T extends @nullable Object> T Config.as(Type)`
  * This overload is typically used by reflective code such as
    pkl-config-kotlin's Config.to() rather than directly by user code
* Clarify that JavaType<T> represents a non-null top-level type whose type arguments may be nullable
  * Restricting <T> to non-null keeps method signatures understandable for humans and tools
  * Enables full symmetry between Class<T> and JavaType<T> overloads in Config and JavaType
  * Enables future non-null runtime checks in both Config.as() overloads
* Simplify construction of `JavaType`s with nullable type arguments
  * Add ofNullable() variants for most factory methods, e.g., JavaType.listOfNullable()
* Overhaul Javadoc of Config and JavaType

Result:

* Clear separation between accessing nullable and non-null values
* Config.as() is used for the common non-null case
* Config.as() can perform non-null runtime checks in a future release (breaking change)
* More ergonomic construction of types with nullable type arguments
* More detailed and consistent documentation
2026-05-19 12:27:59 -07:00
Daniel Chao e34c3e8c4f Test reporter fixes (#1597)
* Fix error message when an invalid test reporter is supplied in Gradle
* Fix Gradle property name in docs
* Fix Gradle property name in tasks
* Introduce `TestReporter.default`, and use it in places where default
is applied
* Remove calls to `convention()`; this is not required because the input
is optional anyways.
2026-05-19 11:32:51 -07:00
Islon Scherer 3fbcd463e0 Introduce "minimal" test reporter (#1563) 2026-05-19 17:20:26 +02:00
odenix 566c42f44d pkl-doc: Support single-package docsite mode (#1592)
When a docsite has only one package name and no DocsiteInfo.overview,
treat it like Javadoc's single-module output: redirect the top-level
index to the package page and omit the site-title breadcrumb segment
from generated pages.

Add src/test/files/SinglePackageTest fixtures to cover multiple package
versions, redirect behavior, breadcrumb behavior, and unchanged site
structure.

Also:
- Shut down Executor used in test.
- Declare expected output fixtures of DocGenerator as test inputs, not
outputs.
- Fix IntelliJ warning by using a Set for the right-hand side of
collection subtraction.
2026-05-15 18:38:24 -07:00
Daniel Chao a7a64acbac Improve handling of evaling dependency notation URIs (#1595) 2026-05-15 15:51:09 -07:00
Daniel Chao 3ad1cb3645 Ensure local dependency matches PklProject.dep.json version (#1594)
The version of local project dependencies should _always_ exactly match
up with what's declared in a PklProject.deps.json; any package in the
transitive dependency tree should always be delcaring the same import
too.

Closes #1591
2026-05-15 11:48:57 -07:00
Vladimir Matveev 2fe565a0f2 Added support for external readers in Gradle plugins (#1578)
Adds support for configuring external module and resource readers in the Gradle plugin
2026-05-14 11:18:22 -07:00
odenix 1b6e89c971 pkl-doc: Fix/improve Executor handling in DocGenerator (#1590)
run() now creates and closes a default Executor per call. This is fine
because there is no good reason to call this method multiple times.

run(Executor) now lets callers provide their own Executor, which is
customary for a well-behaved library.

Also: Fix IntelliJ warning by calling toSet()

Closes #1583
2026-05-14 11:02:23 -07:00
dependabot[bot] 6171dbde28 Bump org.msgpack:msgpack-core from 0.9.11 to 0.9.12 (#1587) 2026-05-14 08:51:52 -07:00
dependabot[bot] 99b29ef3c7 Bump github/codeql-action from 4.35.2 to 4.35.4 (#1586) 2026-05-14 08:49:18 -07:00
dependabot[bot] c428f7abd0 Bump com.palantir.javapoet:javapoet from 0.14.0 to 0.15.0 (#1588) 2026-05-14 08:48:29 -07:00
dependabot[bot] 366b51bd21 Bump nu.validator:validator from 26.4.16 to 26.5.7 (#1589) 2026-05-14 08:47:25 -07:00
14085c18bb Add support for customizing HTTP headers (#1196)
This PR adds support for custom HTTP headers, introducing a
`--http-header` CLI flag to accept `key=value` pairs. These headers can
also be specified within the `setting.pkl` file.

Closes #633

SPICE: https://github.com/apple/pkl-evolution/pull/24

---------

Co-authored-by: Jen Basch <jbasch94@gmail.com>
Co-authored-by: Islon Scherer <islonscherer@gmail.com>
2026-05-12 13:53:59 -07:00
Jen Basch fe58405220 Improve some doc comments in pkl:Command (#1582) 2026-05-12 13:53:15 -07:00
Vladimir Matveev bac8b47ba8 Add resource readers from service providers in CLI (#1581)
This omission, in particular, prevents Gradle plugins (which rely on CLI
classes) from adding custom resource readers via the service loading
mechanism. This change seems benign, especially since this is already
done for module key factories.
2026-05-11 16:54:36 -07:00
Jen Basch 713fbc5043 Add missing javadoc for org.pkl.core.CommandSpec (#1577) 2026-05-08 20:29:05 -07:00
Daniel Chao 38733e5781 Fix parsing of dependency notation URIs (#1570)
Fixes a thrown exception when path segments contain characters that
aren't URI safe (e.g. `import "@foo/bar baz.pkl"`).

Closes #1545
2026-05-07 13:00:52 -07:00
dependabot[bot] 8ff03cfac0 Bump gradle-wrapper from 9.4.1 to 9.5.0 (#1575)
Bumps [gradle-wrapper](https://github.com/gradle/gradle) from 9.4.1 to
9.5.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/gradle/gradle/releases">gradle-wrapper's
releases</a>.</em></p>
<blockquote>
<h2>9.5.0</h2>
<p>The Gradle team is excited to announce Gradle 9.5.0.</p>
<p>Here are the highlights of this release:</p>
<ul>
<li>Task provenance in reports and failure messages</li>
<li>Type-safe accessors for precompiled Kotlin Settings plugins</li>
</ul>
<p><a href="https://docs.gradle.org/9.5.0/release-notes.html">Read the
Release Notes</a></p>
<p>We would like to thank the following community members for their
contributions to this release of Gradle:
<a href="https://github.com/atm1020">atm1020</a>,
<a href="https://github.com/mataha">mataha</a>,
<a href="https://github.com/aSemy">Adam</a>,
<a href="https://github.com/kelemen">Attila Kelemen</a>,
<a href="https://github.com/britter">Benedikt Ritter</a>,
<a href="https://github.com/Vampire">Björn Kautler</a>,
<a href="https://github.com/budindepunk">Caro Silva Rode</a>,
<a href="https://github.com/chanani">CHANHAN</a>,
<a href="https://github.com/DmitryNez">Dmitry Nezavitin</a>,
<a href="https://github.com/Juneezee">Eng Zer Jun</a>,
<a href="https://github.com/KugelLibelle">KugelLibelle</a>,
<a href="https://github.com/vmadalin">Madalin Valceleanu</a>,
<a href="https://github.com/quijote">Markus Gaisbauer</a>,
<a href="https://github.com/koppor">Oliver Kopp</a>,
<a href="https://github.com/hfhbd">Philip Wedemann</a>,
<a href="https://github.com/ploober">ploober</a>,
<a href="https://github.com/rpalcolea">Roberto Perez Alcolea</a>,
<a href="https://github.com/R0h1tAnand">Rohit Anand</a>,
<a href="https://github.com/Suvrat1629">Suvrat Acharya</a>,
<a href="https://github.com/usv240">Ujwal Suresh Vanjare</a>,
<a href="https://github.com/urdak">Victor Merkulov</a></p>
<h2>Upgrade instructions</h2>
<p>Switch your build to use Gradle 9.5.0 by updating your wrapper:</p>
<pre><code>./gradlew wrapper --gradle-version=9.5.0 &amp;&amp; ./gradlew
wrapper
</code></pre>
<p>See the Gradle <a
href="https://docs.gradle.org/9.5.0/userguide/upgrading_version_9.html">9.x
upgrade guide</a> to learn about deprecations, breaking changes and
other considerations when upgrading.</p>
<p>For Java, Groovy, Kotlin and Android compatibility, see the <a
href="https://docs.gradle.org/9.5.0/userguide/compatibility.html">full
compatibility notes</a>.</p>
<h2>Reporting problems</h2>
<p>If you find a problem with this release, please file a bug on <a
href="https://github.com/gradle/gradle/issues">GitHub Issues</a>
adhering to our issue guidelines.
If you're not sure you're encountering a bug, please use the <a
href="https://discuss.gradle.org/c/help-discuss">forum</a>.</p>
<p>We hope you will build happiness with Gradle, and we look forward to
your feedback via <a href="https://twitter.com/gradle">Twitter</a> or on
<a href="https://github.com/gradle">GitHub</a>.</p>
<h2>9.5.0 RC4</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/gradle/gradle/commit/3fe117d68f3907790f3809f121aa36303a9151f8"><code>3fe117d</code></a>
Update jdks.yaml (<a
href="https://redirect.github.com/gradle/gradle/issues/37703">#37703</a>)</li>
<li><a
href="https://github.com/gradle/gradle/commit/33d145af6fbe7cf7c9d84646b6d7f32fea91d5e2"><code>33d145a</code></a>
Update jdks.yaml</li>
<li><a
href="https://github.com/gradle/gradle/commit/f7a05d1ed48442eb5da4d6e2b6593da55cdec1da"><code>f7a05d1</code></a>
Update Gradle wrapper to version 9.5.0-rc-4 (<a
href="https://redirect.github.com/gradle/gradle/issues/37654">#37654</a>)</li>
<li><a
href="https://github.com/gradle/gradle/commit/266facdcbcb0b4c60120cc118eaf0f652bfcdfe5"><code>266facd</code></a>
Update Gradle wrapper to version 9.5.0-rc-4</li>
<li><a
href="https://github.com/gradle/gradle/commit/0ad6dd8e143455707e444aa7e3d38327a3366513"><code>0ad6dd8</code></a>
Suppress OSC taskbar reset on plain/piped stdout (<a
href="https://redirect.github.com/gradle/gradle/issues/37646">#37646</a>)</li>
<li><a
href="https://github.com/gradle/gradle/commit/966025d5850d46c9158a2f25e4096222277ecf57"><code>966025d</code></a>
Suppress OSC taskbar reset on plain/piped stdout</li>
<li><a
href="https://github.com/gradle/gradle/commit/e7455734449e422accebf44cf7b31bf93e3a770c"><code>e745573</code></a>
Polish IP docs (<a
href="https://redirect.github.com/gradle/gradle/issues/37642">#37642</a>)</li>
<li><a
href="https://github.com/gradle/gradle/commit/d5cfd079acd2c8f1182edd6ec23dbab571132d0a"><code>d5cfd07</code></a>
Ensure BuildOperationQueue will progress without extra leases (<a
href="https://redirect.github.com/gradle/gradle/issues/37629">#37629</a>)</li>
<li><a
href="https://github.com/gradle/gradle/commit/acdf0c36fa13ba09a7ff5b51f79b9af4b1a097ee"><code>acdf0c3</code></a>
Ensure BuildOperationQueue will progress without extra leases</li>
<li><a
href="https://github.com/gradle/gradle/commit/f7d0e4f6f7896426a8b24091388e4c252b62faef"><code>f7d0e4f</code></a>
Rename anchor</li>
<li>Additional commits viewable in <a
href="https://github.com/gradle/gradle/compare/v9.4.1...v9.5.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=gradle-wrapper&package-manager=gradle&previous-version=9.4.1&new-version=9.5.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-07 12:28:59 -07:00
dependabot[bot] be8366a975 Bump jline from 4.0.12 to 4.0.14 (#1574)
Bumps `jline` from 4.0.12 to 4.0.14.

Updates `org.jline:jline-reader` from 4.0.12 to 4.0.14
- [Release notes](https://github.com/jline/jline3/releases)
- [Commits](jline/jline3@4.0.12...4.0.14)

Updates `org.jline:jline-terminal` from 4.0.12 to 4.0.14
- [Release notes](https://github.com/jline/jline3/releases)
- [Commits](jline/jline3@4.0.12...4.0.14)

Updates `org.jline:jline-terminal-jni` from 4.0.12 to 4.0.14
- [Release notes](https://github.com/jline/jline3/releases)
- [Commits](jline/jline3@4.0.12...4.0.14)

---
updated-dependencies:
- dependency-name: org.jline:jline-reader
  dependency-version: 4.0.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.jline:jline-terminal
  dependency-version: 4.0.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.jline:jline-terminal-jni
  dependency-version: 4.0.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-07 11:17:45 -07:00
Jen Basch 8a4821c4e7 Power assertions: change source section check to an assert (#1572) 2026-05-04 13:53:40 -07:00
Jen Basch b7ba6a8649 Fix pkl:test fact power assertions when member source section is unavailable (#1571)
Power assertions only work when the source section is available. If it
is unavailable, power assertions throw a ParserError (unexpected EOF on
an empty input) when re-parsing the expression for presentation.
2026-05-04 12:25:15 -07:00
dependabot[bot] 9c1a9cb4f8 Bump kotlinToolchain from 2.3.20 to 2.3.21 (#1567)
Updates `org.jetbrains.kotlin:kotlin-gradle-plugin` from 2.3.20 to 2.3.21
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](JetBrains/kotlin@v2.3.20...v2.3.21)

Updates `org.jetbrains.kotlin.plugin.serialization` from 2.3.20 to 2.3.21
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](JetBrains/kotlin@v2.3.20...v2.3.21)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin:kotlin-gradle-plugin
  dependency-version: 2.3.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.jetbrains.kotlin.plugin.serialization
  dependency-version: 2.3.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-30 08:31:46 -07:00
dependabot[bot] 5d4bac8f61 Bump com.uber.nullaway:nullaway from 0.13.2 to 0.13.4 (#1568)
Bumps [com.uber.nullaway:nullaway](https://github.com/uber/NullAway) from 0.13.2 to 0.13.4.
- [Release notes](https://github.com/uber/NullAway/releases)
- [Changelog](https://github.com/uber/NullAway/blob/master/CHANGELOG.md)
- [Commits](uber/NullAway@v0.13.2...v0.13.4)

---
updated-dependencies:
- dependency-name: com.uber.nullaway:nullaway
  dependency-version: 0.13.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-30 08:31:14 -07:00
Daniel Chao 4a25320995 Fix import/read verification when encountering glob wildcards (#1559)
Fixes an issue where the import verifier can possibly throw when
packaging on Windows due to `*` being an invalid filename.
2026-04-29 20:20:49 -07:00
Vladimir Matveev df063f17f3 Added pkg module key factory and resource reader to project loading (#1547)
This change allows `PklProject` files, usually loaded via the `Project`
static methods, to have references to external packages via `package://`
URIs.

This is helpful for centralizing and sharing common package
configuration via packages.
2026-04-29 16:45:14 -07:00
Kushal Pisavadia d3a3a14aaa Fix CRLF handling in line continuation escapes (#1564) 2026-04-29 13:53:55 -07:00
Daniel Chao 39c01c24ba Add another commit to ignore revs file (#1561)
Add commit from https://github.com/apple/pkl/pull/1560
2026-04-25 11:58:55 -07:00
Daniel Chao 2b3603b544 Reformat Kotlin code (#1560)
ktfmt has much improved how it formats Kotlin code. Unfortunately, this
means that whenever we touch a single line in a Kotlin file, we get a
_lot_ more changes thanks to ratcheting now picking up this file for
formatting.

This PR just reformats every single Kotlin file so we don't have to deal
with this churn in future PRs that touch Kotlin code.
2026-04-25 06:14:44 -07:00
Daniel Chao c4f56bf20d Fix setting DEBUG_ARGS (#1558)
Looks like context variable `runner` isn't available on the job level
`env`. It's available on the step level `env` though.
2026-04-24 19:34:08 -07:00
Daniel Chao 87b15f7a70 Only set --stacktrace --info if verbose logging is enabled (#1557)
This is a quality-of-life improvement; make our build logs more easy to
read through for the default case.

If we need more information, we can click on the "Enable debug logging"
checkbox when re-running a job, which then populates the `runner.debug`
context variable.
2026-04-24 15:28:57 -07:00
Daniel Chao e07ff96de8 Switch CodeQL to use PklCI API (#1555) 2026-04-23 11:28:16 -07:00
dependabot[bot] 88a56198a8 Bump nu.validator:validator from 26.4.2 to 26.4.16 (#1550)
Bumps [nu.validator:validator](https://github.com/validator/validator) from 26.4.2 to 26.4.16.
- [Release notes](https://github.com/validator/validator/releases)
- [Commits](https://github.com/validator/validator/commits/26.4.16)

---
updated-dependencies:
- dependency-name: nu.validator:validator
  dependency-version: 26.4.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-23 11:19:19 -07:00
dependabot[bot] de22705add Bump com.google.errorprone:error_prone_core from 2.48.0 to 2.49.0 (#1552)
Bumps [com.google.errorprone:error_prone_core](https://github.com/google/error-prone) from 2.48.0 to 2.49.0.
- [Release notes](https://github.com/google/error-prone/releases)
- [Commits](google/error-prone@v2.48.0...v2.49.0)

---
updated-dependencies:
- dependency-name: com.google.errorprone:error_prone_core
  dependency-version: 2.49.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-23 10:14:28 -07:00
Jen Basch e07abb7311 SPICE-0028: Add support for multi-line string line continuations (#1507)
SPICE: https://github.com/apple/pkl-evolution/pull/31
2026-04-21 10:29:52 -07:00
dependabot[bot]andDan Chao d85f06be27 Bump org.snakeyaml:snakeyaml-engine from 2.10 to 3.0.1 (#1538)
Bumps [org.snakeyaml:snakeyaml-engine](https://bitbucket.org/snakeyaml/snakeyaml-engine) from 2.10 to 3.0.1.
- [Commits](https://bitbucket.org/snakeyaml/snakeyaml-engine/branches/compare/snakeyaml-engine-3.0.1..snakeyaml-engine-2.10)

---
updated-dependencies:
- dependency-name: org.snakeyaml:snakeyaml-engine
  dependency-version: 3.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dan Chao <dan.chao@apple.com>
2026-04-20 22:28:57 -07:00
Lucas Shadler d4dacd5a0f Implement gradle configuration cache support (#1500)
Modern versions of Gradle support configuration caching
to prevent the gradual increase of project size to affect
the overall developer experience of Gradle builds. To
prepare the PKL project, and specificall pkl-gradle, for
configuration support, we introduce an integration test to
vet configuration cache rules, and then perform the necessary
updates to provide configuration cache support.
2026-04-20 22:02:13 -07:00
dependabot[bot] 7b70a44272 Bump com.uber.nullaway:nullaway from 0.13.1 to 0.13.2 (#1540)
Bumps [com.uber.nullaway:nullaway](https://github.com/uber/NullAway) from 0.13.1 to 0.13.2.
- [Release notes](https://github.com/uber/NullAway/releases)
- [Changelog](https://github.com/uber/NullAway/blob/master/CHANGELOG.md)
- [Commits](uber/NullAway@v0.13.1...v0.13.2)

---
updated-dependencies:
- dependency-name: com.uber.nullaway:nullaway
  dependency-version: 0.13.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-20 11:30:30 -07:00
Daniel Chao a33e431433 Enable codeql scanning (#1532)
This enables security vulnerability scanning using CodeQL.
2026-04-20 11:28:31 -07:00
Daniel Chao 4058f391a3 Fix dependabot (#1537)
Looks like `directory` is a required property; we should also fix our
schema but that's orthogonal to this actual fix.
2026-04-20 11:17:31 -07:00
odenix 7a75ab57f5 pkl-config-java: Replace Config.fromPklBinary() with ConfigDecoder (#1533)
Motivation:
- `Config` mixes configuration representation with decoding logic
- `Config.fromPklBinary()` does not scale as decoding gains options
(e.g., binary versions or formats)
- The decoding API is inconsistent with `ConfigEvaluator`

Changes:
- Introduce `ConfigDecoder` (with builder) and move
`Config.fromPklBinary()` logic into it
- Deprecate `Config.fromPklBinary()` methods for removal
- Add `ConfigDecoder.forKotlin()` extension function
- Update and improve tests

Result:
- Decoding is separated from `Config` and exposed via a dedicated API
- Decoding can evolve independently (e.g., adding options such as binary
versions or supporting new formats)
- Evaluation and decoding APIs follow a consistent design
2026-04-20 11:09:42 -07:00
Daniel Chao 07c68239b9 Remove lockfiles, manage Gradle dependencies with Dependabot (#1535)
Dependabot currently does not update lockfiles in multi-module projects
(see https://github.com/dependabot/dependabot-core/issues/14633)

To work around this issue, we will simply remove our lockfiles, and
change our version catalog to use fully specified versions.
The removal of lockfiles introduces two issues:

1. It is less visible what our dependency graph is
2. Our builds are potentially non-reproducible

To work around this, two mitigations are in place:

1. Enable `failOnDynamicVersions()`, which causes Gradle to fail the
build if any dependencies declare a version range
2. Enable GitHub dependency submission, which provides insight into the
project SBOM
2026-04-20 09:29:33 -07:00
Daniel Chao 9046221e03 Fix dependency scopes (#1534)
Fixes the following pom.xml issues:

1. pkl-doc and pkl-codegen-java sets the wrong dependency scopes for
pkl-commons-cli/pkl-base
2. pkl-config-kotlin sets the wrong dependency scope for
pkl-config-java-all

Closes #1293
Closes #1517
2026-04-20 08:54:49 -07:00
odenix 2e49a319b3 pkl-gradle: Migrate nullness to jSpecify (#1530) 2026-04-17 12:34:54 -07:00
Daniel Chao b1a5d8c915 Remove Config.makeConfig (#1531)
This doesn't really make sense as part of the `Config` API.

We can maybe make class `ConfigUtils` public, but, I don't know how useful it
is anyways; it's more of an implementation detail.
2026-04-17 11:19:02 -07:00
odenix 1571d72111 pkl-config-java: Migrate nullness to jSpecify (#1528) 2026-04-17 08:56:12 -07:00
Daniel Chao 2dd0e2de21 Only include *runtimeClasspath and *compileClasspath dependencies (#1529) 2026-04-16 17:09:08 -07:00
odenix 8103b7759f pkl-executor: Migrate nullness to jSpecify (#1527)
Annotating SPI classes is binary compatible (forward and backward).
2026-04-16 15:02:40 -07:00
Islon Scherer 03a641354e Add nullability check to pkl-formatter (#1526) 2026-04-16 08:37:56 -07:00
Jen Basch eeb0970dc4 Fix bug where reusing a pklbinary#Renderer could result in incorrect output (#1525) 2026-04-15 23:12:36 -07:00
Daniel Chao a8500b6b03 Add dependency submission (#1523)
This adds jobs to add Gradle dependencies to [GitHub's dependency
submission
API](https://docs.github.com/en/code-security/how-tos/secure-your-supply-chain/secure-your-dependencies/using-the-dependency-submission-api),
and to review when these dependencies change.
2026-04-15 22:21:17 -07:00
odenixandDaniel Chao 4faf35a66a Gradle: Replace legacy buildSrc mechanism with included build (#1524)
Motivation:
buildSrc is a special-case legacy mechanism.
Gradle recommends using an included build named build-logic instead:

https://docs.gradle.org/current/userguide/best_practices_structuring_builds.html#favor_composite_builds

Changes:
- Rename buildSrc/ to build-logic/
  - triggers reformatting
- Replace occurrences of "buildSrc" with "build-logic"
- Include the build-logic build in the main build (via
settings.gradle.kts)
- Apply convention plugins via plugin IDs instead of type-safe accessors
  - small tradeoff compared to buildSrc

Result:
- Faster and more isolated builds
- Build logic behaves like a normal build, making it easier to evolve
and reason about

---------

Co-authored-by: Daniel Chao <dan.chao@apple.com>
2026-04-15 21:37:10 -07:00
odenixandDaniel Chao 04a9cc90d2 Improve build logic for Kotlin (#1520)
- Enforce Kotlin version via resolution rule (replaces BOM)
  - fail if kotlin-stdlib/kotlin-reflect exceed target version
- Replace kotlin-stdlib-jdk8 with kotlin-stdlib (jdk7/8 are now shims)
- Port pkl-core annotation processor to Java (with Codex)
- removes kotlin-stdlib from its compile classpath for better dependency
hygiene (Java module)
- Downgrade clikt for Kotlin 2.2 compatibility
- Upgrade kotlinx-serialization

---------

Co-authored-by: Daniel Chao <dan.chao@apple.com>
2026-04-15 09:02:42 -07:00
Islon Scherer 2e0b4a3a97 Fix gradle build issue during spotlessCheck (#1521) 2026-04-15 16:06:14 +02:00
odenix 1ba54f11a9 pkl-parser: Migrate nullness to JSpecify (#1515) 2026-04-14 12:17:17 -07:00
odenix 2d4286ee7b Upgrade JVM toolchain to 25 and Kotlin toolchain to 2.3.20 (#1516)
Motivation
- Enable correct NullAway analysis
- Pick up toolchain fixes and improvements

Toolchains
- Require JDK 25 for JVM toolchain (keep Java 17 runtime compatibility)
- Require Kotlin 2.3.20 for Kotlin toolchain (keep Kotlin 2.2 runtime
compatibility)
- Require JDK 25 for Gradle daemon JVM (via
gradle-daemon-jvm.properties)
- Fix javac and kotlinc warnings from toolchain upgrades

CI
- Bump GitHub workflows to JDK 25

Building Kotlin
- Bump Kotlin language level to 2.2 to match stdlib version
- Consolidate build logic into pklKotlinBase.gradle.kts
- Adopt modern Kotlin plugin syntax
- Fix new kotlinc warnings
- Update ktfmt to 0.62
  - first version compatible with Kotlin 2.3.20
  - changes formatting compared to 0.61
- Replace dependency resolution rule with BOM alignment
  - rule was too broad and interfered with toolchain/runtime separation

Testing
- Expand matrix to JDK 25 (LTS) and 26
- Ensure each matrix task can be run independently
- Fix KotlinCodeGeneratorsTest and EmbeddedExecutorsTest on affected
JDKs
- Disable one test in CliCommandTest on affected JDKs (failure cause
unknown)

Compatibility fixes
- Fix reflective access in DocGenerator on affected JDKs

Build fixes
- Fix misuse of `task.enabled` vs. `report.required`
- Fix `gradlew tasks` on Windows
- Downgrade Spotless to 8.3.0 to (hopefully) work around sporadic
NoClassDefFoundError

Result
- NullAway runs correctly
- Broader JDK test coverage
- More reproducible and potentially faster builds
2026-04-14 11:57:09 -07:00
Daniel Chao 20f403e751 Add spotless formatter step to revert copyright year only changes (#1518)
This avoids an issue where, during the course of development, a file is
touched, thus modifying the copyright year.
Then, undoing the previous change does not undo the copyright year
change.
2026-04-14 09:02:31 -07:00
Daniel Chao 7f173cc8e8 Fix stdlib lockfile (#1519)
Kotlin isn't a dependency of pkl-formatter anymore.
2026-04-14 08:38:30 -07:00
Islon Scherer 1d74e2a869 Move pkl-formatter to Java (#1514) 2026-04-14 16:29:42 +02:00
odenix 4620992743 pkl-parser: Represent "no children" as an empty list instead of null (#1513)
Motivation:
Facilitate the use of the NullAway checker as part of moving to
JSpecify.

Changes:
- represent "no children" as `List.of()` instead of null
- remove obsolete `children != null` assertions
  - NullAway intentionally ignores such assertions
- remove "no children" special-casing where no longer necessary

Result:
- cleaner code with similar performance
- removed a barrier to using the NullAway checker
2026-04-09 08:05:34 -07:00
odenix 2cfd0a0d28 Update JLine to 4.x (#1511)
- Remove dependency org.fusesource.jansi:jansi
- In 4.x, org.fusesource.jansi:jansi was replaced with org.jline:jansi.
Instead of adding this new dependency, this commit replaces Pkl’s single
Jansi usage with custom code that preserves existing behavior. Fixing
existing ANSI quirks is left for a future PR.
- Replace jline-terminal-ansi with jline-terminal-jni
  - In 4.x, only -jni and -ffm are available (-ffm requires Java 22+)
- Configure native-image build for jline-terminal-jni

As updating JLine is delicate, I manually tested `pkl repl` and `jpkl
repl` on Windows 11 (using Windows Terminal) and on Ubuntu, and found no
issues. However, I do not have access to a macOS machine.
2026-04-08 16:25:39 -07:00
odenix fdeb568343 Clean up Kotlin code in buildSrc/ (#1512)
- fix most IntelliJ warnings (regex refactoring was done by IDE)
- replace hardcoded JVM target versions with BuildInfo.jvmTarget
2026-04-08 16:09:37 -07:00
Daniel Chao ff6f7223d3 Remove intellij plugin (#1510)
This plugin is being moved to pkl-project-commons. 

Closes #1491

See https://github.com/apple/pkl-project-commons/pull/75
2026-04-08 13:46:23 -07:00
Daniel Chao aca5a32f8e Bump license year (#1504) 2026-04-08 08:13:58 -07:00
odenix 24e69fd1e2 Improve Parser implementation (#1508)
- Make leaf AST classes final
- Make protected Lexer fields private and add getter
- Split Parser into Parser and ParserImpl
- Using a fresh ParserImpl instance per parse simplifies reasoning
(important) and makes the Parser API thread-safe (nice to have)
- Split GenericParser into GenericParser and GenericParserImpl
  - Same motivation as for Parser

Some of these changes will facilitate the move to JSpecify, which has
proven challenging for this package.
2026-04-08 08:13:39 -07:00
odenix e793f4bd04 Update ktfmt to 0.61 (#1509) 2026-04-07 14:49:01 -07:00
odenix 09435af54f Improve Formatter API (#1505)
- pass `GrammarVersion` to constructor instead of passing it to each
`format` method
- replace `format(Path): String` with `format(Reader, Appendable)`
- instead of picking which overloads besides `format(String): String`
might be useful, offer a single generalized method that streams input
and output
- add `@Throws(IOException::class)` to ensure that Java callers can
catch this exception
- deprecate old methods
2026-04-07 14:16:12 -07:00
odenix 99cbd07518 Update GraalVM to 25.0.1 (#1506)
The latest version (25.0.2) no longer supports macos-x64.
2026-04-07 13:21:19 -07:00
Daniel Chao 8b892f9409 Bump Gradle to 9.4.1 (#1502) 2026-04-07 08:32:43 -07:00
odenix 7dedddcdb1 Update Gradle plugins (#1503) 2026-04-07 06:48:31 -07:00
odenix 623912eca0 Update msgpack to 0.9.11 and slf4j to 2.x (#1501) 2026-04-06 22:00:07 -07:00
odenix dcd60b8194 Update nu-validator from 20.x to 26.x (#1499)
Also fix incorrect heading level in two Pkldoc tests, as this issue is
now flagged by nu-validator.
2026-04-06 19:25:00 -07:00
odenix 1251843169 Update Kotlin dependencies (#1498) 2026-04-06 12:06:43 -07:00
Daniel Chao 9868c11e5a Disable flaky test (#1497)
Disabling for now due to #1493
2026-04-06 11:39:00 -07:00
odenix 0835c6da82 Update JUnit to 6.x (#1496) 2026-04-06 11:15:55 -07:00
odenix a8c66938e6 Update dependencies (#1492)
Update dependencies by running `./gradlew updateDependencyLocks`. Most
of the updated dependencies are test dependencies.
2026-04-06 08:22:06 -07:00
Luke Daley 8e7eb2bd96 Fix data race in MessagePack encoder for concurrent server sends (#1486) 2026-04-04 14:26:16 -07:00
odenix 58033598c7 Fix Javadoc and kotlinc warnings (#1490) 2026-04-03 14:32:34 -07:00
Islon Scherer bc503d4d60 Make the build work on jdk 25 (#1483)
The old version of googleJavaFormat we were using called some deprecated
function.
2026-03-31 09:38:36 +02:00
Jen BaschandIslon Scherer 82afa8b90b Port 0.31.1 changelog to main (#1476)
Co-authored-by: Islon Scherer <i_desouzascherer@apple.com>
2026-03-26 09:41:01 -07:00
Islon Scherer dc5504749a Disable gradle cache for release builds (#1474) 2026-03-26 16:54:10 +01:00
Jen Basch a9c890e2f9 Do not activate power assertions when a single union member containing a type constraint fails (#1462)
Prior to this change, this code would activate powers assertions /
instrumentation permanently:
```pkl
foo: String(contains("a")) | String(contains("b")) = "boo"
```

This is because the `contains("a")` constraint would fail, triggering
power assertions, but the subsequent check of the union's
`contains("b")` branch would succeed.
As observed in #1419, once instrumentation is enabled, all subsequent
evaluation slows significantly.
As with #1419, the fix here is to disable power assertions via
`VmLocalContext` until we know that all union members failed type
checking; then, each member is re-executed with power assertions allowed
to provide the improved user-facing error.
2026-03-25 11:52:37 -07:00
Jen Basch f23c37a993 Prevent --multiple-file-output-path writes from following symlinks outside the target directory (#1467) 2026-03-25 11:50:20 -07:00
Jen Basch cdc6fa8aec Prevent I/O when checking UNC paths against --root-dir (#1466)
Test on [windows] please
2026-03-25 11:40:51 -07:00
Jen Basch 1104f12362 Allow custom/external resources to be "not found" (#1471)
This allows custom/external resources to produce `null` values for
nullable reads (`read?`)

Ref: https://github.com/apple/pkl-go/issues/157
2026-03-24 12:43:44 -07:00
Jen Basch cce84d7ccc Correct SecurityManager check for HTTP(S) module URIs (#1463) 2026-03-23 07:43:07 -07:00
Jen Basch a6db476c70 Fix module reflection when instrumentation is active (#1464) 2026-03-23 07:42:40 -07:00
splint-disk-8i 3f3271d3b1 Update deprecated OpenJDK links in DEVELOPMENT.adoc (#1468)
Fixes broken links and grammar in DEVELOPMENT.adoc:

- Mailing list URL: openjdk.java.net → openjdk.org (old domain returns
301)
- Truffle FAQ link: old OpenJDK wiki is gone (404) — replaced with
current GraalVM Truffle docs
- Grammar: "enables to run" → "enables you to run"
- Grammar: "jenv use specific" → "jenv uses specific"
2026-03-16 10:27:12 -07:00
dependabot[bot] 46da9cb33a Bump actions/create-github-app-token from 2.2.1 to 2.2.2 (#1469) 2026-03-16 09:55:09 -07:00
Jen Basch 3eda3b197e Bump pkl.impl.ghactions to version 1.5.0 (#1460) 2026-03-03 17:59:39 -08:00
Jen Basch 0e685591eb Respect --omit-project-settings for all evaluator options (#1459) 2026-03-03 16:23:42 -08:00
dependabot[bot] 51bb1a5c7e Bump gradle/actions from 5.0.1 to 5.0.2 (#1456) 2026-03-02 09:00:50 -08:00
layla 7c5a80a584 Fix typo: recieve to receive (#1455) 2026-03-01 13:43:29 -08:00
Kushal Pisavadia f9b880be85 Fix command typealias unwrapping in resolveType (#1449)
The loop unwraps nullables and constraints but breaks straight away
after a `typealias`. This means the nullable is missed. Removing the
`break` fixes it.

## Exception

```
org.pkl.core.PklException: –– Pkl Error ––
Command option property `foo` has unsupported type `String?`.

11 | foo: OptionalString
     ^^^^^^^^^^^^^^^^^^^
at <unknown> (file:///var/folders/xh/lmp1n6qj4m13t53cfmbqnkwh0000gn/T/junit-1378070630576324311/cmd.pkl)

Use a supported type or define a transformEach and/or transformAll function
```
2026-02-27 13:33:00 -08:00
Jen Basch 7119526245 Fix typo in 0.31 release notes (#1450) 2026-02-27 13:18:10 -08:00
Kushal Pisavadia 64ea7951db Fix stream double-consumption in CommandSpecParser (#1448)
The `choices` stream was consumed eagerly for metavar construction, then
captured in a lambda for later validation—which promptly fell over with
`IllegalStateException`. Materialise to a `List` straightaway.
2026-02-27 10:04:32 +00:00
Islon Scherer cac3e483b5 Start next dev iteration 2026-02-26 09:51:27 -08:00
Islon Scherer 4d35f18309 Prepare 0.31.0 release 2026-02-26 09:51:27 -08:00
Jen Basch 4cf2a1b42c Allow command options to have nullable types and default values (#1444) 2026-02-26 08:34:46 -08:00
Jen Basch 3ef065b6b6 Correct --root-dir check to also work for jar:file: URIs (#1442) 2026-02-25 10:57:01 -08:00
Jen Basch be21c34938 Allow command transformAll functions to perform imports (#1440) 2026-02-25 08:03:53 -08:00
Jen Basch 2e4d73b957 Fix regression in CLI error handling when project loading fails (#1439) 2026-02-25 01:28:05 -08:00
Jen Basch 28b09134d7 Add release notes for 0.31 (#1438) 2026-02-24 08:56:16 -08:00
Jen Basch 4611d181a8 Remove broken Collection.transpose method (#1437) 2026-02-24 08:09:52 -08:00
Jen Basch 12915f520f Fix command error and import handling (#1436) 2026-02-24 08:09:25 -08:00
Jen Basch 2ec0baad53 Allow referring to remote project dependencies on the CLI with @-notation (#1434) 2026-02-23 08:52:56 -08:00
dependabot[bot] 77395a86f4 Bump EnricoMi/publish-unit-test-result-action from 2.22.0 to 2.23.0 (#1435) 2026-02-23 08:51:04 -08:00
Jen Basch a5dc91f0a5 Command flag behavior improvements (#1432)
* Forbid overlap of built-in and command-defined flag names 
* Allow interleaving built-in and command-defined flags on the command
line
* List abbreviated flag names first, matching the behavior of built-in
flags
2026-02-20 12:00:18 -08:00
Jen Basch 08712e8b26 Fix display of evaluation errors thrown by command convert/transformAll (#1431) 2026-02-20 07:51:33 -08:00
Jen Basch e07868b404 Handle lexer errors in pkl format (#1430)
Resolves #1421
2026-02-19 10:00:00 -08:00
Jen Basch 72a57af164 SPICE-0025: pkl run CLI framework (#1367) 2026-02-12 07:53:02 -08:00
Jen Basch 63a20dd453 Improve org.pkl.formatter.Formatter JVM API (#1428)
Makes for less fussing around to consume this API from the Gradle side
2026-02-11 09:22:42 -08:00
Islon Scherer 60f628eb36 Fix possible race condition during module and resource reading (#1426) 2026-02-11 11:18:11 +01:00
Jen Basch 817e433a7f Document annotations and annotation converters (#1427) 2026-02-09 10:19:47 -08:00
Islon Scherer 08d8c8ec7a Improve import formatting (#1424) 2026-02-06 17:57:50 +01:00
Jen Basch effa4844e6 Bump pkl.impl.ghactions to version 1.3.5 (#1422) 2026-02-06 08:43:45 -08:00
Islon Scherer f0449c8330 Add flag to turn power assertions on/off (#1419) 2026-02-03 09:35:16 +01:00
dependabot[bot] 7b7b51c0ae Bump gradle/actions from 5.0.0 to 5.0.1 (#1420)
Bumps [gradle/actions](https://github.com/gradle/actions) from 5.0.0 to
5.0.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/gradle/actions/releases">gradle/actions's
releases</a>.</em></p>
<blockquote>
<h2>v5.0.1</h2>
<h2>What's Changed</h2>
<ul>
<li>Bump <code>npm</code> code dependency versions</li>
<li>Bump Gradle versions used in sample builds</li>
<li>Bump dependencies versions in Gradle sample builds</li>
<li>Bump GitHub actions used for build and test</li>
<li>Update known wrapper checksums to include Gradle 9.2+</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/gradle/actions/compare/v5.0.0...v5.0.1">https://github.com/gradle/actions/compare/v5.0.0...v5.0.1</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/gradle/actions/commit/f29f5a9d7b09a7c6b29859002d29d24e1674c884"><code>f29f5a9</code></a>
Attempt to fix flaky caching tests (<a
href="https://redirect.github.com/gradle/actions/issues/836">#836</a>)</li>
<li><a
href="https://github.com/gradle/actions/commit/8c7f3ffba4042e38a9b017ec1433452e674e4403"><code>8c7f3ff</code></a>
Bump to v1.4.1 of the dependency-submission plugin</li>
<li><a
href="https://github.com/gradle/actions/commit/85e9805d21cf3b1d1c54c470ae15083df20e00ed"><code>85e9805</code></a>
[bot] Update dist directory</li>
<li><a
href="https://github.com/gradle/actions/commit/acb81f1e15dbc4ea06da2aa52ac9a056747ba8cf"><code>acb81f1</code></a>
Bump the npm-dependencies group across 1 directory with 8 updates (<a
href="https://redirect.github.com/gradle/actions/issues/821">#821</a>)</li>
<li><a
href="https://github.com/gradle/actions/commit/00660c8721edeac5845b81ab1a2d47af4de1e150"><code>00660c8</code></a>
Bump github/codeql-action from 4.31.10 to 4.32.0 in the github-actions
group ...</li>
<li><a
href="https://github.com/gradle/actions/commit/d498ad3b5f3030c0feb2913ae7059605e5d4de40"><code>d498ad3</code></a>
[bot] Update dist directory</li>
<li><a
href="https://github.com/gradle/actions/commit/de83f3396312260c9a3dfc1d77ee4b6f2361eb9a"><code>de83f33</code></a>
Update Gradle version and Gradle dependencies (<a
href="https://redirect.github.com/gradle/actions/issues/834">#834</a>)</li>
<li><a
href="https://github.com/gradle/actions/commit/baabf402fa7896574cf6caf18668d5509e3ce8ef"><code>baabf40</code></a>
Bump the github-actions group across 2 directories with 5 updates</li>
<li><a
href="https://github.com/gradle/actions/commit/69353a9e141a8a7865bcbf48a099ad644e9adf2f"><code>69353a9</code></a>
Bump the gradle group across 1 directory with 4 updates</li>
<li><a
href="https://github.com/gradle/actions/commit/221c7f4dbd2468936638e2ba4fe1d987ce3bbe0d"><code>221c7f4</code></a>
Update known wrapper checksums</li>
<li>Additional commits viewable in <a
href="https://github.com/gradle/actions/compare/4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2...f29f5a9d7b09a7c6b29859002d29d24e1674c884">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=gradle/actions&package-manager=github_actions&previous-version=5.0.0&new-version=5.0.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-02 09:39:13 -08:00
dependabot[bot] a2bfbd72a7 Bump actions/checkout from 6.0.1 to 6.0.2 (#1417) 2026-01-26 09:04:22 -08:00
dependabot[bot] 11b65e4d7a Bump actions/setup-java from 5.1.0 to 5.2.0 (#1416) 2026-01-26 08:55:53 -08:00
Jen Basch 73264e8fd1 SPICE-0024: Annotation converters (#1333)
This enables defining declarative key and/or value transformations in
cases where neither `Class`- nor path-based converters can be applied
gracefully. It is also the only way to express transforming the
resulting property names in `Typed` objects without applying a converter
to the entire containing type, which is cumbersome at best.

SPICE: https://github.com/apple/pkl-evolution/pull/26
2026-01-23 12:44:41 -08:00
Daniel Chao ed0cad668f Fix Function.toString (#1411)
Fixes an issue where the underlying default Java toString() is leaking
through
2026-01-21 07:29:58 -08:00
Daniel ChaoandIslon Scherer 03a7676e64 Implement power assertions (#1384)
This adds power assertions to Pkl!

This implements the SPICE described in
https://github.com/apple/pkl-evolution/pull/29

This follows the power assertions style of reporting also found in
Groovy, Kotlin, and others.

* Literal values are not emitted in the diagram
* Stdlib constructors of literals like `List(1, 2)` are also considered
  literals

Power assertions are added to:

* Failing type constraints
* Failing test facts

Power assertions are implemented as a truffle instrument to observe
execution.
When an assertion fails, the instrument is created and the assertion is
run again to observe facts.
This incurs runtime overhead to collect facts, but has no impact on code
in the non-error case.

---------

Co-authored-by: Islon Scherer <islonscherer@gmail.com>
2026-01-20 21:41:33 -08:00
Daniel Chao 3cd294b62a Add 'let' to list of control keywords (#1409)
Small improvement to syntax highlighting
2026-01-19 20:00:21 -08:00
Jen Basch f6cfc82201 Bump pkl.impl.ghactions to version 1.3.3 (#1408)
Updates pkl.impl.ghactions package to version 1.3.3
2026-01-15 12:06:56 -08:00
Jen Basch fd66438828 Bump pkl.impl.ghactions to version 1.3.2 (#1403)
Updates pkl.impl.ghactions package to version 1.3.2
2026-01-12 18:01:46 -08:00
Daniel Chao b4bd292511 Handle IOException when creating PklProject.deps.json (#1405)
Fixes an issue that otherwise bubbles up as "An unexpected error has
occured".
2026-01-12 15:08:38 -08:00
Daniel Chao f1c71bc9bb Emit error stack trace on non Pkl exceptions (#1402)
If the thrown error is not a Pkl exception, some internal error
occurred, and we need to emit the stack trace for visibility.
2026-01-12 13:45:39 -08:00
Akshat AnandandJen Basch 9d385f2194 Fix super method call inside let expression (#1383)
Fixes #1309

The issue was that super calls were blocked inside let expressions
because:
1. The compiler's isClassMemberScope() check didn't skip over lambda
scopes created by let expressions
2. The runtime's findSupermethod() didn't traverse past VmFunction
owners to find the actual class prototype

Changes:
- SymbolTable.java: Updated isClassMemberScope() to skip lambda scopes
before checking if the parent is a class or module scope
- InvokeSuperMethodNode.java: Updated findSupermethod() to skip
VmFunction owners when looking for the class prototype

Added regression tests covering:
- Super method calls inside let expressions
- Super property access inside let expressions
- Nested let expressions with super calls

---------

Co-authored-by: Jen Basch <jbasch@apple.com>
2026-01-09 19:59:20 -08:00
Jen Basch 3595c03078 Fix spotless ratcheting on release branches (#1401) 2026-01-09 14:18:18 -08:00
Jen Basch 9b6f72d5d0 Fix doc links from pkl:base to pkl:math (#1400) 2026-01-09 11:30:56 -08:00
Daniel Chao ac4f2fd9a6 Add isNotEmpty, isNotBlank methods (#1396)
Adds convenience methods `isNotEmpty` and `isNotBlank`. This borrows the
same methods from Kotlin.

This helps users write more fluent constraints, for example,
`foo.isNotEmpty.implies(bar)`.

Adds:

* List#isNotEmpty
* Map#isNotEmpty
* Set#isNotEmpty
* Mapping#isNotEmpty
* Listing#isNotEmpty
* String#isNotEmpty
* String#isNotBlank
2026-01-08 13:22:43 -08:00
Daniel Chao 14d58a17b0 Address warning diagnostics (#1395)
This addressess various warning diagnostics throughout the codebase.
2026-01-07 22:11:24 -08:00
Daniel Chao 474305c7b9 Use gradle/actions/setup-gradle (#1397)
This adds the setup-gradle action; which has the following improvements:

* Improved cacheing (compared to setup-java's Gradle cache)
* Validates the gradle wrapper jar
2026-01-07 21:10:07 -08:00
Daniel Chao 6b9c670cfd Add syntax highlighting of Pkl code (#1385)
This adds syntax highlighting of Pkl code!

It adds highlighting for:

* Stack frames within error messages
* CLI REPL (highlights as you type, highlights error output)
* Power assertions (coming in https://github.com/apple/pkl/pull/1384)

This uses the lexer for highlighting. It will highlight strings,
numbers, keywords, but doesn't understand how to highlight nodes like
types, function params, etc.
The reason for this is because a single line of code by itself may not
be grammatically valid.
2026-01-06 10:33:11 -08:00
Daniel Chao 4f4f03dbca Fix cacheing of module type (#1393)
This fixes an issue where the `module` type is incorrectly cached.
2026-01-05 14:49:07 -08:00
Eduardo Aguilar Moreno 6cd03c7f56 Add pkl bom module (#1390)
This adds a module that will publish a bom file that will help consumers
align versions for all pkl artifacts using the single bom.
2026-01-05 14:47:28 -08:00
Daniel Chao 8f83885c75 Fix default value for non-final module type (#1392)
This fixes an issue where the `module` type produces the wrong default
value.

Closes #1391
2026-01-05 11:39:24 -08:00
Stefan M. 0a4281366f Do not throw if output dir is symlink (#1389) 2026-01-05 10:16:32 -08:00
dependabot[bot] 35861240a0 Bump EnricoMi/publish-unit-test-result-action from 2.21.0 to 2.22.0 (#1382)
Bumps
[EnricoMi/publish-unit-test-result-action](https://github.com/enricomi/publish-unit-test-result-action)
from 2.21.0 to 2.22.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/enricomi/publish-unit-test-result-action/releases">EnricoMi/publish-unit-test-result-action's
releases</a>.</em></p>
<blockquote>
<h2>v2.22.0</h2>
<p>Adds the following improvements:</p>
<ul>
<li>Upgrade all Python dependencies to latest version <a
href="https://redirect.github.com/enricomi/publish-unit-test-result-action/issues/710">#710</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/EnricoMi/publish-unit-test-result-action/compare/v2.21.0...v2.22.0">https://github.com/EnricoMi/publish-unit-test-result-action/compare/v2.21.0...v2.22.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/EnricoMi/publish-unit-test-result-action/commit/27d65e188ec43221b20d26de30f4892fad91df2f"><code>27d65e1</code></a>
Releasing v2.22.0</li>
<li><a
href="https://github.com/EnricoMi/publish-unit-test-result-action/commit/2deae407d71f83660c8129d55379ef777127b1bf"><code>2deae40</code></a>
Upgrade transient dependencies (<a
href="https://redirect.github.com/enricomi/publish-unit-test-result-action/issues/710">#710</a>)</li>
<li><a
href="https://github.com/EnricoMi/publish-unit-test-result-action/commit/a6d8f3d6cae9c3d19a7a97f61e44d5754b97d803"><code>a6d8f3d</code></a>
Add Ubuntu slim runner (<a
href="https://redirect.github.com/enricomi/publish-unit-test-result-action/issues/709">#709</a>)</li>
<li><a
href="https://github.com/EnricoMi/publish-unit-test-result-action/commit/d3ed9acf9b75c81bd3ed28fac2ef38e7631afd0b"><code>d3ed9ac</code></a>
CI: Merge check upgrades jobs into single job (<a
href="https://redirect.github.com/enricomi/publish-unit-test-result-action/issues/700">#700</a>)</li>
<li>See full diff in <a
href="https://github.com/enricomi/publish-unit-test-result-action/compare/34d7c956a59aed1bfebf31df77b8de55db9bbaaf...27d65e188ec43221b20d26de30f4892fad91df2f">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=EnricoMi/publish-unit-test-result-action&package-manager=github_actions&previous-version=2.21.0&new-version=2.22.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-22 09:34:57 -08:00
Daniel Chao 3f4e894e43 Import release notes from 0.30.2 (#1375) 2025-12-15 13:14:18 -08:00
Daniel Chao dcf3f24e3b Sort list of repos alphabetically (#1376) 2025-12-15 12:48:26 -08:00
Daniel ChaoandJen Basch 6614cf11fb Add highlight.js and pkl-readers repo entries to README (#1371)
Co-authored-by: Jen Basch <jbasch94@gmail.com>
2025-12-15 11:28:30 -08:00
Daniel Chao b92c773555 Bump pkl.impl.ghactions (#1366) 2025-12-12 11:30:47 -08:00
Daniel Chao f528927797 Fix building of pkl-doc (#1365)
Ensure that `assembleNative` is called before testing the native
executable
2025-12-12 09:36:38 -08:00
Islon Scherer 41cf485ffb Fix bug in parsing of super expression (#1364) 2025-12-12 18:02:48 +01:00
Daniel Chao cd9cfaae8f Bump pkl.impl.ghactions, update lockfile to not run (#1362) 2025-12-10 21:39:18 -08:00
Daniel Chao 2578703081 Bump versions, fix dependabot updates (#1361) 2025-12-10 18:03:32 -08:00
Daniel Chao b170968e9e Bump pkl.impl.ghactions to 1.1.0, add version locking. (#1359)
This adopts the version locking introduced in pkl.impl.ghactions@1.1.0.
2025-12-10 16:35:15 -08:00
Daniel ChaoandJen Basch 32e9087da9 Fix formatting of nodes with no children (#1351)
For example, this fixes an issue where an empty module turns into ` \n`.

Closes https://github.com/apple/pkl/issues/1348

---------

Co-authored-by: Jen Basch <jbasch94@gmail.com>
2025-12-09 11:03:50 -08:00
Daniel Chao 9d41518553 Bump pkl.impl.ghactions to 1.0.1 (#1358) 2025-12-09 10:53:04 -08:00
Daniel Chao b7ccc67bd8 Adjust CI to not publish test results for deploy-snapshot (#1357) 2025-12-08 09:56:57 -08:00
Daniel Chao 252f44728e Adjust native lifecycle builds to not throw during configuration phase (#1356)
Allow Gradle to run other tasks on unsupported machines, but throw when
running native lifecycle tasks (e.g. `buildNative`).
2025-12-07 11:35:14 -08:00
Jen Basch 139f70bb79 Change pkl format --write to exit 0 when formatting violations are found (#1340) 2025-12-05 16:01:09 -08:00
Daniel Chao 2de1d5b9d2 Build linux executables that link to glibc 2.17 (#1352)
Fixes an unintentional breakage in 0.30.1 that bumped the required glibc to 2.34.
2025-12-05 15:24:27 -08:00
Jen Basch 81a4e687b4 Fix IDEA gradle project sync on Windows Aarch64 (#1353) 2025-12-05 14:53:06 -08:00
Daniel Chao e1559c66ad Fix CI build for pkldoc (#1349)
Fixes an issue where the executable is not built.

Haven't dug into why this broke; this was working just a little bit ago
(see
https://github.com/apple/pkl/actions/runs/19911073549/job/57079605641?pr=1342).
Nevertheless, the lifecycle job dependencies were a little wonky (test
should assemble first).

[native-pkl-doc]
2025-12-05 09:54:57 -08:00
Daniel Chao c2d672e943 Omit superfluous newline when writing formatted content to stdout (#1350)
Fixes an issue where an extra newline is added when writing formatted
code to stdout.

Closes https://github.com/apple/pkl/issues/1346
2025-12-05 09:54:31 -08:00
Jen Basch 1d94ab5c3c Prepare 0.30.1 release (#1345) 2025-12-03 21:13:36 -08:00
Jen Basch c73fc87583 Fix release publishing (#1343) 2025-12-03 15:13:31 -08:00
Daniel Chao bcbe1b8995 Fix testing of pkldoc executables (#1342)
These tests are actually not running right now.
2025-12-03 15:12:08 -08:00
Daniel Chao c5b98d6510 CI job polish (#1341)
Avoids issues where setup-java post-task cacheing will hang with "device
or resource busy".
2025-12-03 15:11:33 -08:00
Jen Basch db6ff394d7 Fix fetch depth for gradle-compatibility and java-executables-* CI jobs (#1339) 2025-12-03 10:34:03 -08:00
Daniel Chao 53f3be64f3 Fix parsing of URLs with plus signs (#1335)
This fixes an issue where URLs with schemes that contain `+`, `-`, and
`.` would not be parsed correctly.

For example, `foo+bar:///?baz.pkl` would turn into
`foo+bar:///%3Fbaz.pkl`. The query param is lost, and turned into the
path.
2025-12-03 10:11:23 -08:00
Jen Basch d1c652f736 Vendor paguro's RrbTree, fix an int overflow breaking large Lists (#1337) 2025-12-03 09:02:17 -08:00
Islon Scherer 6c3683c55e Fix snapshot publishing (#1330) 2025-11-26 09:17:14 +01:00
Spencer Phillip Young cc02b6b685 Fix newline checks in parser (#1328) 2025-11-24 14:40:54 +01:00
Jen Basch f4938dccca Add support for evaluating module output and expressions to ConfigEvaluator (#1297) 2025-11-19 15:47:12 -08:00
Jen Basch 67f1ff5ab8 Update CLI docs to clarify that --version only applies to the root command (#1326) 2025-11-18 21:08:03 -08:00
Spencer Phillip Young ba281e8475 Fix empty parenthesized type unexpected error (#1323) 2025-11-18 15:35:44 +01:00
Daniel Chao bc5d675b6e Fix macos/amd64 image builds (#1322) 2025-11-17 12:16:28 -08:00
Daniel Chao a2cc70ae37 Fix deploy jobs (#1319)
Specify `merge-multiple` to prevent new directories from being created
when downloading artifacts.
2025-11-15 16:30:51 -08:00
Daniel Chao 0ff99d31c9 Replace broken references to CircleCI (#1318) 2025-11-14 15:44:59 -08:00
Daniel Chao ef9b53be98 Fix release builds (#1317)
In order to preserve the folder hierarchy in our uploaded artifact,
we need to insert a wildcard in the root path.

Also, fix fan-in of tasks that lead to the publish test result task.
2025-11-14 15:18:30 -08:00
Daniel Chao 0ff9125062 Fix build java executable (#1316) 2025-11-13 17:46:35 -08:00
Daniel Chao f948ba2a20 Switch to GitHub Actions (#1315)
This switches our builds over to GitHub Actions!

TODO:

* Add macOS/amd64 native-image builds; this isn't working right now
* Patch musl with security patches
* Add benchmark jobs over time

As part of this build, PRBs will now only run `./gradlew check` on Linux,
but other jobs can be run using slash commands, e.g. `[windows]`
to run `./gradle check` on Windows.
2025-11-13 16:03:05 -08:00
Islon Scherer ecf2d8ba33 Fix Map formatting (#1312) 2025-11-11 09:37:09 +01:00
Daniel Chao 445d94ccff Improve plugin logic (#1296) 2025-11-04 07:33:54 -08:00
Daniel Chao 9e1303ed57 Disable spotless ratcheting of Pkl sources (#1295)
This causes spotless to _always_ format Pkl files, instead of only
formatting them if there's a diff between the file and what's in main.

This means that formatting changes in pkl-formatter will be propagated
to the standard library.
2025-11-04 05:31:49 -08:00
Dan Chao 4c13952b64 Apply spotless formatting 2025-11-03 12:26:58 -08:00
Dan Chao 4d70baba86 Start next dev iteration 2025-11-03 12:26:58 -08:00
Dan Chao 7f231cd916 Prepare 0.30.0 release 2025-11-03 12:26:58 -08:00
Jen Basch 5c944600fa Use 2xlarge resource class for gradle check in CI (#1291) 2025-11-03 10:31:16 -08:00
Islon Scherer 5030061412 Fix ordering issue in formatter (#1289) 2025-11-03 18:52:38 +01:00
Daniel Chao 219e766003 Make format command write relative paths (#1290) 2025-11-03 09:52:29 -08:00
Daniel Chao d29ae07e14 Fix formatting of argument lists (#1283)
This fixes several issues:

1. Leading/trailing line comments surrounding a lambda should make that
   lambda not "trailing", because the formatting otherwise looks bad and
   also isn't stable
2. Fix incorrect algorithm for detecting trailing lambda (currently,
   any number of lambdas makes the alg return `true`)
2025-11-03 09:15:58 -08:00
Islon Scherer 4226c21a42 Fix multiline string stability (#1287) 2025-11-03 17:41:43 +01:00
Daniel Chao 40c88930c5 Normalize paths in pkl format (#1286) 2025-11-03 08:24:04 -08:00
Daniel Chao d5beb3f331 Fix flag name (#1285) 2025-11-03 08:23:35 -08:00
Daniel Chao d8adb28dd1 Respect line breaks in operator chains and argument lists (#1268)
If an operator chain or method call is multiline, keep those newlines
in the formatted output.

Help preserve code like:

```
foo
  |> (it) -> it + 2
  |> (it) -> it / 2
```
2025-11-02 21:51:37 -08:00
Daniel Chao 85529c9b7e Add debug and run button for snippet tests (#1281) 2025-10-31 12:28:03 -07:00
Islon Scherer 50541d9cda Make formatter stable (#1273) 2025-10-31 18:58:22 +01:00
Daniel ChaoandIslon Scherer ea778a7e7a Don't force multiline interpolation into a single line (#1280)
Also, fixes an issue where forced single-line formatting would break for if/else
and let expressions

---------

Co-authored-by: Islon Scherer <islonscherer@gmail.com>
2025-10-31 10:47:53 -07:00
Jen Basch ffc9167bf5 Switch yaml.Parser to parse binary scalars as Bytes (#1277) 2025-10-30 16:45:59 -07:00
Daniel Chao ede48d0fff Fix pkl spotless (#1279) 2025-10-30 16:17:08 -07:00
Jen Basch eab71229e7 Add support for rendering Bytes values with YamlRenderer (#1276) 2025-10-30 15:53:43 -07:00
Daniel Chao 10eccb100c Fix Pkl spotless formatting (#1278) 2025-10-30 15:36:30 -07:00
Jen Basch 2c18f13d08 Rename Config.from to Config.fromPklBinary (#1275) 2025-10-30 11:04:03 -07:00
Jen BaschandDan Chao 9427387019 Add release notes for 0.30 (#1261)
Co-authored-by: Dan Chao <dan.chao@apple.com>
2025-10-30 10:09:35 -07:00
Islon Scherer db800d4521 Fix trailing lambda ending wrap (#1274) 2025-10-30 17:06:09 +01:00
Jen Basch 08c414f3ac Normalize mutli-line string indentation (#1271) 2025-10-30 08:30:30 -07:00
Islon Scherer 9469dd885d Handle trailing commas in types (#1272) 2025-10-30 13:36:56 +01:00
Islon Scherer 7df447924e Coalesce pkl format subcommands into the parent command. (#1263) 2025-10-30 10:08:25 +01:00
Jen Basch 7bf150055c Assert that formatter snippet test output is stable (#1270) 2025-10-29 17:08:43 -07:00
Jen Basch 1d6261b263 Correctly handle trailing commas in function type literals in the generic parser (#1267) 2025-10-29 15:08:26 -07:00
Islon Scherer 72874ec34a Get style guide in line with formatter (#1265) 2025-10-29 16:00:05 +01:00
Islon Scherer 28c20a8652 Don't break lines in module name (#1266) 2025-10-29 15:24:08 +01:00
Daniel Chao bbeeffdd32 Adjust formatting of line comments in lets (#1256) 2025-10-28 17:53:06 -07:00
Daniel Chao 825fcf5d1d Respect newlines in if/else and let expressions (#1259)
Change the formatter to prevent multiline if/else and let expressions
from collapsing into a single line.
2025-10-28 11:26:31 -07:00
Daniel Chao fbcf83aa76 Adjust formatting of argument lists (#1260)
This changes code so that multiple lambda arguments makes the whole
argument list wrap.

Improves the readability of code like:

```
foo
  .toMap(
    (it) -> makeSomeKey(it),
    (it) -> makeSomeValue(it)
  )
```
2025-10-28 10:46:19 -07:00
Islon Scherer be0142d46b Add grammar compatibility option to the formatter (#1249) 2025-10-28 13:29:08 +01:00
Daniel Chao ef4989aa35 Wrap comments in base.pkl to 100 chars (#1258)
Also, strip line numbers from reflectedDeclaration.pcf
2025-10-27 16:00:48 -07:00
Daniel Chao 1a25e044ac Polish documentation for pkl-binary (#1250) 2025-10-26 21:23:57 -07:00
Spencer Phillip YoungandDan Chao fdb2bd8c75 Fix Lexer EOF sentinel collision with valid Unicode code points (#1251)
Fixes an issue where sentinel value (U+7FFF) occurring literally in the source could cause a premature termination of parsing, leading to potential EOF injection attacks.

---------

Co-authored-by: Dan Chao <dan.chao@apple.com>
2025-10-26 15:53:48 -07:00
Daniel Chao a8f76d6209 Adjust formatting of qualified access chains (#1252)
This adjusts formatting of qualified access chains so that leading
dot calls are kept in the same line if possible.
2025-10-24 16:48:21 -07:00
Daniel Chao c7680aea1f Enforce Pkl formatting of stdlib with spotless (#1253)
This adds a spotless formatting step using the new pkl formatter.

This only formats Pkl sources in the stdlib, because other sources
are possibly test input and not meant to be formatted.
2025-10-24 10:15:14 -07:00
Daniel Chao 3223083324 Format interpolated expressions as single line (#1247)
This forces iterpolated expressions to be single-line, so that newline
literals within the bounds of two string delimiters can be seen as
verbatime newlines in the resulting string.

Edge case: in the case of a line comment, it's not possible to keep
this as a single line expression.
These are kept as multi-line expressions.

Also:

* Remove `ForceWrap`, this node is not used.
* Rename `StringConstant` -> `StringChars`
2025-10-24 03:23:41 -07:00
Daniel Chao cce49a40fa Add internal intellij plugin (#1248)
This introduces an IntelliJ plugin that's meant to assist with development of the Pkl codebase itself.

The plugin adds a file editor that opens snippet tests in a split editor pane, showing the input on the left side and output on the right side.
2025-10-21 03:42:21 -07:00
Islon Scherer f6d3fb1228 Fix let formatting (#1246) 2025-10-21 09:45:27 +02:00
Jen Basch 6c036bf82a Implement Pkl binary renderer and parser (#1203)
Implements a binary renderer for Pkl values, which is a lossless capturing of Pkl data.

This follows the pkl binary format that is already used with `pkl server` calls, and is
made available as a Java API and also an in-language API.

Also, introduces a binary parser into the corresponding `PObject` types in Java.
2025-10-20 09:10:22 -07:00
Jen Basch c602dbb84c Fix macOS Intel native builds (#1244) 2025-10-16 19:20:14 -07:00
Jen Basch bed008b3da Update macOS release in CI (#1243) 2025-10-16 15:48:23 -07:00
Daniel Chao 80a4dc9617 Fix typos (#1242) 2025-10-16 14:18:49 -07:00
Daniel Chao b8aad85943 Fix tracking of known usages/subtypes (#1241)
Fixes an issue where known subtype/usage information is not gathered.

Also: change class RuntimeData to not return pairs for better composability.
2025-10-16 12:48:35 -07:00
Daniel Chao 91fec70668 Fix publication of pkl-config-kotlin (#1240)
This fixes a regression where the pkl-config-kotlin library would not
publish after upgrading to Gradle 9.1
2025-10-16 00:44:08 -07:00
Daniel Chao 8c5bd3b7dd Apply pkl formatter to codebase (#1236)
This applies the Pkl formatter to `stdlib/` and `.circleci/`
2025-10-09 15:16:38 -07:00
Daniel Chao 42dcad25c6 Fix error message when reading a resource/module past root dir (#1234) 2025-10-09 10:16:33 -07:00
Daniel Chao 3a29ea8998 Format lambda chains (#1235)
This changes the formatter to only force line on call chains
with multiple lambdas

With this change, this is kept as a single line:

```
foo.bar.map((it) -> it + 1)
```
2025-10-09 10:16:13 -07:00
Daniel Chao 98ab741c54 Bump Kotlin to 2.2.20, minimum Kotlin to 2.1 (#1232)
The current version of the kotlin-gradle plugin is not compatible with
Gradle 9.1, causing error `java.lang.NoSuchMethodError:
 'org.gradle.api.Project org.gradle.api.artifacts.ProjectDependency.getDependencyProject()'`

Also, the Kotlin 2.0 language target is deprecated as of Kotlin 2.2.
2025-10-08 21:40:35 -07:00
Jen Basch ffa3c14fb3 Pass trace mode from CLI/PklProject to the evaluator (#1230) 2025-10-08 10:49:55 -07:00
Jen Basch e230fcf1a9 Follow up for trace pretty printing (#1227) 2025-10-08 09:36:42 -07:00
Daniel Chao cf9d87373d Bump Gradle to 9.1.0 (#1228)
* Bump Gradle to 9.1.0
* Bump foojay resolver to 1.0.0
* Fix build logic on windows

Also, remove support for kotlin gradle plugin less than 1.8.x, because:

* Class `org.gradle.api.plugins.Convention` is no longer available in the classpath in Gradle
* Continued support for legacy plugin would require heavy reflection, which is brittle and hard to verify
* Kotlin 1.7 is 3 years old and no longer updated
2025-10-08 08:54:43 -07:00
Daniel Chao 55eac2088b Bump GraalVM to 25.0.0 (#1226)
* Migrate shadow plugin to org.gradleup to correctly bundle Truffle in
  a fat jar
* Switch to GraalVM Community Edition
2025-10-07 21:23:15 -07:00
Steve Salevan cecaf39aff Adds traceMode evaluator setting to support trace() pretty printing (#1100) 2025-10-07 12:31:16 -07:00
Daniel Chao d03a074f63 Bump dependencies (#1225)
* byte-buddy to 1.17.7
* commonmark to 0.26

And also test dependencies (junit, assertj)
2025-10-04 13:59:54 -07:00
Daniel Chao c585a40601 Fix pkl-doc native test (#1224) 2025-10-03 17:15:14 -07:00
Daniel Chao 2e77d44877 Disable multi-jdk testing when running on Windows ARM (#1223)
Gradle does not support Java toolchains on Windows ARM right now.
To enable running the project in this os/arch, we must omit multi-jdk
test tasks.
2025-10-03 10:36:25 -07:00
Daniel Chao 5d90cf8f4e Introduce pkl-doc model version 2 (#1169)
Currently, in order to update a pkl-doc documentation site,
almost the entire existing site is read in order to update metadata
like known versions, known subtypes, and more.

For example, adding a new version of a package requires that the
existing runtime data of all existing versions be updated.
Eventually, this causes the required storage size to balloon
exponentially to the number of versions.

This addresses these limitations by:

1. Updating the runtime data structure to move "known versions" metadata
   to the package level (the same JSON file is used for all versions).
2. Eliminating known subtype and known usage information at a
   cross-package level.
3. Generating the search index by consuming the previously generated
   search index.
4. Generating the main page by consuming the search index.

Because this changes how runtime data is stored, an existing docsite
needs to be migrated.

This also introduces a new migration command, `pkl-doc --migrate`,
which transforms an older version of the website into a newer version.
2025-09-29 16:10:44 -07:00
Jen Basch 63f89fb679 Expose collected superclass properties/methods in pkl:reflect (#1106) 2025-09-19 12:23:57 -07:00
Simon Rüegg d1171db3d5 Only format changed files (#1217) 2025-09-19 15:16:32 +02:00
Simon Rüegg f327c8e086 Allow formatting multiple files/directories (#1215)
This makes it easier to work with tools which return a list of file to
format, e.g. to only handle files which have changed in a PR.
2025-09-19 15:13:22 +02:00
Islon Scherer 618c6243c5 Fix bug in format apply (#1211) 2025-09-19 11:28:40 +02:00
Islon Scherer 222741dccd Fix broken test (#1208) 2025-09-17 13:53:15 -07:00
Islon Scherer fdc501a35c Implement canonical formatter (#1107)
CLI commands also added: `pkl format check` and `pkl format apply`.
2025-09-17 11:12:04 +02:00
Vladimir Matveev 6a06ab7caa Fixed fallback certificates not working in certain classloader setups (#1198)
In the original implementation the `org/pkl/commons/cli/PklCARoots.pem` resource is resolved relatively to the classloader associated with the class returned by `javaClass`. However, since this is an extension method for `HttpClient.Builder`, it means calling `javaClass` on the builder instance, which is actually defined in the system classpath.

Because of this, if the Pkl class is loaded by a different classloader compared to the one which contains JDK classes, which is totally possible in certain scenarios (e.g. with Gradle), then this resource resolution will fail.

The solution is to resolve `javaClass` against `this@CliCommand`, to use the classloader which loaded the jar with the `CliCommand` class to find the CA resource.
2025-09-04 15:49:43 -07:00
Daniel Chao a66ac0eb35 Refine documentation for class Any (#1194) 2025-09-02 08:19:39 -07:00
Jen Basch bef0375285 Improve interrupt handling in pkl repl (#1188) 2025-08-29 13:39:49 -07:00
Jen BaschandDaniel Chao 44cc154501 Prepare 0.29.1 release (#1192)
Co-authored-by: Daniel Chao <dan.chao@apple.com>
2025-08-27 14:33:25 -07:00
Artem Yarmoliuk af7057b75f Fix shell completion for paths (#1161) 2025-08-26 10:46:54 -07:00
Jen Basch a8806416b9 Correctly handle EOF after unmatched backtick (#1187) 2025-08-25 14:31:26 -07:00
Jen Basch b32039a4f1 Add me as a maintainer (#1185) 2025-08-25 13:17:53 -07:00
Daniel Chao a779316cc2 Update dependencies (#1184)
Bump test dependencies, and also commonmark
2025-08-21 21:32:56 -07:00
Daniel Chao d9db939bdc Fix missing resources in native pkldoc, and disable test mode (#1175)
This fixes two issues:

1. Test mode is enabled in pkldoc without the ability to turn it off
2. Native pkldoc is missing required resources

This also adds tests for both `jpkldoc` and `pkldoc`.
2025-08-21 06:44:13 -07:00
Jen Basch ae5f02b285 Allow trailing commas in comma-separated syntax elements (#1137) 2025-08-21 06:43:38 -07:00
Daniel Chao 3f2f0c3a2b Add docs for installing via winget (#1171) 2025-08-11 17:22:30 -07:00
Daniel Chao 7d50aaeec9 Fix escaping in yaml strings (#1165)
The backslash needs to be escaped when rendering double-quoted YAML strings.

In addition, this escapes the following characters:

* next line (0x85)
* nbsp (0xa0)
2025-08-06 07:57:52 -07:00
Daniel Chao 78ba6bf758 Fix download links (#1162)
* Snapshot repo has changed
* Fix a bug where pkl-codegen-java download link points to Sonatype instead of GitHub

Not in the PR: we also need to fix the snapshot download location;
but haven't figured out yet what the correct link is.
2025-07-31 08:43:24 -07:00
Daniel Chao 20e7e251ec Fix encoding for mapping with local members (#1152)
Fixes an issue where local members are included in
the mapping entry count.

Also: avoid re-computing Mapping.length
2025-07-28 10:13:45 -07:00
Islon Scherer a3cc2f0ea6 Start next dev iteration 2025-07-24 20:06:01 +02:00
Islon Scherer e12c655f5c Prepare 0.29.0 release 2025-07-24 20:06:01 +02:00
Daniel Chao efee9f3801 Disable publishing jpkl (#1147)
This is causing a breakage in our release pipeline right now.
2025-07-24 10:04:46 -07:00
Daniel Chao 8e88133248 Disable publishing native executables to Maven Central (#1146)
Attempts to publish these artifacts is resulting in errors like
"No Archiver found for the stream signature"

Also, add to release notes
2025-07-24 09:21:02 -07:00
Daniel Chao b38b15ba71 Remove duplicate block ids (#1145)
We can't repeat these block ids multiple times in the same page.
2025-07-24 17:19:29 +02:00
Daniel Chao 1c4fbe7c1c Fix: use http.rewrites to configure the evaluator in message passing API (#1141)
This is a bugfix, where the `rewrites` option is currently ignored.

Also: return any illegal argument errors from creating the evaluator as
an error in the CreateEvaluatorResponse
2025-07-24 07:30:31 -07:00
Daniel ChaoandJen Basch ae046a804b Add release notes for 0.29 (#1140)
Co-authored-by: Jen Basch <421772+HT154@users.noreply.github.com>
2025-07-24 07:30:04 -07:00
Daniel Chao 53f6951d81 Add bytesType to pkl:reflect (#1144)
Just like other data types on the base module, the mirror for `Bytes`
should be available directly on `pkl:reflect`.
2025-07-24 06:21:10 -07:00
Daniel Chao 7c8c4438d5 Defer noProxy to settings.pkl or PklProject if not set explicitly (#1143)
Fixes an issue where `http.noProxy` settings are ignored.
2025-07-23 10:57:31 -07:00
Daniel ChaoandIslon Scherer bdf6aa6b60 Un-deprecate Resource.base64, compute bytes/base64 in terms of each other (#1138)
This makes changes to avoid a needless breaking change.
It preserves code like `new Resource { base64 = someValue }.sha256`,
and also code that renders `Resource` into static formats.

Co-authored-by: Islon Scherer <islonscherer@gmail.com>
2025-07-23 06:25:49 -07:00
Daniel Chao 03d8e01801 Bump GraalVM JDK version to 21.0.8 (#1139) 2025-07-23 05:22:17 -07:00
Jen BaschandDaniel Chao 85e4f133a4 Add getOrDefault method to Listing and Mapping (#1053)
This PR adds methods to Listing and Mapping that can be used to retrieve members. If the member for the index/key isn't present, it applies default to the index/key. In both cases, this is essentially sugar for getOrNull(<index/key>) ?? default.apply(<index/key>).

Co-authored-by: Daniel Chao <daniel.h.chao@gmail.com>
2025-07-22 15:45:49 -07:00
Daniel Chao 306a3b0fc2 Polish http rewrites (#1133)
* Polish rewrite docs
* Add documentation comments, add missing evaluator options
* Add ability to set HTTP builder in ConfigEvaluatorBuilder
* Add ability to set rewrites in executor API
2025-07-22 15:42:07 -07:00
Daniel Chao fe064960b4 Bump Gradle to 8.14.3 (#1129) 2025-07-18 11:03:38 -07:00
Daniel Chao 6cd73227a1 Update dependencies (#1128) 2025-07-18 09:29:44 -07:00
Islon Scherer ba82c5c6d6 Only allow shebangs in the beginning of a module (#1126) 2025-07-18 11:18:45 +02:00
Daniel Chao decb4ea66e Improve message passing api docs (#1127)
1. Change `Binary` to `Bytes` (new type representing binary data)
2. Add documentation for `http.rewrites` option
2025-07-17 07:57:48 -07:00
Daniel Chao 99020bb79d Add support for HTTP rewrites (#1062)
This adds a new configuration option for the HTTP client to replace URI prefixes when making outbound calls.

Follows the design of https://github.com/apple/pkl-evolution/pull/17
2025-07-16 15:53:31 -07:00
Daniel Chao fea031a138 Switch publishing to sonatype central (#1121)
OSSRH is now EOL, so we need to publish to this new repository.
2025-07-11 05:48:31 -07:00
Daniel Chao 48ad4386c8 Add Kotlin support for "addGeneratedAnnotation" flag (#1115)
This adds logic so that the Kotlin code generator also supports the
"addGeneratedAnnotation" flag.

Also:
* Add Antora documentation
* Adjust names (generated-annotation -> add-generated-annotation)
* Adjust doc comments
2025-07-08 14:05:15 -07:00
Islon Scherer 3a35be6311 Remove ANTLR from the repo (#1114) 2025-07-08 09:43:35 +02:00
André RouélandNullpointer 0973774a5d Add @Generated annotation to generated Java types (#1075)
JaCoCo automatically excludes methods and classes annotated with @Generated from the coverage reports. This is very important to us as generated code should not normally be included in the coverage report. We want to measure the coverage of the code that we actually wrote and maintain, not the code that was automatically generated by tools.

By introducing a property generatedAnnotation (default value false) one could enable writing @Generated on Java types to be generated.

Co-authored-by: Nullpointer <mike.schulze@tealium.com>
2025-07-07 15:31:49 -07:00
Jen Basch dbf57280ba Fix crash due to parse error in module header (#1112) 2025-07-01 10:05:16 +02:00
Artem YarmoliukandMike Drob f1388ffb2f Don't show 100% when number of failures is rounded up (#1110)
Co-Authored-By: Mike Drob <mdrob@apple.com>
2025-06-27 15:29:26 +02:00
Daniel Chao d6fd7e0942 Fix native build (#1099)
* Add truffle boundaries
* Fix snippet output tests
* Make java LanguageSnippetTests eval output.bytes, just like the CLI does
2025-06-17 08:42:49 -07:00
Daniel ChaoandKushal Pisavadia e9320557b7 Introduces Bytes class (#1019)
This introduces a new `Bytes` standard library class, for working with
binary data.

* Add Bytes class to the standard library
* Change CLI to eval `output.bytes`
* Change code generators to map Bytes to respective underlying type
* Add subscript and concat operator support
* Add binary encoding for Bytes
* Add PCF and Plist rendering for Bytes

Co-authored-by: Kushal Pisavadia <kushi.p@gmail.com>
2025-06-11 16:23:55 -07:00
Artem Yarmoliuk 3bd8a88506 Aggregate junit report into one file (#1056)
Some systems require junit report to be in a single file. For example `bazel` https://bazel.build/reference/test-encyclopedia needs single file to be available in `XML_OUTPUT_FILE` path.

To avoid implementing junit aggregation in pkl wrappers in different places this PR instead adds a `--junit-aggregate-reports` flag to return all junit reports as a single file.

Additional flag `--junit-aggregate-suite-name` is added to allow overriding global test suite name from default `pkl-tests`
2025-06-06 17:33:13 -07:00
Daniel Chao 0b0f3b131d Add ResourceReaders#fromServiceProviders to preconfigured evaluator (#1094)
The preconfigured evaluator currently adds module key factories from
service providers, but not resource readers.

This means that users of pkl-spring, for example, cannot add custom
resource readers.
This is also inconsistent (in the preconfigured evaluator, `import` can
 use custom schemes, but not `read`).
2025-06-06 17:26:38 -07:00
Daniel Chao 568c6ccbc2 Update dependencies, and clean up multi-JDK testing (#1088)
* Update dependencies
  1. Remove */gradle.lockfile files
  2. Run `gradle updateDependencyLocks` and commit
* Update multi-JDK testing to use simple Test task, add junit-platform-launcher to dependencies
  - Don't use JvmTestSuite (we don't use another test runner, we use the same classpath)
* Add junit-platform-launcher to libs (prevent an issue where junit-engine and junit-launcher can fall out of sync)
2025-06-04 08:30:02 -07:00
Daniel Chao dd9800c70a Update Gradle to 8.14.1 (#1091) 2025-06-04 08:28:52 -07:00
Daniel Chao 2bc9c2f424 Treat opaque file URIs as errors (#1087)
Opaque file URIs are URIs whose scheme-specific part does not start with `/`.
For example, `file:foo/bar.txt` is an opaque URI.

Currently, this has the unintentional behavior of: look for file `foo/bar.txt` from the process working directory.
These are effectively dynamics imports; from a single import, we can't statically analyze what it resolves as.

According to RFC-8089, File URIs must have paths that start with `/`. So, these are actually _not valid URIs_.
See the grammar defined in https://datatracker.ietf.org/doc/html/rfc8089#section-2

This changes Pkl's behavior so that these URIs are treated as errors.
2025-06-03 14:57:22 -07:00
Daniel Chao 4eeb61dc74 Fix multi-jdk testing setup (#1086)
This changes the Gradle build to always create multi-jdk tasks,
and instead use the `enabled` property to determine whether the task
is actually ran or not.

The has the following benefits:
* IntelliJ and other tools understand the task execution graph (e.g. testJdk20 shows up as a task)
* JDK-specific Gradle configurations always exist, so `updateDependencyLocks` is consistent.
2025-06-03 08:56:02 -07:00
Vladimir Sitnikov 7d50c46c29 Use javac -release and kotlinc -Xjdk-release (#1080)
The change ensures the generated bytecode adheres to the APIs
for the target Java release.

Previously, only sourceCompatibility and targetCompatibility were used,
and they might cause issues like NoSuchMethodError when a newer javac
compiles with -target older_release.

Note: it is good to use a new an up to date javac to avoid issues
in the compiler itself, so having a proper `-release ..` configuration
is vital.

See https://www.morling.dev/blog/bytebuffer-and-the-dreaded-nosuchmethoderr
2025-05-28 09:38:53 -07:00
Islon Scherer a19e6bf684 Fix doc dependency link (#1078) 2025-05-28 18:08:38 +02:00
Jen Basch 021f43bec4 I'm Jen! (#1072) 2025-05-19 11:55:24 -07:00
Islon Scherer fe2e4aa1a4 Simplify precedence and associativity parsing (#1066) 2025-05-12 14:59:26 +02:00
Josh B 948a20ad0c Add mapNonNullIndexed API to List and Set (#1063) 2025-05-08 15:57:28 +02:00
Sitaktif 919d63e51a docs: fixed referenced property in "fixed" section (#1065) 2025-05-08 15:52:40 +02:00
e4716c9e45 Add command to generate shell completion (#1052)
Co-authored-by: Daniel Chao <daniel.h.chao@gmail.com>
Co-authored-by: Islon Scherer <islonscherer@gmail.com>
2025-05-01 08:39:30 -07:00
Daniel Chao 49a593f5c9 Add release notes for 0.28.2 (#1043) 2025-04-17 08:58:56 -07:00
Daniel Chao e98b42cffd Fix incorrect substring (#1028)
The relative path should be based off the module name prefix, not the
package name.
2025-04-14 16:22:46 -07:00
Daniel Chao 38c44860d4 Fix compiler error in benchmark (#1040) 2025-04-11 16:08:20 -07:00
Jeroen Soeters 854074e619 Do not crash, but suggest '--multiple-file-output-path' when specifying a directory as output file (#1038)
When specifying a directory instead of a file for the output, pkl won't crash anymore, but instead output an error message, suggesting --multiple-file-output-path.
2025-04-08 10:56:15 -07:00
mbvissers 3119e0781b Fix typo in evolution-and-roadmap.adoc (#1031) 2025-04-01 11:34:47 -07:00
Daniel Chao b445713b8c Publish executables for pkldoc, pkl-codegen-java, pkl-codegen-kotlin (#1023)
This adds logic to build and publish the other executables related to Pkl.

These are:

* pkl-doc
* pkl-codegen-kotlin
* pkl-codegen-java

pkl-codegen-kotlin and pkl-codegen-java are published as executable JARs, whereas pkldoc is published both as an executable JAR, and also native executables (matching the set of os/arch supported by Pkl).

The reason this only publishes executable JARs for pkl-codegen-kotlin and pkl-codegen-java is because we expect that the Java requirement is not a problem for these users, and that the native executable provides negligible added value.

As part of this, the following changes are made:

* Introduce `pklJavaExecutable` plugin, which sets up building and publishing of executable JAR.
* Introduce `pklNativeExecutable` plugin, which sets up building and publishing of native executables.
* Introduce `NativeImageBuild` Gradle task, which knows how to build native-image executables.
* Introduce `ExecutableSpec` extension, for projects that publish executables to configure how those executables should be published.
* `./griddles buildNative`, by default, will only build the executable of the host OS/Arch, and will no longer cross-build.
* The target arch of `./gradlew buildNative` can be changed using `-Dpkl.targetArch=<aarch64|amd64>`.
* On linux/amd64 only, with `./gradlew buildNative`, a statically linked executable can be built using `-Dpkl.musl=true`
* Make `javaExecutable` a dependency of `assemble`
* Make `testStartJavaExecutable` a dependency of `check`
* Change name `pklNativeBuild` to `pklNativeLifecycle` to better match the plugin's purpose
* Remove Truffle SVM classes from main source set (don't publish these classes as part of the pkl-cli JAR)
* Change CircleCI definition to publish new executables
* Change CircleCI definition to call `buildNative` instead of individual task names
2025-03-19 09:08:12 -07:00
Islon Scherer aad530b9a8 move parser out of pkl-core (#1024) 2025-03-18 20:23:53 +01:00
Islon Scherer 1cd0549bd6 remove stacking of block comments (#1022) 2025-03-12 18:24:38 +01:00
Kushal Pisavadia 8b7d59e4e4 Build with m2pro.large instances, not macos.m1.large.gen1 (#1020)
* Update `com.circleci.v2` to `1.5.0` and `pkl.impl.circleci` to `1.2.0`

See:
- https://github.com/apple/pkl-pantry/pull/103
- https://github.com/apple/pkl-project-commons/pull/7

* Build with `m2pro.large` instances, not `macos.m1.large.gen1`
2025-03-11 11:20:43 +01:00
Kushal Pisavadia f7eaeddc78 Alphabetically sort the projects list in settings.gradle.kts (#1015) 2025-03-07 15:06:14 +01:00
Daniel ChaoandKushal Pisavadia 18e7a7e87e Add optimization for generator bodies that don't introduce new members (#1013)
If a generator object literal doesn't add any object members, we
can simply use the parent in its place.

Co-authored-by: Kushal Pisavadia <kushi.p@gmail.com>
2025-03-05 10:25:54 -08:00
Daniel Chao bf484b3431 Revert Gradle plugin tests to use deprecated API (#1011)
Using the replacement API fails with:
"DefaultTaskContainer#register(String, Class, Action) on task set cannot be executed in the current context."
2025-03-04 07:58:16 -08:00
Daniel Chao 5636fb55c4 Adjust installation docs (#1010) 2025-03-03 12:19:13 -08:00
Daniel Chao 5021107269 Update Gradle to 8.13 (#1008)
Also:

* Replace usages of deprecated APIs
* Prevent `testStart*` tasks from writing to standard output
2025-03-03 12:08:48 -08:00
Pedro Piñera Buendía 3baefbcfd3 Document how to install pkl with Mise (#982) 2025-03-03 12:01:09 -08:00
Daniel Chao a0a64923a6 Cherry pick changes from 0.28.1 (#1004)
* Add release notes for 0.28.1
* Update Pkl version in jbang catalog
2025-03-03 10:18:35 -08:00
Daniel Chao 09166ba165 Allow native-image flags to be passed through from Gradle properties (#1001)
Allow other build environments (e.g. homebrew) to configure the native-image build without requiring source code changes.
2025-03-03 08:49:44 -08:00
Daniel Chao 9ba7fa01af Fix shadow jar logic (#998)
Fix an incorrect relocation setting.

Also, add tests to start the shadow jar, and also to test the shadow jar settings.
2025-03-03 07:48:35 -08:00
Daniel Chao 9f22c56ff5 Make Truffle use fallback runtime in Gradle plugin (#995)
Using native libraries in Gradle plugins is problematic; this adds some flags that causes Truffle to use a fallback runtime that avoids loading native libraries.
2025-02-27 12:54:49 -08:00
Daniel Chao 06d04878f7 Add Kotlin version bump to breaking changes (#987) 2025-02-26 14:06:06 -08:00
Islon Scherer d3ba0f9e47 Start next dev iteration 2025-02-26 09:48:20 -08:00
Islon Scherer cc9827f032 remove folders from build executable dir 2025-02-26 09:48:20 -08:00
Islon Scherer d1f7b639a7 change version to 0.28.0 2025-02-26 09:48:20 -08:00
3673 changed files with 235600 additions and 24963 deletions

No files matched your search

-162
View File
@@ -1,162 +0,0 @@
//===----------------------------------------------------------------------===//
// Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//===----------------------------------------------------------------------===//
// File gets rendered to .circleci/config.yml via git hook.
amends "package://pkg.pkl-lang.org/pkl-project-commons/pkl.impl.circleci@1.1.1#/PklCI.pkl"
import "jobs/BuildNativeJob.pkl"
import "jobs/GradleCheckJob.pkl"
import "jobs/DeployJob.pkl"
import "jobs/SimpleGradleJob.pkl"
local prbJobs: Listing<String> = gradleCheckJobs.keys.toListing()
local buildAndTestJobs = (prbJobs) {
"bench"
"gradle-compatibility"
...buildNativeJobs.keys.filter((it) -> it.endsWith("snapshot"))
}
local releaseJobs = (prbJobs) {
"bench"
"gradle-compatibility"
...buildNativeJobs.keys.filter((it) -> it.endsWith("release"))
}
prb {
jobs = prbJobs
}
main {
jobs {
...buildAndTestJobs
new {
["deploy-snapshot"] {
requires = buildAndTestJobs
context = "pkl-maven-release"
}
}
}
}
release {
jobs {
...releaseJobs
// do GitHub release first because we can overwrite the tag.
// publishing to Maven Central is final.
new {
["github-release"] {
requires = releaseJobs
context = "pkl-github-release"
}
}
new {
["deploy-release"] {
requires { "github-release" }
context = "pkl-maven-release"
}
}
}
}
releaseBranch {
jobs = releaseJobs
}
triggerDocsBuild = "both"
triggerPackageDocsBuild = "release"
local buildNativeJobs: Mapping<String, BuildNativeJob> = new {
for (_dist in List("release", "snapshot")) {
for (_arch in List("amd64", "aarch64")) {
for (_os in List("macOS", "linux")) {
["pkl-cli-\(_os)-\(_arch)-\(_dist)"] {
arch = _arch
os = _os
isRelease = _dist == "release"
}
}
}
["pkl-cli-linux-alpine-amd64-\(_dist)"] {
arch = "amd64"
os = "linux"
musl = true
isRelease = _dist == "release"
}
["pkl-cli-windows-amd64-\(_dist)"] {
arch = "amd64"
os = "windows"
isRelease = _dist == "release"
}
}
}
local gradleCheckJobs: Mapping<String, GradleCheckJob> = new {
["gradle-check"] {
javaVersion = "21.0"
isRelease = false
os = "linux"
}
["gradle-check-windows"] {
javaVersion = "21.0"
isRelease = false
os = "windows"
}
}
jobs {
for (jobName, job in buildNativeJobs) {
[jobName] = job.job
}
for (jobName, job in gradleCheckJobs) {
[jobName] = job.job
}
["bench"] = new SimpleGradleJob { command = "bench:jmh" }.job
["gradle-compatibility"] = new SimpleGradleJob {
name = "gradle compatibility"
command = #"""
:pkl-gradle:build \
:pkl-gradle:compatibilityTestReleases
"""#
}.job
["deploy-snapshot"] = new DeployJob { command = "publishToSonatype" }.job
["deploy-release"] = new DeployJob {
isRelease = true
command = "publishToSonatype closeAndReleaseSonatypeStagingRepository"
}.job
["github-release"] {
docker {
new { image = "maniator/gh:v2.40.1" }
}
steps {
new AttachWorkspaceStep { at = "." }
new RunStep {
name = "Publish release on GitHub"
command = #"""
# exclude build_artifacts.txt from publish
rm -f pkl-cli/build/executable/*.build_artifacts.txt
gh release create "${CIRCLE_TAG}" \
--title "${CIRCLE_TAG}" \
--target "${CIRCLE_SHA1}" \
--verify-tag \
--notes "Release notes: https://pkl-lang.org/main/current/release-notes/changelog.html#release-${CIRCLE_TAG}" \
--repo "${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}" \
pkl-cli/build/executable/*
"""#
}
}
}
}
-939
View File
@@ -1,939 +0,0 @@
# Generated from CircleCI.pkl. DO NOT EDIT.
version: '2.1'
orbs:
pr-approval: apple/pr-approval@0.1.0
jobs:
pkl-cli-macOS-amd64-release:
steps:
- checkout
- run:
command: /usr/sbin/softwareupdate --install-rosetta --agree-to-license
name: Installing Rosetta 2
- run:
command: |-
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_mac_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz
mkdir $HOME/jdk \
&& cd $HOME/jdk \
&& cat /tmp/jdk.tar.gz | tar --strip-components=1 -xzC .
name: Set up environment
shell: '#!/bin/bash -exo pipefail'
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:macExecutableAmd64 pkl-core:testMacExecutableAmd64 pkl-server:testMacExecutableAmd64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
JAVA_HOME: /Users/distiller/jdk/Contents/Home
resource_class: macos.m1.large.gen1
macos:
xcode: 15.3.0
pkl-cli-linux-amd64-release:
steps:
- checkout
- restore_cache:
key: staticdeps-amd64
name: Restore static deps from cache
- run:
command: |-
sed -ie '/\[ol8_codeready_builder\]/,/^$/s/enabled=0/enabled=1/g' /etc/yum.repos.d/oracle-linux-ol8.repo \
&& microdnf -y install util-linux tree coreutils-single findutils curl tar gzip git zlib-devel gcc-c++ make openssl glibc-langpack-en libstdc++-static \
&& microdnf clean all \
&& rm -rf /var/cache/dnf
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_linux_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \
&& cd /jdk \
&& cat /tmp/jdk.tar.gz | tar --strip-components=1 -xzC .
mkdir -p ~/staticdeps/bin
cp /usr/lib/gcc/x86_64-redhat-linux/8/libstdc++.a ~/staticdeps
# install zlib
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
curl -Lf https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
mkdir -p /tmp/dep_zlib-1.2.13 \
&& cd /tmp/dep_zlib-1.2.13 \
&& cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC . \
&& echo "zlib-1.2.13: configure..." && ./configure --static --prefix="$HOME"/staticdeps > /dev/null \
&& echo "zlib-1.2.13: make..." && make -s -j4 \
&& echo "zlib-1.2.13: make install..." && make -s install \
&& rm -rf /tmp/dep_zlib-1.2.13
fi
# install musl
if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then
curl -Lf https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz
mkdir -p /tmp/dep_musl-1.2.2 \
&& cd /tmp/dep_musl-1.2.2 \
&& cat /tmp/musl.tar.gz | tar --strip-components=1 -xzC . \
&& echo "musl-1.2.2: configure..." && ./configure --disable-shared --prefix="$HOME"/staticdeps > /dev/null \
&& echo "musl-1.2.2: make..." && make -s -j4 \
&& echo "musl-1.2.2: make install..." && make -s install \
&& rm -rf /tmp/dep_musl-1.2.2
# native-image expects to find an executable at this path.
ln -s ~/staticdeps/bin/musl-gcc ~/staticdeps/bin/x86_64-linux-musl-gcc
fi
name: Set up environment
shell: '#!/bin/bash -exo pipefail'
- save_cache:
paths:
- ~/staticdeps
key: staticdeps-amd64
name: Save statics deps to cache
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:linuxExecutableAmd64 pkl-core:testLinuxExecutableAmd64 pkl-server:testLinuxExecutableAmd64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
JAVA_HOME: /jdk
resource_class: xlarge
docker:
- image: oraclelinux:8-slim
pkl-cli-macOS-aarch64-release:
steps:
- checkout
- run:
command: |-
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_aarch64_mac_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz
mkdir $HOME/jdk \
&& cd $HOME/jdk \
&& cat /tmp/jdk.tar.gz | tar --strip-components=1 -xzC .
name: Set up environment
shell: '#!/bin/bash -exo pipefail'
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:macExecutableAarch64 pkl-core:testMacExecutableAarch64 pkl-server:testMacExecutableAarch64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
JAVA_HOME: /Users/distiller/jdk/Contents/Home
resource_class: macos.m1.large.gen1
macos:
xcode: 15.3.0
pkl-cli-linux-aarch64-release:
steps:
- checkout
- restore_cache:
key: staticdeps-aarch64
name: Restore static deps from cache
- run:
command: |-
sed -ie '/\[ol8_codeready_builder\]/,/^$/s/enabled=0/enabled=1/g' /etc/yum.repos.d/oracle-linux-ol8.repo \
&& microdnf -y install util-linux tree coreutils-single findutils curl tar gzip git zlib-devel gcc-c++ make openssl glibc-langpack-en libstdc++-static \
&& microdnf clean all \
&& rm -rf /var/cache/dnf
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_aarch64_linux_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \
&& cd /jdk \
&& cat /tmp/jdk.tar.gz | tar --strip-components=1 -xzC .
mkdir -p ~/staticdeps/bin
cp /usr/lib/gcc/aarch64-redhat-linux/8/libstdc++.a ~/staticdeps
# install zlib
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
curl -Lf https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
mkdir -p /tmp/dep_zlib-1.2.13 \
&& cd /tmp/dep_zlib-1.2.13 \
&& cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC . \
&& echo "zlib-1.2.13: configure..." && ./configure --static --prefix="$HOME"/staticdeps > /dev/null \
&& echo "zlib-1.2.13: make..." && make -s -j4 \
&& echo "zlib-1.2.13: make install..." && make -s install \
&& rm -rf /tmp/dep_zlib-1.2.13
fi
name: Set up environment
shell: '#!/bin/bash -exo pipefail'
- save_cache:
paths:
- ~/staticdeps
key: staticdeps-aarch64
name: Save statics deps to cache
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:linuxExecutableAarch64 pkl-core:testLinuxExecutableAarch64 pkl-server:testLinuxExecutableAarch64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
JAVA_HOME: /jdk
resource_class: arm.xlarge
docker:
- image: arm64v8/oraclelinux:8-slim
pkl-cli-linux-alpine-amd64-release:
steps:
- checkout
- restore_cache:
key: staticdeps-amd64
name: Restore static deps from cache
- run:
command: |-
sed -ie '/\[ol8_codeready_builder\]/,/^$/s/enabled=0/enabled=1/g' /etc/yum.repos.d/oracle-linux-ol8.repo \
&& microdnf -y install util-linux tree coreutils-single findutils curl tar gzip git zlib-devel gcc-c++ make openssl glibc-langpack-en libstdc++-static \
&& microdnf clean all \
&& rm -rf /var/cache/dnf
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_linux_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \
&& cd /jdk \
&& cat /tmp/jdk.tar.gz | tar --strip-components=1 -xzC .
mkdir -p ~/staticdeps/bin
cp /usr/lib/gcc/x86_64-redhat-linux/8/libstdc++.a ~/staticdeps
# install zlib
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
curl -Lf https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
mkdir -p /tmp/dep_zlib-1.2.13 \
&& cd /tmp/dep_zlib-1.2.13 \
&& cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC . \
&& echo "zlib-1.2.13: configure..." && ./configure --static --prefix="$HOME"/staticdeps > /dev/null \
&& echo "zlib-1.2.13: make..." && make -s -j4 \
&& echo "zlib-1.2.13: make install..." && make -s install \
&& rm -rf /tmp/dep_zlib-1.2.13
fi
# install musl
if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then
curl -Lf https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz
mkdir -p /tmp/dep_musl-1.2.2 \
&& cd /tmp/dep_musl-1.2.2 \
&& cat /tmp/musl.tar.gz | tar --strip-components=1 -xzC . \
&& echo "musl-1.2.2: configure..." && ./configure --disable-shared --prefix="$HOME"/staticdeps > /dev/null \
&& echo "musl-1.2.2: make..." && make -s -j4 \
&& echo "musl-1.2.2: make install..." && make -s install \
&& rm -rf /tmp/dep_musl-1.2.2
# native-image expects to find an executable at this path.
ln -s ~/staticdeps/bin/musl-gcc ~/staticdeps/bin/x86_64-linux-musl-gcc
fi
name: Set up environment
shell: '#!/bin/bash -exo pipefail'
- save_cache:
paths:
- ~/staticdeps
key: staticdeps-amd64
name: Save statics deps to cache
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:alpineExecutableAmd64 pkl-core:testAlpineExecutableAmd64 pkl-server:testAlpineExecutableAmd64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
JAVA_HOME: /jdk
resource_class: xlarge
docker:
- image: oraclelinux:8-slim
pkl-cli-windows-amd64-release:
steps:
- checkout
- run:
command: |-
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_windows_hotspot_21.0.5_11.zip -o /tmp/jdk.zip
unzip /tmp/jdk.zip -d /tmp/jdk \
&& cd /tmp/jdk/jdk-* \
&& mkdir /jdk \
&& cp -r . /jdk
name: Set up environment
shell: bash.exe
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:windowsExecutableAmd64 pkl-core:testWindowsExecutableAmd64 pkl-server:testWindowsExecutableAmd64
name: gradle buildNative
shell: bash.exe
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
JAVA_HOME: /jdk
resource_class: windows.large
machine:
image: windows-server-2022-gui:current
pkl-cli-macOS-amd64-snapshot:
steps:
- checkout
- run:
command: /usr/sbin/softwareupdate --install-rosetta --agree-to-license
name: Installing Rosetta 2
- run:
command: |-
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_mac_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz
mkdir $HOME/jdk \
&& cd $HOME/jdk \
&& cat /tmp/jdk.tar.gz | tar --strip-components=1 -xzC .
name: Set up environment
shell: '#!/bin/bash -exo pipefail'
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true pkl-cli:macExecutableAmd64 pkl-core:testMacExecutableAmd64 pkl-server:testMacExecutableAmd64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
JAVA_HOME: /Users/distiller/jdk/Contents/Home
resource_class: macos.m1.large.gen1
macos:
xcode: 15.3.0
pkl-cli-linux-amd64-snapshot:
steps:
- checkout
- restore_cache:
key: staticdeps-amd64
name: Restore static deps from cache
- run:
command: |-
sed -ie '/\[ol8_codeready_builder\]/,/^$/s/enabled=0/enabled=1/g' /etc/yum.repos.d/oracle-linux-ol8.repo \
&& microdnf -y install util-linux tree coreutils-single findutils curl tar gzip git zlib-devel gcc-c++ make openssl glibc-langpack-en libstdc++-static \
&& microdnf clean all \
&& rm -rf /var/cache/dnf
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_linux_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \
&& cd /jdk \
&& cat /tmp/jdk.tar.gz | tar --strip-components=1 -xzC .
mkdir -p ~/staticdeps/bin
cp /usr/lib/gcc/x86_64-redhat-linux/8/libstdc++.a ~/staticdeps
# install zlib
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
curl -Lf https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
mkdir -p /tmp/dep_zlib-1.2.13 \
&& cd /tmp/dep_zlib-1.2.13 \
&& cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC . \
&& echo "zlib-1.2.13: configure..." && ./configure --static --prefix="$HOME"/staticdeps > /dev/null \
&& echo "zlib-1.2.13: make..." && make -s -j4 \
&& echo "zlib-1.2.13: make install..." && make -s install \
&& rm -rf /tmp/dep_zlib-1.2.13
fi
# install musl
if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then
curl -Lf https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz
mkdir -p /tmp/dep_musl-1.2.2 \
&& cd /tmp/dep_musl-1.2.2 \
&& cat /tmp/musl.tar.gz | tar --strip-components=1 -xzC . \
&& echo "musl-1.2.2: configure..." && ./configure --disable-shared --prefix="$HOME"/staticdeps > /dev/null \
&& echo "musl-1.2.2: make..." && make -s -j4 \
&& echo "musl-1.2.2: make install..." && make -s install \
&& rm -rf /tmp/dep_musl-1.2.2
# native-image expects to find an executable at this path.
ln -s ~/staticdeps/bin/musl-gcc ~/staticdeps/bin/x86_64-linux-musl-gcc
fi
name: Set up environment
shell: '#!/bin/bash -exo pipefail'
- save_cache:
paths:
- ~/staticdeps
key: staticdeps-amd64
name: Save statics deps to cache
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true pkl-cli:linuxExecutableAmd64 pkl-core:testLinuxExecutableAmd64 pkl-server:testLinuxExecutableAmd64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
JAVA_HOME: /jdk
resource_class: xlarge
docker:
- image: oraclelinux:8-slim
pkl-cli-macOS-aarch64-snapshot:
steps:
- checkout
- run:
command: |-
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_aarch64_mac_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz
mkdir $HOME/jdk \
&& cd $HOME/jdk \
&& cat /tmp/jdk.tar.gz | tar --strip-components=1 -xzC .
name: Set up environment
shell: '#!/bin/bash -exo pipefail'
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true pkl-cli:macExecutableAarch64 pkl-core:testMacExecutableAarch64 pkl-server:testMacExecutableAarch64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
JAVA_HOME: /Users/distiller/jdk/Contents/Home
resource_class: macos.m1.large.gen1
macos:
xcode: 15.3.0
pkl-cli-linux-aarch64-snapshot:
steps:
- checkout
- restore_cache:
key: staticdeps-aarch64
name: Restore static deps from cache
- run:
command: |-
sed -ie '/\[ol8_codeready_builder\]/,/^$/s/enabled=0/enabled=1/g' /etc/yum.repos.d/oracle-linux-ol8.repo \
&& microdnf -y install util-linux tree coreutils-single findutils curl tar gzip git zlib-devel gcc-c++ make openssl glibc-langpack-en libstdc++-static \
&& microdnf clean all \
&& rm -rf /var/cache/dnf
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_aarch64_linux_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \
&& cd /jdk \
&& cat /tmp/jdk.tar.gz | tar --strip-components=1 -xzC .
mkdir -p ~/staticdeps/bin
cp /usr/lib/gcc/aarch64-redhat-linux/8/libstdc++.a ~/staticdeps
# install zlib
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
curl -Lf https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
mkdir -p /tmp/dep_zlib-1.2.13 \
&& cd /tmp/dep_zlib-1.2.13 \
&& cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC . \
&& echo "zlib-1.2.13: configure..." && ./configure --static --prefix="$HOME"/staticdeps > /dev/null \
&& echo "zlib-1.2.13: make..." && make -s -j4 \
&& echo "zlib-1.2.13: make install..." && make -s install \
&& rm -rf /tmp/dep_zlib-1.2.13
fi
name: Set up environment
shell: '#!/bin/bash -exo pipefail'
- save_cache:
paths:
- ~/staticdeps
key: staticdeps-aarch64
name: Save statics deps to cache
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true pkl-cli:linuxExecutableAarch64 pkl-core:testLinuxExecutableAarch64 pkl-server:testLinuxExecutableAarch64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
JAVA_HOME: /jdk
resource_class: arm.xlarge
docker:
- image: arm64v8/oraclelinux:8-slim
pkl-cli-linux-alpine-amd64-snapshot:
steps:
- checkout
- restore_cache:
key: staticdeps-amd64
name: Restore static deps from cache
- run:
command: |-
sed -ie '/\[ol8_codeready_builder\]/,/^$/s/enabled=0/enabled=1/g' /etc/yum.repos.d/oracle-linux-ol8.repo \
&& microdnf -y install util-linux tree coreutils-single findutils curl tar gzip git zlib-devel gcc-c++ make openssl glibc-langpack-en libstdc++-static \
&& microdnf clean all \
&& rm -rf /var/cache/dnf
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_linux_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \
&& cd /jdk \
&& cat /tmp/jdk.tar.gz | tar --strip-components=1 -xzC .
mkdir -p ~/staticdeps/bin
cp /usr/lib/gcc/x86_64-redhat-linux/8/libstdc++.a ~/staticdeps
# install zlib
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
curl -Lf https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
mkdir -p /tmp/dep_zlib-1.2.13 \
&& cd /tmp/dep_zlib-1.2.13 \
&& cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC . \
&& echo "zlib-1.2.13: configure..." && ./configure --static --prefix="$HOME"/staticdeps > /dev/null \
&& echo "zlib-1.2.13: make..." && make -s -j4 \
&& echo "zlib-1.2.13: make install..." && make -s install \
&& rm -rf /tmp/dep_zlib-1.2.13
fi
# install musl
if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then
curl -Lf https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz
mkdir -p /tmp/dep_musl-1.2.2 \
&& cd /tmp/dep_musl-1.2.2 \
&& cat /tmp/musl.tar.gz | tar --strip-components=1 -xzC . \
&& echo "musl-1.2.2: configure..." && ./configure --disable-shared --prefix="$HOME"/staticdeps > /dev/null \
&& echo "musl-1.2.2: make..." && make -s -j4 \
&& echo "musl-1.2.2: make install..." && make -s install \
&& rm -rf /tmp/dep_musl-1.2.2
# native-image expects to find an executable at this path.
ln -s ~/staticdeps/bin/musl-gcc ~/staticdeps/bin/x86_64-linux-musl-gcc
fi
name: Set up environment
shell: '#!/bin/bash -exo pipefail'
- save_cache:
paths:
- ~/staticdeps
key: staticdeps-amd64
name: Save statics deps to cache
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true pkl-cli:alpineExecutableAmd64 pkl-core:testAlpineExecutableAmd64 pkl-server:testAlpineExecutableAmd64
name: gradle buildNative
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
JAVA_HOME: /jdk
resource_class: xlarge
docker:
- image: oraclelinux:8-slim
pkl-cli-windows-amd64-snapshot:
steps:
- checkout
- run:
command: |-
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_windows_hotspot_21.0.5_11.zip -o /tmp/jdk.zip
unzip /tmp/jdk.zip -d /tmp/jdk \
&& cd /tmp/jdk/jdk-* \
&& mkdir /jdk \
&& cp -r . /jdk
name: Set up environment
shell: bash.exe
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true pkl-cli:windowsExecutableAmd64 pkl-core:testWindowsExecutableAmd64 pkl-server:testWindowsExecutableAmd64
name: gradle buildNative
shell: bash.exe
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
JAVA_HOME: /jdk
resource_class: windows.large
machine:
image: windows-server-2022-gui:current
gradle-check:
steps:
- checkout
- run:
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true check
name: gradle check
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
docker:
- image: cimg/openjdk:21.0
gradle-check-windows:
steps:
- checkout
- run:
command: |-
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_windows_hotspot_21.0.5_11.zip -o /tmp/jdk.zip
unzip /tmp/jdk.zip -d /tmp/jdk \
&& cd /tmp/jdk/jdk-* \
&& mkdir /jdk \
&& cp -r . /jdk
name: Set up environment
shell: bash.exe
- run:
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true check
name: gradle check
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
JAVA_HOME: /jdk
resource_class: windows.large
machine:
image: windows-server-2022-gui:current
bench:
steps:
- checkout
- run:
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true bench:jmh
name: bench:jmh
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
docker:
- image: cimg/openjdk:21.0
gradle-compatibility:
steps:
- checkout
- run:
command: |-
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true :pkl-gradle:build \
:pkl-gradle:compatibilityTestReleases
name: gradle compatibility
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
docker:
- image: cimg/openjdk:21.0
deploy-snapshot:
steps:
- checkout
- attach_workspace:
at: '.'
- run:
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true publishToSonatype
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
docker:
- image: cimg/openjdk:21.0
deploy-release:
steps:
- checkout
- attach_workspace:
at: '.'
- run:
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true publishToSonatype closeAndReleaseSonatypeStagingRepository
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
docker:
- image: cimg/openjdk:21.0
github-release:
steps:
- attach_workspace:
at: '.'
- run:
command: |-
# exclude build_artifacts.txt from publish
rm -f pkl-cli/build/executable/*.build_artifacts.txt
gh release create "${CIRCLE_TAG}" \
--title "${CIRCLE_TAG}" \
--target "${CIRCLE_SHA1}" \
--verify-tag \
--notes "Release notes: https://pkl-lang.org/main/current/release-notes/changelog.html#release-${CIRCLE_TAG}" \
--repo "${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}" \
pkl-cli/build/executable/*
name: Publish release on GitHub
docker:
- image: maniator/gh:v2.40.1
trigger-docsite-build:
steps:
- run:
command: |-
curl --location \
--request POST \
--header "Content-Type: application/json" \
-u "${CIRCLE_TOKEN}:" \
--data '{ "branch": "main" }' \
"https://circleci.com/api/v2/project/github/apple/pkl-lang.org/pipeline"
name: Triggering docsite build
docker:
- image: cimg/base:current
trigger-package-docs-build:
steps:
- run:
command: |-
curl --location \
--request POST \
--header "Content-Type: application/json" \
-u "${CIRCLE_TOKEN}:" \
--data '{ "branch": "main" }' \
"https://circleci.com/api/v2/project/github/apple/pkl-package-docs/pipeline"
name: Triggering docsite build
docker:
- image: cimg/base:current
workflows:
prb:
jobs:
- hold:
type: approval
- pr-approval/authenticate:
context: pkl-pr-approval
- gradle-check:
requires:
- hold
- gradle-check-windows:
requires:
- hold
when:
matches:
value: << pipeline.git.branch >>
pattern: ^pull/\d+(/head)?$
main:
jobs:
- gradle-check
- gradle-check-windows
- bench
- gradle-compatibility
- pkl-cli-macOS-amd64-snapshot
- pkl-cli-linux-amd64-snapshot
- pkl-cli-macOS-aarch64-snapshot
- pkl-cli-linux-aarch64-snapshot
- pkl-cli-linux-alpine-amd64-snapshot
- pkl-cli-windows-amd64-snapshot
- deploy-snapshot:
requires:
- gradle-check
- gradle-check-windows
- bench
- gradle-compatibility
- pkl-cli-macOS-amd64-snapshot
- pkl-cli-linux-amd64-snapshot
- pkl-cli-macOS-aarch64-snapshot
- pkl-cli-linux-aarch64-snapshot
- pkl-cli-linux-alpine-amd64-snapshot
- pkl-cli-windows-amd64-snapshot
context: pkl-maven-release
- trigger-docsite-build:
requires:
- deploy-snapshot
context:
- pkl-pr-approval
when:
equal:
- main
- << pipeline.git.branch >>
release:
jobs:
- gradle-check:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- gradle-check-windows:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- bench:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- gradle-compatibility:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- pkl-cli-macOS-amd64-release:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- pkl-cli-linux-amd64-release:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- pkl-cli-macOS-aarch64-release:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- pkl-cli-linux-aarch64-release:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- pkl-cli-linux-alpine-amd64-release:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- pkl-cli-windows-amd64-release:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- github-release:
requires:
- gradle-check
- gradle-check-windows
- bench
- gradle-compatibility
- pkl-cli-macOS-amd64-release
- pkl-cli-linux-amd64-release
- pkl-cli-macOS-aarch64-release
- pkl-cli-linux-aarch64-release
- pkl-cli-linux-alpine-amd64-release
- pkl-cli-windows-amd64-release
context: pkl-github-release
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- deploy-release:
requires:
- github-release
context: pkl-maven-release
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- trigger-package-docs-build:
requires:
- deploy-release
context:
- pkl-pr-approval
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
release-branch:
jobs:
- gradle-check
- gradle-check-windows
- bench
- gradle-compatibility
- pkl-cli-macOS-amd64-release
- pkl-cli-linux-amd64-release
- pkl-cli-macOS-aarch64-release
- pkl-cli-linux-aarch64-release
- pkl-cli-linux-alpine-amd64-release
- pkl-cli-windows-amd64-release
when:
matches:
value: << pipeline.git.branch >>
pattern: ^release/\d+\.\d+$
-186
View File
@@ -1,186 +0,0 @@
//===----------------------------------------------------------------------===//
// Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//===----------------------------------------------------------------------===//
/// Builds the native `pkl` CLI
extends "GradleJob.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.1.2#/Config.pkl"
/// The architecture to use
arch: "amd64"|"aarch64"
/// Whether to link to musl. Otherwise, links to glibc.
musl: Boolean = false
javaVersion = "21.0"
local setupLinuxEnvironment: Config.RunStep =
let (muslVersion = "1.2.2")
let (zlibVersion = "1.2.13")
new {
name = "Set up environment"
shell = "#!/bin/bash -exo pipefail"
command = new Listing {
#"""
sed -ie '/\[ol8_codeready_builder\]/,/^$/s/enabled=0/enabled=1/g' /etc/yum.repos.d/oracle-linux-ol8.repo \
&& microdnf -y install util-linux tree coreutils-single findutils curl tar gzip git zlib-devel gcc-c++ make openssl glibc-langpack-en libstdc++-static \
&& microdnf clean all \
&& rm -rf /var/cache/dnf
# install jdk
curl -Lf \
https://github.com/adoptium/temurin\#(module.majorJdkVersion)-binaries/releases/download/\#(module.jdkGitHubReleaseName)/OpenJDK\#(module.majorJdkVersion)U-jdk_\#(if (arch == "amd64") "x64" else "aarch64")_linux_hotspot_\#(module.jdkVersionAlt).tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \
&& cd /jdk \
&& cat /tmp/jdk.tar.gz | tar --strip-components=1 -xzC .
mkdir -p ~/staticdeps/bin
cp /usr/lib/gcc/\#(if (arch == "amd64") "x86_64" else "aarch64")-redhat-linux/8/libstdc++.a ~/staticdeps
# install zlib
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
curl -Lf https://github.com/madler/zlib/releases/download/v\#(zlibVersion)/zlib-\#(zlibVersion).tar.gz -o /tmp/zlib.tar.gz
mkdir -p /tmp/dep_zlib-\#(zlibVersion) \
&& cd /tmp/dep_zlib-\#(zlibVersion) \
&& cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC . \
&& echo "zlib-\#(zlibVersion): configure..." && ./configure --static --prefix="$HOME"/staticdeps > /dev/null \
&& echo "zlib-\#(zlibVersion): make..." && make -s -j4 \
&& echo "zlib-\#(zlibVersion): make install..." && make -s install \
&& rm -rf /tmp/dep_zlib-\#(zlibVersion)
fi
"""#
// don't need musl on aarch because GraalVM only supports musl builds on x86
when (arch == "amd64") {
#"""
# install musl
if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then
curl -Lf https://musl.libc.org/releases/musl-\#(muslVersion).tar.gz -o /tmp/musl.tar.gz
mkdir -p /tmp/dep_musl-\#(muslVersion) \
&& cd /tmp/dep_musl-\#(muslVersion) \
&& cat /tmp/musl.tar.gz | tar --strip-components=1 -xzC . \
&& echo "musl-\#(muslVersion): configure..." && ./configure --disable-shared --prefix="$HOME"/staticdeps > /dev/null \
&& echo "musl-\#(muslVersion): make..." && make -s -j4 \
&& echo "musl-\#(muslVersion): make install..." && make -s install \
&& rm -rf /tmp/dep_musl-\#(muslVersion)
# native-image expects to find an executable at this path.
ln -s ~/staticdeps/bin/musl-gcc ~/staticdeps/bin/x86_64-linux-musl-gcc
fi
"""#
}
}.join("\n\n")
}
local setupMacEnvironment: Config.RunStep =
new {
name = "Set up environment"
shell = "#!/bin/bash -exo pipefail"
command =
#"""
# install jdk
curl -Lf \
https://github.com/adoptium/temurin\#(module.majorJdkVersion)-binaries/releases/download/\#(module.jdkGitHubReleaseName)/OpenJDK\#(module.majorJdkVersion)U-jdk_\#(if (arch == "amd64") "x64" else "aarch64")_mac_hotspot_\#(module.jdkVersionAlt).tar.gz -o /tmp/jdk.tar.gz
mkdir $HOME/jdk \
&& cd $HOME/jdk \
&& cat /tmp/jdk.tar.gz | tar --strip-components=1 -xzC .
"""#
}
steps {
when (os == "linux") {
new Config.RestoreCacheStep {
name = "Restore static deps from cache"
key = "staticdeps-\(arch)"
}
setupLinuxEnvironment
new Config.SaveCacheStep {
name = "Save statics deps to cache"
key = "staticdeps-\(arch)"
paths {
"~/staticdeps"
}
}
}
when (os == "macOS") {
when (arch == "amd64") {
new Config.RunStep {
name = "Installing Rosetta 2"
command = """
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
"""
}
}
setupMacEnvironment
}
new Config.RunStep {
name = "gradle buildNative"
local _os =
if (module.os == "macOS") "mac"
else if (musl) "alpine"
else if (module.os == "windows") "windows"
else "linux"
local jobName = "\(_os)Executable\(arch.capitalize())"
when (module.os == "windows") {
shell = "bash.exe"
}
command = #"""
export PATH=~/staticdeps/bin:$PATH
./gradlew \#(module.gradleArgs) pkl-cli:\#(jobName) pkl-core:test\#(jobName.capitalize()) pkl-server:test\#(jobName.capitalize())
"""#
}
new Config.PersistToWorkspaceStep {
root = "."
paths {
"pkl-cli/build/executable/"
}
}
}
job {
when (os == "macOS") {
macos {
xcode = "15.3.0"
}
resource_class = "macos.m1.large.gen1"
environment {
["JAVA_HOME"] = "/Users/distiller/jdk/Contents/Home"
}
}
when (os == "linux") {
docker = new Listing<Config.DockerImage> {
new {
image = if (arch == "aarch64") "arm64v8/oraclelinux:8-slim" else "oraclelinux:8-slim"
}
}
environment {
["JAVA_HOME"] = "/jdk"
}
resource_class = if (arch == "aarch64") "arm.xlarge" else "xlarge"
}
when (os == "windows") {
machine {
image = "windows-server-2022-gui:current"
}
resource_class = "windows.large"
environment {
["JAVA_HOME"] = "/jdk"
}
}
}
-40
View File
@@ -1,40 +0,0 @@
//===----------------------------------------------------------------------===//
// Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//===----------------------------------------------------------------------===//
extends "GradleJob.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.1.2#/Config.pkl"
local self = this
javaVersion = "21.0"
command: String
os = "linux"
steps {
new Config.AttachWorkspaceStep { at = "." }
new Config.RunStep {
command = "./gradlew \(self.gradleArgs) \(module.command)"
}
// add jpkl to workspace so it gets published as a GitHub release
new Config.PersistToWorkspaceStep {
root = "."
paths {
"pkl-cli/build/executable/"
}
}
}
-25
View File
@@ -1,25 +0,0 @@
//===----------------------------------------------------------------------===//
// Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//===----------------------------------------------------------------------===//
extends "GradleJob.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.1.2#/Config.pkl"
steps {
new Config.RunStep {
name = "gradle check"
command = "./gradlew \(module.gradleArgs) check"
}
}
-101
View File
@@ -1,101 +0,0 @@
//===----------------------------------------------------------------------===//
// Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//===----------------------------------------------------------------------===//
abstract module GradleJob
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.1.2#/Config.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/pkl.experimental.uri@1.0.3#/URI.pkl"
/// Whether this is a release build or not.
isRelease: Boolean = false
/// The OS to run on
os: "macOS"|"linux"|"windows"
/// The version of Java to use.
javaVersion: "17.0"|"21.0"
fixed javaVersionFull =
if (javaVersion == "17.0") "17.0.9+9"
else "21.0.5+11"
fixed jdkVersionAlt = javaVersionFull.replaceLast("+", "_")
fixed majorJdkVersion = javaVersionFull.split(".").first
fixed jdkGitHubReleaseName =
let (ver =
// 17.0.9+9 is missing some binaries (see https://github.com/adoptium/adoptium-support/issues/994)
if (javaVersionFull == "17.0.9+9" && os == "windows") "jdk-17.0.9+9.1"
else "jdk-\(javaVersionFull)"
)
URI.encodeComponent(ver)
fixed gradleArgs = new Listing {
"--info"
"--stacktrace"
"-DtestReportsDir=${HOME}/test-results"
"-DpklMultiJdkTesting=true"
when (isRelease) {
"-DreleaseBuild=true"
}
}.join(" ")
steps: Listing<Config.Step>
job: Config.Job = new {
environment {
["LANG"] = "en_US.UTF-8"
when (os == "windows") {
["JAVA_HOME"] = "/jdk"
}
}
when (os == "linux") {
docker {
new {
image = "cimg/openjdk:\(javaVersion)"
}
}
}
when (os == "windows") {
machine {
image = "windows-server-2022-gui:current"
}
resource_class = "windows.large"
}
steps {
"checkout"
when (os == "windows") {
new Config.RunStep {
name = "Set up environment"
shell = "bash.exe"
command = #"""
# install jdk
curl -Lf \
https://github.com/adoptium/temurin\#(majorJdkVersion)-binaries/releases/download/\#(jdkGitHubReleaseName)/OpenJDK\#(majorJdkVersion)U-jdk_x64_windows_hotspot_\#(jdkVersionAlt).zip -o /tmp/jdk.zip
unzip /tmp/jdk.zip -d /tmp/jdk \
&& cd /tmp/jdk/jdk-* \
&& mkdir /jdk \
&& cp -r . /jdk
"""#
}
}
...module.steps
new Config.StoreTestResults {
path = "~/test-results"
}
}
}
-35
View File
@@ -1,35 +0,0 @@
//===----------------------------------------------------------------------===//
// Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//===----------------------------------------------------------------------===//
extends "GradleJob.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.1.2#/Config.pkl"
name: String = command
command: String
os = "linux"
javaVersion = "21.0"
steps {
new Config.RunStep {
name = module.name
command = """
./gradlew \(module.gradleArgs) \(module.command)
"""
}
}
+2
View File
@@ -1,2 +1,4 @@
# Auto-format Kotlin code
816cd483c8adf4c04e14236c173a1dc6bd2579ea
# Format Kotlin code again
2b3603b544bae2ad87374b65afaf8ac018216261
+1
View File
@@ -1,5 +1,6 @@
# linguist-generated would suppress files in diffs
**/src/test/files/** linguist-vendored
.github/workflows/* linguist-generated
/docs/** linguist-documentation
+3 -3
View File
@@ -2,7 +2,7 @@
files=`git diff --cached --name-status`
if [[ $files =~ .circleci/config.pkl ]]; then
pkl eval .circleci/config.pkl -o .circleci/config.yml
git add .circleci/config.yml
if [[ $files =~ .github/* ]]; then
pkl eval --project-dir .github/ -m .github .github/index.pkl
git add .github/workflows/
fi
+10
View File
@@ -0,0 +1,10 @@
amends "pkl:Project"
dependencies {
["pkl.impl.ghactions"] {
uri = "package://pkg.pkl-lang.org/pkl-project-commons/pkl.impl.ghactions@1.8.2"
}
["gha"] {
uri = "package://pkg.pkl-lang.org/pkl-pantry/com.github.actions@1.4.0"
}
}
+40
View File
@@ -0,0 +1,40 @@
{
"schemaVersion": 1,
"resolvedDependencies": {
"package://pkg.pkl-lang.org/pkl-pantry/com.github.actions@1": {
"type": "remote",
"uri": "projectpackage://pkg.pkl-lang.org/pkl-pantry/com.github.actions@1.9.0",
"checksums": {
"sha256": "5947924cf94fae9d8cdca42ade3f86db2675842cab7254214e7c0e281ddb6908"
}
},
"package://pkg.pkl-lang.org/pkl-project-commons/pkl.impl.ghactions@1": {
"type": "remote",
"uri": "projectpackage://pkg.pkl-lang.org/pkl-project-commons/pkl.impl.ghactions@1.8.2",
"checksums": {
"sha256": "12cca6326806ec37abc790a6707b6d907b4f8ba97628f2bc7fb327b5a6f68b49"
}
},
"package://pkg.pkl-lang.org/pkl-pantry/pkl.experimental.deepToTyped@1": {
"type": "remote",
"uri": "projectpackage://pkg.pkl-lang.org/pkl-pantry/pkl.experimental.deepToTyped@1.2.1",
"checksums": {
"sha256": "6e752d1e84aff24c3a1801658f27f12af70840c39b3fe7bac509c8178d566d25"
}
},
"package://pkg.pkl-lang.org/pkl-pantry/pkl.github.dependabotManagedActions@1": {
"type": "remote",
"uri": "projectpackage://pkg.pkl-lang.org/pkl-pantry/pkl.github.dependabotManagedActions@1.1.9",
"checksums": {
"sha256": "467b91559f31ad7401c78d3df9569b5ec7aa4e1b49209f9f22d02bd72971e0bd"
}
},
"package://pkg.pkl-lang.org/pkl-pantry/com.github.dependabot@1": {
"type": "remote",
"uri": "projectpackage://pkg.pkl-lang.org/pkl-pantry/com.github.dependabot@1.0.4",
"checksums": {
"sha256": "c7391119f946d7761d0ca0cc358ed8fe2bdfc691411087ccac89637bd96fec4a"
}
}
}
}
+25
View File
@@ -0,0 +1,25 @@
version: 2
updates:
- package-ecosystem: gradle
cooldown:
default-days: 7
directory: /
schedule:
interval: quarterly
- package-ecosystem: github-actions
cooldown:
default-days: 7
directory: /
groups:
first-party:
patterns:
- actions/*
codeql:
patterns:
- github/codeql-action/*
ignore:
- dependency-name: '*'
update-types:
- version-update:semver-major
schedule:
interval: quarterly
+261
View File
@@ -0,0 +1,261 @@
amends "@pkl.impl.ghactions/PklCI.pkl"
import "@gha/Workflow.pkl"
import "jobs/BuildJavaExecutableJob.pkl"
import "jobs/BuildNativeJob.pkl"
import "jobs/DeployJob.pkl"
import "jobs/GithubRelease.pkl"
import "jobs/GradleJob.pkl"
import "jobs/PklJob.pkl"
import "jobs/SimpleGradleJob.pkl"
triggerDocsBuild = "both"
testReports {
junit {
"**/build/test-results/**/*.xml"
}
html {
"**/build/reports/tests/**/*"
}
excludeJobs {
"bench"
"github-release"
"dependency-submission"
"dependency-review"
Regex("deploy-.*")
}
}
local baseGradleCheck: SimpleGradleJob = new {
isRelease = false
command = "check"
fetchDepth = 0
}
local gradleCheck = (baseGradleCheck) {
os = "linux"
}
local gradleCheckWindows = (baseGradleCheck) {
os = "windows"
}
local typealias PklJobs = Mapping<String, PklJob | *Workflow.Job>
local toWorkflowJobs: (PklJobs) -> Workflow.Jobs = (it) -> new Workflow.Jobs {
for (k, v in it) {
when (v is PklJob) {
[k] = v.job
} else {
[k] = v
}
}
}
local gradleCheckJobs: PklJobs = new {
["gradle-check"] = gradleCheck
["gradle-check-windows"] = gradleCheckWindows
}
local buildNativeJobs: Mapping<String, BuildNativeJob> = new {
for (_dist in List("release", "snapshot")) {
for (_project in List("pkl-cli", "pkl-doc", "libpkl")) {
for (_arch in List("amd64", "aarch64")) {
["\(_project)-linux-\(_arch)-\(_dist)"] {
arch = _arch
os = "linux"
isRelease = _dist == "release"
project = _project
buildDir = if (_project == "libpkl") "libpkl/build/native-libs/**/*" else "\(_project)*/build/executable/**/*"
}
}
["\(_project)-macOS-aarch64-\(_dist)"] {
arch = "aarch64"
os = "macOS"
isRelease = _dist == "release"
project = _project
}
["\(_project)-alpine-linux-amd64-\(_dist)"] {
arch = "amd64"
os = "linux"
musl = true
isRelease = _dist == "release"
project = _project
buildDir = if (_project == "libpkl") "libpkl*/build/distributions/**/*" else "\(_project)*/build/executable/**/*"
}
["\(_project)-windows-amd64-\(_dist)"] {
arch = "amd64"
os = "windows"
isRelease = _dist == "release"
project = _project
buildDir = if (_project == "libpkl") "libpkl*/build/distributions/**/*" else "\(_project)*/build/executable/**/*"
}
}
}
}
local buildNativeSnapshots = buildNativeJobs.toMap().filter((key, _) -> key.endsWith("snapshot"))
local buildNativeReleases = buildNativeJobs.toMap().filter((key, _) -> key.endsWith("release"))
local benchmarkJob: SimpleGradleJob = new { command = "bench:jmh" }
local gradleCompatibilityJob: SimpleGradleJob = new {
command = ":pkl-gradle:build :pkl-gradle:compatibilityTestReleases"
fetchDepth = 0
}
local buildJavaExecutableJob: BuildJavaExecutableJob = new {
fetchDepth = 0
}
local buildAndTestJobs: PklJobs = new {
...gradleCheckJobs
["bench"] = benchmarkJob
["gradle-compatibility"] = gradleCompatibilityJob
["java-executables-snapshot"] = (buildJavaExecutableJob) { isRelease = false }
...buildNativeSnapshots
}
local releaseJobs: PklJobs = new {
...gradleCheckJobs
["bench"] = benchmarkJob
["gradle-compatibility"] = gradleCompatibilityJob
["java-executables-release"] = (buildJavaExecutableJob) { isRelease = true }
...buildNativeReleases
}
// By default, just run ./gradlew check on linux.
// Trigger other checks based on GitHub PR description. Examples:
//
// * [windows] -- Test on Windows
// * [native] -- Test all native builds
// * [native-pkl-cli] -- Test all pkl-cli os/arch pairs
// * [native-pkl-cli-macos] -- Test pkl-cli on macOS
prb {
local prbJobs: Mapping<String, GradleJob> = new {
["gradle-check"] = gradleCheck
["gradle-check-windows"] = (gradleCheckWindows) {
`if` = "contains(github.event.pull_request.body, '[windows]')"
}
for (jobName, job in buildNativeSnapshots) {
[jobName] = (job) {
local tags = new Listing {
"[native]"
"[native-\(job.project)]"
"[native-\(job.project)-\(job.os)]"
"[native-\(job.project)-\(job.os)-\(job.arch)]"
"[native-\(job.project)-\(job.os)-\(job.arch)]"
when (job.musl) {
"[native-\(job.project)-alpine-\(job.os)-\(job.arch)]"
}
}
`if` =
tags
.toList()
.map((it) -> "contains(github.event.pull_request.body, '\(it)')")
.join(" || ")
}
}
}
local prbJobs2 = (prbJobs) {
[[true]] {
// better SLA when not running on nightly
nightlyMacOS = false
}
}
jobs = prbJobs2 |> toWorkflowJobs
}
build {
jobs = buildAndTestJobs |> toWorkflowJobs
}
main {
jobs =
(buildAndTestJobs) {
["deploy-snapshot"] = (
new DeployJob {
extraGradleArgs {
"--no-parallel"
}
command = "publishToSonatype"
}
) {
needs = buildAndTestJobs.keys.toListing()
}
["dependency-submission"] {
`runs-on` = "ubuntu-latest"
permissions {
contents = "write"
}
steps {
module.catalog.`actions/checkout@v6`
(module.catalog.`actions/setup-java@v5`) {
with {
`java-version` = "25"
distribution = "temurin"
}
}
(module.catalog.`gradle/actions/dependency-submission@v6`) {
with {
// language=regexp
`dependency-graph-include-configurations` =
".*[rR]untimeClasspath|.*[cC]ompileClasspath"
}
}
}
}
} |> toWorkflowJobs
}
releaseBranch {
jobs = releaseJobs |> toWorkflowJobs
}
release {
jobs =
(releaseJobs) {
["deploy-release"] = (
new DeployJob {
isRelease = true
command = "publishToSonatype closeAndReleaseSonatypeStagingRepository"
}
) {
needs = releaseJobs.keys.toListing()
}
["github-release"] = new GithubRelease {
needs = releaseJobs.keys.toListing()
}
} |> toWorkflowJobs
}
dependabot {
updates {
new {
`package-ecosystem` = "gradle"
schedule {
interval = "quarterly"
}
cooldown {
`default-days` = 7
}
directory = "/"
}
}
}
codeql {
scans {
new {
language = "java-kotlin"
buildMode = "autobuild"
}
new {
language = "javascript-typescript"
buildMode = "none"
}
}
}
+31
View File
@@ -0,0 +1,31 @@
extends "GradleJob.pkl"
import "@gha/catalog.pkl"
// Keep this in sync with projects that build java executables
local projects: List<String> = List("pkl-doc", "pkl-cli", "pkl-codegen-java", "pkl-codegen-kotlin")
local command =
new Listing<String> {
"./gradlew"
module.gradleArgs
for (project in projects) {
// NOTE: `build` doesn't build native executables
"\(project):build"
}
}.join(" ")
steps {
new {
name = "gradle build java executables"
shell = "bash"
run = command
}
(catalog.`actions/upload-artifact@v5`) {
name = "Upload executable artifacts"
with {
name = "deploy-artifacts-java-executables"
path = "*/build/executable/**/*"
}
}
}
+92
View File
@@ -0,0 +1,92 @@
extends "GradleJob.pkl"
import "@gha/catalog.pkl"
/// Whether to link to musl. Otherwise, links to glibc.
musl: Boolean(implies(module.os == "linux")) = false
/// The Gradle project under which to generate the executable
project: String
/// Path pattern for artifact uploads (glob passed to actions/upload-artifact)
buildDir: String = "\(project)*/build/executable/**/*"
local needsCCompiler = project == "libpkl"
extraGradleArgs {
when (musl) {
"-Dpkl.musl=true"
}
}
preSteps {
when (os == "linux" && !musl) {
new {
name = "Install deps"
run =
"dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en"
}
}
}
steps {
when (musl) {
new {
name = "Install musl and zlib"
run = read("../scripts/install_musl.sh").text
}
}
// workaround for https://github.com/actions/checkout/issues/1048
when (os == "linux" && !musl) {
new {
name = "Fix git ownership"
// language=bash
run = #"git status || git config --system --add safe.directory "$GITHUB_WORKSPACE""#
}
}
when (needsCCompiler && os == "windows") {
new {
name = "Set up MSVC"
uses = "ilammy/msvc-dev-cmd@v1"
}
}
new {
name = "gradle buildNative"
shell = "bash"
run = "./gradlew \(module.gradleArgs) \(project):buildNative"
}
(catalog.`actions/upload-artifact@v5`) {
name = "Upload built artifacts"
with {
name =
if (musl)
"deploy-artifacts-\(project)-alpine-\(module.os)-\(module.arch)"
else
"deploy-artifacts-\(project)-\(module.os)-\(module.arch)"
// Need to insert a wildcard to make actions/upload-artifact preserve the folder hierarchy.
// See https://github.com/actions/upload-artifact/issues/206
path = module.buildDir
}
}
(catalog.`actions/upload-artifact@v5`) {
name = "Upload compiled classes list"
with {
name =
if (musl)
"compiled-classes-\(project)-alpine-\(module.os)-\(module.arch)"
else
"compiled-classes-\(project)-\(module.os)-\(module.arch)"
// Need to insert a wildcard to make actions/upload-artifact preserve the folder hierarchy.
// See https://github.com/actions/upload-artifact/issues/206
path = "\(project)*/build/compiled-classes/**/*"
}
}
}
fixed job {
when (os == "linux" && !musl) {
container {
image = "redhat/ubi8:8.10"
}
}
}
+31
View File
@@ -0,0 +1,31 @@
extends "GradleJob.pkl"
import "@gha/catalog.pkl"
import "@gha/Workflow.pkl"
import "@pkl.impl.ghactions/helpers.pkl"
local self = this
command: String
arch = "amd64"
os = "linux"
steps {
catalog.`actions/checkout@v6`
(catalog.`actions/download-artifact@v6`) {
with {
pattern = "deploy-artifacts-**"
`merge-multiple` = true
}
}
new Workflow.Step {
run = "./gradlew \(self.gradleArgs) \(module.command)"
}
|> helpers.withMavenPublishSecrets
}
fixed job {
environment = "maven-release"
}
+42
View File
@@ -0,0 +1,42 @@
module GithubRelease
extends "PklJob.pkl"
import "@gha/catalog.pkl"
import "@gha/context.pkl"
fixed job {
`runs-on` = "ubuntu-latest"
permissions {
contents = "write"
}
needs = module.needs
steps {
(catalog.`actions/download-artifact@v6`) {
with {
pattern = "deploy-artifacts-**"
`merge-multiple` = true
}
}
new {
name = "Publish release on GitHub"
env {
["GH_TOKEN"] = context.github.token
["TAG_NAME"] = context.github.refName
["GIT_SHA"] = context.github.sha
["GH_REPO"] = context.github.repository
}
// language=bash
run =
#"""
gh release create ${TAG_NAME} \
--draft \
--title "${TAG_NAME}" \
--target "${GIT_SHA}" \
--verify-tag \
--notes "Release notes: https://pkl-lang.org/main/current/release-notes/changelog.html#release-${TAG_NAME}" \
*/build/executable/*
"""#
}
}
}
+120
View File
@@ -0,0 +1,120 @@
abstract module GradleJob
extends "PklJob.pkl"
import "@gha/Workflow.pkl"
import "@gha/context.pkl"
import "@pkl.impl.ghactions/catalog.pkl"
/// Whether this is a release build or not.
isRelease: Boolean = false
/// The architecture to use
arch: "amd64" | "aarch64" = "amd64"
/// The OS to run on.
os: "macOS" | "linux" | "windows" = "linux"
// TODO flip this to `true` when nightly macOS is available
/// Whether to run on nightly macOS.
nightlyMacOS: Boolean(implies(os == "macOS")) = false
extraGradleArgs: Listing<String>
steps: Listing<Workflow.Step>
preSteps: Listing<Workflow.Step>
/// The fetch depth to use when doing a git checkout.
fetchDepth: Int?
fixed gradleArgs =
new Listing {
"$DEBUG_ARGS"
"--no-daemon"
"-DpklMultiJdkTesting=true"
when (isRelease) {
"-DreleaseBuild=true"
}
...extraGradleArgs
}.join(" ")
fixed job {
env {
["LANG"] = "en_US.UTF-8"
when (os == "windows") {
["JAVA_HOME"] = "/jdk"
}
}
when (os == "macOS") {
`if` =
let (cond = "github.repository_owner == 'apple'")
if (super.`if` != null)
"(\(super.`if`)) && \(cond)"
else
cond
}
`runs-on` =
if (os == "linux" && arch == "amd64")
"ubuntu-latest"
else if (os == "linux" && arch == "aarch64")
"ubuntu-24.04-arm"
else if (os == "windows")
"windows-latest"
else
new Listing {
"self-hosted"
"macos"
// Currently have a bug where macOS runners have `cc` from XCode 26 toolchain but have
// default SDK set to 27.
// TODO remove me once this issue is fixed.
"tahoe"
when (nightlyMacOS) {
"nightly"
}
}
steps {
...preSteps
// full checkout (needed for spotless)
(catalog.`actions/checkout@v6`) {
when (fetchDepth != null) {
with {
`fetch-depth` = fetchDepth
}
}
}
(catalog.`actions/setup-java@v5`) {
with {
`java-version` = "25"
distribution = "temurin"
architecture =
if (arch == "amd64")
"x64"
else
"aarch64"
}
}
(catalog.`gradle/actions/setup-gradle@v5`) {
when (isRelease) {
with {
`cache-disabled` = true
}
}
}
new {
name = "Set DEBUG_ARGS env var"
env {
["RUNNER_DEBUG"] = context.runner.debug
}
shell = "bash"
// language=bash
run =
"""
if [[ "$RUNNER_DEBUG" -eq 1 ]]; then
echo "DEBUG_ARGS=--info --stacktrace" >> $GITHUB_ENV
fi
"""
}
...module.steps
}
}
+29
View File
@@ -0,0 +1,29 @@
abstract module PklJob
extends "@pkl.impl.ghactions/jobs/PklJob.pkl"
/// Identify any jobs that must complete successfully before this job will run.
///
/// It can be a string or array of strings.
/// If a job fails or is skipped, all jobs that need it are skipped unless the jobs use a conditional expression that
/// causes the job to continue.
/// If a run contains a series of jobs that need each other, a failure or skip applies to all jobs in the dependency
/// chain from the point of failure or skip onwards. If you would like a job to run even if a job it is dependent on
/// did not succeed, use the `always()` conditional expression in `jobs.<job_id>.if`.
///
/// See: <https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idneeds>
needs: (String | *Listing<String>)?
/// A conditional to prevent a job from running unless a condition is met.
///
/// You can use any supported context and expression to create a conditional.
/// For more information on which contexts are supported in this key, see
/// [Contexts reference](https://docs.github.com/en/actions/reference/workflows-and-actions/contexts#context-availability).
@SourceCode { language = "GithubExpressionLanguage" }
`if`: String?
/// The underlying workflow job
fixed job {
`if` = module.`if`
needs = module.needs
}
+18
View File
@@ -0,0 +1,18 @@
extends "GradleJob.pkl"
name: String = command
command: String
os = "linux"
steps {
new {
name = module.name
shell = "bash"
run =
"""
./gradlew \(module.gradleArgs) \(module.command)
"""
}
}
+75
View File
@@ -0,0 +1,75 @@
set -e
mkdir -p ~/staticdeps/
ZLIB_VERSION="1.2.13"
MUSL_VERSION="9fa28ece75d8a2191de7c5bb53bed224c5947417" # v1.2.6
# install zlib
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
# Download zlib tarball and signature
curl -Lf "https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz" -o /tmp/zlib.tar.gz
curl -Lf "https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz.asc" -o /tmp/zlib.tar.gz.asc
# Import zlib GPG key
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 5ED46A6721D365587791E2AA783FCD8E58BCAFBA
# Verify GPG signature
echo "Verifying zlib GPG signature..."
gpg --verify /tmp/zlib.tar.gz.asc /tmp/zlib.tar.gz
mkdir -p "/tmp/dep_zlib-${ZLIB_VERSION}"
cd "/tmp/dep_zlib-${ZLIB_VERSION}"
# shellcheck disable=SC2002
cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC .
echo "zlib-${ZLIB_VERSION}: configure..."
./configure --static --prefix="$HOME"/staticdeps > /dev/null
echo "zlib-${ZLIB_VERSION}: make..."
make -s -j4
echo "zlib-${ZLIB_VERSION}: make install..."
make -s install
rm -rf /tmp/dep_zlib-${ZLIB_VERSION}
fi
declare -a MUSL_REPOS=(
https://git.musl-libc.org/git/musl
https://gogs.librecmc.org/OWEALS/musl.git
)
# install musl
if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then
# Download musl git repo
cd /tmp
for repo in "${MUSL_REPOS[@]}"; do
if git clone --depth 1 --revision "$MUSL_VERSION" "$repo" /tmp/musl; then
break
else
rm -rf /tmp/musl
fi
done
cd /tmp/musl
for patch in $GITHUB_WORKSPACE/.github/scripts/musl-*.patch; do
echo "musl-${MUSL_VERSION}: applying $patch..."
cat "$patch" | git apply
done
echo "musl-${MUSL_VERSION}: configure..."
./configure --disable-shared --prefix="$HOME"/staticdeps > /dev/null
echo "musl-${MUSL_VERSION}: make..."
make -s -j4
echo "musl-${MUSL_VERSION}: make install..."
make -s install
rm -rf "/tmp/dep_musl-${MUSL_VERSION}"
# native-image expects to find an executable at this path.
ln -s ~/staticdeps/bin/musl-gcc ~/staticdeps/bin/x86_64-linux-musl-gcc
fi
echo "${HOME}/staticdeps/bin" >> "$GITHUB_PATH"
+166
View File
@@ -0,0 +1,166 @@
>From 7813e9119eb5fe681b6750b8a033a0490bca0941 Mon Sep 17 00:00:00 2001
From: Szabolcs Nagy <nsz@port70.net>
Date: Thu, 23 Apr 2026 21:22:18 +0000
Subject: [PATCH] regex: avoid int overflow in regcomp
regcomp has many int arith ops that may overflow. before tre_expand_ast
int values are limited by 2x the input length n, e.g.:
input ERE int field max value
aaaaaaaaaaaa... position n
()()()()()()... submatch_id n/2+1
()||||||||||... num_tags 2n-3
so overflow before expand requires large n (and a lot of memory). later
some values can become big due to repetitions:
input ERE int field that overflows
(((a{255}){255}){255}){255} position
((a|b*){255,}){255,} num_transitions
num_transitions and memory use can be big without {k,} repetitions too:
input ERE what max value
(a|a|a|a...|a)* num_transitions n^2/4
(()|a|a|...|a)* sum tnfa tags > n^3/16 - n^2
so memory can run out quickly as n grows (with 31bit va space 1700 long
input is enough even without {k,}) about half is tnfa and half is ast
firstpos/lastpos data. but overflow can happen before allocations fail.
fix early overflow by limiting n. the stack usage is in [n,11n] without
repetitions, usually 7n, so the stack limit got adjusted too. the limit
is such that almost all inputs that worked before still work.
overflows during and after expand are fixed by explicit checks via a
check_add helper and xcalloc instead of xmalloc.
---
src/regex/regcomp.c | 41 +++++++++++++++++++++++++++++++++++------
1 file changed, 35 insertions(+), 6 deletions(-)
diff --git a/src/regex/regcomp.c b/src/regex/regcomp.c
index b4b81968..a7115b12 100644
--- a/src/regex/regcomp.c
+++ b/src/regex/regcomp.c
@@ -1680,6 +1680,12 @@ tre_add_tags(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *tree,
AST to TNFA compilation routines.
*/
+/* check if a+b overflows for a,b in [0,INT_MAX] */
+static int check_add(unsigned a, unsigned b)
+{
+ return a + b > INT_MAX;
+}
+
typedef enum {
COPY_RECURSE,
COPY_SET_RESULT_PTR
@@ -1731,6 +1737,8 @@ tre_copy_ast(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *ast,
/* XXX - e.g. [ab] has only one position but two
nodes, so we are creating holes in the state space
here. Not fatal, just wastes memory. */
+ if (check_add(pos, *pos_add))
+ return REG_ESPACE;
pos += *pos_add;
num_copied++;
}
@@ -1826,6 +1834,8 @@ tre_copy_ast(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *ast,
break;
}
}
+ if (check_add(*pos_add, num_copied))
+ return REG_ESPACE;
*pos_add += num_copied;
return status;
}
@@ -1870,6 +1880,8 @@ tre_expand_ast(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *ast,
tre_literal_t *lit= node->obj;
if (!IS_SPECIAL(lit) || IS_BACKREF(lit))
{
+ if (check_add(lit->position, pos_add))
+ return REG_ESPACE;
lit->position += pos_add;
if (lit->position > max_pos)
max_pos = lit->position;
@@ -1998,6 +2010,8 @@ tre_expand_ast(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *ast,
}
iter_depth--;
+ if (check_add(pos_add_total, pos_add - pos_add_last))
+ return REG_ESPACE;
pos_add_total += pos_add - pos_add_last;
if (iter_depth == 0)
pos_add = pos_add_total;
@@ -2010,6 +2024,8 @@ tre_expand_ast(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *ast,
}
}
+ if (check_add(*position, pos_add_total))
+ return REG_ESPACE;
*position += pos_add_total;
/* `max_pos' should never be larger than `*position' if the above
@@ -2711,9 +2727,19 @@ regcomp(regex_t *restrict preg, const char *restrict regex, int cflags)
/* Parse context. */
tre_parse_ctx_t parse_ctx;
+ /* Limits: before tre_expand_ast, int values like position, subid or
+ * num_tags are bounded by 2x input length, used stack entries are
+ * bounded by 16x input length. input length is checked upfront to
+ * avoid overflows before expand. later, values that can grow big are
+ * bounds checked via check_add and xcalloc. */
+ const int input_limit = 1024000;
+ const int stack_limit = 8*input_limit;
+ if (strnlen(regex, input_limit) >= input_limit)
+ return REG_ESPACE;
+
/* Allocate a stack used throughout the compilation process for various
purposes. */
- stack = tre_stack_new(512, 1024000, 128);
+ stack = tre_stack_new(512, stack_limit, 128);
if (!stack)
return REG_ESPACE;
/* Allocate a fast memory allocator. */
@@ -2801,9 +2827,12 @@ regcomp(regex_t *restrict preg, const char *restrict regex, int cflags)
for example "a*" or "ab*". Figure out a simple way to detect
this possibility. */
tmp_ast_l = tree;
- tmp_ast_r = tre_ast_new_literal(mem, 0, 0, parse_ctx.position++);
+ tmp_ast_r = tre_ast_new_literal(mem, 0, 0, parse_ctx.position);
if (tmp_ast_r == NULL)
ERROR_EXIT(REG_ESPACE);
+ if (check_add(parse_ctx.position, 1))
+ ERROR_EXIT(REG_ESPACE);
+ parse_ctx.position++;
tree = tre_ast_new_catenation(mem, tmp_ast_l, tmp_ast_r);
if (tree == NULL)
@@ -2813,22 +2842,22 @@ regcomp(regex_t *restrict preg, const char *restrict regex, int cflags)
if (errcode != REG_OK)
ERROR_EXIT(errcode);
- counts = xmalloc(sizeof(int) * parse_ctx.position);
+ counts = xcalloc(sizeof(int), parse_ctx.position);
if (counts == NULL)
ERROR_EXIT(REG_ESPACE);
- offs = xmalloc(sizeof(int) * parse_ctx.position);
+ offs = xcalloc(sizeof(int), parse_ctx.position);
if (offs == NULL)
ERROR_EXIT(REG_ESPACE);
- for (i = 0; i < parse_ctx.position; i++)
- counts[i] = 0;
tre_ast_to_tnfa(tree, NULL, counts, NULL);
add = 0;
for (i = 0; i < parse_ctx.position; i++)
{
offs[i] = add;
+ if (check_add(add, counts[i] + 1))
+ ERROR_EXIT(REG_ESPACE);
add += counts[i] + 1;
counts[i] = 0;
}
--
2.21.0
+177
View File
@@ -0,0 +1,177 @@
>From 228da39e38c1cae13cbe637e771412c1984dba5d Mon Sep 17 00:00:00 2001
From: Rich Felker <dalias@aerifal.cx>
Date: Thu, 9 Apr 2026 22:51:30 -0400
Subject: [PATCH 1/3] qsort: fix leonardo heap corruption from bug in
doubleword ctz primitive
the pntz function, implementing a "count trailing zeros" variant for a
bit vector consisting of two size_t words, erroneously returned zero
rather than the number of bits in the low word when the first bit set
was the low bit of the high word.
as a result, a loop in the trinkle function which should have a
guaranteed small bound on the number of iterations, could run
unboundedly, thereby overflowing a stack-based working-space array
which was sized for the bound.
CVE-2026-40200 has been assigned for this issue.
---
src/stdlib/qsort.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/stdlib/qsort.c b/src/stdlib/qsort.c
index ab79dc6f..13219ab3 100644
--- a/src/stdlib/qsort.c
+++ b/src/stdlib/qsort.c
@@ -34,11 +34,11 @@
typedef int (*cmpfun)(const void *, const void *, void *);
+/* returns index of first bit set, excluding the low bit assumed to always
+ * be set, starting from low bit of p[0] up through high bit of p[1] */
static inline int pntz(size_t p[2]) {
- int r = ntz(p[0] - 1);
- if(r != 0 || (r = 8*sizeof(size_t) + ntz(p[1])) != 8*sizeof(size_t)) {
- return r;
- }
+ if (p[0] != 1) return ntz(p[0] - 1);
+ if (p[1]) return 8*sizeof(size_t) + ntz(p[1]);
return 0;
}
--
2.21.0
>From b3291b9a9f77f1f993d2b4f8c68a26cf09221ae7 Mon Sep 17 00:00:00 2001
From: Rich Felker <dalias@aerifal.cx>
Date: Thu, 9 Apr 2026 23:40:53 -0400
Subject: [PATCH 2/3] qsort: hard-preclude oob array writes independent of any
invariants
while the root cause of CVE-2026-40200 was a faulty ctz primitive, the
fallout of the bug would have been limited to erroneous sorting or
infinite loop if not for the stores to a stack-based array that
depended on trusting invariants in order not to go out of bounds.
increase the size of the array to a power of two so that we can mask
indices into it to force them into range. in the absence of any
further bug, the masking is a no-op, but it does not have any
measurable performance cost, and it makes spatial memory safety
trivial to prove (and for readers not familiar with the algorithms to
trust).
---
src/stdlib/qsort.c | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/src/stdlib/qsort.c b/src/stdlib/qsort.c
index 13219ab3..e4bce9f7 100644
--- a/src/stdlib/qsort.c
+++ b/src/stdlib/qsort.c
@@ -89,10 +89,16 @@ static inline void shr(size_t p[2], int n)
p[1] >>= n;
}
+/* power-of-two length for working array so that we can mask indices and
+ * not depend on any invariant of the algorithm for spatial memory safety.
+ * the original size was just 14*sizeof(size_t)+1 */
+#define AR_LEN (16 * sizeof(size_t))
+#define AR_MASK (AR_LEN - 1)
+
static void sift(unsigned char *head, size_t width, cmpfun cmp, void *arg, int pshift, size_t lp[])
{
unsigned char *rt, *lf;
- unsigned char *ar[14 * sizeof(size_t) + 1];
+ unsigned char *ar[AR_LEN];
int i = 1;
ar[0] = head;
@@ -104,16 +110,16 @@ static void sift(unsigned char *head, size_t width, cmpfun cmp, void *arg, int p
break;
}
if(cmp(lf, rt, arg) >= 0) {
- ar[i++] = lf;
+ ar[i++ & AR_MASK] = lf;
head = lf;
pshift -= 1;
} else {
- ar[i++] = rt;
+ ar[i++ & AR_MASK] = rt;
head = rt;
pshift -= 2;
}
}
- cycle(width, ar, i);
+ cycle(width, ar, i & AR_MASK);
}
static void trinkle(unsigned char *head, size_t width, cmpfun cmp, void *arg, size_t pp[2], int pshift, int trusty, size_t lp[])
@@ -121,7 +127,7 @@ static void trinkle(unsigned char *head, size_t width, cmpfun cmp, void *arg, si
unsigned char *stepson,
*rt, *lf;
size_t p[2];
- unsigned char *ar[14 * sizeof(size_t) + 1];
+ unsigned char *ar[AR_LEN];
int i = 1;
int trail;
@@ -142,7 +148,7 @@ static void trinkle(unsigned char *head, size_t width, cmpfun cmp, void *arg, si
}
}
- ar[i++] = stepson;
+ ar[i++ & AR_MASK] = stepson;
head = stepson;
trail = pntz(p);
shr(p, trail);
@@ -150,7 +156,7 @@ static void trinkle(unsigned char *head, size_t width, cmpfun cmp, void *arg, si
trusty = 0;
}
if(!trusty) {
- cycle(width, ar, i);
+ cycle(width, ar, i & AR_MASK);
sift(head, width, cmp, arg, pshift, lp);
}
}
--
2.21.0
>From 5122f9f3c99fee366167c5de98b31546312921ab Mon Sep 17 00:00:00 2001
From: Luca Kellermann <mailto.luca.kellermann@gmail.com>
Date: Fri, 10 Apr 2026 03:03:22 +0200
Subject: [PATCH 3/3] qsort: fix shift UB in shl and shr
if shl() or shr() are called with n==8*sizeof(size_t), n is adjusted
to 0. the shift by (sizeof(size_t) * 8 - n) that then follows will
consequently shift by the width of size_t, which is UB and in practice
produces an incorrect result.
return early in this case. the bitvector p was already shifted by the
required amount.
---
src/stdlib/qsort.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/stdlib/qsort.c b/src/stdlib/qsort.c
index e4bce9f7..28607450 100644
--- a/src/stdlib/qsort.c
+++ b/src/stdlib/qsort.c
@@ -71,6 +71,7 @@ static inline void shl(size_t p[2], int n)
n -= 8 * sizeof(size_t);
p[1] = p[0];
p[0] = 0;
+ if (!n) return;
}
p[1] <<= n;
p[1] |= p[0] >> (sizeof(size_t) * 8 - n);
@@ -83,6 +84,7 @@ static inline void shr(size_t p[2], int n)
n -= 8 * sizeof(size_t);
p[0] = p[1];
p[1] = 0;
+ if (!n) return;
}
p[0] >>= n;
p[0] |= p[1] << (sizeof(size_t) * 8 - n);
--
2.21.0
+319
View File
@@ -0,0 +1,319 @@
>From 67219f0130ec7c876ac0b299046460fad31caabf Mon Sep 17 00:00:00 2001
From: Rich Felker <dalias@aerifal.cx>
Date: Mon, 30 Mar 2026 16:00:50 -0400
Subject: [PATCH] fix pathological slowness & incorrect mappings in iconv
gb18030 decoder
in order to implement the "UTF" aspect of gb18030 (ability to
represent arbitrary unicode characters not present in the 2-byte
mapping), we have to apply the index obtained from the encoded 4-byte
sequence into the set of unmapped characters. this was done by
scanning repeatedly over the table of mapped characters and counting
off mapped characters below a running index by which to adjust the
running index by on each iteration. this iterative process eventually
leaves us with the value of the Nth unmapped character replacing the
index, but depending on which particular character that is, the number
of iterations needed to find it can be in the tens of thousands, and
each iteration traverses the whole 126x190 table in the inner loop.
this can lead to run times exceeding an entire second per character on
moderate-speed machines.
on top of that, the transformation logic produced wrong results for
BMP characters above the the surrogate range, as a result of not
correctly accounting for it being excluded, and for characters outside
the BMP, as a result of a misunderstanding of how gb18030 encodes
them.
this patch replaces the unmapped character lookup with a single linear
search of a list of unmapped ranges. there are only 206 such ranges,
and these are permanently assigned and unchangeable as a consequence
of the character encoding having to be stable, so a simple array of
16-bit start/length values for each range consumes only 824 bytes, a
very reasonable size cost here.
this new table accounts for the previously-incorrect surrogate
handling, and non-BMP characters are handled correctly by a single
offset, without the need for any unmapped-range search.
there are still a small number of mappings that are incorrect due to
late changes made in the definition of gb18030, swapping PUA
codepoints with proper Unicode characters. correcting these requires a
postprocessing step that will be added later.
---
src/locale/gb18030utf.h | 206 ++++++++++++++++++++++++++++++++++++++++
src/locale/iconv.c | 33 +++++--
2 files changed, 230 insertions(+), 9 deletions(-)
create mode 100644 src/locale/gb18030utf.h
diff --git a/src/locale/gb18030utf.h b/src/locale/gb18030utf.h
new file mode 100644
index 00000000..322a2440
--- /dev/null
+++ b/src/locale/gb18030utf.h
@@ -0,0 +1,206 @@
+{ 0x80, 36 },
+{ 0xa5, 2 },
+{ 0xa9, 7 },
+{ 0xb2, 5 },
+{ 0xb8, 31 },
+{ 0xd8, 8 },
+{ 0xe2, 6 },
+{ 0xeb, 1 },
+{ 0xee, 4 },
+{ 0xf4, 3 },
+{ 0xf8, 1 },
+{ 0xfb, 1 },
+{ 0xfd, 4 },
+{ 0x102, 17 },
+{ 0x114, 7 },
+{ 0x11c, 15 },
+{ 0x12c, 24 },
+{ 0x145, 3 },
+{ 0x149, 4 },
+{ 0x14e, 29 },
+{ 0x16c, 98 },
+{ 0x1cf, 1 },
+{ 0x1d1, 1 },
+{ 0x1d3, 1 },
+{ 0x1d5, 1 },
+{ 0x1d7, 1 },
+{ 0x1d9, 1 },
+{ 0x1db, 1 },
+{ 0x1dd, 28 },
+{ 0x1fa, 87 },
+{ 0x252, 15 },
+{ 0x262, 101 },
+{ 0x2c8, 1 },
+{ 0x2cc, 13 },
+{ 0x2da, 183 },
+{ 0x3a2, 1 },
+{ 0x3aa, 7 },
+{ 0x3c2, 1 },
+{ 0x3ca, 55 },
+{ 0x402, 14 },
+{ 0x450, 1 },
+{ 0x452, 7102 },
+{ 0x2011, 2 },
+{ 0x2017, 1 },
+{ 0x201a, 2 },
+{ 0x201e, 7 },
+{ 0x2027, 9 },
+{ 0x2031, 1 },
+{ 0x2034, 1 },
+{ 0x2036, 5 },
+{ 0x203c, 112 },
+{ 0x20ad, 86 },
+{ 0x2104, 1 },
+{ 0x2106, 3 },
+{ 0x210a, 12 },
+{ 0x2117, 10 },
+{ 0x2122, 62 },
+{ 0x216c, 4 },
+{ 0x217a, 22 },
+{ 0x2194, 2 },
+{ 0x219a, 110 },
+{ 0x2209, 6 },
+{ 0x2210, 1 },
+{ 0x2212, 3 },
+{ 0x2216, 4 },
+{ 0x221b, 2 },
+{ 0x2221, 2 },
+{ 0x2224, 1 },
+{ 0x2226, 1 },
+{ 0x222c, 2 },
+{ 0x222f, 5 },
+{ 0x2238, 5 },
+{ 0x223e, 10 },
+{ 0x2249, 3 },
+{ 0x224d, 5 },
+{ 0x2253, 13 },
+{ 0x2262, 2 },
+{ 0x2268, 6 },
+{ 0x2270, 37 },
+{ 0x2296, 3 },
+{ 0x229a, 11 },
+{ 0x22a6, 25 },
+{ 0x22c0, 82 },
+{ 0x2313, 333 },
+{ 0x246a, 10 },
+{ 0x249c, 100 },
+{ 0x254c, 4 },
+{ 0x2574, 13 },
+{ 0x2590, 3 },
+{ 0x2596, 10 },
+{ 0x25a2, 16 },
+{ 0x25b4, 8 },
+{ 0x25be, 8 },
+{ 0x25c8, 3 },
+{ 0x25cc, 2 },
+{ 0x25d0, 18 },
+{ 0x25e6, 31 },
+{ 0x2607, 2 },
+{ 0x260a, 54 },
+{ 0x2641, 1 },
+{ 0x2643, 2110 },
+{ 0x2e82, 2 },
+{ 0x2e85, 3 },
+{ 0x2e89, 2 },
+{ 0x2e8d, 10 },
+{ 0x2e98, 15 },
+{ 0x2ea8, 2 },
+{ 0x2eab, 3 },
+{ 0x2eaf, 4 },
+{ 0x2eb4, 2 },
+{ 0x2eb8, 3 },
+{ 0x2ebc, 14 },
+{ 0x2ecb, 293 },
+{ 0x2ffc, 4 },
+{ 0x3004, 1 },
+{ 0x3018, 5 },
+{ 0x301f, 2 },
+{ 0x302a, 20 },
+{ 0x303f, 2 },
+{ 0x3094, 7 },
+{ 0x309f, 2 },
+{ 0x30f7, 5 },
+{ 0x30ff, 6 },
+{ 0x312a, 246 },
+{ 0x322a, 7 },
+{ 0x3232, 113 },
+{ 0x32a4, 234 },
+{ 0x3390, 12 },
+{ 0x339f, 2 },
+{ 0x33a2, 34 },
+{ 0x33c5, 9 },
+{ 0x33cf, 2 },
+{ 0x33d3, 2 },
+{ 0x33d6, 113 },
+{ 0x3448, 43 },
+{ 0x3474, 298 },
+{ 0x359f, 111 },
+{ 0x360f, 11 },
+{ 0x361b, 765 },
+{ 0x3919, 85 },
+{ 0x396f, 96 },
+{ 0x39d1, 14 },
+{ 0x39e0, 147 },
+{ 0x3a74, 218 },
+{ 0x3b4f, 287 },
+{ 0x3c6f, 113 },
+{ 0x3ce1, 885 },
+{ 0x4057, 264 },
+{ 0x4160, 471 },
+{ 0x4338, 116 },
+{ 0x43ad, 4 },
+{ 0x43b2, 43 },
+{ 0x43de, 248 },
+{ 0x44d7, 373 },
+{ 0x464d, 20 },
+{ 0x4662, 193 },
+{ 0x4724, 5 },
+{ 0x472a, 82 },
+{ 0x477d, 16 },
+{ 0x478e, 441 },
+{ 0x4948, 50 },
+{ 0x497b, 2 },
+{ 0x497e, 4 },
+{ 0x4984, 1 },
+{ 0x4987, 20 },
+{ 0x499c, 3 },
+{ 0x49a0, 22 },
+{ 0x49b8, 703 },
+{ 0x4c78, 39 },
+{ 0x4ca4, 111 },
+{ 0x4d1a, 148 },
+{ 0x4daf, 81 },
+{ 0x9fa6, 14426 },
+{ 0xe76c, 1 },
+{ 0xe7c8, 1 },
+{ 0xe7e7, 13 },
+{ 0xe815, 1 },
+{ 0xe819, 5 },
+{ 0xe81f, 7 },
+{ 0xe827, 4 },
+{ 0xe82d, 4 },
+{ 0xe833, 8 },
+{ 0xe83c, 7 },
+{ 0xe844, 16 },
+{ 0xe856, 14 },
+{ 0xe865, 4295 },
+{ 0xf92d, 76 },
+{ 0xf97a, 27 },
+{ 0xf996, 81 },
+{ 0xf9e8, 9 },
+{ 0xf9f2, 26 },
+{ 0xfa10, 1 },
+{ 0xfa12, 1 },
+{ 0xfa15, 3 },
+{ 0xfa19, 6 },
+{ 0xfa22, 1 },
+{ 0xfa25, 2 },
+{ 0xfa2a, 1030 },
+{ 0xfe32, 1 },
+{ 0xfe45, 4 },
+{ 0xfe53, 1 },
+{ 0xfe58, 1 },
+{ 0xfe67, 1 },
+{ 0xfe6c, 149 },
+{ 0xff5f, 129 },
+{ 0xffe6, 26 },
diff --git a/src/locale/iconv.c b/src/locale/iconv.c
index 52178950..4151411d 100644
--- a/src/locale/iconv.c
+++ b/src/locale/iconv.c
@@ -74,6 +74,10 @@ static const unsigned short gb18030[126][190] = {
#include "gb18030.h"
};
+static const unsigned short gb18030utf[][2] = {
+#include "gb18030utf.h"
+};
+
static const unsigned short big5[89][157] = {
#include "big5.h"
};
@@ -224,6 +228,8 @@ static unsigned uni_to_jis(unsigned c)
}
}
+#define countof(a) (sizeof (a) / sizeof *(a))
+
size_t iconv(iconv_t cd, char **restrict in, size_t *restrict inb, char **restrict out, size_t *restrict outb)
{
size_t x=0;
@@ -430,15 +436,24 @@ size_t iconv(iconv_t cd, char **restrict in, size_t *restrict inb, char **restri
d = *((unsigned char *)*in + 3);
if (d-'0'>9) goto ilseq;
c += d-'0';
- c += 128;
- for (d=0; d<=c; ) {
- k = 0;
- for (int i=0; i<126; i++)
- for (int j=0; j<190; j++)
- if (gb18030[i][j]-d <= c-d)
- k++;
- d = c+1;
- c += k;
+ /* Starting at 90 30 81 30 (189000), mapping is
+ * linear without gaps, to U+10000 and up. */
+ if (c >= 189000) {
+ c -= 189000;
+ c += 0x10000;
+ if (c >= 0x110000) goto ilseq;
+ break;
+ }
+ /* Otherwise we must process an index into set
+ * of characters unmapped by 2-byte table. */
+ for (int i=0; ; i++) {
+ if (i==countof(gb18030utf))
+ goto ilseq;
+ if (c<gb18030utf[i][1]) {
+ c += gb18030utf[i][0];
+ break;
+ }
+ c -= gb18030utf[i][1];
}
break;
}
--
2.21.0
+42
View File
@@ -0,0 +1,42 @@
#file: noinspection MandatoryParamsAbsent,UndefinedAction
# This is a fake workflow that never runs.
# It's used to pin actions to specific git SHAs when generating actual workflows.
# It also gets updated by dependabot (see .github/dependabot.yml).
# Generated from Workflow.pkl. DO NOT EDIT.
name: __lockfile__
'on':
push:
branches-ignore:
- '**'
tags-ignore:
- '**'
permissions: {}
jobs:
locks:
if: 'false'
runs-on: nothing
steps:
- name: EnricoMi/publish-unit-test-result-action@v2
uses: EnricoMi/publish-unit-test-result-action@d0a4676d0e0b938bc201470d88276b7c74c712b3 # v2
- name: actions/checkout@v6
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
- name: actions/create-github-app-token@v2
uses: actions/create-github-app-token@fee1f7d63c2ff003460e3d139729b119787bc349 # v2
- name: actions/download-artifact@v6
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6
- name: actions/setup-java@v5
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
- name: actions/upload-artifact@v5
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
- name: dawidd6/action-download-artifact@v11
uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11
- name: github/codeql-action/analyze@v4
uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4
- name: github/codeql-action/init@v4
uses: github/codeql-action/init@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4
- name: gradle/actions/dependency-submission@v6
uses: gradle/actions/dependency-submission@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6
- name: gradle/actions/setup-gradle@v5
uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5
- name: ilammy/msvc-dev-cmd@v1
uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1
+1269
View File
File diff suppressed because it is too large. Load diff
+62
View File
@@ -0,0 +1,62 @@
# Generated from Workflow.pkl. DO NOT EDIT.
'on':
pull_request:
branches:
- main
push:
branches:
- main
schedule:
- cron: 29 17 * * 4
jobs:
analyze-actions:
name: Analyze (actions)
permissions:
security-events: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false
- uses: github/codeql-action/init@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4
with:
languages: actions
build-mode: none
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4
with:
category: /language:actions
analyze-java-kotlin:
name: Analyze (java-kotlin)
permissions:
security-events: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false
- uses: github/codeql-action/init@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4
with:
languages: java-kotlin
build-mode: autobuild
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4
with:
category: /language:java-kotlin
analyze-javascript-typescript:
name: Analyze (javascript-typescript)
permissions:
security-events: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false
- uses: github/codeql-action/init@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4
with:
languages: javascript-typescript
build-mode: none
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4
with:
category: /language:javascript-typescript
+1386
View File
File diff suppressed because it is too large. Load diff
+1209
View File
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+1432
View File
File diff suppressed because it is too large. Load diff
+34
View File
@@ -0,0 +1,34 @@
# Generated from Workflow.pkl. DO NOT EDIT.
name: PR Test Reports
'on':
workflow_run:
types:
- completed
workflows:
- Pull Request
permissions:
contents: read
jobs:
test-results:
name: Test Results
if: github.event.workflow_run.conclusion == 'success' || github.event.workflow_run.conclusion == 'failure'
permissions:
actions: read
checks: write
runs-on: ubuntu-latest
steps:
- name: Download artifacts
uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11
with:
path: artifacts
name: test-results-.*
name_is_regexp: true
run_id: ${{ github.event.workflow_run.id }}
- name: Publish test results
uses: EnricoMi/publish-unit-test-result-action@d0a4676d0e0b938bc201470d88276b7c74c712b3 # v2
with:
commit: ${{ github.event.workflow_run.head_sha }}
comment_mode: 'off'
files: artifacts/**/*.xml
event_file: artifacts/test-results-event-file/event.json
event_name: ${{ github.event.workflow_run.event }}
+1 -4
View File
@@ -15,13 +15,10 @@ testgenerated/
!.idea/runConfigurations/
!.idea/scopes/
!.idea/vcs.xml
.intellijPlatform/
.vscode/
.pkl-lsp/
# :pkl-core:makeIntelliJAntlrPluginHappy
gen/
PklLexer.tokens
.kotlin/
+1 -10
View File
@@ -10,16 +10,6 @@
<option name="INSERT_INNER_CLASS_IMPORTS" value="true" />
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999" />
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999" />
<option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
<value />
</option>
<option name="IMPORT_LAYOUT_TABLE">
<value>
<package name="" withSubpackages="true" static="true" />
<emptyLine />
<package name="" withSubpackages="true" static="false" />
</value>
</option>
<option name="RIGHT_MARGIN" value="100" />
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
<option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" />
@@ -63,6 +53,7 @@
</option>
<option name="IMPORT_LAYOUT_TABLE">
<value>
<package name="" withSubpackages="true" static="false" module="true" />
<package name="" withSubpackages="true" static="true" />
<emptyLine />
<package name="" withSubpackages="true" static="false" />
+35 -1
View File
@@ -12,6 +12,35 @@
<option name="REPORT_FIELDS" value="true" />
</inspection_tool>
<inspection_tool class="ClassCanBeRecord" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="ClassEscapesItsScope" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="CustomRegExpInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="myConfigurations">
<list>
<RegExpInspectionConfiguration>
<option name="name" value="PklCliDirectProjectEvaluatorSettingsAccess" />
<option name="suppressId" value="PklCliDirectProjectEvaluatorSettingsAccess" />
<option name="uuid" value="dd497f47-d38f-3fab-9ed7-eabe699620c8" />
<option name="patterns">
<list>
<InspectionPattern>
<option name="regExp" value="project\?\.evaluatorSettings" />
<option name="_fileType" value="Kotlin" />
<option name="searchContext" value="ANY" />
<option name="replacement" value="evaluatorSettings" />
</InspectionPattern>
<InspectionPattern>
<option name="regExp" value="project\?\.resolvedEvaluatorSettings" />
<option name="_fileType" value="Kotlin" />
<option name="searchContext" value="ANY" />
<option name="replacement" value="evaluatorSettings" />
</InspectionPattern>
</list>
</option>
</RegExpInspectionConfiguration>
</list>
</option>
</inspection_tool>
<inspection_tool class="FieldAccessNotGuarded" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="FieldMayBeFinal" enabled="true" level="INFORMATION" enabled_by_default="true">
<scope name="AllExceptTruffleAst" level="WARNING" enabled="true" />
</inspection_tool>
@@ -68,10 +97,15 @@
<option name="REPORT_NULLS_PASSED_TO_NON_ANNOTATED_METHOD" value="true" />
</inspection_tool>
<inspection_tool class="SameParameterValue" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="ShellCheck" enabled="true" level="ERROR" enabled_by_default="true">
<shellcheck_settings value="SC2129" />
</inspection_tool>
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
<option name="processCode" value="true" />
<option name="processLiterals" value="true" />
<option name="processComments" value="true" />
</inspection_tool>
<inspection_tool class="StringToUpperWithoutLocale" enabled="true" level="WARNING" enabled_by_default="true" editorAttributes="WARNING_ATTRIBUTES" />
<inspection_tool class="dd497f47-d38f-3fab-9ed7-eabe699620c8" enabled="true" level="ERROR" enabled_by_default="true" editorAttributes="ERRORS_ATTRIBUTES" />
</profile>
</component>
</component>
+2
View File
@@ -0,0 +1,2 @@
Jen Basch <421772+HT154@users.noreply.github.com>
Jen Basch <jbasch@apple.com>
+24
View File
@@ -0,0 +1,24 @@
# This file is only used to configure CLion with proper include paths.
# Pkl builds everything through Gradle, not CMake.
cmake_minimum_required(VERSION 4.2)
project(pkl C)
set(CMAKE_C_STANDARD 11)
file(GLOB NATIVE_LIB_INCLUDE_DIRS CONFIGURE_DEPENDS
libpkl/build/native-libs/*/include)
file(GLOB NATIVE_IMAGE_BUILD_DIRS CONFIGURE_DEPENDS
libpkl/build/tmp/native-image-build/*)
include_directories(${NATIVE_LIB_INCLUDE_DIRS})
include_directories(${NATIVE_IMAGE_BUILD_DIRS})
include_directories(libpkl/src/main/c/include)
file(GLOB_RECURSE GENERATED_HEADER_FILES CONFIGURE_DEPENDS
libpkl/build/tmp/native-libs/*/*.h)
add_executable(pkl
${GENERATED_HEADER_FILES}
libpkl/src/main/c/include/pkl.h
libpkl/src/main/c/pkl.c
libpkl/src/nativeTest/c/test_pkl.c)
-77
View File
@@ -1,77 +0,0 @@
## Code of Conduct
### Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our
project and our community a harassment-free experience for everyone,
regardless of age, body size, disability, ethnicity, sex
characteristics, gender identity and expression, level of experience,
education, socio-economic status, nationality, personal appearance,
race, religion, or sexual identity and orientation.
### Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual
attention or advances
* Trolling, insulting/derogatory comments, and personal or political
attacks
* Public or private harassment
* Publishing others’ private information, such as a physical or
electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
### Our Responsibilities
Project maintainers are responsible for clarifying the standards of
acceptable behavior and are expected to take appropriate and fair
corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit,
or reject comments, commits, code, wiki edits, issues, and other
contributions that are not aligned to this Code of Conduct, or to ban
temporarily or permanently any contributor for other behaviors that they
deem inappropriate, threatening, offensive, or harmful.
### Scope
This Code of Conduct applies within all project spaces, and it also
applies when an individual is representing the project or its community
in public spaces. Examples of representing a project or community
include using an official project e-mail address, posting via an
official social media account, or acting as an appointed representative
at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
### Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may
be reported by contacting the open source team at
opensource-conduct@group.apple.com. All complaints will be reviewed and
investigated and will result in a response that is deemed necessary and
appropriate to the circumstances. The project team is obligated to
maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted
separately.
Project maintainers who do not follow or enforce the Code of Conduct in
good faith may face temporary or permanent repercussions as determined
by other members of the project’s leadership.
### Attribution
This Code of Conduct is adapted from the
[Contributor Covenant](https://www.contributor-covenant.org), version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+25 -16
View File
@@ -13,11 +13,11 @@ To import the project into IntelliJ, go to File->Open and select the project's r
If the project is opened but not imported, look for a popup in the lower right corner
and click its "Import Gradle Project" link.
. (recommended) Install {uri-gng}[gng] +
_gng_ enables to run Gradle commands with `gw` (instead of `./gradlew`) from any subdirectory.
_gng_ enables you to run Gradle commands with `gw` (instead of `./gradlew`) from any subdirectory.
. (recommended) Set up Git ignore-revs +
`git config blame.ignoreRevsFile .git-blame-ignore-revs`
. (recommended) Install {uri-jenv}[jenv] and plugins +
_jenv_ use specific JDK versions in certain subdirectories. _Pkl_ comes with a `.java-version` file specifying JDK 21. +
_jenv_ uses specific JDK versions in certain subdirectories. _Pkl_ comes with a `.java-version` file specifying JDK 21. +
Enable _jenv_ plugins for better handling by `gradle`:
+
[source,shell]
@@ -45,16 +45,14 @@ install {uri-native-prerequisites-windows}[Prerequisites For Native Image on Win
[source,shell]
----
gw clean
gw test # run all tests except native executable tests
gw testNative # run native executable tests
gw spotlessApply # fix code formatting
gw build # build everything except native executables
gw buildNative # build native executable(s) for current platform
# (Alpine executable is only built if ~/staticdeps/bin/musl-gcc exists)
gw test # run all tests except native executable tests
gw spotlessApply # fix code formatting
gw build # build everything except native executables
gw pkl-cli:testNative # run native executable tests
gw pkl-cli:buildNative # build native executable for current platform
pkl-cli/build/executable/jpkl # run Java executable
pkl-cli/build/executable/pkl-macos-aarch64 # run Mac executable
pkl-cli/build/executable/pkl-macos-amd64 # run Intel Mac executable
pkl-cli/build/executable/pkl-linux-amd64 # run Linux executable
pkl-cli/build/executable/pkl-alpine-linux-amd64 # run Alpine Linux executable
pkl-cli/build/executable/pkl-windows-amd64.exe # run Windows executable
@@ -75,16 +73,12 @@ gw wrapper --gradle-version [version] --gradle-distribution-sha256-sum [sha]
. (optional) Update _gradle/libs.version.toml_
based on version information from https://search.maven.org, https://plugins.gradle.org, and GitHub repos
. Run `gw updateDependencyLocks`
. Validate changes with `gw build buildNative`
. Review and commit the updated dependency lock files
== Code Generation
* Truffle code generation is performed by Truffle's annotation processor, which runs as part of task `:pkl-core:compileJava`
** Output dir is `generated/truffle/`
* ANTLR code generation is performed by task `:pkl-core:generateTestGrammarSource`
** Output dir is `testgenerated/antlr/`
== Remote JVM Debugging
@@ -93,20 +87,35 @@ This will listen on port 5005.
Example: `./gradlew test -Djvmdebug=true`
== Snippet Test Plugin
There is an IntelliJ plugin meant for development on the Pkl project itself located in https://github.com/apple/pkl-project-commons[pkl-project-commons].
See https://github.com/apple/pkl-project-commons?tab=readme-ov-file#internal-intellij-plugin[its readme] for instructions on how to set it up.
== Working on libpkl
libpkl is a native library written in C, and is best written in CLion, or VSCode.
IntelliJ has limited support for editing C sources.
There is a CMakeLists.txt file whose only job is to configure CLion with proper include paths.
== Resources
For automated build setup examples see our https://github.com/apple/pkl/blob/main/.circleci/[CircleCI] jobs like our https://github.com/apple/pkl/blob/main/.circleci/jobs/BuildNativeJob.pkl[BuildNativeJob.pkl], where we build Pkl automatically.
For automated build setup examples see our https://github.com/apple/pkl/blob/main/.github/[GitHub Actions] jobs like our https://github.com/apple/pkl/blob/main/.github/jobs/BuildNativeJob.pkl[BuildNativeJob.pkl], where we build Pkl automatically.
=== Truffle
* http://ssw.jku.at/Research/Projects/JVM/Truffle.html[Homepage]
* https://github.com/graalvm/truffle[GitHub]
* http://lafo.ssw.uni-linz.ac.at/javadoc/truffle/latest/[Javadoc]
* http://mail.openjdk.java.net/pipermail/graal-dev/[Mailing List]
* https://mail.openjdk.org/pipermail/graal-dev/[Mailing List]
* https://medium.com/@octskyward/graal-truffle-134d8f28fb69#.2db370y2g[Graal & Truffle (Article)]
* https://comserv.cs.ut.ee/home/files/Pool_ComputerScience_2016.pdf?study=ATILoputoo&reference=6319668E7151D556131810BC3F4A627D7FEF5F3B[Truffle Overview (see chapter 1)]
* https://gist.github.com/smarr/d1f8f2101b5cc8e14e12[Truffle: Languages and Material]
* https://github.com/smarr/truffle-notes[Truffle Notes]
* https://wiki.openjdk.java.net/display/Graal/Truffle+FAQ+and+Guidelines[Truffle FAQ]
* https://www.graalvm.org/latest/graalvm-as-a-platform/language-implementation-framework/[Truffle Language Implementation Framework]
=== Other Config Languages
+1
View File
@@ -8,4 +8,5 @@ See link:CONTRIBUTING.adoc[] for general contribution guidelines.
* https://github.com/bioball[Daniel Chao]
* https://github.com/stackoverflow[Islon Scherer]
* https://github.com/HT154[Jen Basch]
* https://github.com/holzensp[Philip Hölzenspies]
+1 -1
View File
@@ -1,4 +1,4 @@
Copyright © 2024-2025 Apple Inc. and the Pkl project authors
Copyright © 2024-2026 Apple Inc. and the Pkl project authors
Portions of this software were originally based on 'SnakeYAML' developed by Andrey Somov.
+15 -6
View File
@@ -12,7 +12,7 @@
:uri-installation: https://pkl-lang.org/main/current/pkl-cli/index.html#installation
:uri-lang-reference: https://pkl-lang.org/main/current/language-reference/index.html
:uri-ci-artifacts: https://s01.oss.sonatype.org/content/groups/public/org/pkl-lang/
:uri-ci-pipeline: https://app.circleci.com/pipelines/github/apple/pkl
:uri-ci-pipeline: https://github.com/apple/pkl/actions
A configuration as code language with rich validation and tooling.
@@ -37,7 +37,10 @@ We'd love to hear from you!
* Create an {uri-github-issue}[issue]
* Ask a question on {uri-github-discussions}[GitHub Discussions]
== Development image:https://circleci.com/gh/apple/pkl.svg?style=svg["Apple", link="https://app.circleci.com/pipelines/github/apple/pkl"]
== Development
image:https://github.com/apple/pkl/actions/workflows/main.yml/badge.svg?style=svg["Build (main)", link="https://github.com/apple/pkl/actions/workflows/main.yml"]
* link:CONTRIBUTING.adoc[] for tips on pull requests and filing issues
* link:DEVELOPMENT.adoc[] for build instructions
* {uri-ci-artifacts}[Sonatype Repository] for the artifacts/binaries built by our {uri-ci-pipeline}[CI pipelines] (and those of our other tools and packages repositories).
@@ -60,6 +63,9 @@ We'd love to hear from you!
|https://github.com/apple/pkl-go-examples[`apple/pkl-go-examples`]
|Examples for using Pkl within Go applications
|https://github.com/apple/highlightjs-pkl[`apple/highlightjs-pkl`]
|Highlight.js syntax highlighting for Pkl
|https://github.com/apple/pkl-intellij[`apple/pkl-intellij`]
|JetBrains editor plugins providing Pkl language support
@@ -76,7 +82,7 @@ We'd love to hear from you!
|The pkl-lang.org website
|https://github.com/apple/pkl-lsp[`apple/pkl-lsp`]
| Language server for Pkl, implementing the server-side of the Language Server Protocol
|Language server for Pkl, implementing the server-side of the Language Server Protocol
|https://github.com/apple/pkl-neovim[`apple/pkl-neovim`]
|Pkl language support for Neovim
@@ -90,6 +96,9 @@ We'd love to hear from you!
|https://github.com/apple/pkl-project-commons[`apple/pkl-project-commons`]
|Utility libraries for Pkl
|https://github.com/apple/pkl-readers[`apple/pkl-readers`]
|Shared Pkl https://pkl-lang.org/main/current/language-reference/index.html#external-readers[external reader] tools
|https://github.com/apple/pkl-spring[`apple/pkl-spring`]
|Spring Boot extension for configuring Boot apps with Pkl
@@ -105,9 +114,9 @@ We'd love to hear from you!
|https://github.com/apple/pkl.tmbundle[`apple/pkl.tmbundle`]
|TextMate bundle for Pkl
|https://github.com/apple/rules_pkl[`apple/rules_pkl`]
| Bazel build rules for Pkl
|https://github.com/apple/tree-sitter-pkl[`apple/tree-sitter-pkl`]
|Tree-sitter parser for Pkl
|https://github.com/apple/rules_pkl[`apple/rules_pkl`]
|Bazel build rules for Pkl
|===
+98
View File
@@ -363,3 +363,101 @@ Copyright © 2008-2010 Andrey Somov
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
25) JSpecify (https://jspecify.dev)
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
Copyright 2022 The JSpecify Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
26) mordant
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
Copyright 2018 AJ Alt
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
27) colormath
License URL: https://github.com/ajalt/colormath/blob/master/LICENSE
Copyright 2021 AJ Alt
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28) protobuf-java
License URL: https://github.com/protocolbuffers/protobuf/blob/main/LICENSE
Copyright 2008 Google Inc. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Code generated by the Protocol Buffer compiler is owned by the owner
of the input file used when generating it. This code is not
standalone and requires a support library to be linked with it. This
support library is itself covered by the above license.
29) pprof
License URL: https://github.com/google/pprof/blob/main/LICENSE
Copyright 2016 Google Inc. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+20 -9
View File
@@ -1,5 +1,5 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,29 +14,34 @@
* limitations under the License.
*/
plugins {
pklAllProjects
pklJavaLibrary
id("pklAllProjects")
id("pklJavaLibrary")
id("me.champeau.jmh")
}
val truffle: Configuration by configurations.creating
val graal: Configuration by configurations.creating
val truffle: Configuration = configurations.create("truffle")
val graal: Configuration = configurations.create("graal")
dependencies {
jmh(projects.pklCore)
jmh(projects.pklCommonsTest)
jmh(projects.pklParser)
truffle(libs.truffleApi)
graal(libs.graalCompiler)
}
jmh {
// include = ["fib_class_java"]
// include = ["fib_class_constrained1", "fib_class_constrained2"]
// includes = listOf("ParserBenchmark")
jmhVersion.set(libs.versions.jmh)
// jvmArgsAppend = "-Dgraal.TruffleCompilationExceptionsAreFatal=true " +
// "-Dgraal.Dump=Truffle,TruffleTree -Dgraal.TraceTruffleCompilation=true " +
// "-Dgraal.TruffleFunctionInlining=false"
jvm.set("${buildInfo.graalVmAmd64.baseDir}/bin/java")
val graalVm =
when (buildInfo.arch) {
Target.Arch.AARCH64 -> buildInfo.graalVmAarch64
Target.Arch.AMD64 -> buildInfo.graalVmAmd64
}
jvm.set("${graalVm.baseDir}/bin/java")
// see:
// https://docs.oracle.com/en/graalvm/enterprise/20/docs/graalvm-as-a-platform/implement-language/#disable-class-path-separation
jvmArgs.set(
@@ -50,7 +55,13 @@ jmh {
// synchronizeIterations = false
}
tasks.named("jmh") { dependsOn(":installGraalVmAmd64") }
tasks.named("jmh") {
if (buildInfo.arch == Target.Arch.AARCH64) {
dependsOn(":installGraalVmAarch64")
} else if (buildInfo.arch == Target.Arch.AMD64) {
dependsOn(":installGraalVmAmd64")
}
}
// Prevent this error which occurs when building in IntelliJ:
// "Entry org/pkl/core/fib_class_typed.pkl is a duplicate but no duplicate handling strategy has
-62
View File
@@ -1,62 +0,0 @@
# This is a Gradle generated file for dependency locking.
# Manual edits can break the build and are not advised.
# This file is expected to be part of source control.
net.bytebuddy:byte-buddy:1.15.11=jmh,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
net.sf.jopt-simple:jopt-simple:5.0.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.apache.commons:commons-math3:3.6.1=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.apiguardian:apiguardian-api:1.1.2=jmhCompileClasspath,jmhImplementationDependenciesMetadata,testCompileClasspath,testImplementationDependenciesMetadata,testJdk17CompileClasspath,testJdk17ImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.27.3=jmh,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.graalvm.compiler:compiler:24.1.2=graal
org.graalvm.polyglot:polyglot:24.1.2=jmh,jmhRuntimeClasspath,truffle
org.graalvm.sdk:collections:24.1.2=graal,jmh,jmhRuntimeClasspath,truffle
org.graalvm.sdk:graal-sdk:24.1.2=jmh,jmhRuntimeClasspath
org.graalvm.sdk:nativeimage:24.1.2=jmh,jmhRuntimeClasspath,truffle
org.graalvm.sdk:word:24.1.2=graal,jmh,jmhRuntimeClasspath,truffle
org.graalvm.truffle:truffle-api:24.1.2=jmh,jmhRuntimeClasspath,truffle
org.graalvm.truffle:truffle-compiler:24.1.2=graal
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-build-common:2.0.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:2.0.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:2.0.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:2.0.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-client:2.0.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.0.21=kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration
org.jetbrains.kotlin:kotlin-reflect:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-script-runtime:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-scripting-common:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17
org.jetbrains.kotlin:kotlin-scripting-jvm:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17
org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib:2.0.21=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains:annotations:13.0=jmh,jmhCompileClasspath,jmhRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17,kotlinKlibCommonizerClasspath,testCompileClasspath,testRuntimeClasspath
org.junit.jupiter:junit-jupiter-api:5.11.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-api:5.8.2=testJdk17CompileClasspath,testJdk17ImplementationDependenciesMetadata,testJdk17RuntimeClasspath
org.junit.jupiter:junit-jupiter-engine:5.11.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-engine:5.8.2=testJdk17RuntimeClasspath
org.junit.jupiter:junit-jupiter-params:5.11.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.jupiter:junit-jupiter-params:5.8.2=testJdk17CompileClasspath,testJdk17ImplementationDependenciesMetadata,testJdk17RuntimeClasspath
org.junit.jupiter:junit-jupiter:5.8.2=testJdk17CompileClasspath,testJdk17ImplementationDependenciesMetadata,testJdk17RuntimeClasspath
org.junit.platform:junit-platform-commons:1.11.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.platform:junit-platform-commons:1.8.2=testJdk17CompileClasspath,testJdk17ImplementationDependenciesMetadata,testJdk17RuntimeClasspath
org.junit.platform:junit-platform-engine:1.11.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.platform:junit-platform-engine:1.8.2=testJdk17RuntimeClasspath
org.junit.platform:junit-platform-launcher:1.8.2=testJdk17RuntimeClasspath
org.junit:junit-bom:5.11.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit:junit-bom:5.8.2=testJdk17CompileClasspath,testJdk17ImplementationDependenciesMetadata,testJdk17RuntimeClasspath
org.msgpack:msgpack-core:0.9.8=jmh,jmhRuntimeClasspath
org.openjdk.jmh:jmh-core:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.openjdk.jmh:jmh-generator-asm:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.openjdk.jmh:jmh-generator-bytecode:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.openjdk.jmh:jmh-generator-reflection:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.opentest4j:opentest4j:1.2.0=testJdk17CompileClasspath,testJdk17ImplementationDependenciesMetadata,testJdk17RuntimeClasspath
org.opentest4j:opentest4j:1.3.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.organicdesign:Paguro:3.10.3=jmh,jmhRuntimeClasspath
org.ow2.asm:asm:9.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.snakeyaml:snakeyaml-engine:2.9=jmh,jmhRuntimeClasspath
empty=annotationProcessor,apiDependenciesMetadata,compileClasspath,compileOnlyDependenciesMetadata,implementationDependenciesMetadata,intransitiveDependenciesMetadata,jmhAnnotationProcessor,jmhApiDependenciesMetadata,jmhCompileOnlyDependenciesMetadata,jmhIntransitiveDependenciesMetadata,jmhKotlinScriptDef,jmhKotlinScriptDefExtensions,jmhRuntimeOnlyDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtimeClasspath,runtimeOnlyDependenciesMetadata,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testJdk17AnnotationProcessor,testJdk17ApiDependenciesMetadata,testJdk17CompileOnlyDependenciesMetadata,testJdk17IntransitiveDependenciesMetadata,testJdk17KotlinScriptDefExtensions,testKotlinScriptDef,testKotlinScriptDefExtensions
@@ -1,5 +1,5 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.util.TempFile;
import org.openjdk.jmh.util.TempFileManager;
import org.pkl.core.evaluatorSettings.TraceMode;
import org.pkl.core.http.HttpClient;
import org.pkl.core.module.ModuleKeyFactories;
import org.pkl.core.repl.ReplRequest;
@@ -51,7 +52,8 @@ public class ListSort {
null,
IoUtils.getCurrentWorkingDir(),
StackFrameTransformers.defaultTransformer,
false);
false,
TraceMode.COMPACT);
private static final List<Object> list = new ArrayList<>(100000);
static {
@@ -24,6 +24,8 @@ import org.pkl.commons.test.FileTestUtils;
import org.pkl.commons.test.FileTestUtilsKt;
import org.pkl.core.Release;
import org.pkl.core.util.IoUtils;
import org.pkl.parser.Parser;
import org.pkl.parser.ParserError;
@SuppressWarnings("unused")
@Warmup(iterations = 5, time = 2)
@@ -1,5 +1,5 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,11 +20,16 @@ plugins {
`jvm-toolchains`
}
// Keep this in sync with the constants in `BuildInfo.kt` (those are not addressable here).
val toolchainVersion = 21
/**
* To avoid the provisioning of multiple JDKs and other build issues, keep this value in sync with
* the JVM toolchain versions in `BuildInfo.kt` and `gradle-daemon-jvm.properties`.
*/
val toolchainVersion = 25
dependencies {
implementation(libs.downloadTaskPlugin)
implementation(libs.errorPronePlugin)
implementation(libs.nullawayPlugin)
implementation(libs.spotlessPlugin)
implementation(libs.kotlinPlugin) { exclude(module = "kotlin-android-extensions") }
implementation(libs.shadowPlugin)
@@ -35,16 +40,18 @@ dependencies {
}
java {
sourceCompatibility = JavaVersion.toVersion(toolchainVersion)
targetCompatibility = JavaVersion.toVersion(toolchainVersion)
toolchain {
languageVersion = JavaLanguageVersion.of(toolchainVersion)
vendor = JvmVendorSpec.ADOPTIUM
}
}
tasks.withType<JavaCompile>().configureEach { options.release = toolchainVersion }
kotlin {
jvmToolchain(toolchainVersion)
compilerOptions { jvmTarget = JvmTarget.fromTarget(toolchainVersion.toString()) }
compilerOptions {
jvmTarget = JvmTarget.fromTarget(toolchainVersion.toString())
freeCompilerArgs.add("-Xjdk-release=$toolchainVersion")
}
}
@@ -1,5 +1,5 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,7 +15,7 @@
*/
@file:Suppress("UnstableApiUsage")
rootProject.name = "buildSrc"
rootProject.name = "build-logic"
pluginManagement {
repositories {
@@ -24,7 +24,7 @@ pluginManagement {
}
}
plugins { id("org.gradle.toolchains.foojay-resolver-convention") }
plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" }
// makes ~/.gradle/init.gradle unnecessary and ~/.gradle/gradle.properties optional
dependencyResolutionManagement {
@@ -1,5 +1,5 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,26 +15,27 @@
*/
@file:Suppress("MemberVisibilityCanBePrivate")
import Target.Arch
import Target.OS
import java.io.File
import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.api.artifacts.VersionCatalog
import org.gradle.api.artifacts.VersionCatalogsExtension
import org.gradle.api.attributes.Category
import org.gradle.api.plugins.JvmTestSuitePlugin
import org.gradle.api.plugins.jvm.JvmTestSuite
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.testing.Test
import org.gradle.internal.extensions.stdlib.capitalized
import org.gradle.internal.os.OperatingSystem
import org.gradle.jvm.toolchain.*
import org.gradle.kotlin.dsl.*
import org.gradle.kotlin.dsl.support.serviceOf
import org.gradle.process.CommandLineArgumentProvider
import org.gradle.testing.base.TestingExtension
/**
* JVM bytecode target; this is pinned at a reasonable version, because downstream JVM projects
* which consume Pkl will need a minimum Bytecode level at or above this one.
* which consume Pkl will need a minimum bytecode level at or above this one.
*
* Kotlin and Java need matching bytecode targets, so this is expressed as a build setting and
* constant default. To override, pass `-DpklJdkToolchain=X` to the Gradle command line, where X is
@@ -43,10 +44,13 @@ import org.gradle.testing.base.TestingExtension
const val PKL_JVM_TARGET_DEFAULT_MAXIMUM = 17
/**
* The Pkl build requires JDK 21+ to build, because JDK 17 is no longer within the default set of
* supported JDKs for GraalVM. This is a build-time requirement, not a runtime requirement.
* The Pkl build requires JDK 25+; otherwise, NullAway will not work correctly.
*
* This is a build-time requirement, not a runtime requirement. To avoid the provisioning of
* multiple JDKs and other build issues, keep this value in sync with the JVM toolchain versions in
* `build-logic/build.gradle.kts` and `gradle-daemon-jvm.properties`.
*/
const val PKL_JDK_VERSION_MIN = 21
const val PKL_JDK_VERSION_MIN = 25
/**
* The JDK minimum is set to match the bytecode minimum, to guarantee that fat JARs work against the
@@ -55,44 +59,43 @@ const val PKL_JDK_VERSION_MIN = 21
const val PKL_TEST_JDK_MINIMUM = PKL_JVM_TARGET_DEFAULT_MAXIMUM
/**
* Maximum JDK version which Pkl is tested with; this should be bumped when new JDK stable releases
* are issued. At the time of this writing, JDK 23 is the latest available release.
* Maximum JDK version which Pkl is tested with; this should be bumped when new JDK releases are
* issued.
*/
const val PKL_TEST_JDK_MAXIMUM = 23
const val PKL_TEST_JDK_MAXIMUM = 26
/**
* Test the full suite of JDKs between [PKL_TEST_JDK_MINIMUM] and [PKL_TEST_JDK_MAXIMUM]; if this is
* set to `false` (or overridden on the command line), only LTS releases are tested by default.
* If `true`, all JDK releases between [PKL_TEST_JDK_MINIMUM] and [PKL_TEST_JDK_MAXIMUM] are tested.
* If `false`, only LTS releases within that range are tested. To override, pass
* `-DpklTestAllJdks=true` on the Gradle command line.
*/
const val PKL_TEST_ALL_JDKS = false
// `buildInfo` in main build scripts
// `project.extensions.getByType<BuildInfo>()` in precompiled script plugins
open class BuildInfo(private val project: Project) {
inner class GraalVm(val arch: String) {
inner class GraalVm(
val osName: String,
val arch: String,
val version: String,
val graalJdkVersion: String,
) {
val homeDir: String by lazy {
System.getenv("GRAALVM_HOME") ?: "${System.getProperty("user.home")}/.graalvm"
}
val version: String by lazy { libs.findVersion("graalVm").get().toString() }
val graalVmJdkVersion: String by lazy { libs.findVersion("graalVmJdkVersion").get().toString() }
val graalVmInnovation: String by lazy { libs.findVersion("graalVmInnovation").get().toString() }
val osName: String by lazy {
when {
os.isMacOsX -> "macos"
os.isLinux -> "linux"
os.isWindows -> "windows"
else -> throw RuntimeException("${os.familyName} is not supported.")
}
val baseName: String by lazy {
"graalvm-community-jdk-${graalVmJdkVersion}_${osName}-${arch}_bin"
}
val baseName: String by lazy { "graalvm-jdk-${graalVmJdkVersion}_${osName}-${arch}_bin" }
val graalMajorVersion: String = graalJdkVersion.split(".").first()
val downloadUrl: String by lazy {
val jdkMajor = graalVmJdkVersion.takeWhile { it != '.' }
val extension = if (os.isWindows) "zip" else "tar.gz"
"https://download.oracle.com/graalvm/$jdkMajor/archive/$baseName.$extension"
val ext = if (os.isWindows) "zip" else "tar.gz"
val platformArch = if (arch == "amd64") "x64" else arch
"https://github.com/graalvm/graalvm-ce-builds/releases/download/graal-$version/graalvm-community-jdk-${graalMajorVersion}i${graalVmInnovation}-${graalJdkVersion}_${osName}-${platformArch}_bin.$ext"
}
val downloadFile: File by lazy {
@@ -103,23 +106,50 @@ open class BuildInfo(private val project: Project) {
val installDir: File by lazy { File(homeDir, baseName) }
val baseDir: String by lazy {
if (os.isMacOsX) "$installDir/Contents/Home" else installDir.toString()
if (os.isMacOS) "$installDir/Contents/Home" else installDir.toString()
}
}
/** Same logic as [org.gradle.internal.os.OperatingSystem#arch], which is protected. */
val arch: String by lazy {
/** The target machine to build, defaulting to the host system machine. */
val targetMachine: Target by lazy { Target.from(os = os, arch = targetArch, musl = musl) }
/** The target architecture to build, defaulting to the system architecture. */
val targetArch: Arch by lazy { System.getProperty("pkl.targetArch")?.let(Arch::fromName) ?: arch }
/** Tells if this is a cross-arch build (e.g. targeting amd64 when on an aarch64 machine). */
val isCrossArch by lazy { arch != targetArch }
/** Tells if cross-arch builds are supported on this machine. */
val isCrossArchSupported by lazy { os.isMacOS }
/** Whether to build native executables using the musl toolchain or not. */
val musl: Boolean by lazy { java.lang.Boolean.getBoolean("pkl.musl") }
val arch: Arch by lazy {
when (val arch = System.getProperty("os.arch")) {
"x86" -> "i386"
"x86_64" -> "amd64"
"powerpc" -> "ppc"
else -> arch
"x86_64",
"amd64" -> Arch.AMD64
"aarch64" -> Arch.AARCH64
else -> throw GradleException("Cannot build Pkl on arch: $arch")
}
}
val graalVmAarch64: GraalVm = GraalVm("aarch64")
val graalVmAarch64: GraalVm by lazy { createGraalVm("aarch64") }
val graalVmAmd64: GraalVm = GraalVm("x64")
val graalVmAmd64: GraalVm by lazy { createGraalVm("x64") }
private fun createGraalVm(arch: String): GraalVm {
val osName =
when {
os.isMacOS -> "macos"
os.isLinux -> "linux"
os.isWindows -> "windows"
else -> throw RuntimeException("Unsupported OS for GraalVM: ${os.name}")
}
val version = libs.findVersion("graalVm").get().toString()
val graalJdkVersion = libs.findVersion("graalVmJdkVersion").get().toString()
return GraalVm(osName, arch, version, graalJdkVersion)
}
val isCiBuild: Boolean by lazy { System.getenv("CI") != null }
@@ -187,21 +217,44 @@ open class BuildInfo(private val project: Project) {
}
val testJdkVendors: Sequence<JvmVendorSpec> by lazy {
// By default, only OpenJDK is tested during multi-JDK testing. Flip `-DpklTestAllVendors=true`
// to additionally test against a suite of JDK vendors, including Azul, Oracle, and GraalVM.
// By default, only Adoptium is tested during multi-JDK testing. Flip `-DpklTestAllVendors=true`
// to additionally test against GraalVM and Oracle.
when (System.getProperty("pklTestAllVendors")?.toBoolean()) {
true -> sequenceOf(JvmVendorSpec.ADOPTIUM, JvmVendorSpec.GRAAL_VM, JvmVendorSpec.ORACLE)
else -> sequenceOf(JvmVendorSpec.ADOPTIUM)
}
}
private val isArmWindows: Boolean
get() {
if (!os.isWindows) {
return false
}
// System.getProperty("os.arch") returns the architecture of the JVM, not the host OS.
val procArch = System.getenv("PROCESSOR_ARCHITECTURE")
return "ARM64".equals(procArch, ignoreCase = true)
}
// Assembles a collection of JDK versions which tests can be run against, considering ancillary
// parameters like `testAllJdks` and `testExperimentalJdks`.
val jdkTestRange: Collection<JavaLanguageVersion> by lazy {
JavaVersionRange.inclusive(jdkTestFloor, jdkTestCeiling).filter { version ->
// unless we are instructed to test all JDKs, tests only include LTS releases and
// versions above the toolchain version.
testAllJdks || (JavaVersionRange.isLTS(version) || version >= jdkToolchainVersion)
if (isArmWindows) {
// Java toolchains does not work on ARM windows: https://github.com/gradle/gradle/issues/29807
// prevent creating tasks to test different JDKs if developing on a Windows ARM machine.
return@lazy listOf()
}
JavaVersionRange.inclusive(jdkTestFloor, jdkTestCeiling).toList()
}
val JavaLanguageVersion.isEnabled: Boolean
get() = isVersionEnabled(this)
fun isVersionEnabled(version: JavaLanguageVersion): Boolean {
return when {
testAllJdks -> true
multiJdkTesting -> JavaVersionRange.isLTS(version)
testExperimentalJdks -> version > jdkToolchainVersion
else -> false
}
}
@@ -240,20 +293,26 @@ open class BuildInfo(private val project: Project) {
configurator: MultiJdkTestConfigurator = {},
): Iterable<Provider<out Any>> =
with(project) {
// force the `jvm-test-suite` plugin to apply first
project.pluginManager.apply(JvmTestSuitePlugin::class.java)
val isMultiVendor = testJdkVendors.count() > 1
val baseNameProvider = { templateTask.get().name }
val namer = testNamer(baseNameProvider)
val applyConfig: MultiJdkTestConfigurator = { (version, jdk) ->
// 1) copy configurations from the template task
dependsOn(templateTask)
templateTask.get().let { template ->
// copy explicit dependencies not inferred from task inputs
dependsOn(template.dependsOn)
classpath = template.classpath
testClassesDirs = template.testClassesDirs
jvmArgs.addAll(template.jvmArgs)
jvmArgumentProviders.addAll(template.jvmArgumentProviders)
jvmArgumentProviders.addAll(
template.jvmArgumentProviders.map { provider ->
// Gradle injects this arg, which is not compatible across JDK versions
// other JDK versions (see https://github.com/gradle/gradle/issues/39442)
CommandLineArgumentProvider {
provider.asArguments().filter { !it.startsWith("--sun-misc-unsafe-memory-access") }
}
}
)
forkEvery = template.forkEvery
maxParallelForks = template.maxParallelForks
minHeapSize = template.minHeapSize
@@ -275,15 +334,8 @@ open class BuildInfo(private val project: Project) {
// multiply out by jdk vendor
testJdkVendors.map { vendor -> (targetVersion to vendor) }
}
.filter { (jdkTarget, vendor) ->
// only include experimental tasks in the return suite if the flag is set. if the task
// is withheld from the returned list, it will not be executed by default with `gradle
// check`.
testExperimentalJdks ||
(!namer(jdkTarget, vendor.takeIf { isMultiVendor }).contains("Experimental"))
}
.map { (jdkTarget, vendor) ->
if (jdkToolchainVersion == jdkTarget)
.mapNotNull { (jdkTarget, vendor) ->
if (jdkToolchainVersion == jdkTarget) {
tasks.register(namer(jdkTarget, vendor)) {
// alias to `test`
dependsOn(templateTask)
@@ -291,27 +343,24 @@ open class BuildInfo(private val project: Project) {
description =
"Alias for regular '${baseNameProvider()}' task, on JDK ${jdkTarget.asInt()}"
}
else
the<TestingExtension>().suites.register(
namer(jdkTarget, vendor.takeIf { isMultiVendor }),
JvmTestSuite::class,
) {
targets.all {
testTask.configure {
group = Category.VERIFICATION
description = "Run tests against JDK ${jdkTarget.asInt()}"
applyConfig(jdkTarget to toolchains.launcherFor { languageVersion = jdkTarget })
// fix: on jdk17, we must force the polyglot module on to the modulepath
if (jdkTarget.asInt() == 17)
jvmArgumentProviders.add(
CommandLineArgumentProvider {
buildList { listOf("--add-modules=org.graalvm.polyglot") }
}
)
}
} else {
// Always register and enable the task so it can be run explicitly,
// but only return it if it should be included in "check".
val task =
tasks.register(namer(jdkTarget, vendor.takeIf { isMultiVendor }), Test::class) {
group = Category.VERIFICATION
description = "Run tests against JDK ${jdkTarget.asInt()}"
applyConfig(jdkTarget to toolchains.launcherFor { languageVersion = jdkTarget })
// fix: on jdk17, we must force the polyglot module on to the modulepath
if (jdkTarget.asInt() == 17)
jvmArgumentProviders.add(
CommandLineArgumentProvider {
buildList { listOf("--add-modules=org.graalvm.polyglot") }
}
)
}
}
task.takeIf { jdkTarget.isEnabled }
}
}
.toList()
}
@@ -330,9 +379,8 @@ open class BuildInfo(private val project: Project) {
}
val multiJdkTesting: Boolean by lazy {
// By default, Pkl is tested against a full range of JDK versions, past and present, within the
// supported bounds of `PKL_TEST_JDK_TARGET` and `PKL_TEST_JDK_MAXIMUM`. To opt-out of this
// behavior, set `-DpklMultiJdkTesting=false` on the Gradle command line.
// Test Pkl against a full range of JDK versions, past and present, within the
// supported bounds of `PKL_TEST_JDK_TARGET` and `PKL_TEST_JDK_MAXIMUM`.
//
// In CI, this defaults to `true` to catch potential cross-JDK compat regressions or other bugs.
// In local dev, this defaults to `false` to speed up the build and reduce contributor load.
@@ -340,12 +388,18 @@ open class BuildInfo(private val project: Project) {
}
val hasMuslToolchain: Boolean by lazy {
// see "install musl" in .circleci/jobs/BuildNativeJob.pkl
// see .github/scripts/install_musl.sh
File(System.getProperty("user.home"), "staticdeps/bin/x86_64-linux-musl-gcc").exists()
}
val os: org.gradle.internal.os.OperatingSystem by lazy {
org.gradle.internal.os.OperatingSystem.current()
val os: OS by lazy {
val currentOs = OperatingSystem.current()
when {
currentOs.isMacOsX -> OS.MacOS
currentOs.isLinux -> OS.Linux
currentOs.isWindows -> OS.Windows
else -> throw GradleException("Cannot build on ${currentOs.name}")
}
}
// could be `commitId: Provider<String> = project.provider { ... }`
@@ -353,7 +407,7 @@ open class BuildInfo(private val project: Project) {
// allow -DcommitId=abc123 for build environments that don't have git.
System.getProperty("commitId").let { if (it != null) return@lazy it }
// only run command once per build invocation
if (project === project.rootProject) {
if (project.path == project.rootProject.path) {
val process =
ProcessBuilder()
.command("git", "rev-parse", "--short", "HEAD")
@@ -401,3 +455,12 @@ open class BuildInfo(private val project: Project) {
// Shape of a function which is applied to configure multi-JDK testing.
private typealias MultiJdkTestConfigurator =
Test.(Pair<JavaLanguageVersion, Provider<JavaLauncher>>) -> Unit
private val OperatingSystem.canonicalName
get() =
when {
isMacOsX -> "macos"
isWindows -> "windows"
isLinux -> "linux"
else -> throw RuntimeException("Unsupported OS: $name")
}
@@ -0,0 +1,111 @@
/*
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.io.File
import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream
import org.gradle.api.DefaultTask
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
open class BuildSourceBundle : DefaultTask() {
/** Sources jars that are included in full. */
@get:InputFiles val inputJars: ConfigurableFileCollection = project.objects.fileCollection()
/**
* Sources jars that are only included in part, if [compiledClasses] is set.
*
* Only `.java` files are dropped, if their class is not in [compiledClasses]. Everything else is
* kept: other languages (e.g. Kotlin) can't be matched by name, because the classes that they
* compile to don't necessarily relate to the file name or package (e.g. with `@file:JvmName` or
* `@file:JvmPackageName`), and licenses and other metadata must be retained.
*
* If [compiledClasses] is not set, these jars are included in full.
*/
@get:InputFiles
val filteredInputJars: ConfigurableFileCollection = project.objects.fileCollection()
/** Fully qualified names of top-level classes, one per line. */
@get:[InputFile Optional]
val compiledClasses: RegularFileProperty = project.objects.fileProperty()
@get:OutputFile val outputZip: RegularFileProperty = project.objects.fileProperty()
@TaskAction
@Suppress("unused")
fun merge() {
val zipFile = outputZip.asFile.get()
if (!zipFile.getParentFile().exists()) zipFile.getParentFile().mkdirs()
val classes =
if (compiledClasses.isPresent) {
compiledClasses
.get()
.asFile
.readLines()
.map { it.trim() }
.filterTo(hashSetOf()) { it.isNotEmpty() }
} else null
val packages = classes?.mapTo(hashSetOf()) { it.substringBeforeLast('.', "").replace('.', '/') }
var dropped = 0
ZipOutputStream(zipFile.outputStream()).use { zip ->
fun copyJar(jar: File, keep: (String) -> Boolean) {
val jarName = jar.toPath().fileName.toString().removeSuffix(".jar")
project.zipTree(jar).visit {
if (isDirectory) return@visit
val path = relativePath.pathString
if (!keep(path)) {
dropped++
return@visit
}
zip.putNextEntry(ZipEntry("$jarName/$path"))
copyTo(zip)
zip.closeEntry()
}
}
for (jar in inputJars) copyJar(jar) { true }
for (jar in filteredInputJars) {
copyJar(jar) { path ->
classes == null || packages == null || isEvident(path, classes, packages)
}
}
}
if (classes != null) {
logger.lifecycle("Dropped $dropped source files that are not in ${compiledClasses.get()}")
}
}
private fun isEvident(path: String, classes: Set<String>, packages: Set<String>): Boolean {
// sources of multi-release jars have the same classes as the unversioned ones
val sourcePath = path.replace(multiReleasePrefix, "")
val packagePath = sourcePath.substringBeforeLast('/', "")
val fileName = sourcePath.substringAfterLast('/')
return when (sourcePath.substringAfterLast('.', "")) {
"java" ->
when (fileName) {
"package-info.java" -> packagePath in packages
"module-info.java" -> true
else -> sourcePath.removeSuffix(".java").replace('/', '.') in classes
}
else -> true
}
}
private val multiReleasePrefix = Regex("^META-INF/versions/\\d+/")
}
+89
View File
@@ -0,0 +1,89 @@
/*
* Copyright © 2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Target.OS
import javax.inject.Inject
import org.gradle.api.DefaultTask
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
import org.gradle.process.ExecOperations
/**
* Task for creating static libraries from object files.
*
* Supports both Unix `ar` and Windows `lib.exe`.
*/
abstract class CArchive : DefaultTask() {
/** The object files to archive. */
@get:InputFiles abstract val objectFiles: ConfigurableFileCollection
/** The output static library file. */
@get:OutputFile abstract val outputFile: RegularFileProperty
@get:Inject protected abstract val execOperations: ExecOperations
private val buildInfo: BuildInfo = project.extensions.getByType(BuildInfo::class.java)
init {
group = "build"
}
@TaskAction
fun archive() {
outputFile.get().asFile.delete()
when (buildInfo.os) {
OS.Linux,
OS.MacOS -> archiveWithAr()
OS.Windows -> archiveWithLib()
}
logger.info("Created static library -> ${outputFile.get().asFile.name}")
}
private fun archiveWithAr() {
val output = outputFile.get().asFile
output.parentFile.mkdirs()
val args = buildList {
add("ar")
add("-rcs")
add(output.absolutePath)
objectFiles.files.forEach { file -> add(file.absolutePath) }
}
execOperations.exec {
workingDir = project.projectDir
commandLine(args)
}
}
private fun archiveWithLib() {
val output = outputFile.get().asFile
output.parentFile.mkdirs()
val args = buildList {
add("lib.exe")
add("/OUT:${output.absolutePath}")
objectFiles.files.forEach { file -> add(file.absolutePath) }
}
execOperations.exec {
workingDir = project.projectDir
commandLine(args)
}
}
}
+410
View File
@@ -0,0 +1,410 @@
/*
* Copyright © 2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Target.OS
import javax.inject.Inject
import org.gradle.api.DefaultTask
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.MapProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
import org.gradle.process.ExecOperations
/**
* Task for compiling C source files to object files or executables. Supports both GCC/Clang and
* MSVC compilers.
*/
abstract class CCompile : DefaultTask() {
/** The C source files to compile. */
@get:InputFiles abstract val sourceFiles: ConfigurableFileCollection
/** The include directories for compilation. */
@get:InputFiles abstract val includeDirs: ConfigurableFileCollection
/** Preprocessor definitions. */
@get:Input @get:Optional abstract val defines: MapProperty<String, String>
/** C standard version (e.g., "c11", "c17", "gnu11"). */
@get:Input @get:Optional abstract val cStandard: Property<String>
/** Optimization level (e.g., "0", "1", "2", "3", "s", "fast"). */
@get:Input @get:Optional abstract val optimizationLevel: Property<String>
/** Whether to include debug symbols. */
@get:Input abstract val debugSymbols: Property<Boolean>
/** Whether to generate position-independent code (GCC/Clang only). */
@get:Input abstract val positionIndependentCode: Property<Boolean>
/** Warning flags (GCC/Clang: prefixed with -W, e.g., "all", "extra"). */
@get:Input abstract val warningFlags: ListProperty<String>
/** Warning level for MSVC (0-4). */
@get:Input @get:Optional abstract val warningLevel: Property<Int>
/** Feature flags (GCC/Clang only, prefixed with -f). */
@get:Input abstract val featureFlags: ListProperty<String>
/** Machine-specific flags (GCC/Clang only, prefixed with -m). */
@get:Input abstract val machineFlags: ListProperty<String>
/** Runtime library for MSVC (e.g., "MT", "MD", "MTd", "MDd"). */
@get:Input @get:Optional abstract val runtimeLibrary: Property<String>
/** Additional compiler arguments. */
@get:Input abstract val compilerArgs: ListProperty<String>
/** The architecture to compile for (macOS only). */
@get:Input @get:Optional abstract val arch: Property<Target.Arch>
// ===== Linking properties =====
/** Whether to link into an executable (true) or just compile to object files (false). */
@get:Input abstract val link: Property<Boolean>
/** Library search paths. */
@get:InputFiles @get:Optional abstract val libraryPaths: ConfigurableFileCollection
/** Libraries to link by name. */
@get:Input @get:Optional abstract val libraries: ListProperty<String>
/** Direct library files to link. */
@get:InputFiles @get:Optional abstract val libraryFiles: ConfigurableFileCollection
/** Linker flags. */
@get:Input @get:Optional abstract val linkerFlags: ListProperty<String>
/** macOS frameworks to link (GCC/Clang only). */
@get:Input @get:Optional abstract val frameworks: ListProperty<String>
/** Output file when linking (executable name). */
@get:OutputFile @get:Optional abstract val outputFile: RegularFileProperty
/** Create a shared library (dll, dylib, so). */
@get:Input abstract val sharedLibrary: Property<Boolean>
/** The output directory for object files (when not linking). */
@get:OutputDirectory @get:Optional abstract val outputDir: DirectoryProperty
@get:Inject protected abstract val execOperations: ExecOperations
private val buildInfo: BuildInfo = project.extensions.getByType(BuildInfo::class.java)
init {
group = "build"
// Defaults
link.convention(false)
debugSymbols.convention(false)
positionIndependentCode.convention(false)
sharedLibrary.convention(false)
warningFlags.convention(listOf("all", "extra"))
warningLevel.convention(3)
featureFlags.convention(emptyList())
machineFlags.convention(emptyList())
compilerArgs.convention(emptyList())
defines.convention(emptyMap())
libraries.convention(emptyList())
linkerFlags.convention(emptyList())
frameworks.convention(emptyList())
}
@TaskAction
fun compile() {
if (link.get()) {
compileAndLink()
} else {
compileOnly()
}
}
private fun compileOnly() {
val outputDirectory = outputDir.get().asFile
outputDirectory.mkdirs()
val cFiles = sourceFiles.files.filter { it.extension == "c" }
if (cFiles.isEmpty()) {
logger.info("No C files to compile")
return
}
cFiles.forEach { cFile ->
when (buildInfo.targetMachine.os) {
OS.Linux,
OS.MacOS -> compileFileGCC(cFile, outputDirectory)
OS.Windows -> compileFileMSVC(cFile, outputDirectory)
}
}
cFiles.forEach { cFile ->
val objectFile = outputDirectory.resolve("${cFile.nameWithoutExtension}.o")
logger.info("Compiled ${cFile.name} -> ${objectFile.name}")
}
}
private fun compileFileGCC(cFile: java.io.File, outputDirectory: java.io.File) {
val objectFile = outputDirectory.resolve("${cFile.nameWithoutExtension}.o")
val args = buildList {
add("cc")
add("-c")
addAll(buildCompilerFlagsGCC())
add(cFile.absolutePath)
add("-o")
add(objectFile.absolutePath)
}
execOperations.exec {
workingDir = project.projectDir
commandLine(args)
}
}
private fun compileFileMSVC(cFile: java.io.File, outputDirectory: java.io.File) {
val objectFile = outputDirectory.resolve("${cFile.nameWithoutExtension}.obj")
val args = buildList {
add("cl.exe")
add("/c")
addAll(buildCompilerFlagsMSVC())
add("/Fo${objectFile.absolutePath}")
add(cFile.absolutePath)
}
execOperations.exec {
workingDir = project.projectDir
commandLine(args)
}
}
private fun compileAndLink() {
when (buildInfo.targetMachine.os) {
OS.Linux,
OS.MacOS -> compileAndLinkGCC()
OS.Windows -> compileAndLinkMSVC()
}
logger.info("Compiled and linked -> ${outputFile.get().asFile.name}")
}
private fun compileAndLinkGCC() {
val output = outputFile.get().asFile
val args = buildList {
add("cc")
addAll(buildCompilerFlagsGCC())
// Add source/object files
sourceFiles.files.forEach { file -> add(file.absolutePath) }
// Library search paths
libraryPaths.files.forEach { dir -> add("-L${dir.absolutePath}") }
// Direct library files. These must come before `-l` libraries below: GNU ld resolves
// symbols in a single left-to-right pass, so a static `-lz` etc. must appear after the
// archives (e.g. libpkl.a) whose undefined symbols it resolves, or those symbols are
// never pulled in.
libraryFiles.files.forEach { file -> add(file.absolutePath) }
// Libraries by name
libraries.get().forEach { lib -> add("-l${lib}") }
// Linker flags
if (linkerFlags.get().isNotEmpty()) {
add("-Wl,${linkerFlags.get().joinToString(",")}")
}
// macOS frameworks
if (buildInfo.os.isMacOS) {
frameworks.get().forEach { framework ->
add("-framework")
add(framework)
}
}
if (sharedLibrary.get()) {
add("-shared")
}
// Output file
add("-o")
add(output.absolutePath)
}
output.parentFile.mkdirs()
execOperations.exec {
workingDir = project.projectDir
commandLine(args)
}
}
private fun compileAndLinkMSVC() {
val output = outputFile.get().asFile
output.parentFile.mkdirs()
val args = buildList {
add("cl.exe")
addAll(buildCompilerFlagsMSVC())
// Output executable
add("/Fe${output.absolutePath}")
// Add source/object files
sourceFiles.files.forEach { file -> add(file.absolutePath) }
// Linker section
if (
libraryPaths.files.isNotEmpty() ||
libraries.get().isNotEmpty() ||
libraryFiles.files.isNotEmpty() ||
linkerFlags.get().isNotEmpty()
) {
add("/link")
if (sharedLibrary.get()) {
add("/DLL")
}
// Library search paths
libraryPaths.files.forEach { dir -> add("/LIBPATH:${dir.absolutePath}") }
// Library files by name
libraries.get().forEach { lib -> add("lib${lib}.lib") }
// Direct library files
libraryFiles.files.forEach { file -> add(file.absolutePath) }
// Additional linker flags
addAll(linkerFlags.get())
}
}
execOperations.exec {
workingDir = project.projectDir
commandLine(args)
}
}
private fun buildCompilerFlagsGCC(): List<String> = buildList {
// Warning flags
warningFlags.get().forEach { flag -> add("-W${flag}") }
// Include directories
includeDirs.files.forEach { dir -> add("-I${dir.absolutePath}") }
// Preprocessor definitions
defines.get().forEach { (key, value) ->
if (value.isEmpty()) {
add("-D${key}")
} else {
add("-D${key}=${value}")
}
}
// C standard
if (cStandard.isPresent) {
add("-std=${cStandard.get()}")
}
// Optimization level
if (optimizationLevel.isPresent) {
add("-O${optimizationLevel.get()}")
}
// Debug symbols
if (debugSymbols.get()) {
add("-g")
}
// Position-independent code
if (positionIndependentCode.get()) {
add("-fPIC")
}
// Feature flags
featureFlags.get().forEach { flag -> add("-f${flag}") }
// Machine flags
machineFlags.get().forEach { flag -> add("-m${flag}") }
// Platform-specific flags
if (buildInfo.os.isMacOS && arch.isPresent) {
add("-arch")
add(arch.get().cCompilerName)
}
// Additional compiler arguments
addAll(compilerArgs.get())
}
private fun buildCompilerFlagsMSVC(): List<String> = buildList {
// Warning level
if (warningLevel.isPresent) {
add("/W${warningLevel.get()}")
}
// Include directories
includeDirs.files.forEach { dir -> add("/I${dir.absolutePath}") }
// Preprocessor definitions
defines.get().forEach { (key, value) ->
if (value.isEmpty()) {
add("/D${key}")
} else {
add("/D${key}=${value}")
}
}
// C standard
if (cStandard.isPresent) {
add("/std:${cStandard.get()}")
}
// Optimization level
if (optimizationLevel.isPresent) {
when (optimizationLevel.get().lowercase()) {
"0",
"d" -> add("/Od")
"1" -> add("/O1")
"2" -> add("/O2")
"x",
"fast" -> add("/Ox")
"s" -> add("/Os")
"t" -> add("/Ot")
}
}
// Debug symbols
if (debugSymbols.get()) {
add("/Zi")
}
// Runtime library
if (runtimeLibrary.isPresent) {
add("/${runtimeLibrary.get()}")
}
// Additional compiler arguments
addAll(compilerArgs.get())
}
}
@@ -0,0 +1,76 @@
/*
* Copyright © 2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import groovy.util.Node
import groovy.xml.XmlParser
import groovy.xml.XmlUtil
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
abstract class ConfigureLateInitAnnotation : DefaultTask() {
private val miscXmlFile = project.rootProject.file(".idea/misc.xml")
init {
inputs.file(miscXmlFile)
outputs.file(miscXmlFile)
}
@TaskAction
fun run() {
val annotationName = "org.pkl.core.util.LateInit"
if (!miscXmlFile.exists()) {
miscXmlFile.writeText(
"""
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
</project>
"""
.trimIndent()
.trim()
)
}
val root = XmlParser().parse(miscXmlFile)
fun Node.childNodes() = children().filterIsInstance<Node>()
var entryPointsManager =
root.childNodes().find {
it.name() == "component" && it.attribute("name") == "EntryPointsManager"
}
if (entryPointsManager == null) {
entryPointsManager = root.appendNode("component", mapOf("name" to "EntryPointsManager"))
}
var writeAnnotations = entryPointsManager.childNodes().find { it.name() == "writeAnnotations" }
if (writeAnnotations == null) {
writeAnnotations = entryPointsManager.appendNode("writeAnnotations")
}
val alreadyExists =
writeAnnotations.childNodes().any {
it.name() == "writeAnnotation" && it.attribute("name") == annotationName
}
if (!alreadyExists) {
writeAnnotations.appendNode("writeAnnotation", mapOf("name" to annotationName))
miscXmlFile.writeText(XmlUtil.serialize(root))
logger.lifecycle("Updated .idea/misc.xml")
} else {
logger.info("$annotationName is already configured in .idea/misc.xml")
}
}
}
@@ -1,5 +1,5 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -36,6 +36,7 @@ abstract class ExecutableJar : DefaultTask() {
@get:Input abstract val jvmArgs: ListProperty<String>
@TaskAction
@Suppress("unused")
fun buildJar() {
val inFile = inJar.get().asFile
val outFile = outJar.get().asFile
@@ -0,0 +1,49 @@
/*
* Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.gradle.api.provider.Property
abstract class ExecutableSpec {
/** The main entrypoint Java class of the executable. */
abstract val mainClass: Property<String>
/**
* The name of the native executable.
*
* Not required if not building a native executable.
*/
abstract val name: Property<String>
/** The name of the Java executable. */
abstract val javaName: Property<String>
/** The name of the executable that shows in the description when published to Maven. */
abstract val documentationName: Property<String>
/**
* The base name of the Maven publication.
*
* This becomes the base name of the Artifact ID, with the os and arch suffixed.
*
* For example, `pkl` becomes `pkl-macos-aarch` for the macOS/aarch64 variant.
*/
abstract val publicationName: Property<String>
/** The name of the artifact ID for the Java executable. */
abstract val javaPublicationName: Property<String>
/** The website for this executable. */
abstract val website: Property<String>
}
@@ -1,5 +1,5 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -0,0 +1,150 @@
/*
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.nio.file.AtomicMoveNotSupportedException
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
import java.nio.file.StandardCopyOption
import java.util.*
import java.util.zip.ZipInputStream
import javax.inject.Inject
import kotlin.io.path.createDirectories
import org.gradle.api.DefaultTask
import org.gradle.api.internal.file.FileOperations
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
import org.gradle.process.ExecOperations
abstract class InstallGraalVm
@Inject
constructor(
private val fileOperations: FileOperations,
private val execOperations: ExecOperations,
) : DefaultTask() {
@get:Input abstract val graalVm: Property<BuildInfo.GraalVm>
init {
@Suppress("LeakingThis") onlyIf("GraalVM not installed") { !graalVm.get().installDir.exists() }
}
@TaskAction
@Suppress("unused")
fun run() {
// minimize chance of corruption by extract-to-random-dir-and-publish
val distroDir = Paths.get(graalVm.get().homeDir, UUID.randomUUID().toString())
try {
distroDir.createDirectories()
println("Extracting ${graalVm.get().downloadFile} into $distroDir")
val os = org.gradle.internal.os.OperatingSystem.current()
if (os.isWindows) extractZip(distroDir) else extractTarGz(distroDir)
val distroBinDir =
if (os.isMacOsX) distroDir.resolve("Contents/Home/bin") else distroDir.resolve("bin")
println("Installing native-image into $distroDir")
val gvmVersionMajor =
requireNotNull(graalVm.get().version.split(".").first().toIntOrNull()) {
"Invalid GraalVM JDK version: ${graalVm.get().graalVmJdkVersion}"
}
if (gvmVersionMajor < 24) {
execOperations.exec {
val executableName = if (os.isWindows) "gu.cmd" else "gu"
executable = distroBinDir.resolve(executableName).toString()
args("install", "--no-progress", "native-image")
}
}
publishInstallDir(distroDir, os)
} catch (e: Exception) {
try {
fileOperations.delete(distroDir)
} catch (ignored: Exception) {}
throw e
}
}
private fun extractTarGz(distroDir: Path) {
// faster and more reliable than Gradle's `copy { from tarTree() }`
execOperations.exec {
workingDir = distroDir.toFile()
executable = "tar"
args("--strip-components=1", "-xzf", graalVm.get().downloadFile)
}
}
private fun extractZip(distroDir: Path) {
val targetDir = distroDir.toAbsolutePath().normalize()
ZipInputStream(graalVm.get().downloadFile.inputStream().buffered()).use { zipInput ->
var entry = zipInput.nextEntry
while (entry != null) {
try {
val strippedPath = stripFirstPathComponent(entry.name)
if (strippedPath != null) {
val target = targetDir.resolve(strippedPath).normalize()
require(target.startsWith(targetDir)) {
"GraalVM archive entry escapes destination directory: ${entry.name}"
}
if (entry.isDirectory) {
target.createDirectories()
} else {
target.parent?.createDirectories()
Files.copy(zipInput, target)
}
}
} finally {
zipInput.closeEntry()
}
entry = zipInput.nextEntry
}
}
}
private fun stripFirstPathComponent(path: String): String? {
val normalizedPath = path.replace('\\', '/').trimStart('/')
val separatorIndex = normalizedPath.indexOf('/')
if (separatorIndex == -1) return null
return normalizedPath.substring(separatorIndex + 1).takeIf { it.isNotEmpty() }
}
private fun publishInstallDir(distroDir: Path, os: org.gradle.internal.os.OperatingSystem) {
if (os.isWindows) {
println("Installing ${graalVm.get().installDir} from $distroDir")
moveAtomicallyOrRegularly(distroDir, graalVm.get().installDir.toPath())
return
}
println("Creating symlink ${graalVm.get().installDir} for $distroDir")
val tempLink = Paths.get(graalVm.get().homeDir, UUID.randomUUID().toString())
Files.createSymbolicLink(tempLink, distroDir)
try {
moveAtomicallyOrRegularly(tempLink, graalVm.get().installDir.toPath())
} catch (e: Exception) {
try {
fileOperations.delete(tempLink.toFile())
} catch (ignored: Exception) {}
throw e
}
}
private fun moveAtomicallyOrRegularly(source: Path, target: Path) {
try {
Files.move(source, target, StandardCopyOption.ATOMIC_MOVE)
} catch (e: AtomicMoveNotSupportedException) {
Files.move(source, target)
}
}
}
@@ -1,5 +1,5 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -27,6 +27,7 @@ private val ltsReleases =
JavaLanguageVersion.of(11),
JavaLanguageVersion.of(17),
JavaLanguageVersion.of(21),
JavaLanguageVersion.of(25),
)
/** Describes an inclusive range of JVM versions, based on the [JavaLanguageVersion] type. */
@@ -1,5 +1,5 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -57,7 +57,7 @@ open class MergeSourcesJars : DefaultTask() {
// a word or a period character. should catch most cases.
val importPattern =
Pattern.compile(
"(?<!(\\w|\\.))(" + relocatedPkgs.keys.joinToString("|") { it.replace(".", "\\.") } + ")"
"(?<!([\\w.]))(" + relocatedPkgs.keys.joinToString("|") { it.replace(".", "\\.") } + ")"
)
val sourceFileExts = sourceFileExtensions.get()
@@ -70,7 +70,7 @@ open class MergeSourcesJars : DefaultTask() {
val details = this
if (details.isDirectory) return@visit
var path = details.relativePath.parent.pathString
var path = details.relativePath.parent!!.pathString
val relocatedPath = relocatedPaths.keys.find { path.startsWith(it) }
if (relocatedPath != null) {
path = path.replace(relocatedPath, relocatedPaths.getValue(relocatedPath))
@@ -101,7 +101,7 @@ open class MergeSourcesJars : DefaultTask() {
project.zipTree(jar).visit {
val details = this
if (details.isDirectory) return@visit // avoid adding empty dirs
result.add(details.relativePath.parent.pathString)
result.add(details.relativePath.parent!!.pathString)
}
}
return result
@@ -0,0 +1,340 @@
/*
* Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.nio.file.Files
import java.nio.file.StandardCopyOption
import javax.inject.Inject
import kotlin.io.path.createDirectories
import kotlin.io.path.exists
import org.gradle.api.DefaultTask
import org.gradle.api.GradleException
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.FileCollection
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.MapProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.provider.SetProperty
import org.gradle.api.services.BuildService
import org.gradle.api.services.BuildServiceParameters
import org.gradle.api.tasks.ClasspathNormalizer
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.OutputDirectories
import org.gradle.api.tasks.OutputFiles
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.TaskAction
import org.gradle.kotlin.dsl.registerIfAbsent
import org.gradle.kotlin.dsl.withNormalizer
import org.gradle.process.ExecOperations
abstract class NativeImageBuildService : BuildService<BuildServiceParameters.None>
abstract class NativeImageBuild : DefaultTask() {
@get:Input abstract val outputName: Property<String>
@get:Input abstract val extraNativeImageArgs: ListProperty<String>
@get:Input abstract val arch: Property<Target.Arch>
/**
* Names of extra directories, relative to the native-image working directory, that should be
* copied into [outputDir] after a successful build.
*/
@get:Input abstract val additionalOutputDirectoryNames: SetProperty<String>
/**
* The main class entrypoint for the executable.
*
* This option is not necessary if [sharedLibrary] is true.
*/
@get:Optional @get:Input abstract val mainClass: Property<String>
/** Create a shared library, instead of an executable. */
@get:Input abstract val sharedLibrary: Property<Boolean>
@get:InputFiles abstract val classpath: ConfigurableFileCollection
@get:Input abstract val envVars: MapProperty<String, String>
@get:InputFile @get:Optional abstract val nativeCompilerPath: RegularFileProperty
@get:Internal abstract val compiledClassesFile: RegularFileProperty
@get:Internal abstract val outputDir: DirectoryProperty
@get:Inject protected abstract val execOperations: ExecOperations
@get:Inject protected abstract val objectFactory: ObjectFactory
private val graalVm: Provider<BuildInfo.GraalVm> = arch.map { a ->
when (a) {
Target.Arch.AMD64 -> buildInfo.graalVmAmd64
Target.Arch.AARCH64 -> buildInfo.graalVmAarch64
}
}
private val buildInfo: BuildInfo = project.extensions.getByType(BuildInfo::class.java)
private val nativeImageCommandName =
if (buildInfo.os.isWindows) "native-image.cmd" else "native-image"
private val nativeImageExecutable = graalVm.map { "${it.baseDir}/bin/$nativeImageCommandName" }
private val extraArgsFromProperties by lazy {
System.getProperties()
.filter { it.key.toString().startsWith("pkl.native") }
.map { "${it.key}=${it.value}".substring("pkl.native".length) }
}
private val buildService =
project.gradle.sharedServices.registerIfAbsent(
"nativeImageBuildService",
NativeImageBuildService::class,
) {
maxParallelUsages.set(1)
}
init {
// ensure native-image builds run in serial (prevent `gw buildNative` from consuming all host
// CPU resources).
usesService(buildService)
sharedLibrary.convention(false)
outputDir.convention(project.layout.buildDirectory.dir("executable"))
group = "build"
inputs
.files(classpath)
.withPropertyName("runtimeClasspath")
.withNormalizer(ClasspathNormalizer::class)
inputs
.files(nativeImageExecutable)
.withPropertyName("graalVmNativeImage")
.withPathSensitivity(PathSensitivity.ABSOLUTE)
if (nativeCompilerPath.isPresent) {
inputs.file(nativeCompilerPath)
}
}
@Suppress("unused")
@OutputFiles
fun getEffectiveOutputFiles(): FileCollection {
return objectFactory
.fileCollection()
.from(
sharedLibrary.map { isLibrary ->
val dir = outputDir.get()
val libraryName = outputName.get()
// if building a library, native-image outputs the shared library plus four headers
// (and, on Windows, an import library); otherwise, it outputs just the one file
if (isLibrary) {
val sharedLibraryExtension = buildInfo.os.sharedLibraryExtension
val staticLibraryExtension = buildInfo.os.staticLibraryExtension
dir.files(
buildList {
add("$libraryName.$sharedLibraryExtension")
if (buildInfo.os.isWindows) {
// the DLL's import library, which consumers must link against instead of
// the .dll itself
add("$libraryName.$staticLibraryExtension")
// a genuine, self-contained static archive with no runtime DLL dependency,
// produced by build_windows.bat
add("${libraryName}_s.$staticLibraryExtension")
} else {
// a genuine, self-contained static archive with no runtime dependency,
// produced by build_unix.sh
add("$libraryName.$staticLibraryExtension")
}
add("$libraryName.h")
add("${libraryName}_dynamic.h")
add("graal_isolate.h")
add("graal_isolate_dynamic.h")
}
)
} else {
val executableName = if (buildInfo.os.isWindows) "${libraryName}.exe" else libraryName
dir.file(executableName)
}
}
)
}
@Suppress("unused")
@OutputDirectories
fun getEffectiveOutputDirectories(): FileCollection =
objectFactory
.fileCollection()
.from(additionalOutputDirectoryNames.map { names -> names.map { outputDir.get().dir(it) } })
@TaskAction
protected fun run() {
val workingDir =
project.layout.buildDirectory
.dir("tmp/native-image-build/${name}")
.get()
.asFile
.toPath()
.also { it.createDirectories() }
val reportsDir = workingDir.resolve("reports")
// reports are timestamped and never cleaned up by native-image; make sure we read a fresh one
reportsDir
.toFile()
.listFiles { f -> f.name.startsWith(COMPILATION_REPORT_PREFIX) }
?.forEach { it.delete() }
val execResult = execOperations.exec {
val exclusions =
listOf(buildInfo.libs.findLibrary("graalSdk").get()).map { it.get().module.name }
executable = nativeImageExecutable.get()
workingDir(workingDir)
args = buildList {
add("--color=always")
// must be emitted before any experimental options are used
add("-H:+UnlockExperimentalVMOptions")
// emit `reports/universe_compilation_*.txt`, listing all compiled methods
add("-H:+PrintUniverse")
// currently gives a deprecation warning, but we've been told
// that the "initialize everything at build time" *CLI* option is likely here to stay
add("--initialize-at-build-time=")
// needed for messagepack-java (see https://github.com/msgpack/msgpack-java/issues/600)
add("--initialize-at-run-time=org.msgpack.core.buffer.DirectBufferAccess")
// prevent storing `homeDir` in native image
add("--initialize-at-run-time=org.pkl.core.util.BaseDirectory")
add("--initialize-at-run-time=org.pkl.core.util.BaseDirectories")
// prevent storing `isEnabled`
add("--initialize-at-run-time=org.pkl.core.util.DebugLogger")
// needed for jline-terminal-jni
add("--initialize-at-run-time=org.jline.nativ,org.jline.terminal.impl.jni")
// needed for protobuf-java
add("--initialize-at-run-time=com.google.protobuf.UnsafeUtil")
add("--no-fallback")
add("-H:IncludeResources=org/pkl/core/stdlib/.*\\.pkl")
add("-H:IncludeResources=org/jline/utils/.*")
add("-H:IncludeResourceBundles=org.pkl.core.errorMessages")
add("-H:IncludeResourceBundles=org.pkl.parser.errorMessages")
add("-H:IncludeResources=org/pkl/commons/cli/PklCARoots.pem")
if (mainClass.isPresent) {
add("-H:Class=${mainClass.get()}")
}
if (sharedLibrary.get()) {
add("--shared")
}
add("-o")
add(outputName.get())
// the actual limit (currently) used by native-image is this number + 1400 (idea is to
// compensate for Truffle's own nodes)
add("-H:MaxRuntimeCompileMethods=1800")
add("-H:+EnforceMaxRuntimeCompileMethods")
add("--enable-url-protocols=http,https")
add("-H:+ReportExceptionStackTraces")
// disable automatic support for JVM CLI options (puts our main class in full control of
// argument parsing)
add("-H:-ParseRuntimeOptions")
if (!buildInfo.isReleaseBuild) {
// disable all optimizations
add("-O0")
// generate debugging information
add("-g")
}
if (buildInfo.isNativeArch) {
add("-march=native")
} else {
add("-march=compatibility")
}
// native-image rejects non-existing class path entries -> filter
add("--class-path")
val pathInput = classpath.filter {
it.exists() && !exclusions.any { exclude -> it.name.contains(exclude) }
}
add(pathInput.asPath)
// make sure dev machine stays responsive (15% slowdown on my laptop)
val processors =
Runtime.getRuntime().availableProcessors() /
if (buildInfo.os.isMacOS && !buildInfo.isCiBuild) 4 else 1
add("-J-XX:ActiveProcessorCount=${processors}")
addAll(envVars.get().entries.map { "-E${it.key}=${it.value}" })
if (nativeCompilerPath.isPresent) {
add("--native-compiler-path=${nativeCompilerPath.get().asFile}")
}
// Pass through all `HOMEBREW_` prefixed environment variables to allow build with shimmed
// tools.
addAll(environment.keys.filter { it.startsWith("HOMEBREW_") }.map { "-E$it" })
addAll(extraNativeImageArgs.get())
addAll(extraArgsFromProperties)
}
}
if (execResult.exitValue == 0) {
val outputFileNames = getEffectiveOutputFiles().files.map { it.name }
for (fileName in outputFileNames) {
val sourceFile = workingDir.resolve(fileName)
val targetFile = outputDir.get().asFile.toPath().resolve(fileName)
if (!sourceFile.exists()) {
throw GradleException("Expected to find $fileName in the working dir but didn't")
}
Files.copy(sourceFile, targetFile, StandardCopyOption.REPLACE_EXISTING)
}
for (dirName in additionalOutputDirectoryNames.get()) {
val sourceDir = workingDir.resolve(dirName).toFile()
if (!sourceDir.exists()) {
throw GradleException("Expected to find directory $dirName in the working dir but didn't")
}
val targetDir = outputDir.get().asFile.resolve(dirName)
targetDir.deleteRecursively()
sourceDir.copyRecursively(targetDir, overwrite = true)
}
writeCompiledClasses(reportsDir.toFile())
}
}
private fun writeCompiledClasses(reportsDir: java.io.File) {
val report =
reportsDir
.listFiles { f -> f.name.startsWith(COMPILATION_REPORT_PREFIX) }
?.maxByOrNull { it.lastModified() }
?: throw GradleException("Expected to find $COMPILATION_REPORT_PREFIX*.txt in $reportsDir")
// Method lines look like `336 2232 apple.security.AppleProvider$Service.newInstance(...): ...`
// (offset, size, qualified method name, signature).
val methodLine = Regex("""^\s*\d+\s+\d+\s+([^\s(]+)\(""")
val classNames = sortedSetOf<String>()
report.useLines { lines ->
for (line in lines) {
val method = methodLine.find(line)?.groupValues?.get(1) ?: continue
// Nested, hidden, and lambda classes all live in their top-level class' source file.
classNames.add(method.substringBeforeLast('.').substringBefore('$').substringBefore('/'))
}
}
if (classNames.isEmpty()) {
throw GradleException("Found no compiled methods in $report")
}
val file = compiledClassesFile.get().asFile
file.parentFile.mkdirs()
file.writeText(classNames.joinToString("\n", postfix = "\n"))
}
private companion object {
const val COMPILATION_REPORT_PREFIX = "universe_compilation_"
}
}
@@ -0,0 +1,109 @@
/*
* Copyright © 2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream
import org.gradle.api.DefaultTask
import org.gradle.api.GradleException
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.SetProperty
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
/**
* Collects the JDK, SubstrateVM, and Graal Java sources for every class that has methods compiled
* into a native image.
*
* The classes are read from [compiledClasses], and their sources are looked up in the OpenJDK and
* Graal repositories' tagged source archives. These archives contain the sources of every platform
* and architecture, so this task does not need to run on the platform that it collects sources for.
*/
abstract class NativeImageSourcesJar : DefaultTask() {
/**
* Fully qualified top-level names of the classes compiled into the image, one per line.
*
* This is the list that native-image reports (via `-H:+PrintUniverse`) when building the image.
*/
@get:InputFile abstract val compiledClasses: RegularFileProperty
/** The gzipped tarball of the OpenJDK repository (e.g. `jdk25u`) at the JDK's release tag. */
@get:InputFiles abstract val openJdkTarball: ConfigurableFileCollection
/** The gzipped tarball of the `oracle/graal` repository at the GraalVM's release tag. */
@get:InputFiles abstract val graalTarball: ConfigurableFileCollection
/**
* The platform-specific source roots to include from OpenJDK; any of `share`, `unix`, `linux`,
* `macosx`, and `windows`.
*/
@get:Input abstract val openJdkPlatforms: SetProperty<String>
@get:OutputFile abstract val outputJar: RegularFileProperty
@TaskAction
@Suppress("unused")
fun collect() {
val wanted =
compiledClasses
.get()
.asFile
.readLines()
.filter { it.isNotBlank() }
.mapTo(hashSetOf()) { it.trim().replace('.', '/') + ".java" }
if (wanted.isEmpty()) {
throw GradleException("No compiled classes found in ${compiledClasses.get()}")
}
val platforms = openJdkPlatforms.get()
// <repo>-<tag>/src/<module>/<platform>/classes/<package path>.java
val openJdkSource = Regex("""^[^/]+/src/[^/]+/([^/]+)/classes/(.+\.java)$""")
// <repo>-<tag>/<suite>/src/<project>/src/<package path>.java
//
// Truffle sources are intentionally omitted; they are already published as sources jars.
val graalSource = Regex("""^[^/]+/(?:substratevm|compiler|sdk)/src/[^/]+/src/(.+\.java)$""")
val out = outputJar.get().asFile
out.parentFile.mkdirs()
val written = hashSetOf<String>()
ZipOutputStream(out.outputStream().buffered()).use { zip ->
fun collectFrom(tarball: java.io.File, sourcePathOf: (String) -> String?) {
project.tarTree(project.resources.gzip(tarball)).visit {
if (isDirectory) return@visit
val sourcePath = sourcePathOf(relativePath.pathString) ?: return@visit
if (sourcePath !in wanted || !written.add(sourcePath)) return@visit
zip.putNextEntry(ZipEntry(sourcePath))
copyTo(zip)
zip.closeEntry()
}
}
collectFrom(openJdkTarball.singleFile) { path ->
openJdkSource
.matchEntire(path)
?.takeIf { it.groupValues[1] in platforms }
?.let { it.groupValues[2] }
}
collectFrom(graalTarball.singleFile) { path ->
graalSource.matchEntire(path)?.groupValues?.get(1)
}
}
logger.lifecycle(
"Collected sources of ${written.size} of ${wanted.size} compiled classes into $out"
)
}
}
@@ -0,0 +1,58 @@
/*
* Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import com.diffplug.spotless.FormatterFunc
import com.diffplug.spotless.FormatterStep
import java.io.Serial
import java.io.Serializable
import java.net.URLClassLoader
import org.gradle.api.artifacts.Configuration
class PklFormatterStep(@Transient private val configuration: Configuration) : Serializable {
companion object {
@Serial private const val serialVersionUID: Long = 1L
}
fun create(): FormatterStep {
return FormatterStep.createLazy(
"pkl",
{ PklFormatterStep(configuration) },
{ PklFormatterFunc(configuration) },
)
}
}
class PklFormatterFunc(@Transient private val configuration: Configuration) :
FormatterFunc, Serializable {
companion object {
@Serial private const val serialVersionUID: Long = 1L
}
private val classLoader by lazy {
val urls = configuration.files.map { it.toURI().toURL() }
// Use the platform classloader as parent to isolate from Gradle's classloader
URLClassLoader(urls.toTypedArray(), ClassLoader.getPlatformClassLoader())
}
private val formatterClass by lazy { classLoader.loadClass("org.pkl.formatter.Formatter") }
private val formatMethod by lazy { formatterClass.getMethod("format", String::class.java) }
private val formatterInstance by lazy { formatterClass.getConstructor().newInstance() }
override fun apply(input: String): String {
return formatMethod(formatterInstance, input) as String
}
}
@@ -0,0 +1,153 @@
/*
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.nio.charset.StandardCharsets
import java.util.Base64
import org.gradle.api.Project
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.publish.maven.tasks.AbstractPublishToMaven
import org.gradle.api.publish.maven.tasks.GenerateMavenPom
import org.gradle.kotlin.dsl.*
import org.gradle.plugins.signing.SigningExtension
/** Configures common POM metadata (licenses, developers, SCM, etc.) for all Pkl publications. */
fun Project.configurePklPomMetadata() {
extensions.configure<PublishingExtension> {
publications.withType<MavenPublication>().configureEach {
pom {
name.set(artifactId)
licenses {
license {
name.set("The Apache Software License, Version 2.0")
url.set("https://github.com/apple/pkl/blob/main/LICENSE.txt")
}
}
developers {
developer {
id.set("pkl-authors")
name.set("The Pkl Authors")
email.set("pkl-oss@group.apple.com")
}
}
scm {
connection.set("scm:git:git://github.com/apple/pkl.git")
developerConnection.set("scm:git:ssh://github.com/apple/pkl.git")
val buildInfo = extensions.getByType<BuildInfo>()
url.set("https://github.com/apple/pkl/tree/${buildInfo.commitish}")
}
issueManagement {
system.set("GitHub Issues")
url.set("https://github.com/apple/pkl/issues")
}
ciManagement {
system.set("GitHub Actions")
url.set("https://github.com/apple/pkl/actions")
}
}
}
}
}
/**
* Configures POM validation for [publicationName] to check for unresolved versions and snapshots in
* releases.
*/
fun Project.configurePomValidation(publicationName: String = "library") {
val generatePomTaskName =
"generatePomFileFor${publicationName.replaceFirstChar { it.uppercase() }}Publication"
val generatePomTasks =
tasks.withType<GenerateMavenPom>().matching { it.name == generatePomTaskName }
val pomFiles = providers.provider { generatePomTasks.map { it.destination } }
val validatePom =
tasks.register("validatePom") {
val outputFile =
layout.buildDirectory.file("validatePom") // dummy output to satisfy up-to-date check
dependsOn(generatePomTasks)
inputs.files(pomFiles)
outputs.file(outputFile)
onlyIf { pomFiles.get().isNotEmpty() }
doLast {
outputFile.get().asFile.delete()
val pomFile = pomFiles.get().single()
assert(pomFile.exists())
val text = pomFile.readText()
run {
val unresolvedVersion = Regex("<version>.*[+,()\\[\\]].*</version>")
val matches = unresolvedVersion.findAll(text).toList()
if (matches.isNotEmpty()) {
throw org.gradle.api.GradleException(
"""
Found unresolved version selector(s) in generated POM:
${matches.joinToString("\n") { it.groupValues[0] }}
"""
.trimIndent()
)
}
}
val buildInfo = project.extensions.getByType<BuildInfo>()
if (buildInfo.isReleaseBuild) {
val snapshotVersion = Regex("<version>.*-SNAPSHOT</version>")
val matches = snapshotVersion.findAll(text).toList()
if (matches.isNotEmpty()) {
throw org.gradle.api.GradleException(
"""
Found snapshot version(s) in generated POM of Pkl release version:
${matches.joinToString("\n") { it.groupValues[0] }}
"""
.trimIndent()
)
}
}
outputFile.get().asFile.writeText("OK")
}
}
tasks.named("publish") { dependsOn(validatePom) }
}
/** Configures signing for Pkl publications. */
fun Project.configurePklSigning() {
// Workaround for maven publish plugin not setting up dependencies correctly.
// Taken from https://github.com/gradle/gradle/issues/26091#issuecomment-1798137734
val dependsOnTasks = mutableListOf<String>()
tasks.withType<AbstractPublishToMaven>().configureEach {
dependsOnTasks.add(name.replace("publish", "sign").replaceAfter("Publication", ""))
dependsOn(dependsOnTasks)
}
extensions.configure<SigningExtension> {
// provided as env vars `ORG_GRADLE_PROJECT_signingKey` and
// `ORG_GRADLE_PROJECT_signingPassword` in CI.
val signingKey =
(findProperty("signingKey") as String?)?.let {
Base64.getDecoder().decode(it).toString(StandardCharsets.US_ASCII)
}
val signingPassword = findProperty("signingPassword") as String?
if (signingKey != null && signingPassword != null) {
useInMemoryPgpKeys(signingKey, signingPassword)
}
extensions.getByType<PublishingExtension>().publications.findByName("library")?.let { sign(it) }
}
}
@@ -1,5 +1,5 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -0,0 +1,77 @@
/*
* Copyright © 2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import com.diffplug.spotless.FormatterFunc
import com.diffplug.spotless.FormatterStep
import java.io.File
import java.io.Serial
import java.io.Serializable
/**
* A Spotless [FormatterStep] that suppresses formatting changes where the only difference between
* the formatted output and the file's content in the upstream base ref is the license header year.
*
* Avoids an issue where, in the process of working on the codebase:
* 1. A file is modified.
* 2. Spotless formats the file, and also updates the copyright year.
* 3. The original modification is reverted.
* 4. Spotless formats the file again, but now the copyright year is the updated year.
*/
class RevertYearOnlyChangesStep(private val repoRoot: File, private val ratchetFrom: String) :
Serializable {
companion object {
@Serial private const val serialVersionUID: Long = 1L
}
fun create(): FormatterStep =
FormatterStep.createLazy(
"revertYearOnlyChanges",
{ this },
{ RevertYearOnlyChangesFunc(repoRoot, ratchetFrom) },
)
}
class RevertYearOnlyChangesFunc(private val repoRoot: File, private val ratchetFrom: String) :
FormatterFunc.NeedsFile, Serializable {
companion object {
@Serial private const val serialVersionUID: Long = 1L
// Matches "Copyright © 2024" or "Copyright © 2024-2025"
private val YEAR_REGEX = Regex("""(Copyright © )\d{4}(-\d{4})?""")
}
override fun applyWithFile(unix: String, file: File): String {
val relativePath = repoRoot.toPath().relativize(file.toPath()).toString()
val upstreamContent = gitShow(ratchetFrom, relativePath) ?: return unix
val normalizedRaw = YEAR_REGEX.replace(unix, "\$1YEAR")
val normalizedUpstream = YEAR_REGEX.replace(upstreamContent, "\$1YEAR")
return if (normalizedRaw == normalizedUpstream) {
// Only the year changed — return the upstream content
upstreamContent
} else {
unix
}
}
private fun gitShow(ref: String, path: String): String? {
val process =
ProcessBuilder("git", "show", "$ref:$path")
.directory(repoRoot)
.redirectErrorStream(true)
.start()
val output = process.inputStream.readBytes().toString(Charsets.UTF_8)
return if (process.waitFor() == 0) output.replace("\r\n", "\n") else null
}
}
@@ -0,0 +1,43 @@
/*
* Copyright © 2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.provider.Property
/**
* The inputs that source bundles of a project are made of.
*
* This is configured by the `pklSourceBundle` plugin; the plugins that register the actual source
* bundles (`pklJvmSourceBundle` and `pklNativeSourceBundle`) consume it.
*/
abstract class SourceBundleSpec {
/** Sources jars of the project itself, and of the projects that it depends on. */
abstract val firstPartyJars: ConfigurableFileCollection
/** Sources jars of third-party dependencies, as resolved from the runtime classpath. */
abstract val dependencyJars: ConfigurableFileCollection
/**
* Additional sources to include in source bundles of native targets (e.g. C sources of the
* project itself).
*/
abstract val extraNativeSources: ConfigurableFileCollection
/**
* Whether musl and zlib are statically linked into the project's native executable for musl
* targets, in which case their sources are included in the source bundle of those targets.
*/
abstract val staticMuslLibc: Property<Boolean>
}
+110
View File
@@ -0,0 +1,110 @@
/*
* Copyright © 2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
@file:Suppress("MemberVisibilityCanBePrivate")
/**
* A build target when building native libraries or executables.
*
* Pkl only builds for the following listed targets.
*/
enum class Target(val os: OS, val arch: Arch, val musl: Boolean) {
MacosAarch64(os = OS.MacOS, arch = Arch.AARCH64, musl = false),
LinuxAarch64(os = OS.Linux, arch = Arch.AARCH64, musl = false),
LinuxAmd64(os = OS.Linux, arch = Arch.AMD64, musl = false),
AlpineLinuxAmd64(os = OS.Linux, arch = Arch.AMD64, musl = true),
WindowsAmd64(os = OS.Windows, arch = Arch.AMD64, musl = false);
companion object {
fun from(os: OS, arch: Arch, musl: Boolean): Target {
for (target in entries) {
if (target.os == os && target.arch == arch && target.musl == musl) {
return target
}
}
throw IllegalArgumentException("Cannot build for $os-$arch with musl: $musl")
}
}
val targetName: String
get() {
return if (musl) {
assert(os == OS.Linux)
"alpine-linux-$arch"
} else "$os-$arch"
}
enum class Arch(
/** What we call this arch */
val simpleName: String,
/** What the C compiler calls this arch */
val cCompilerName: String,
) {
AARCH64("aarch64", "arm64"),
AMD64("amd64", "x86_64");
override fun toString() = simpleName
companion object {
fun fromName(name: String): Arch =
when (name) {
"aarch64" -> AARCH64
"amd64" -> AMD64
else -> throw IllegalArgumentException("Unknown arch: $name")
}
}
}
enum class OS(
val simpleName: String,
val sharedLibraryExtension: String,
val staticLibraryExtension: String,
val objectFileExtension: String,
val displayName: String,
) {
MacOS(
simpleName = "macos",
sharedLibraryExtension = "dylib",
staticLibraryExtension = "a",
objectFileExtension = "o",
displayName = "macOS",
),
Linux(
simpleName = "linux",
sharedLibraryExtension = "so",
staticLibraryExtension = "a",
objectFileExtension = "o",
displayName = "Linux",
),
Windows(
simpleName = "windows",
sharedLibraryExtension = "dll",
staticLibraryExtension = "lib",
objectFileExtension = "obj",
displayName = "Windows",
);
override fun toString(): String = simpleName
val isWindows: Boolean
get() = this == Windows
val isMacOS: Boolean
get() = this == MacOS
val isLinux: Boolean
get() = this == Linux
}
}
@@ -1,5 +1,5 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,19 +15,19 @@
*/
import com.diffplug.gradle.spotless.KotlinGradleExtension
import org.gradle.accessors.dm.LibrariesForLibs
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { id("com.diffplug.spotless") }
val buildInfo = extensions.create<BuildInfo>("buildInfo", project)
dependencyLocking { lockAllConfigurations() }
configurations {
val rejectedVersionSuffix = Regex("-alpha|-beta|-eap|-m|-rc|-snapshot", RegexOption.IGNORE_CASE)
configureEach {
resolutionStrategy {
// forbid dependencies whose pom.xml's include version ranges, because this will lead to
// unreproducible builds.
failOnDynamicVersions()
componentSelection {
all {
if (rejectedVersionSuffix.containsMatchIn(candidate.version)) {
@@ -42,26 +42,10 @@ configurations {
}
}
configurations.all {
resolutionStrategy.eachDependency {
if (requested.group == "org.jetbrains.kotlin") {
// prevent transitive deps from bumping Koltin version
useVersion(libs.versions.kotlin.get())
}
}
}
plugins.withType(JavaPlugin::class).configureEach {
val java = project.extensions.getByType<JavaPluginExtension>()
java.sourceCompatibility = JavaVersion.VERSION_17
java.targetCompatibility = JavaVersion.VERSION_17
}
tasks.withType<KotlinCompile>().configureEach {
compilerOptions {
jvmTarget = JvmTarget.JVM_17
freeCompilerArgs.addAll("-Xjsr305=strict", "-Xjvm-default=all")
}
tasks.withType<JavaCompile>().configureEach {
javaCompiler = buildInfo.javaCompiler
options.release = buildInfo.jvmTarget
options.compilerArgs.add("-Xlint:unchecked")
}
plugins.withType(IdeaPlugin::class).configureEach {
@@ -82,7 +66,7 @@ plugins.withType(MavenPublishPlugin::class).configureEach {
repositories {
maven {
name = "projectLocal" // affects task names
url = uri("file:///$rootDir/build/m2")
url = rootDir.resolve("build/m2").toURI()
}
}
// use resolved/locked (e.g., `1.15`)
@@ -96,14 +80,7 @@ plugins.withType(MavenPublishPlugin::class).configureEach {
}
}
// settings.gradle.kts sets `--write-locks`
// if Gradle command line contains this task name
val updateDependencyLocks by
tasks.registering {
doLast { configurations.filter { it.isCanBeResolved }.forEach { it.resolve() } }
}
val allDependencies by tasks.registering(DependencyReportTask::class)
val allDependencies = tasks.register<DependencyReportTask>("allDependencies")
tasks.withType(Test::class).configureEach {
System.getProperty("testReportsDir")?.let { reportsDir ->
@@ -111,7 +88,6 @@ tasks.withType(Test::class).configureEach {
}
debugOptions {
enabled = System.getProperty("jvmdebug")?.toBoolean() ?: false
@Suppress("UnstableApiUsage")
host = "*"
port = 5005
suspend = true
@@ -122,7 +98,6 @@ tasks.withType(Test::class).configureEach {
tasks.withType(JavaExec::class).configureEach {
debugOptions {
enabled = System.getProperty("jvmdebug")?.toBoolean() ?: false
@Suppress("UnstableApiUsage")
host = "*"
port = 5005
suspend = true
@@ -134,7 +109,7 @@ tasks.withType(JavaExec::class).configureEach {
private val libs = the<LibrariesForLibs>()
private val licenseHeaderFile by lazy {
rootProject.file("buildSrc/src/main/resources/license-header.star-block.txt")
rootProject.file("build-logic/src/main/resources/license-header.star-block.txt")
}
private fun KotlinGradleExtension.configureFormatter() {
@@ -143,26 +118,40 @@ private fun KotlinGradleExtension.configureFormatter() {
}
val originalRemoteName = System.getenv("PKL_ORIGINAL_REMOTE_NAME") ?: "origin"
// if we're running against a release branch (or a PR targeted at one), use that branch for
// ratcheting
// these env vars are set by GitHub actions:
// https://docs.github.com/en/actions/reference/workflows-and-actions/variables#default-environment-variables
val ratchetBranchName =
(System.getenv("GITHUB_BASE_REF") ?: System.getenv("GITHUB_REF_NAME"))?.let {
if (it.startsWith("release/")) it else null
} ?: "main"
spotless {
ratchetFrom = "$originalRemoteName/main"
ratchetFrom = "$originalRemoteName/$ratchetBranchName"
// When building root project, format buildSrc files too.
// We need this because buildSrc is not a subproject of the root project, so a top-level
// `spotlessApply` will not trigger `buildSrc:spotlessApply`.
if (project === rootProject) {
val revertYearOnlyChangesStep =
RevertYearOnlyChangesStep(rootProject.rootDir, ratchetFrom!!).create()
// When building root project, format build-logic files too.
// We need this because build-logic is not a subproject of the root project, so a top-level
// `spotlessApply` will not trigger `build-logic:spotlessApply`.
if (project.path == rootProject.path) {
kotlinGradle {
configureFormatter()
target("*.kts", "buildSrc/*.kts", "buildSrc/src/*/kotlin/**/*.kts")
addStep(revertYearOnlyChangesStep)
target("*.kts", "build-logic/*.kts", "build-logic/src/*/kotlin/**/*.kts")
}
kotlin {
ktfmt(libs.versions.ktfmt.get()).googleStyle()
target("buildSrc/src/*/kotlin/**/*.kt")
target("build-logic/src/*/kotlin/**/*.kt")
licenseHeaderFile(licenseHeaderFile)
addStep(revertYearOnlyChangesStep)
}
} else {
kotlinGradle {
configureFormatter()
addStep(revertYearOnlyChangesStep)
target("*.kts")
}
}
@@ -1,5 +1,5 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,7 +15,6 @@
*/
import org.gradle.api.GradleException
import org.gradle.api.artifacts.Configuration
import org.gradle.api.component.AdhocComponentWithVariants
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.tasks.bundling.Jar
import org.gradle.api.tasks.testing.Test
@@ -24,7 +23,8 @@ import org.gradle.kotlin.dsl.*
plugins {
`java-library`
`maven-publish`
id("com.github.johnrengelman.shadow")
id("com.gradleup.shadow")
id("pklJvmSourceBundle")
}
// make fat Jar available to other subprojects
@@ -32,34 +32,31 @@ val fatJarConfiguration: Configuration = configurations.create("fatJar")
val fatJarPublication: MavenPublication = publishing.publications.create<MavenPublication>("fatJar")
// ideally we'd configure this automatically based on project dependencies
val firstPartySourcesJarsConfiguration: Configuration =
configurations.create("firstPartySourcesJars")
val relocations =
mapOf(
// pkl-core dependencies
"org.organicdesign.fp." to "org.pkl.thirdparty.paguro.",
"org.snakeyaml.engine." to "org.pkl.thirdparty.snakeyaml.engine.",
"org.msgpack." to "org.pkl.thirdparty.msgpack.",
"org.w3c.dom." to "org.pkl.thirdparty.w3c.dom",
"org.w3c.dom." to "org.pkl.thirdparty.w3c.dom.",
"com.oracle.svm.core." to "org.pkl.thirdparty.svm.",
// pkl-cli dependencies
"org.jline." to "org.pkl.thirdparty.jline.",
"com.github.ajalt.clikt." to "org.pkl.thirdparty.clikt.",
"com.github.ajalt.colormath" to "org.pkl.thirdparty.colormath.",
"com.github.ajalt.mordant" to "org.pkl.thirdparty.mordant",
"com.sun.jna" to "org.pkl.thirdparty.jna",
"com.github.ajalt.colormath." to "org.pkl.thirdparty.colormath.",
"com.github.ajalt.mordant." to "org.pkl.thirdparty.mordant.",
"com.sun.jna." to "org.pkl.thirdparty.jna.",
"kotlin." to "org.pkl.thirdparty.kotlin.",
"kotlinx." to "org.pkl.thirdparty.kotlinx.",
"org.intellij." to "org.pkl.thirdparty.intellij.",
"org.fusesource.jansi." to "org.pkl.thirdparty.jansi",
"org.fusesource.hawtjni." to "org.pkl.thirdparty.hawtjni",
"org.fusesource.jansi." to "org.pkl.thirdparty.jansi.",
"org.fusesource.hawtjni." to "org.pkl.thirdparty.hawtjni.",
// pkl-doc dependencies
"org.commonmark." to "org.pkl.thirdparty.commonmark.",
"org.jetbrains." to "org.pkl.thirdparty.jetbrains.",
"_COROUTINE." to "org.pkl.thirdparty.kotlinx._COROUTINE.",
// pkl-config-java dependencies
"io.leangen.geantyref." to "org.pkl.thirdparty.geantyref.",
@@ -69,9 +66,27 @@ val relocations =
// pkl-codegen-kotlin dependencies
"com.squareup.kotlinpoet." to "org.pkl.thirdparty.kotlinpoet.",
// pkl-profiler dependencies
"com.google.protobuf." to "org.pkl.thirdparty.com.google.protobuf.",
"com.google.perftools." to "org.pkl.thirdparty.com.google.perftools.",
"google.protobuf." to "org.pkl.thirdparty.google.protobuf.",
)
val nonRelocations = listOf("com/oracle/truffle/", "org/graalvm/")
for ((key, value) in relocations) {
if (!key.endsWith(".")) {
throw GradleException(
"Invalid relocation `\"$key\" to \"$value\"`: `$key` should end with a dot"
)
}
if (!value.endsWith(".")) {
throw GradleException(
"Invalid relocation `\"$key\" to \"$value\"`: `$value` should end with a dot"
)
}
}
val nonRelocations = listOf("com/oracle/truffle/", "org/graalvm/", "org/jspecify/")
tasks.shadowJar {
inputs.property("relocations", relocations)
@@ -80,12 +95,16 @@ tasks.shadowJar {
configurations = listOf(project.configurations.runtimeClasspath.get())
addMultiReleaseAttribute = true
// not required at runtime / fat JARs can't be used in native-image builds anyway
exclude("org/pkl/cli/svm/**")
exclude("META-INF/maven/**")
exclude("META-INF/upgrade/**")
exclude("DebugProbesKt.bin")
val info = project.extensions.getByType<BuildInfo>()
val minimumJvmTarget = JavaVersion.toVersion(info.jvmTarget)
@@ -103,9 +122,6 @@ tasks.shadowJar {
JavaVersionRange.startingAt(JavaLanguageVersion.of(minimumJvmTarget.majorVersion.toInt() + 1))
.forEach { exclude("META-INF/versions/${it.asInt()}/**") }
// org.antlr.v4.runtime.misc.RuleDependencyProcessor
exclude("META-INF/services/javax.annotation.processing.Processor")
exclude("module-info.*")
for ((from, to) in relocations) {
@@ -116,13 +132,10 @@ tasks.shadowJar {
mergeServiceFiles()
}
// workaround for https://github.com/johnrengelman/shadow/issues/651
components.withType(AdhocComponentWithVariants::class.java).forEach { c ->
c.withVariantsFromConfiguration(project.configurations.shadowRuntimeElements.get()) { skip() }
}
shadow { addShadowVariantIntoJavaComponent = false }
val testFatJar by
tasks.registering(Test::class) {
val testFatJar =
tasks.register<Test>("testFatJar") {
testClassesDirs = files(tasks.test.get().testClassesDirs)
classpath =
// compiled test classes
@@ -137,8 +150,8 @@ val testFatJar by
tasks.check { dependsOn(testFatJar) }
val validateFatJar by
tasks.registering {
val validateFatJar =
tasks.register("validateFatJar") {
val outputFile = layout.buildDirectory.file("validateFatJar/result.txt")
inputs.files(tasks.shadowJar)
inputs.property("nonRelocations", nonRelocations)
@@ -171,17 +184,13 @@ val validateFatJar by
tasks.check { dependsOn(validateFatJar) }
val resolveSourcesJars by
tasks.registering(ResolveSourcesJars::class) {
configuration.set(configurations.runtimeClasspath)
outputDir.set(layout.buildDirectory.dir("resolveSourcesJars"))
}
val fatSourcesJar by
tasks.registering(MergeSourcesJars::class) {
val fatSourcesJar =
tasks.register<MergeSourcesJars>("fatSourcesJar") {
plugins.withId("pklJavaLibrary") { inputJars.from(tasks.named("sourcesJar")) }
inputJars.from(firstPartySourcesJarsConfiguration)
inputJars.from(resolveSourcesJars.map { fileTree(it.outputDir) })
inputJars.from(configurations.named("firstPartySourcesJars"))
inputJars.from(
tasks.named<ResolveSourcesJars>("resolveSourcesJars").map { fileTree(it.outputDir) }
)
mergedBinaryJars.from(tasks.shadowJar)
relocatedPackages.set(relocations)
@@ -197,13 +206,13 @@ artifacts { add("fatJar", tasks.shadowJar) }
publishing {
publications {
named<MavenPublication>("fatJar") {
project.shadow.component(this)
from(components["shadow"])
// sources Jar is fat
artifact(fatSourcesJar.flatMap { it.outputJar.asFile }) { classifier = "sources" }
plugins.withId("pklJavaLibrary") {
val javadocJar by tasks.existing(Jar::class)
val javadocJar = tasks.named<Jar>("javadocJar")
// Javadoc Jar is not fat (didn't invest effort)
artifact(javadocJar.flatMap { it.archiveFile }) { classifier = "javadoc" }
}
@@ -1,5 +1,5 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,11 +21,15 @@ plugins { id("de.undercouch.download") }
val buildInfo = project.extensions.getByType<BuildInfo>()
// tries to minimize chance of corruption by download-to-temp-file-and-move
val downloadGraalVmAarch64 by
tasks.registering(Download::class) { configureDownloadGraalVm(buildInfo.graalVmAarch64) }
val downloadGraalVmAarch64 =
tasks.register<Download>("downloadGraalVmAarch64") {
configureDownloadGraalVm(buildInfo.graalVmAarch64)
}
val downloadGraalVmAmd64 by
tasks.registering(Download::class) { configureDownloadGraalVm(buildInfo.graalVmAmd64) }
val downloadGraalVmAmd64 =
tasks.register<Download>("downloadGraalVmAmd64") {
configureDownloadGraalVm(buildInfo.graalVmAmd64)
}
fun Download.configureDownloadGraalVm(graalvm: BuildInfo.GraalVm) {
onlyIf { !graalvm.installDir.exists() }
@@ -37,14 +41,14 @@ fun Download.configureDownloadGraalVm(graalvm: BuildInfo.GraalVm) {
tempAndMove(true)
}
val verifyGraalVmAarch64 by
tasks.registering(Verify::class) {
val verifyGraalVmAarch64 =
tasks.register<Verify>("verifyGraalVmAarch64") {
configureVerifyGraalVm(buildInfo.graalVmAarch64)
dependsOn(downloadGraalVmAarch64)
}
val verifyGraalVmAmd64 by
tasks.registering(Verify::class) {
val verifyGraalVmAmd64 =
tasks.register<Verify>("verifyGraalVmAmd64") {
configureVerifyGraalVm(buildInfo.graalVmAmd64)
dependsOn(downloadGraalVmAmd64)
}
@@ -60,15 +64,23 @@ fun Verify.configureVerifyGraalVm(graalvm: BuildInfo.GraalVm) {
}
@Suppress("unused")
val installGraalVmAarch64 by
tasks.registering(InstallGraalVm::class) {
val installGraalVmAarch64 =
tasks.register<InstallGraalVm>("installGraalVmAarch64") {
dependsOn(verifyGraalVmAarch64)
graalVm = buildInfo.graalVmAarch64
}
@Suppress("unused")
val installGraalVmAmd64 by
tasks.registering(InstallGraalVm::class) {
val installGraalVmAmd64 =
tasks.register<InstallGraalVm>("installGraalVmAmd64") {
dependsOn(verifyGraalVmAmd64)
graalVm = buildInfo.graalVmAmd64
}
// Picked up by GitHub Actions and uploaded as a build artifact
tasks.withType<NativeImageBuild>().configureEach {
compiledClassesFile =
layout.buildDirectory.file(
"compiled-classes/${project.name}-${project.version}-${buildInfo.targetMachine.targetName}.txt"
)
}
@@ -1,5 +1,5 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,6 +21,8 @@ tasks.addRule("Pattern: compatibilityTest[All|Releases|Latest|Candidate|Nightly|
val taskName = this
val matchResult = Regex("compatibilityTest(.+)").matchEntire(taskName) ?: return@addRule
// https://github.com/gradle/gradle/issues/32599
@Suppress("DEPRECATION")
when (val taskNameSuffix = matchResult.groupValues[1]) {
"All" ->
task("compatibilityTestAll") {
@@ -1,5 +1,5 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,30 +23,32 @@ val validatorConfiguration: Configuration =
configurations.create("validator") {
resolutionStrategy.eachDependency {
if (requested.group == "log4j" && requested.name == "log4j") {
@Suppress("UnstableApiUsage") useTarget(buildInfo.libs.findLibrary("log4j12Api").get())
useTarget(buildInfo.libs.findLibrary("log4j12Api").get())
because("mitigate critical security vulnerabilities")
}
}
}
dependencies {
@Suppress("UnstableApiUsage")
validatorConfiguration(buildInfo.libs.findLibrary("nuValidator").get()) {
// we only want jetty-util and jetty-util-ajax (with the right version)
// couldn't find a more robust way to express this
// remove unnecessary dependencies
// (some of the requested versions don't even exist on Maven Central)
exclude(group = "org.eclipse.jetty", module = "jetty-alpn-client")
exclude(group = "org.eclipse.jetty", module = "jetty-continuation")
exclude(group = "org.eclipse.jetty", module = "jetty-http")
exclude(group = "org.eclipse.jetty", module = "jetty-io")
exclude(group = "org.eclipse.jetty", module = "jetty-security")
exclude(group = "org.eclipse.jetty", module = "jetty-server")
exclude(group = "org.eclipse.jetty", module = "jetty-servlets")
exclude(group = "org.eclipse.jetty", module = "jetty-jakarta-servlet-api")
exclude(group = "org.eclipse.jetty.toolchain")
exclude(group = "javax.servlet")
exclude(group = "commons-fileupload")
exclude(group = "org.apache.commons", module = "commons-fileupload2-core")
exclude(group = "org.apache.commons", module = "commons-fileupload2-jakarta-servlet5")
}
}
val validateHtml by
tasks.registering(JavaExec::class) {
val validateHtml =
tasks.register<JavaExec>("validateHtml") {
val resultFile = layout.buildDirectory.file("validateHtml/result.txt")
inputs.files(htmlValidator.sources)
outputs.file(resultFile)
@@ -0,0 +1,49 @@
/*
* Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import net.ltgt.gradle.errorprone.CheckSeverity
import net.ltgt.gradle.errorprone.errorprone
import net.ltgt.gradle.nullaway.nullaway
import org.gradle.accessors.dm.LibrariesForLibs
import org.gradle.api.tasks.compile.JavaCompile
plugins {
`java-library`
id("net.ltgt.errorprone")
id("net.ltgt.nullaway")
}
val libs = the<LibrariesForLibs>()
dependencies {
api(libs.jspecify)
errorprone(libs.errorProne)
errorprone(libs.nullaway)
}
nullaway { onlyNullMarked = true }
tasks.withType<JavaCompile>().configureEach {
options.errorprone.disableAllChecks = true
options.errorprone.check("StringCaseLocaleUsage", CheckSeverity.ERROR)
options.errorprone.check("GuardedBy", CheckSeverity.ERROR)
options.errorprone.nullaway {
error()
onlyNullMarked = true
jspecifyMode = true
// honor assert x != null in addition to Objects.requireNonNull(x)
assertsEnabled = true
}
}
@@ -0,0 +1,132 @@
/*
* Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import kotlin.io.path.createDirectories
import kotlin.io.path.writeText
import org.gradle.kotlin.dsl.support.serviceOf
plugins {
id("pklJavaLibrary")
// id("pklPublishLibrary")
id("com.gradleup.shadow")
id("pklJvmSourceBundle")
}
val executableSpec = project.extensions.create("executable", ExecutableSpec::class.java)
val buildInfo = project.extensions.getByType<BuildInfo>()
val javaExecutable =
tasks.register<ExecutableJar>("javaExecutable") {
group = "build"
dependsOn(tasks.jar)
inJar = tasks.shadowJar.flatMap { it.archiveFile }
val effectiveJavaName =
executableSpec.javaName.map { name -> if (buildInfo.os.isWindows) "$name.bat" else name }
outJar = layout.buildDirectory.dir("executable").flatMap { it.file(effectiveJavaName) }
// uncomment for debugging
// jvmArgs.addAll("-ea", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005")
}
fun Task.setupTestStartJavaExecutable(launcher: Provider<JavaLauncher>? = null) {
group = "verification"
dependsOn(javaExecutable)
// dummy output to satisfy up-to-date check
val outputFile = layout.buildDirectory.file("testStartJavaExecutable/$name")
outputs.file(outputFile)
val execOutput = providers.exec {
val executablePath = javaExecutable.get().outputs.files.singleFile
if (launcher?.isPresent == true) {
commandLine(
launcher.get().executablePath.asFile.absolutePath,
"-jar",
executablePath.absolutePath,
"--version",
)
} else {
commandLine(executablePath.absolutePath, "--version")
}
}
doLast {
val outputText = execOutput.standardOutput.asText.get()
if (!outputText.contains(buildInfo.pklVersionNonUnique)) {
throw GradleException(
"Expected version output to contain current version (${buildInfo.pklVersionNonUnique}), but got '$outputText'"
)
}
outputFile.get().asFile.toPath().apply {
try {
parent.createDirectories()
} catch (_: java.nio.file.FileAlreadyExistsException) {}
writeText("OK")
}
}
}
val testStartJavaExecutable =
tasks.register("testStartJavaExecutable") { setupTestStartJavaExecutable() }
// Setup `testStartJavaExecutable` tasks for multi-JDK testing.
val testStartJavaExecutableOnOtherJdks =
buildInfo.jdkTestRange.map { jdkTarget ->
tasks.register("testStartJavaExecutableJdk${jdkTarget.asInt()}") {
enabled = buildInfo.isVersionEnabled(jdkTarget)
val toolChainService: JavaToolchainService = serviceOf()
val launcher = toolChainService.launcherFor { languageVersion = jdkTarget }
setupTestStartJavaExecutable(launcher)
}
}
tasks.assemble { dependsOn(javaExecutable) }
tasks.check {
dependsOn(testStartJavaExecutable)
dependsOn(testStartJavaExecutableOnOtherJdks)
}
// publishing {
// publications {
// // need to put in `afterEvaluate` because `artifactId` cannot be set lazily.
// project.afterEvaluate {
// register<MavenPublication>("javaExecutable") {
// artifactId = executableSpec.javaPublicationName.get()
//
// artifact(javaExecutable.map { it.outputs.files.singleFile }) {
// classifier = null
// extension = "bin"
// builtBy(javaExecutable)
// }
//
// pom {
// url = executableSpec.website
// description =
// executableSpec.documentationName.map { name ->
// """
// $name executable for Java.
// Can be executed directly, or with `java -jar <path/to/jpkl>`.
// Requires Java 17 or higher.
// """
// .trimIndent()
// }
// }
// }
// }
// }
// }
// signing { project.afterEvaluate { sign(publishing.publications["javaExecutable"]) } }
@@ -1,5 +1,5 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@ import org.gradle.accessors.dm.LibrariesForLibs
plugins {
`java-library`
`jvm-toolchains`
`jvm-test-suite`
id("pklKotlinTest")
id("com.diffplug.spotless")
}
@@ -34,14 +35,9 @@ val libs = the<LibrariesForLibs>()
val info = project.extensions.getByType<BuildInfo>()
java {
val jvmTarget = JavaVersion.toVersion(info.jvmTarget)
withSourcesJar() // creates `sourcesJar` task
withJavadocJar()
sourceCompatibility = jvmTarget
targetCompatibility = jvmTarget
toolchain {
languageVersion = info.jdkToolchainVersion
vendor = info.jdkVendor
@@ -54,20 +50,18 @@ artifacts {
}
spotless {
val revertYearOnlyChanges = RevertYearOnlyChangesStep(rootProject.rootDir, ratchetFrom!!).create()
java {
addStep(revertYearOnlyChanges)
googleJavaFormat(libs.versions.googleJavaFormat.get())
target("src/*/java/**/*.java")
licenseHeaderFile(rootProject.file("buildSrc/src/main/resources/license-header.star-block.txt"))
}
kotlin {
ktfmt(libs.versions.ktfmt.get()).googleStyle()
target("src/*/kotlin/**/*.kt")
licenseHeaderFile(rootProject.file("buildSrc/src/main/resources/license-header.star-block.txt"))
licenseHeaderFile(
rootProject.file("build-logic/src/main/resources/license-header.star-block.txt")
)
}
}
tasks.compileKotlin { enabled = false }
tasks.jar {
manifest {
attributes +=
@@ -85,19 +79,6 @@ tasks.javadoc {
(options as StandardJavadocDocletOptions).addStringOption("Xdoclint:none", "-quiet")
}
val workAroundKotlinGradlePluginBug by
tasks.registering {
doLast {
// Works around this problem, which sporadically appears and disappears in different
// subprojects:
// A problem was found with the configuration of task ':pkl-executor:compileJava' (type
// 'JavaCompile').
// > Directory '[...]/pkl/pkl-executor/build/classes/kotlin/main'
// specified for property 'compileKotlinOutputClasses' does not exist.
layout.buildDirectory.dir("classes/kotlin/main").get().asFile.mkdirs()
}
}
val truffleJavacArgs =
listOf(
// TODO: determine correct limits for Truffle specializations
@@ -107,15 +88,12 @@ val truffleJavacArgs =
tasks.compileJava {
javaCompiler = info.javaCompiler
dependsOn(workAroundKotlinGradlePluginBug)
options.compilerArgs.addAll(truffleJavacArgs + info.jpmsAddModulesFlags)
}
tasks.withType<JavaCompile>().configureEach {
val jvmTarget = JavaVersion.toVersion(info.jvmTarget)
javaCompiler = info.javaCompiler
sourceCompatibility = jvmTarget.majorVersion
targetCompatibility = jvmTarget.majorVersion
options.release = info.jvmTarget
}
tasks.withType<JavaExec>().configureEach { jvmArgs(info.jpmsAddModulesFlags) }
@@ -142,4 +120,4 @@ tasks.test { configureJdkTestTask(info.javaTestLauncher) }
// inherits the configuration of the default `test` task (aside from an overridden launcher).
val jdkTestTasks = info.multiJdkTestingWith(tasks.test) { (_, jdk) -> configureJdkTestTask(jdk) }
if (info.multiJdkTesting) tasks.check { dependsOn(jdkTestTasks) }
tasks.check { dependsOn(jdkTestTasks) }
@@ -0,0 +1,35 @@
/*
* Copyright © 2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Source bundle for the JVM variant of a project: its fat JAR, or its executable JAR.
//
// These contain the complete sources of all dependencies, because fat JARs contain the complete
// classes of all dependencies.
plugins { id("pklSourceBundle") }
val sourceBundleSpec = extensions.getByType<SourceBundleSpec>()
val sourceBundleJava =
tasks.register<BuildSourceBundle>("sourceBundleJava") {
group = "build"
description = "Builds the source bundle of ${project.name}'s JVM variant."
inputJars.from(sourceBundleSpec.firstPartyJars, sourceBundleSpec.dependencyJars)
outputZip =
layout.buildDirectory.file(
"sourceBundle/${project.name}-${project.version}-java-sourcebundle.zip"
)
}
tasks.named("sourceBundle") { dependsOn(sourceBundleJava) }
@@ -0,0 +1,114 @@
/*
* Copyright © 2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.gradle.accessors.dm.LibrariesForLibs
import org.gradle.api.GradleException
import org.gradle.kotlin.dsl.getByType
import org.gradle.kotlin.dsl.kotlin
import org.gradle.kotlin.dsl.the
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
plugins {
java
kotlin("jvm")
id("com.diffplug.spotless")
}
val buildInfo = project.extensions.getByType<BuildInfo>()
val libs = the<LibrariesForLibs>()
kotlin {
jvmToolchain {
languageVersion.set(buildInfo.jdkToolchainVersion)
vendor.set(buildInfo.jdkVendor)
}
compilerOptions {
val kotlinTarget = KotlinVersion.fromVersion(libs.versions.kotlinTarget.get())
languageVersion.set(kotlinTarget)
apiVersion.set(kotlinTarget)
jvmTarget = JvmTarget.fromTarget(buildInfo.jvmTarget.toString())
freeCompilerArgs.addAll(
"-jvm-default=no-compatibility", // was: -Xjvm-default=all
"-Xjdk-release=${buildInfo.jvmTarget}",
)
}
}
spotless {
val revertYearOnlyChanges = RevertYearOnlyChangesStep(rootProject.rootDir, ratchetFrom!!).create()
kotlin {
addStep(revertYearOnlyChanges)
ktfmt(libs.versions.ktfmt.get()).googleStyle()
target("src/*/kotlin/**/*.kt")
licenseHeaderFile(
rootProject.file("build-logic/src/main/resources/license-header.star-block.txt")
)
}
}
/**
* Kotlin modules to guard: fail the build if any dependency resolves to a version higher than
* `libs.versions.kotlinTarget`. This includes versions introduced via direct declarations, BOMs,
* version catalogs, or constraints.
*/
val guardedKotlinModules = setOf(libs.kotlinStdLib.get().module, libs.kotlinReflect.get().module)
/**
* Classpath configurations where the above rule applies. Kept narrow to avoid interfering with
* Gradle/Kotlin plugin internal configurations.
*/
val guardedConfigurations =
setOf(
configurations.compileClasspath,
configurations.runtimeClasspath,
configurations.testCompileClasspath,
configurations.testRuntimeClasspath,
)
guardedConfigurations.forEach { configuration ->
configuration.configure {
incoming.afterResolve {
resolutionResult.allComponents.forEach { component ->
val moduleVersion = component.moduleVersion ?: return@forEach
if (
moduleVersion.module in guardedKotlinModules &&
moduleVersion.version.exceedsKotlinTarget()
) {
throw GradleException(
"Resolved ${moduleVersion.module}:${moduleVersion.version} on configuration $name, " +
"which exceeds the allowed Kotlin version ($kotlinTargetVersion)"
)
}
}
}
}
}
// also works for version ranges like: [2.3.0,)
val kotlinVersionRegex = Regex("""(\d+)\.(\d+)(?:\.\d+)?""")
val kotlinTargetVersion = libs.versions.kotlinTarget.get()
val targetMajor = kotlinTargetVersion.substringBefore('.').toInt()
val targetMinor = kotlinTargetVersion.substringAfter('.').toInt()
fun String.exceedsKotlinTarget(): Boolean {
val version =
kotlinVersionRegex.find(this) ?: throw GradleException("Could not parse Kotlin version: $this")
val major = version.groupValues[1].toInt()
val minor = version.groupValues[2].toInt()
return major > targetMajor || (major == targetMajor && minor > targetMinor)
}
@@ -0,0 +1,29 @@
/*
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.gradle.accessors.dm.LibrariesForLibs
plugins { id("pklJavaLibrary") }
val buildInfo = project.extensions.getByType<BuildInfo>()
val libs = the<LibrariesForLibs>()
dependencies {
// Kotlin libraries typically expose stdlib types in their public APIs.
// Therefore, the stdlib must be available on the consumer's compile classpath,
// and "implementation" is not sufficient.
api(libs.kotlinStdLib)
}
@@ -1,5 +1,5 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,22 +14,27 @@
* limitations under the License.
*/
import java.net.URI
import org.gradle.accessors.dm.LibrariesForLibs
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
plugins {
`jvm-test-suite`
kotlin("jvm")
id("pklKotlinBase")
}
val buildInfo = project.extensions.getByType<BuildInfo>()
dependencies {
testImplementation(buildInfo.libs.findLibrary("assertj").get())
testImplementation(buildInfo.libs.findLibrary("junitApi").get())
testImplementation(buildInfo.libs.findLibrary("junitParams").get())
testImplementation(buildInfo.libs.findLibrary("kotlinStdLib").get())
val libs = the<LibrariesForLibs>()
testRuntimeOnly(buildInfo.libs.findLibrary("junitEngine").get())
dependencies {
testImplementation(libs.kotlinStdLib)
testImplementation(libs.assertj)
testImplementation(libs.junitApi)
testImplementation(libs.junitParams)
testRuntimeOnly(libs.junitEngine)
testRuntimeOnly(libs.junitLauncher)
}
tasks.withType<Test>().configureEach {
@@ -40,7 +45,7 @@ tasks.withType<Test>().configureEach {
// enable checking of stdlib return types
systemProperty("org.pkl.testMode", "true")
reports.named("html") { enabled = true }
reports.named("html") { required = true }
testLogging { exceptionFormat = TestExceptionFormat.FULL }
@@ -0,0 +1,270 @@
/*
* Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.lang.Runtime.Version
import kotlin.io.path.createDirectories
import kotlin.io.path.writeText
import org.gradle.accessors.dm.LibrariesForLibs
plugins {
id("pklGraalVm")
id("pklJavaLibrary")
id("pklNativeLifecycle")
id("pklNativeSourceBundle")
id("pklPublishLibrary")
id("com.gradleup.shadow")
}
// assumes that `pklJavaExecutable` is also applied
val executableSpec = project.extensions.getByType<ExecutableSpec>()
val buildInfo = project.extensions.getByType<BuildInfo>()
// musl executables are linked with `--static`, so musl and zlib become part of the executable
extensions.getByType<SourceBundleSpec>().staticMuslLibc = true
val stagedMacAarch64Executable: Configuration = configurations.create("stagedMacAarch64Executable")
val stagedLinuxAmd64Executable: Configuration = configurations.create("stagedLinuxAmd64Executable")
val stagedLinuxAarch64Executable: Configuration =
configurations.create("stagedLinuxAarch64Executable")
val stagedAlpineLinuxAmd64Executable: Configuration =
configurations.create("stagedAlpineLinuxAmd64Executable")
val stagedWindowsAmd64Executable: Configuration =
configurations.create("stagedWindowsAmd64Executable")
val nativeImageClasspath =
configurations.create("nativeImageClasspath") {
extendsFrom(configurations.runtimeClasspath.get())
// Ensure native-image version uses GraalVM C SDKs instead of Java FFI or JNA
// (comes from artifact `mordant-jvm-graal-ffi`).
exclude("com.github.ajalt.mordant", "mordant-jvm-ffm")
exclude("com.github.ajalt.mordant", "mordant-jvm-ffm-jvm")
exclude("com.github.ajalt.mordant", "mordant-jvm-jna")
exclude("com.github.ajalt.mordant", "mordant-jvm-jna-jvm")
}
val libs = the<LibrariesForLibs>()
dependencies {
fun executableFile(target: Target) =
files(
layout.buildDirectory.dir("executable").map { dir ->
dir.file(
executableSpec.name.map { name ->
if (target.os.isWindows) "$name-${target.targetName}.exe"
else "$name-${target.targetName}"
}
)
}
)
nativeImageClasspath(libs.truffleRuntime)
nativeImageClasspath(libs.graalSdk)
stagedMacAarch64Executable(executableFile(Target.MacosAarch64))
stagedLinuxAarch64Executable(executableFile(Target.LinuxAarch64))
stagedLinuxAmd64Executable(executableFile(Target.LinuxAmd64))
stagedAlpineLinuxAmd64Executable(executableFile(Target.AlpineLinuxAmd64))
stagedWindowsAmd64Executable(executableFile(Target.WindowsAmd64))
}
private fun NativeImageBuild.configure(target: Target) {
arch = target.arch
outputName = executableSpec.name.map { "$it-${target.targetName}" }
mainClass = executableSpec.mainClass
if (target.arch == Target.Arch.AARCH64) {
dependsOn(":installGraalVmAarch64")
} else {
dependsOn(":installGraalVmAmd64")
}
classpath.from(sourceSets.main.map { it.output })
classpath.from(
project(":pkl-commons-cli").extensions.getByType(SourceSetContainer::class)["svm"].output
)
classpath.from(nativeImageClasspath)
}
val macExecutableAarch64 =
tasks.register<NativeImageBuild>("macExecutableAarch64") { configure(Target.MacosAarch64) }
val linuxExecutableAmd64 =
tasks.register<NativeImageBuild>("linuxExecutableAmd64") { configure(Target.LinuxAmd64) }
val linuxExecutableAarch64 =
tasks.register<NativeImageBuild>("linuxExecutableAarch64") {
configure(Target.LinuxAarch64)
// Ensure compatibility for kernels with page size set to 4k, 16k and 64k
// (e.g. Raspberry Pi 5, Asahi Linux)
extraNativeImageArgs.add("-H:PageSize=65536")
}
val alpineExecutableAmd64 =
tasks.register<NativeImageBuild>("alpineExecutableAmd64") {
configure(Target.AlpineLinuxAmd64)
extraNativeImageArgs.addAll("--static", "--libc=musl")
}
val windowsExecutableAmd64 =
tasks.register<NativeImageBuild>("windowsExecutableAmd64") {
configure(Target.WindowsAmd64)
extraNativeImageArgs.add("-Dfile.encoding=UTF-8")
}
val assembleNative = tasks.named("assembleNative")
val testStartNativeExecutable =
tasks.register("testStartNativeExecutable") {
dependsOn(assembleNative)
// dummy file for up-to-date checking
val outputFile = project.layout.buildDirectory.file("testStartNativeExecutable/output.txt")
outputs.file(outputFile)
val execOutput = providers.exec {
commandLine(assembleNative.get().outputs.files.singleFile, "--version")
}
doLast {
val outputText = execOutput.standardOutput.asText.get()
if (!outputText.contains(buildInfo.pklVersionNonUnique)) {
throw GradleException(
"Expected version output to contain current version (${buildInfo.pklVersionNonUnique}), but got '$outputText'"
)
}
outputFile.get().asFile.toPath().apply {
try {
parent.createDirectories()
} catch (_: java.nio.file.FileAlreadyExistsException) {}
writeText("OK")
}
}
}
val requiredGlibcVersion: Version = Version.parse("2.17")
val checkGlibc =
tasks.register("checkGlibc") {
enabled = buildInfo.os.isLinux && !buildInfo.musl
dependsOn(assembleNative)
doLast {
val exec = providers.exec {
commandLine("objdump", "-T", assembleNative.get().outputs.files.singleFile)
}
val output = exec.standardOutput.asText.get()
val minimumGlibcVersion =
output
.split("\n")
.mapNotNull { line ->
val match = Regex("GLIBC_([.0-9]*)").find(line)
match?.groups[1]?.let { Version.parse(it.value) }
}
.maxOrNull()
if (minimumGlibcVersion == null) {
throw GradleException(
"Could not determine glibc version from executable. objdump output: $output"
)
}
if (minimumGlibcVersion > requiredGlibcVersion) {
throw GradleException(
"Incorrect glibc version. Found: $minimumGlibcVersion, required: $requiredGlibcVersion"
)
}
}
}
// Expose underlying task's outputs
private fun <T : Task> Task.wraps(other: TaskProvider<T>) {
dependsOn(other)
outputs.files(other)
}
val testNative = tasks.named("testNative") { dependsOn(testStartNativeExecutable, checkGlibc) }
val assembleNativeMacOsAarch64 =
tasks.named("assembleNativeMacOsAarch64") { wraps(macExecutableAarch64) }
val assembleNativeLinuxAarch64 =
tasks.named("assembleNativeLinuxAarch64") { wraps(linuxExecutableAarch64) }
val assembleNativeLinuxAmd64 =
tasks.named("assembleNativeLinuxAmd64") { wraps(linuxExecutableAmd64) }
val assembleNativeAlpineLinuxAmd64 =
tasks.named("assembleNativeAlpineLinuxAmd64") { wraps(alpineExecutableAmd64) }
val assembleNativeWindowsAmd64 =
tasks.named("assembleNativeWindowsAmd64") { wraps(windowsExecutableAmd64) }
private fun MavenPublication.configurePublication(target: Target, configuration: Configuration) {
artifactId = "${executableSpec.publicationName.get()}-${target.targetName}"
pom {
name = "${executableSpec.publicationName.get()}-${target.targetName}"
url = executableSpec.website
artifact(configuration.singleFile) {
classifier = null
extension = if (target.os.isWindows) "exe" else "bin"
builtBy(configuration)
}
description =
executableSpec.documentationName.map { name ->
buildString {
append("Native $name executable for ${target.os.displayName}/${target.arch}")
if (target.musl) {
append(" and statically linked to musl")
}
append(".")
}
}
}
}
publishing {
publications {
// need to put in `afterEvaluate` because `artifactId` cannot be set lazily.
project.afterEvaluate {
create<MavenPublication>("macExecutableAarch64") {
configurePublication(Target.MacosAarch64, stagedMacAarch64Executable)
}
create<MavenPublication>("linuxExecutableAmd64") {
configurePublication(Target.LinuxAmd64, stagedLinuxAmd64Executable)
}
create<MavenPublication>("linuxExecutableAarch64") {
configurePublication(Target.LinuxAarch64, stagedLinuxAarch64Executable)
}
create<MavenPublication>("alpineLinuxExecutableAmd64") {
configurePublication(Target.AlpineLinuxAmd64, stagedAlpineLinuxAmd64Executable)
}
create<MavenPublication>("windowsExecutableAmd64") {
configurePublication(Target.WindowsAmd64, stagedWindowsAmd64Executable)
}
}
}
}
signing {
project.afterEvaluate {
sign(publishing.publications["linuxExecutableAarch64"])
sign(publishing.publications["linuxExecutableAmd64"])
sign(publishing.publications["macExecutableAarch64"])
sign(publishing.publications["alpineLinuxExecutableAmd64"])
sign(publishing.publications["windowsExecutableAmd64"])
}
}
@@ -0,0 +1,96 @@
/*
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
val assembleNativeMacOsAarch64 = tasks.register("assembleNativeMacOsAarch64") { group = "build" }
val assembleNativeLinuxAarch64 = tasks.register("assembleNativeLinuxAarch64") { group = "build" }
val assembleNativeLinuxAmd64 = tasks.register("assembleNativeLinuxAmd64") { group = "build" }
val assembleNativeAlpineLinuxAmd64 =
tasks.register("assembleNativeAlpineLinuxAmd64") { group = "build" }
val assembleNativeWindowsAmd64 = tasks.register("assembleNativeWindowsAmd64") { group = "build" }
val testNativeMacOsAarch64 = tasks.register("testNativeMacOsAarch64") { group = "verification" }
val testNativeLinuxAarch64 = tasks.register("testNativeLinuxAarch64") { group = "verification" }
val testNativeLinuxAmd64 = tasks.register("testNativeLinuxAmd64") { group = "verification" }
val testNativeAlpineLinuxAmd64 =
tasks.register("testNativeAlpineLinuxAmd64") { group = "verification" }
val testNativeWindowsAmd64 = tasks.register("testNativeWindowsAmd64") { group = "verification" }
val buildInfo = project.extensions.getByType<BuildInfo>()
private fun <T : Task> Task.wraps(other: TaskProvider<T>) {
dependsOn(other)
outputs.files(other)
}
val assembleNative =
tasks.register("assembleNative") {
group = "build"
@Suppress("DuplicatedCode")
if (!buildInfo.isCrossArchSupported && buildInfo.isCrossArch) {
doLast {
throw GradleException("Cross-arch builds are not supported on ${buildInfo.os.name}")
}
}
@Suppress("DuplicatedCode")
when (buildInfo.targetMachine) {
Target.MacosAarch64 -> wraps(assembleNativeMacOsAarch64)
Target.LinuxAarch64 -> wraps(assembleNativeLinuxAarch64)
Target.LinuxAmd64 -> wraps(assembleNativeLinuxAmd64)
Target.AlpineLinuxAmd64 -> wraps(assembleNativeAlpineLinuxAmd64)
Target.WindowsAmd64 -> wraps(assembleNativeWindowsAmd64)
}
}
val testNative =
tasks.register("testNative") {
group = "verification"
dependsOn(assembleNative)
@Suppress("DuplicatedCode")
if (!buildInfo.isCrossArchSupported && buildInfo.isCrossArch) {
throw GradleException("Cross-arch builds are not supported on ${buildInfo.os.name}")
}
@Suppress("DuplicatedCode")
when (buildInfo.targetMachine) {
Target.MacosAarch64 -> wraps(testNativeMacOsAarch64)
Target.LinuxAarch64 -> wraps(testNativeLinuxAarch64)
Target.LinuxAmd64 -> wraps(testNativeLinuxAmd64)
Target.AlpineLinuxAmd64 -> wraps(testNativeAlpineLinuxAmd64)
Target.WindowsAmd64 -> wraps(testNativeWindowsAmd64)
}
}
val checkNative =
tasks.register("checkNative") {
group = "verification"
dependsOn(testNative)
}
val buildNative =
tasks.register("buildNative") {
group = "build"
dependsOn(checkNative)
}
@@ -0,0 +1,322 @@
/*
* Copyright © 2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import javax.inject.Inject
import org.gradle.accessors.dm.LibrariesForLibs
import org.gradle.api.tasks.options.Option
import org.gradle.process.ExecOperations
// Source bundles for the native variants of a project, one for each `Target`.
//
// Each bundle consists of the sources of everything that is compiled into the native image or
// library of that target:
// * the project's own sources, and those of its first-party dependencies;
// * the sources of third-party dependencies that have classes in the image;
// * the Java sources of the JDK, SubstrateVM, and Graal classes that are in the image;
// * the C sources of the JDK and SubstrateVM native libraries that are linked into the image;
// * for statically linked musl executables, the sources of musl and zlib.
//
// Which classes are in the image is read from the lists in `build/compiled-classes` (download them
// with the `downloadCompiledClasses` task). native-image produces these lists, and CI uploads them
// as `compiled-classes-<project>-*` artifacts. This way, the source bundle of any target can be
// built on any machine.
//
// Sources of the JDK, SubstrateVM, and Graal come from the OpenJDK and Graal repositories at the
// tags matching the GraalVM that is used to build, because GraalVM doesn't ship all of the Java
// sources (or any of the C sources).
plugins { id("pklSourceBundle") }
val libs = the<LibrariesForLibs>()
val sourceBundleSpec = extensions.getByType<SourceBundleSpec>()
val openJdkSourcesTarball: Configuration = configurations.create("openJdkSourcesTarball")
val graalSourcesTarball: Configuration = configurations.create("graalSourcesTarball")
val muslSourcesTarball: Configuration = configurations.create("muslSourcesTarball")
val zlibSourcesTarball: Configuration = configurations.create("zlibSourcesTarball")
// CI builds musl and zlib from source for statically linked executables; use the same versions.
fun muslToolchainVersion(name: String): String {
val script = rootProject.file(".github/scripts/install_musl.sh").readText()
return Regex("${name}_VERSION=\"([^\"]+)\"").find(script)?.groupValues?.get(1)
?: throw GradleException("Could not find ${name}_VERSION in .github/scripts/install_musl.sh")
}
// The "GitHub tag archives" and "musl releases" repositories are declared in settings.gradle.kts;
// declaring repositories in a project would stop it from using the ones declared in settings.
dependencies {
val jdkVersion = libs.versions.graalVmJdkVersion.get()
openJdkSourcesTarball("openjdk:jdk${jdkVersion.substringBefore('.')}u:jdk-$jdkVersion-ga")
graalSourcesTarball("oracle:graal:vm-${libs.versions.graalVm.get()}")
muslSourcesTarball("musl:musl:${muslToolchainVersion("MUSL")}")
zlibSourcesTarball("madler:zlib:v${muslToolchainVersion("ZLIB")}")
}
// native-image's class path can differ from the runtime class path (e.g. `nativeImageClasspath` in
// `pklNativeExecutable`), so resolve the sources of what's actually compiled in.
val resolveNativeSourcesJars =
tasks.register<ResolveSourcesJars>("resolveNativeSourcesJars") {
configuration.set(
provider {
configurations.findByName("nativeImageClasspath")
?: configurations.getByName("runtimeClasspath")
}
)
outputDir.set(layout.buildDirectory.dir("resolveNativeSourcesJars"))
}
// The JDK native libraries that native-image links into the image.
val openJdkNativeLibraries = listOf("java", "net", "nio", "zip", "extnet", "management_ext")
// Platform-specific directories in OpenJDK's `src/<module>/<platform>/`.
val Target.OS.openJdkPlatforms: List<String>
get() = buildList {
add("share")
if (!isWindows) add("unix")
add(
when {
isMacOS -> "macosx"
isWindows -> "windows"
else -> "linux"
}
)
}
// The `substratevm/src/com.oracle.svm.native.*` projects that apply to the OS.
val Target.OS.svmNativeProjects: List<String>
get() = buildList {
add("libchelper")
when {
isMacOS -> {
add("darwin")
add("jvm.posix")
}
isLinux -> {
add("libcontainer")
add("jvm.posix")
}
isWindows -> add("jvm.windows")
}
}
val sourceBundleTasks =
Target.entries.map { target ->
val variant = target.name
val outputDir = layout.buildDirectory.dir("tmp/nativeImageSources/${target.targetName}")
val compiledClassesFile =
layout.buildDirectory.file("compiled-classes/${target.targetName}.txt")
val nativeImageSourcesJar =
tasks.register<NativeImageSourcesJar>("nativeImageSourcesJar$variant") {
compiledClasses = compiledClassesFile
openJdkTarball.from(openJdkSourcesTarball)
graalTarball.from(graalSourcesTarball)
openJdkPlatforms.addAll(target.os.openJdkPlatforms)
outputJar = outputDir.map { it.file("native-image-sources.jar") }
}
val openJdkNativeSourcesJar =
tasks.register<Zip>("openJdkNativeSourcesJar$variant") {
archiveFileName = "openjdk-native-sources.jar"
destinationDirectory = outputDir
includeEmptyDirs = false
from(provider { tarTree(resources.gzip(openJdkSourcesTarball.singleFile)) }) {
for (platform in target.os.openJdkPlatforms) {
include("*/src/*/$platform/native/include/**")
for (library in openJdkNativeLibraries) {
include("*/src/*/$platform/native/lib$library/**")
}
}
// drop the `<repo>-<tag>/` root directory
eachFile {
relativePath = RelativePath(true, *relativePath.segments.drop(1).toTypedArray())
}
}
}
val graalNativeSourcesJar =
tasks.register<Zip>("graalNativeSourcesJar$variant") {
archiveFileName = "graal-native-sources.jar"
destinationDirectory = outputDir
includeEmptyDirs = false
from(provider { tarTree(resources.gzip(graalSourcesTarball.singleFile)) }) {
for (svmProject in target.os.svmNativeProjects) {
include("*/substratevm/src/com.oracle.svm.native.$svmProject/**")
}
eachFile {
relativePath = RelativePath(true, *relativePath.segments.drop(1).toTypedArray())
}
}
}
// Executables for musl targets are statically linked, so musl and zlib are part of them.
val staticLibcSources =
if (target.musl) {
val muslArch =
when (target.arch) {
Target.Arch.AMD64 -> "x86_64"
Target.Arch.AARCH64 -> "aarch64"
}
val muslSourcesJar =
tasks.register<Zip>("muslSourcesJar$variant") {
archiveFileName = "musl-sources.jar"
destinationDirectory = outputDir
includeEmptyDirs = false
from(provider { tarTree(resources.gzip(muslSourcesTarball.singleFile)) }) {
// skip the other architectures
include("*/src/**", "*/include/**", "*/crt/**", "*/ldso/**", "*/compat/**")
include("*/arch/generic/**", "*/arch/$muslArch/**")
include("*/COPYRIGHT", "*/VERSION", "*/WHATSNEW")
eachFile {
relativePath = RelativePath(true, *relativePath.segments.drop(1).toTypedArray())
}
}
}
val zlibSourcesJar =
tasks.register<Zip>("zlibSourcesJar$variant") {
archiveFileName = "zlib-sources.jar"
destinationDirectory = outputDir
includeEmptyDirs = false
from(provider { tarTree(resources.gzip(zlibSourcesTarball.singleFile)) }) {
exclude("*/.github/**")
eachFile {
relativePath = RelativePath(true, *relativePath.segments.drop(1).toTypedArray())
}
}
}
sourceBundleSpec.staticMuslLibc.map { isStatic ->
if (isStatic) files(muslSourcesJar, zlibSourcesJar) else files()
}
} else {
provider { files() }
}
tasks.register<BuildSourceBundle>("sourceBundle$variant") {
group = "build"
description = "Builds the source bundle of ${project.name} for ${target.targetName}."
inputJars.from(
sourceBundleSpec.firstPartyJars,
sourceBundleSpec.extraNativeSources,
nativeImageSourcesJar,
openJdkNativeSourcesJar,
graalNativeSourcesJar,
staticLibcSources,
)
// Only include sources of dependency classes that are compiled into the image.
filteredInputJars.from(resolveNativeSourcesJars.map { fileTree(it.outputDir) })
compiledClasses = compiledClassesFile
outputZip =
layout.buildDirectory.file(
"sourceBundle/${project.name}-${project.version}-${target.targetName}-sourcebundle.zip"
)
}
}
tasks.named("sourceBundle") { dependsOn(sourceBundleTasks) }
/**
* Downloads the lists of classes compiled into native images, which CI uploads as
* `compiled-classes-<project>-<os>-<arch>` artifacts, into `build/compiled-classes`.
*
* Requires the GitHub CLI (`gh`) to be installed and authenticated.
*/
abstract class DownloadCompiledClasses : DefaultTask() {
@get:Option(option = "run-id", description = "ID of the GitHub Actions run to download from.")
@get:Input
abstract val runId: Property<String>
@get:Option(option = "repo", description = "GitHub repository that the run belongs to.")
@get:Input
abstract val repo: Property<String>
/** The project whose artifacts to download (named `compiled-classes-<project>-*`). */
@get:Input abstract val projectName: Property<String>
@get:OutputDirectory abstract val destinationDir: DirectoryProperty
@get:Inject protected abstract val execOperations: ExecOperations
init {
group = "build"
description = "Downloads the compiled classes lists that CI produced into the build directory."
repo.convention("apple/pkl")
// always re-download; this task is meant to be run manually
outputs.upToDateWhen { false }
}
@TaskAction
@Suppress("unused")
fun download() {
if (!runId.isPresent) {
throw GradleException("Specify the run to download from, e.g. `--run-id=<id>`")
}
val name = projectName.get()
val downloadDir = temporaryDir.resolve("download")
downloadDir.deleteRecursively()
downloadDir.mkdirs()
execOperations.exec {
commandLine(
"gh",
"run",
"download",
runId.get(),
"--repo",
repo.get(),
"--pattern",
"compiled-classes-$name-*",
"--dir",
downloadDir.absolutePath,
)
}
// Files are named `<project>-<version>-<target name>.txt`; keep only the target name.
val fileName = Regex("^${Regex.escape(name)}-\\d+(?:\\.\\d+)*(?:-SNAPSHOT)?-(.+\\.txt)$")
val downloaded =
downloadDir
.walkTopDown()
.filter { it.isFile }
.associate { file ->
val target =
fileName.matchEntire(file.name)?.groupValues?.get(1)
?: throw GradleException("Unexpected file in downloaded artifacts: $file")
target to file
}
if (downloaded.isEmpty()) {
throw GradleException("Run ${runId.get()} has no `compiled-classes-$name-*` artifacts")
}
val destination = destinationDir.get().asFile
destination.mkdirs()
// remove lists of targets that are no longer built
destination.listFiles { f -> f.extension == "txt" }?.forEach { it.delete() }
for ((target, file) in downloaded) {
file.copyTo(destination.resolve(target))
}
logger.lifecycle("Downloaded ${downloaded.keys.sorted()} into $destination")
}
}
tasks.register<DownloadCompiledClasses>("downloadCompiledClasses") {
projectName = project.name
destinationDir = layout.buildDirectory.dir("compiled-classes")
}
@@ -0,0 +1,38 @@
/*
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
plugins {
`maven-publish`
signing
}
publishing {
publications {
components.findByName("java")?.let { javaComponent ->
create<MavenPublication>("library") { from(javaComponent) }
}
}
}
configurePklPomMetadata()
configurePomValidation()
configurePklSigning()
artifacts {
project.tasks.findByName("javadocJar")?.let { archives(it) }
project.tasks.findByName("sourcesJar")?.let { archives(it) }
}
@@ -0,0 +1,49 @@
/*
* Copyright © 2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
plugins { id("pklAllProjects") }
// Sources jars of the first-party projects that this project depends on.
// Ideally we'd configure this automatically based on project dependencies.
val firstPartySourcesJars: Configuration = configurations.create("firstPartySourcesJars")
// Sources jars of third-party dependencies. Project dependencies are not covered by this; they
// are added to `firstPartySourcesJars` instead.
val resolveSourcesJars =
tasks.register<ResolveSourcesJars>("resolveSourcesJars") {
configuration.set(configurations.named("runtimeClasspath"))
outputDir.set(layout.buildDirectory.dir("resolveSourcesJars"))
}
val sourceBundleSpec = extensions.create<SourceBundleSpec>("sourceBundleSpec")
sourceBundleSpec.staticMuslLibc.convention(false)
plugins.withId("pklJavaLibrary") { sourceBundleSpec.firstPartyJars.from(tasks.named("sourcesJar")) }
plugins.withId("pklKotlinLibrary") {
sourceBundleSpec.firstPartyJars.from(tasks.named("sourcesJar"))
}
sourceBundleSpec.firstPartyJars.from(firstPartySourcesJars)
sourceBundleSpec.dependencyJars.from(resolveSourcesJars.map { fileTree(it.outputDir) })
// Builds every source bundle of this project; there is one for each variant that the project is
// distributed as. The variants are registered by `pklJvmSourceBundle` and `pklNativeSourceBundle`.
tasks.register("sourceBundle") {
group = "build"
description = "Builds the source bundles of all variants of this project."
}
@@ -0,0 +1,39 @@
/*
* Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
plugins { id("com.diffplug.spotless") }
val pklFormatter = configurations.create("pklFormatter")
dependencies { pklFormatter(rootProject.project("pkl-formatter")) }
spotless {
format("pkl") {
target("**/*.pkl")
addStep(PklFormatterStep(pklFormatter).create())
licenseHeaderFile(
rootProject.file("build-logic/src/main/resources/license-header.line-comment.txt"),
"/// ",
)
// disable ratcheting for Pkl sources
// make any change to pkl-formatter reformat the stdlib
ratchetFrom = null
}
}
for (taskName in
listOf("spotlessPkl", "spotlessPklApply", "spotlessPklCheck", "spotlessPklDiagnose")) {
tasks.named(taskName) { dependsOn(":pkl-formatter:assemble") }
}
@@ -0,0 +1,15 @@
::===----------------------------------------------------------------------===//
:: Copyright © $YEAR Apple Inc. and the Pkl project authors. All rights reserved.
::
:: Licensed under the Apache License, Version 2.0 (the "License");
:: you may not use this file except in compliance with the License.
:: You may obtain a copy of the License at
::
:: https://www.apache.org/licenses/LICENSE-2.0
::
:: Unless required by applicable law or agreed to in writing, software
:: distributed under the License is distributed on an "AS IS" BASIS,
:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
:: See the License for the specific language governing permissions and
:: limitations under the License.
::===----------------------------------------------------------------------===//
@@ -0,0 +1,15 @@
#===----------------------------------------------------------------------===//
# Copyright © $YEAR Apple Inc. and the Pkl project authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#===----------------------------------------------------------------------===//
+12 -13
View File
@@ -1,5 +1,5 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,16 +14,14 @@
* limitations under the License.
*/
// https://youtrack.jetbrains.com/issue/KTIJ-19369
@file:Suppress("DSL_SCOPE_VIOLATION")
import org.jetbrains.gradle.ext.ActionDelegationConfig
import org.jetbrains.gradle.ext.ActionDelegationConfig.TestRunner.PLATFORM
import org.jetbrains.gradle.ext.ProjectSettings
import org.jetbrains.gradle.ext.TaskTriggersConfig
import org.jetbrains.gradle.ext.taskTriggers
plugins {
pklAllProjects
pklGraalVm
id("pklAllProjects")
id("pklGraalVm")
alias(libs.plugins.ideaExt)
alias(libs.plugins.jmh) apply false
@@ -33,12 +31,15 @@ plugins {
nexusPublishing {
repositories {
sonatype {
nexusUrl.set(uri("https://s01.oss.sonatype.org/service/local/"))
snapshotRepositoryUrl.set(uri("https://s01.oss.sonatype.org/content/repositories/snapshots/"))
nexusUrl.set(uri("https://ossrh-staging-api.central.sonatype.com/service/local/"))
snapshotRepositoryUrl.set(uri("https://central.sonatype.com/repository/maven-snapshots/"))
}
}
}
val configureLateInitAnnotation =
tasks.register<ConfigureLateInitAnnotation>("configureLateInitAnnotation")
idea {
project {
this as ExtensionAware
@@ -48,16 +49,14 @@ idea {
delegateBuildRunToGradle = true
testRunner = PLATFORM
}
configure<TaskTriggersConfig> {
afterSync(provider { project(":pkl-core").tasks.named("makeIntelliJAntlrPluginHappy") })
}
taskTriggers.afterSync(configureLateInitAnnotation)
}
}
}
val clean by tasks.existing { delete(layout.buildDirectory) }
val clean = tasks.named("clean") { delete(layout.buildDirectory) }
val printVersion by tasks.registering { doFirst { println(buildInfo.pklVersion) } }
val printVersion = tasks.register("printVersion") { doFirst { println(buildInfo.pklVersion) } }
val message =
"""
@@ -1,91 +0,0 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.nio.file.Files
import java.nio.file.Paths
import java.nio.file.StandardCopyOption
import java.util.*
import javax.inject.Inject
import kotlin.io.path.createDirectories
import org.gradle.api.DefaultTask
import org.gradle.api.internal.file.FileOperations
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
import org.gradle.process.ExecOperations
abstract class InstallGraalVm
@Inject
constructor(
private val fileOperations: FileOperations,
private val execOperations: ExecOperations,
) : DefaultTask() {
@get:Input abstract val graalVm: Property<BuildInfo.GraalVm>
init {
@Suppress("LeakingThis") onlyIf("GraalVM not installed") { !graalVm.get().installDir.exists() }
}
@TaskAction
@Suppress("unused")
fun run() {
// minimize chance of corruption by extract-to-random-dir-and-flip-symlink
val distroDir = Paths.get(graalVm.get().homeDir, UUID.randomUUID().toString())
try {
distroDir.createDirectories()
println("Extracting ${graalVm.get().downloadFile} into $distroDir")
// faster and more reliable than Gradle's `copy { from tarTree() }`
execOperations.exec {
workingDir = distroDir.toFile()
executable = "tar"
args("--strip-components=1", "-xzf", graalVm.get().downloadFile)
}
val os = org.gradle.internal.os.OperatingSystem.current()
val distroBinDir =
if (os.isMacOsX) distroDir.resolve("Contents/Home/bin") else distroDir.resolve("bin")
println("Installing native-image into $distroDir")
val gvmVersionMajor =
requireNotNull(graalVm.get().version.split(".").first().toIntOrNull()) {
"Invalid GraalVM JDK version: ${graalVm.get().graalVmJdkVersion}"
}
if (gvmVersionMajor < 24) {
execOperations.exec {
val executableName = if (os.isWindows) "gu.cmd" else "gu"
executable = distroBinDir.resolve(executableName).toString()
args("install", "--no-progress", "native-image")
}
}
println("Creating symlink ${graalVm.get().installDir} for $distroDir")
val tempLink = Paths.get(graalVm.get().homeDir, UUID.randomUUID().toString())
Files.createSymbolicLink(tempLink, distroDir)
try {
Files.move(tempLink, graalVm.get().installDir.toPath(), StandardCopyOption.ATOMIC_MOVE)
} catch (e: Exception) {
try {
fileOperations.delete(tempLink.toFile())
} catch (ignored: Exception) {}
throw e
}
} catch (e: Exception) {
try {
fileOperations.delete(distroDir)
} catch (ignored: Exception) {}
throw e
}
}
}
@@ -1,46 +0,0 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.gradle.accessors.dm.LibrariesForLibs
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile
plugins {
id("pklJavaLibrary")
kotlin("jvm")
}
// Build configuration.
val buildInfo = project.extensions.getByType<BuildInfo>()
// Version Catalog library symbols.
val libs = the<LibrariesForLibs>()
dependencies {
// At least some of our kotlin APIs contain Kotlin stdlib types
// that aren't compiled away by kotlinc (e.g., `kotlin.Function`).
// So let's be conservative and default to `api` for now.
// For Kotlin APIs that only target Kotlin users (e.g., pkl-config-kotlin),
// it won't make a difference.
api(buildInfo.libs.findLibrary("kotlinStdLib").get())
}
tasks.compileKotlin {
enabled = true // disabled by pklJavaLibrary
}
tasks.withType<KotlinJvmCompile>().configureEach {
compilerOptions { jvmTarget = JvmTarget.fromTarget(buildInfo.jvmTarget.toString()) }
}
@@ -1,147 +0,0 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.nio.charset.StandardCharsets
import java.util.Base64
import org.gradle.api.publish.maven.tasks.GenerateMavenPom
plugins {
`maven-publish`
signing
}
publishing {
publications {
components.findByName("java")?.let { javaComponent ->
create<MavenPublication>("library") { from(javaComponent) }
}
withType<MavenPublication>().configureEach {
pom {
name.set(artifactId)
licenses {
license {
name.set("The Apache Software License, Version 2.0")
url.set("https://github.com/apple/pkl/blob/main/LICENSE.txt")
}
}
developers {
developer {
id.set("pkl-authors")
name.set("The Pkl Authors")
email.set("pkl-oss@group.apple.com")
}
}
scm {
connection.set("scm:git:git://github.com/apple/pkl.git")
developerConnection.set("scm:git:ssh://github.com/apple/pkl.git")
val buildInfo = project.extensions.getByType<BuildInfo>()
url.set("https://github.com/apple/pkl/tree/${buildInfo.commitish}")
}
issueManagement {
system.set("GitHub Issues")
url.set("https://github.com/apple/pkl/issues")
}
ciManagement {
system.set("Circle CI")
url.set("https://app.circleci.com/pipelines/github/apple/pkl")
}
}
}
}
}
val validatePom by
tasks.registering {
if (tasks.findByName("generatePomFileForLibraryPublication") == null) {
return@registering
}
val generatePomFileForLibraryPublication by tasks.existing(GenerateMavenPom::class)
val outputFile =
layout.buildDirectory.file("validatePom") // dummy output to satisfy up-to-date check
dependsOn(generatePomFileForLibraryPublication)
inputs.file(generatePomFileForLibraryPublication.get().destination)
outputs.file(outputFile)
doLast {
outputFile.get().asFile.delete()
val pomFile = generatePomFileForLibraryPublication.get().destination
assert(pomFile.exists())
val text = pomFile.readText()
run {
val unresolvedVersion = Regex("<version>.*[+,()\\[\\]].*</version>")
val matches = unresolvedVersion.findAll(text).toList()
if (matches.isNotEmpty()) {
throw GradleException(
"""
Found unresolved version selector(s) in generated POM:
${matches.joinToString("\n") { it.groupValues[0] }}
"""
.trimIndent()
)
}
}
val buildInfo = project.extensions.getByType<BuildInfo>()
if (buildInfo.isReleaseBuild) {
val snapshotVersion = Regex("<version>.*-SNAPSHOT</version>")
val matches = snapshotVersion.findAll(text).toList()
if (matches.isNotEmpty()) {
throw GradleException(
"""
Found snapshot version(s) in generated POM of Pkl release version:
${matches.joinToString("\n") { it.groupValues[0] }}
"""
.trimIndent()
)
}
}
outputFile.get().asFile.writeText("OK")
}
}
tasks.publish { dependsOn(validatePom) }
// Workaround for maven publish plugin not setting up dependencies correctly.
// Taken from https://github.com/gradle/gradle/issues/26091#issuecomment-1798137734
val dependsOnTasks = mutableListOf<String>()
tasks.withType<AbstractPublishToMaven>().configureEach {
dependsOnTasks.add(name.replace("publish", "sign").replaceAfter("Publication", ""))
dependsOn(dependsOnTasks)
}
signing {
// provided as env vars `ORG_GRADLE_PROJECT_signingKey` and `ORG_GRADLE_PROJECT_signingPassword`
// in CI.
val signingKey =
(findProperty("signingKey") as String?)?.let {
Base64.getDecoder().decode(it).toString(StandardCharsets.US_ASCII)
}
val signingPassword = findProperty("signingPassword") as String?
if (signingKey != null && signingPassword != null) {
useInMemoryPgpKeys(signingKey, signingPassword)
}
publishing.publications.findByName("library")?.let { sign(it) }
}
artifacts {
project.tasks.findByName("javadocJar")?.let { archives(it) }
project.tasks.findByName("sourcesJar")?.let { archives(it) }
}
+2 -2
View File
@@ -1,6 +1,6 @@
name: main
title: Main Project
version: 0.28.0-dev
prerelease: true
version: 0.33.0
prerelease: false
nav:
- nav.adoc
+4 -4
View File
@@ -1,5 +1,5 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,8 +16,8 @@
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
plugins {
pklAllProjects
pklKotlinTest
id("pklAllProjects")
id("pklKotlinTest")
}
sourceSets {
@@ -37,8 +37,8 @@ dependencies {
testImplementation(projects.pklConfigJava)
testImplementation(projects.pklConfigKotlin)
testImplementation(projects.pklCommonsTest)
testImplementation(projects.pklParser)
testImplementation(libs.junitEngine)
testImplementation(libs.antlrRuntime)
}
tasks.test {
-46
View File
@@ -1,46 +0,0 @@
# This is a Gradle generated file for dependency locking.
# Manual edits can break the build and are not advised.
# This file is expected to be part of source control.
com.tunnelvisionlabs:antlr4-runtime:4.9.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
io.leangen.geantyref:geantyref:1.3.16=testRuntimeClasspath
net.bytebuddy:byte-buddy:1.15.11=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.27.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.graalvm.polyglot:polyglot:24.1.2=testRuntimeClasspath
org.graalvm.sdk:collections:24.1.2=testRuntimeClasspath
org.graalvm.sdk:graal-sdk:24.1.2=testRuntimeClasspath
org.graalvm.sdk:nativeimage:24.1.2=testRuntimeClasspath
org.graalvm.sdk:word:24.1.2=testRuntimeClasspath
org.graalvm.truffle:truffle-api:24.1.2=testRuntimeClasspath
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-build-common:2.0.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:2.0.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:2.0.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:2.0.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-client:2.0.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.0.21=kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration
org.jetbrains.kotlin:kotlin-reflect:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-script-runtime:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-scripting-common:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-scripting-jvm:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains:annotations:13.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testRuntimeClasspath
org.junit.jupiter:junit-jupiter-api:5.11.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-engine:5.11.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-params:5.11.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.platform:junit-platform-commons:1.11.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.platform:junit-platform-engine:1.11.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit:junit-bom:5.11.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.msgpack:msgpack-core:0.9.8=testRuntimeClasspath
org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.organicdesign:Paguro:3.10.3=testRuntimeClasspath
org.snakeyaml:snakeyaml-engine:2.9=testRuntimeClasspath
empty=annotationProcessor,apiDependenciesMetadata,compileClasspath,compileOnlyDependenciesMetadata,implementationDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtimeClasspath,runtimeOnlyDependenciesMetadata,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions
Loaded 100 of 3673 files, more files were not shown because too many files have changed in this diff. Show more