diff --git a/.releaserc.json b/.releaserc.json deleted file mode 100644 index 5b6afd807..000000000 --- a/.releaserc.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "branches": [ - { "name": "+([0-9])?(.{+([0-9]),x}).x" }, - { "name": "main" }, - { "name": "next" }, - { "name": "next-major" }, - { "name": "beta", "prerelease": true }, - { "name": "alpha", "prerelease": true } - ], - "preset": "conventionalcommits", - "plugins": [ - "@semantic-release/release-notes-generator", - [ - "@semantic-release/commit-analyzer", - { - "releaseRules": [ - {"breaking": true, "release": "minor"} - ] - } - ], - [ - "@semantic-release/exec", - { - "verifyConditionsCmd": "ci/release/verify.sh", - "prepareCmd": "ci/release/prepare.sh ${nextRelease.version}", - "publishCmd": "ci/release/publish.sh" - } - ], - [ - "@semantic-release/changelog", - { - "changelogTitle": "Release Notes\n---", - "changelogFile": "CHANGELOG.md" - } - ], - [ - "@semantic-release/github", - { - "assets": [ - { - "path": "native/libs/isthmus-macOS-latest", - "name": "isthmus-macOS-${nextRelease.version}", - "label": "Isthmus Native Image - macOS" - }, - { - "path": "native/libs/isthmus-ubuntu-latest", - "name": "isthmus-ubuntu-${nextRelease.version}", - "label": "Isthmus Native Image - Linux" - } - ], - "successComment": false - } - ], - [ - "@semantic-release/git", - { - "assets": [ - "gradle.properties", - "CHANGELOG.md" - ], - "message": "chore(release): ${nextRelease.version}" - } - ] - ] -} diff --git a/.releaserc.mjs b/.releaserc.mjs new file mode 100644 index 000000000..65f87aefa --- /dev/null +++ b/.releaserc.mjs @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// semantic-release configuration. +// +// This is an ESM (.mjs) config rather than .releaserc.json because the +// release-notes-generator needs a `writerOpts.transform` function to strip git +// trailers (e.g. `Signed-off-by:`) that the conventional-commits parser folds +// into `BREAKING CHANGE` notes. JSON cannot carry functions. +// +// This config defaults to a dry run as a fail-safe: the publishing plugins +// (@semantic-release/github, @semantic-release/git) and the verify/publish exec +// commands are only included when RELEASE_DRY_RUN=false. ci/release/run.sh opts +// in to a real release that way; every other invocation stays harmless. + +import { createRequire } from "node:module"; +import { pathToFileURL } from "node:url"; + +const loadPreset = async () => { + try { + return (await import("conventional-changelog-conventionalcommits")).default; + } catch { + const require = createRequire(pathToFileURL(process.argv[1])); + const resolved = pathToFileURL( + require.resolve("conventional-changelog-conventionalcommits") + ).href; + return (await import(resolved)).default; + } +}; +const conventionalcommits = await loadPreset(); + +const TRAILER_KEYS = [ + "Signed-off-by", + "Co-authored-by", + "Co-developed-by", + "Reviewed-by", + "Acked-by", + "Tested-by", + "Reported-by", + "Suggested-by", + "Helped-by", + "Cc", +]; +const TRAILER = new RegExp(`^(?:${TRAILER_KEYS.join("|")}):\\s`, "i"); + +const stripTrailers = (text) => { + if (!text) { + return text; + } + + const lines = text.split("\n"); + while (lines.length) { + const last = lines[lines.length - 1].trim(); + if (last === "" || TRAILER.test(last)) { + lines.pop(); + } else { + break; + } + } + return lines.join("\n"); +}; + +const preset = await conventionalcommits(); +const presetTransform = preset.writer.transform; +const dryRun = process.env.RELEASE_DRY_RUN !== "false"; + +export default { + branches: [ + { name: "+([0-9])?(.{+([0-9]),x}).x" }, + { name: "main" }, + { name: "next" }, + { name: "next-major" }, + { name: "beta", prerelease: true }, + { name: "alpha", prerelease: true }, + ], + preset: "conventionalcommits", + dryRun, + plugins: [ + [ + "@semantic-release/release-notes-generator", + { + writerOpts: { + transform(commit, context) { + const out = presetTransform(commit, context); + if (out && Array.isArray(out.notes)) { + out.notes = out.notes.map((note) => ({ + ...note, + text: stripTrailers(note.text), + })); + } + return out; + }, + }, + }, + ], + [ + "@semantic-release/commit-analyzer", + { + releaseRules: [{ breaking: true, release: "minor" }], + }, + ], + [ + "@semantic-release/exec", + dryRun + ? {} + : { + verifyConditionsCmd: "ci/release/verify.sh", + prepareCmd: "ci/release/prepare.sh ${nextRelease.version}", + publishCmd: "ci/release/publish.sh", + }, + ], + [ + "@semantic-release/changelog", + { + changelogTitle: "Release Notes\n---", + changelogFile: "CHANGELOG.md", + }, + ], + ...(dryRun + ? [] + : [ + [ + "@semantic-release/github", + { + assets: [ + { + path: "native/libs/isthmus-macOS-latest", + name: "isthmus-macOS-${nextRelease.version}", + label: "Isthmus Native Image - macOS", + }, + { + path: "native/libs/isthmus-ubuntu-latest", + name: "isthmus-ubuntu-${nextRelease.version}", + label: "Isthmus Native Image - Linux", + }, + ], + successComment: false, + }, + ], + [ + "@semantic-release/git", + { + assets: ["gradle.properties", "CHANGELOG.md"], + message: "chore(release): ${nextRelease.version}", + }, + ], + ]), + ], +}; diff --git a/CHANGELOG.md b/CHANGELOG.md index d1e315091..7c6ec4ca1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,63 @@ Release Notes ## [0.95.0](https://github.com/substrait-io/substrait-java/compare/v0.94.0...v0.95.0) (2026-07-05) +### ⚠ BREAKING CHANGES + +* **core:** remove deprecated Time, Timestamp, TimestampTZ types and literals (#950) +* **deps:** Protobuf bindings are now generated using the v4 +protobuf libraries, released in March 2024. Ensure that dependent +projects also use the v4 protobuf-java libraries, and be aware of the +breaking changes within the protobuf-java APIs documented at +https://protobuf.dev/news/v26/#java-breaking-changes + +### Features + +* **core:** add Substrait dialect support ([#861](https://github.com/substrait-io/substrait-java/issues/861)) ([ff76c77](https://github.com/substrait-io/substrait-java/commit/ff76c771d37f644ee57c77c7db0eb061804126f5)) +* **core:** remove deprecated Time, Timestamp, TimestampTZ types and literals ([#950](https://github.com/substrait-io/substrait-java/issues/950)) ([71b940f](https://github.com/substrait-io/substrait-java/commit/71b940f94fcd711603d1cfbafb9a2002ea5fd0f5)) +* **isthmus:** map execution context variables to/from Calcite ([#976](https://github.com/substrait-io/substrait-java/issues/976)) ([08c2889](https://github.com/substrait-io/substrait-java/commit/08c2889e675bb51ef6b5d39b8c9ed1e3811a474b)) + +### Bug Fixes + +* **core:** add compiled output to javadocImmutable classpath ([#953](https://github.com/substrait-io/substrait-java/issues/953)) ([1d3ea51](https://github.com/substrait-io/substrait-java/commit/1d3ea51537ee6b3e944ae6db96d014ef15e37c41)) +* **core:** validate Plan.Root output name count ([#812](https://github.com/substrait-io/substrait-java/issues/812)) ([4bd6b69](https://github.com/substrait-io/substrait-java/commit/4bd6b69ce535098da82d1ae33d6e2cfd78c62e78)) +* **isthmus:** avoid NPE from dangling correlations left by partial decorrelation ([fbf2930](https://github.com/substrait-io/substrait-java/commit/fbf2930ce575a47a643940f3f5bcd89474dab3cc)) +* **isthmus:** handle LITERAL_AGG in aggregate conversion ([52a32ba](https://github.com/substrait-io/substrait-java/commit/52a32bad575da67031ddd4e44caddeef641b9ed5)) +* **isthmus:** use reachability-metadata.json for native image build ([#979](https://github.com/substrait-io/substrait-java/issues/979)) ([a1e48c6](https://github.com/substrait-io/substrait-java/commit/a1e48c6b4d38b5ec8750b1918263c35bc1a83dc0)) +* **isthmus:** use Substrait type system when building Calcite RelBuilder ([#973](https://github.com/substrait-io/substrait-java/issues/973)) ([b370df5](https://github.com/substrait-io/substrait-java/commit/b370df50b8f35e802be3e78d3e5f87303b2e7517)), closes [#954](https://github.com/substrait-io/substrait-java/issues/954) [#955](https://github.com/substrait-io/substrait-java/issues/955) + +### Build System + +* **deps:** update protobuf from v3 to v4 ([#962](https://github.com/substrait-io/substrait-java/issues/962)) ([1516209](https://github.com/substrait-io/substrait-java/commit/1516209dd1c6801082a4a04649b5da79af4e0a1b)) + +### ⚠ BREAKING CHANGES + +* **core:** remove deprecated Time, Timestamp, TimestampTZ types and literals (#950) +* **deps:** Protobuf bindings are now generated using the v4 +protobuf libraries, released in March 2024. Ensure that dependent +projects also use the v4 protobuf-java libraries, and be aware of the +breaking changes within the protobuf-java APIs documented at +https://protobuf.dev/news/v26/#java-breaking-changes + +### Features + +* **core:** add Substrait dialect support ([#861](https://github.com/substrait-io/substrait-java/issues/861)) ([ff76c77](https://github.com/substrait-io/substrait-java/commit/ff76c771d37f644ee57c77c7db0eb061804126f5)) +* **core:** remove deprecated Time, Timestamp, TimestampTZ types and literals ([#950](https://github.com/substrait-io/substrait-java/issues/950)) ([71b940f](https://github.com/substrait-io/substrait-java/commit/71b940f94fcd711603d1cfbafb9a2002ea5fd0f5)) +* **isthmus:** map execution context variables to/from Calcite ([#976](https://github.com/substrait-io/substrait-java/issues/976)) ([08c2889](https://github.com/substrait-io/substrait-java/commit/08c2889e675bb51ef6b5d39b8c9ed1e3811a474b)) + +### Bug Fixes + +* **core:** add compiled output to javadocImmutable classpath ([#953](https://github.com/substrait-io/substrait-java/issues/953)) ([1d3ea51](https://github.com/substrait-io/substrait-java/commit/1d3ea51537ee6b3e944ae6db96d014ef15e37c41)) +* **core:** validate Plan.Root output name count ([#812](https://github.com/substrait-io/substrait-java/issues/812)) ([4bd6b69](https://github.com/substrait-io/substrait-java/commit/4bd6b69ce535098da82d1ae33d6e2cfd78c62e78)) +* **isthmus:** avoid NPE from dangling correlations left by partial decorrelation ([fbf2930](https://github.com/substrait-io/substrait-java/commit/fbf2930ce575a47a643940f3f5bcd89474dab3cc)) +* **isthmus:** handle LITERAL_AGG in aggregate conversion ([52a32ba](https://github.com/substrait-io/substrait-java/commit/52a32bad575da67031ddd4e44caddeef641b9ed5)) +* **isthmus:** use reachability-metadata.json for native image build ([#979](https://github.com/substrait-io/substrait-java/issues/979)) ([a1e48c6](https://github.com/substrait-io/substrait-java/commit/a1e48c6b4d38b5ec8750b1918263c35bc1a83dc0)) +* **isthmus:** use Substrait type system when building Calcite RelBuilder ([#973](https://github.com/substrait-io/substrait-java/issues/973)) ([b370df5](https://github.com/substrait-io/substrait-java/commit/b370df50b8f35e802be3e78d3e5f87303b2e7517)), closes [#954](https://github.com/substrait-io/substrait-java/issues/954) [#955](https://github.com/substrait-io/substrait-java/issues/955) + +### Build System + +* **deps:** update protobuf from v3 to v4 ([#962](https://github.com/substrait-io/substrait-java/issues/962)) ([1516209](https://github.com/substrait-io/substrait-java/commit/1516209dd1c6801082a4a04649b5da79af4e0a1b)) + + ## [0.94.0](https://github.com/substrait-io/substrait-java/compare/v0.93.0...v0.94.0) (2026-06-21) ### Features diff --git a/ci/release/dry_run.sh b/ci/release/dry_run.sh index 238c57b25..84c17e7ee 100755 --- a/ci/release/dry_run.sh +++ b/ci/release/dry_run.sh @@ -21,23 +21,19 @@ trap cleanup EXIT ERR cd "$worktree" || exit 1 export GITHUB_REF="$branch" +export RELEASE_DRY_RUN=true npx --yes \ - -p semantic-release \ - -p "@semantic-release/commit-analyzer" \ - -p "@semantic-release/release-notes-generator" \ - -p "@semantic-release/changelog" \ - -p "@semantic-release/exec" \ - -p "@semantic-release/git" \ - -p "conventional-changelog-conventionalcommits" \ + -p "semantic-release@25.0.5" \ + -p "@semantic-release/commit-analyzer@13.0.1" \ + -p "@semantic-release/release-notes-generator@14.1.1" \ + -p "@semantic-release/changelog@7.0.0-beta.1" \ + -p "@semantic-release/github@12.0.8" \ + -p "@semantic-release/exec@7.1.0" \ + -p "@semantic-release/git@10.0.1" \ + -p "conventional-changelog-conventionalcommits@9.3.1" \ semantic-release \ --ci false \ --dry-run \ - --preset conventionalcommits \ - --plugins \ - --analyze-commits "@semantic-release/commit-analyzer" \ - --generate-notes "@semantic-release/release-notes-generator" \ - --verify-conditions "@semantic-release/changelog,@semantic-release/exec,@semantic-release/git" \ - --prepare "@semantic-release/changelog,@semantic-release/exec" \ --branches "$branch" \ --repository-url "file://$PWD" diff --git a/ci/release/run.sh b/ci/release/run.sh index 438e00c77..5319b2e93 100755 --- a/ci/release/run.sh +++ b/ci/release/run.sh @@ -3,13 +3,13 @@ set -euo pipefail -npx --yes \ - -p semantic-release \ - -p "@semantic-release/commit-analyzer" \ - -p "@semantic-release/release-notes-generator" \ - -p "@semantic-release/changelog" \ - -p "@semantic-release/github" \ - -p "@semantic-release/exec" \ - -p "@semantic-release/git" \ - -p "conventional-changelog-conventionalcommits" \ +RELEASE_DRY_RUN=false npx --yes \ + -p "semantic-release@25.0.5" \ + -p "@semantic-release/commit-analyzer@13.0.1" \ + -p "@semantic-release/release-notes-generator@14.1.1" \ + -p "@semantic-release/changelog@7.0.0-beta.1" \ + -p "@semantic-release/github@12.0.8" \ + -p "@semantic-release/exec@7.1.0" \ + -p "@semantic-release/git@10.0.1" \ + -p "conventional-changelog-conventionalcommits@9.3.1" \ semantic-release --ci