{"id":13734567,"url":"https://github.com/diffplug/spotless-changelog","last_synced_at":"2025-08-21T01:32:02.808Z","repository":{"id":45111112,"uuid":"225545609","full_name":"diffplug/spotless-changelog","owner":"diffplug","description":"The changelog is cast, let the versions fall where they may.","archived":false,"fork":false,"pushed_at":"2024-07-06T20:54:40.000Z","size":1498,"stargazers_count":47,"open_issues_count":12,"forks_count":3,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-04-08T01:41:52.965Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/diffplug.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-12-03T06:17:59.000Z","updated_at":"2025-02-15T21:17:00.000Z","dependencies_parsed_at":"2024-11-15T02:32:56.943Z","dependency_job_id":"f226a94a-3b1a-4250-9674-67a697edfacf","html_url":"https://github.com/diffplug/spotless-changelog","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/diffplug/spotless-changelog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diffplug%2Fspotless-changelog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diffplug%2Fspotless-changelog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diffplug%2Fspotless-changelog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diffplug%2Fspotless-changelog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/diffplug","download_url":"https://codeload.github.com/diffplug/spotless-changelog/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diffplug%2Fspotless-changelog/sbom","scorecard":{"id":341669,"data":{"date":"2025-08-11","repo":{"name":"github.com/diffplug/spotless-changelog","commit":"dd4557af8b456a5e84a11c00e40a2302173ebe93"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.1,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/12 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/changelog-print.yml:1","Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: topLevel 'contents' permission set to 'write': .github/workflows/deploy.yml:14","Info: topLevel 'contents' permission set to 'read': .github/workflows/gradle-wrapper-validation.yml:15","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/changelog-print.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/diffplug/spotless-changelog/changelog-print.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/changelog-print.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/diffplug/spotless-changelog/changelog-print.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/changelog-print.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/diffplug/spotless-changelog/changelog-print.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/diffplug/spotless-changelog/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/diffplug/spotless-changelog/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/diffplug/spotless-changelog/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/diffplug/spotless-changelog/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/diffplug/spotless-changelog/deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/diffplug/spotless-changelog/deploy.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/diffplug/spotless-changelog/deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/gradle-wrapper-validation.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/diffplug/spotless-changelog/gradle-wrapper-validation.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/gradle-wrapper-validation.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/diffplug/spotless-changelog/gradle-wrapper-validation.yml/main?enable=pin","Info:   0 out of   7 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/deploy.yml:27"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 23 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T06:03:05.596Z","repository_id":45111112,"created_at":"2025-08-18T06:03:05.596Z","updated_at":"2025-08-18T06:03:05.596Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271415019,"owners_count":24755628,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-20T02:00:09.606Z","response_time":69,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-03T03:00:57.468Z","updated_at":"2025-08-21T01:32:02.502Z","avatar_url":"https://github.com/diffplug.png","language":"Java","readme":"# \u003cimg align=\"left\" src=\"logo.png\"\u003e Spotless Changelog\n***The changelog is cast, let the versions fall where they may.***\n\u003c!---freshmark shields\noutput = [\n    link(shield('Gradle plugin', 'plugins.gradle.org', 'com.diffplug.spotless-changelog', 'blue'), 'https://plugins.gradle.org/plugin/com.diffplug.spotless-changelog'),\n    link(shield('Maven central', 'mavencentral', 'available', 'blue'), 'https://search.maven.org/search?q=g:com.diffplug.spotless-changelog'),\n    link(shield('Apache 2.0', 'license', 'apache-2.0', 'blue'), 'https://tldrlegal.com/license/apache-license-2.0-(apache-2.0)'),\n    '',\n    link(shield('Changelog', 'changelog', versionLast, 'brightgreen'), 'CHANGELOG.md'),\n    link(shield('Javadoc', 'javadoc', 'yes', 'brightgreen'), 'https://javadoc.jitpack.io/com/github/diffplug/spotless-changelog/spotless-changelog-agg/release~{{versionLast}}/javadoc/'),\n    link(shield('Live chat', 'gitter', 'chat', 'brightgreen'), 'https://gitter.im/diffplug/spotless-changelog'),\n    link(image('CircleCI', 'https://circleci.com/gh/diffplug/spotless-changelog.svg?style=shield'), 'https://circleci.com/gh/diffplug/spotless-changelog')\n    ].join('\\n');\n--\u003e\n[![Gradle plugin](https://img.shields.io/badge/plugins.gradle.org-com.diffplug.spotless--changelog-blue.svg)](https://plugins.gradle.org/plugin/com.diffplug.spotless-changelog)\n[![Maven central](https://img.shields.io/badge/mavencentral-available-blue.svg)](https://search.maven.org/search?q=g:com.diffplug.spotless-changelog)\n[![Apache 2.0](https://img.shields.io/badge/license-apache--2.0-blue.svg)](https://tldrlegal.com/license/apache-license-2.0-(apache-2.0))\n\n[![Changelog](https://img.shields.io/badge/changelog-3.1.2-brightgreen.svg)](CHANGELOG.md)\n[![Javadoc](https://img.shields.io/badge/javadoc-yes-brightgreen.svg)](https://javadoc.jitpack.io/com/github/diffplug/spotless-changelog/spotless-changelog-agg/release~3.1.2/javadoc/)\n[![Live chat](https://img.shields.io/badge/gitter-chat-brightgreen.svg)](https://gitter.im/diffplug/spotless-changelog)\n[![CircleCI](https://circleci.com/gh/diffplug/spotless-changelog.svg?style=shield)](https://circleci.com/gh/diffplug/spotless-changelog)\n\u003c!---freshmark /shields --\u003e\n\nSpotless Changelog checks that your changelog complies with the format of [keepachangelog](https://keepachangelog.com/), and uses the information from **only the changelog file** to compute the version of the next release. If you want, you can use the computed version to update the changelog file, then automatically commit, tag, and push when a release is published.\n\nThere are [many plugins](https://plugins.gradle.org/search?term=version) that compute your next version using a variety of configurable rules based on git tags, commit message standards, class file comparison, and other methods.  They tend to require a lot of documentation.\n\nIf your changelog doesn't already have information about breaking changes and new features, then you should fix that first, whether you end up adopting this plugin or not!  But once your changelog has that information, why not make things simple and use it as the source-of-truth?  If you want, there are also plugins which can generate your changelog automatically from your [git commits](https://plugins.gradle.org/search?term=git+changelog) or [github issues](https://plugins.gradle.org/search?term=github+changelog) (although we tend to think it's better to be a bit more human about it).\n\nCurrently Spotless Changelog only has a gradle plugin, but the logic lives in a separate library, and we welcome contributions for other build systems, just [as happened with the Spotless code formatter](https://github.com/diffplug/spotless/issues/102).\n\n\u003c!---freshmark version\noutput = prefixDelimiterReplace(input, \"id 'com.diffplug.spotless-changelog' version '\", \"'\", versionLast)\noutput = prefixDelimiterReplace(output, 'https://github.com/diffplug/spotless-changelog/blob/release/', '/spotless', versionLast)\noutput = prefixDelimiterReplace(output, 'https://javadoc.io/static/com.diffplug.spotless-changelog/spotless-changelog-plugin-gradle/', '/', versionLast)\n--\u003e\n\n## Keep your changelog clean\n\nYou have to start out with a changelog in the [keepachangelog](https://keepachangelog.com/) format. Here is a concise example:\n\n```\n## [Unreleased]\n### Added\n- A great feature\n\n## [1.0.0] - 2019-12-02\nInitial release.\n```\n\nIn your `build.gradle`, you do this:\n\n```gradle\nplugins {\n  id 'com.diffplug.spotless-changelog' version '3.1.2'\n}\n\nspotlessChangelog { // only necessary if you need to change the defaults below\n  changelogFile 'CHANGELOG.md'\n  enforceCheck true\n}\n```\n\nThe `changelogCheck` task will now run every time `gradlew check` runs, and it will verify that the changelog versions and dates conform to the format.\n\nIt does not enforce the entire keepachangelog format, only the `## [x.y.z] yyyy-mm-dd` lines.  We're happy to take a PR to support a stricter format, but it will be optional.\n\n### Legacy changelogs\n\nIf you have a big long legacy changelog that's not in the [keepachangelog](https://keepachangelog.com/) format, good job!  Changelogs are good!\n\nYou don't have to convert the whole thing.  Just stick `\u003c!-- END CHANGELOG --\u003e` on its own line into your changelog, and it will stop parsing as soon as this line is encountered.  The goal isn't perfection, just better.\n\n## Compute the next version\n\nBy default, Spotless Changelog uses the names `breaking.added.fixed` for `x.y.z`. When computing the next version, Spotless Changelog always starts with the most recent version from your changelog.  From there, the only decision we have to make is which position to bump: `breaking`, `added`, or `fixed`.  By default, Spotless Changelog will bump `fixed`.  All you need to do is set the rules for escalating to an `added` or `breaking` bump:\n\n```gradle\nspotlessChangelog {  // defaults\n  // breaking.added.fixed\n  ifFoundBumpBreaking '**BREAKING**'\n  ifFoundBumpAdded    '### Added'\n}\n```\n\nIf you're curious what the next version will be:\n\n```gradle\ncmd\u003e gradlew changelogPrint\nmyproj 1.0.4 -\u003e 1.1.0\n```\n\nYou can use these versions in your buildscript as `spotlessChangelog.versionNext` and `spotlessChangelog.versionLast`:\n\n```gradle\nproject.version = project.spotlessChangelog.versionNext\ndependencies {\n  implementation \"group:artifact:${project(':dep-project-with-own-changelog').spotlessChangelog.versionLast}\"\n}\n```\n\nWe also support other version schemas, like `2.0` instead of `2.0.0`, or `brand.major.minor.patch`, or `Ryyyy.SRx`, or any custom function you want.  See [ALTERNATE_VERSION_SCHEMAS.md](ALTERNATE_VERSION_SCHEMAS.md) for details.\n\n### Pre-1.0, 0.x, and other forms of perfomative insecurity\n\nThe terrible thing about `0.x` is that *the more unstable a codebase is, the more valuable **(concise compatibility guarantee).(new feature advertisement).(lowest downside risk to upgrade)** would be!*\n\nBut habits are what they are, and you're going to keep publishing things with `0.x`.  I will judge you for that, but Spotless Changelog won't.  It will just increment the `added` version (`0.1.0`, `0.2.0`, `0.3.0`, etc) whether your changelog has `**BREAKING**` or just `### Added`.  See how the information is getting lost?  If you really want to stick with `0.x`, you can convey a lot more information with [`0.breaking.added.fixed`](https://github.com/diffplug/spotless-changelog/blob/main/ALTERNATE_VERSION_SCHEMAS.md#available-schemas).\n\n### Alphas, betas, release-candidates, etc.\n\nIf you want, you can set `forceNextVersion '3.0.0.BETA7-RC1-FINAL'`.  It will still check that your changelog is formatted, but it will short-circuit the next version calculation.  This is also how to go from `0.x` to `1.0`.\n\n### -SNAPSHOT\n\nIntegration testing is important, and `-SNAPSHOT` is an easy way to do it.  [JitPack](https://jitpack.io/) is an even better way to do it, because using the git SHA as your version number solves the ambiguity and repeatability problems of `-SNAPSHOT`.\n\nThat said,`-SNAPSHOT` is handy and widely used.  One way to get it is `forceNextVersion '1.0.0-SNAPSHOT'`.  Another way is to set `appendDashSnapshotUnless_dashPrelease=true`.  This mode acts like a gun safety where all versions are nerfed to `-SNAPSHOT`, until you allow a release by adding `-Prelease=true` to the gradle command line.\n\n## Update the changelog, commit, push\n\n`gradlew changelogBump` will turn `[Unreleased]` into `[1.2.3] 2011-11-11` (or whatever) and add a new `[Unreleased]` section in your working copy file.  `gradlew changelogPush` will commit, tag, and push that change.\n\n```gradle\nspotlessChangelog {  // defaults\n  tagPrefix 'release/'\n  commitMessage 'Published release/{{version}}' // {{version}} will be replaced\n  remote 'origin'\n  branch 'main'\n}\n```\n\nWe recommend that you use `changelogPush` as your deploy task, and wire your tasks so that it will only happen if the publish was successful.  Here is a [battle-tested wiring plan](https://github.com/diffplug/blowdryer-diffplug/blob/main/src/main/resources/base/changelog.gradle) which can even [update your README.md with the latest version number](https://github.com/diffplug/blowdryer-diffplug/blob/2.0.0/src/main/resources/spotless/freshmark.gradle#L35-L61).  A simpler scheme is presented below:\n\n### Multiple changelogs per project\n\nThat's fine too!  If you apply `com.diffplug.spotless-changelog` to multiple projects, just be sure to set the `tagPrefix` and `commitMessage` properties so that you have unique tags and commit messages for each project.  You also might want to use the snippet below in your root project to ensure that you only release one of the changelogs at a time.\n\n```gradle\ngradle.taskGraph.whenReady { taskGraph -\u003e\n  def changelogPushTasks = taskGraph.allTasks.stream()\n    .filter { t -\u003e t.name == 'changelogPush' }\n    .map { t -\u003e t.path }\n    .toList()\n  if (changelogPushTasks.size() \u003e 1) {\n    throw new IllegalArgumentException(\"Run changelogPush one at a time:\\n\" + changelogPushTasks.join('\\n'))\n  }\n}\n```\n\n## Reference\n\n### Plugin DSL ([javadoc](https://javadoc.io/static/com.diffplug.spotless-changelog/spotless-changelog-plugin-gradle/3.1.2/com/diffplug/spotless/changelog/gradle/ChangelogExtension.html))\n\n```gradle\nspotlessChangelog { // all defaults\n  // keep changelog formatted\n  changelogFile 'CHANGELOG.md'\n  enforceCheck true\n  // calculate next version (breaking.added.fixed)\n  ifFoundBumpBreaking ['**BREAKING**']\n  ifFoundBumpAdded    ['### Added']\n  forceNextVersion null\n  // rare to change this, see ALTERNATE_VERSION_SCHEMAS.md\n  versionSchema Semver.class\n  // default value is false, but if you set it to true, then it will\n  // append -SNAPSHOT to nextVersion unless you add -Prelease=true to the gradle command line\n  appendDashSnapshotUnless_dashPrelease=false\n  // tag and push\n  tagPrefix 'release/'\n  commitMessage 'Published release/{{version}}' // {{version}} will be replaced\n  tagMessage null // default is null (creates lightweight tag); {{changes}} and {{version}} will be replaced\n  runAfterPush null // runs a CLI command after the push; {{changes}} and {{version}} will be replaced\n  remote 'origin'\n  branch 'main'\n  // default value is `yes`, but if you set it to `no`, then it will\n  // disable ssh host key checking (.ssh/known_hosts).\n  sshStrictHostKeyChecking \"yes\" // can override with `-PsshStrictHostKeyChecking=no`\n}\n\n// last version parsed from changelog\nString versionLast = spotlessChangelog.versionLast\n// calculated next version\nString versionNext = spotlessChangelog.versionNext\n// NOTE: Once you call either of these, you can't modify the spotlessChangelog configuration.\n//       Don't worry about doing this accidentally, you'll get a loud error if you do.\n```\n\n### Tasks ([code](https://github.com/diffplug/spotless-changelog/blob/release/3.1.2/spotless-changelog-plugin-gradle/src/main/java/com/diffplug/spotless/changelog/gradle/ChangelogPlugin.java))\n\n- `changelogPrint` - prints the last published version and calculated next version\n  - `myproj 1.0.4 -\u003e 1.1.0`\n- `changelogCheck` - throws an error if the changelog is not formatted according to your rules\n  - if `enforceCheck true` (default) then `check.dependsOn changelogCheck`\n- `changelogBump` - updates the changelog on disk with the next version and the current UTC date\n  - applying `changelogBump` multiple times in a row is fine, an empty section under `[Unreleased]` is enough to know that it has already been applied.\n- `changelogPush` - commits the changelog, tags, and pushes\n  - `changelogPush` depends on `changelogBump` depends on `changelogCheck`\n  - If `changelogPush` is in the task graph, then `changelogCheck` will do an extra check to make sure that the git push will succeed.  The `changelogBump` section above shows how you wire `changelogCheck` into your `jar` task so that your build will fail early if you haven't correctly setup the git credentials.\n\n### Requirements\n\nJava 8+ and Gradle 6.2+. (Spotless Changelog `2.2.0` can support Gradle 5.2+)\n\n\u003c!---freshmark /version --\u003e\n\n## Acknowledgments\n\n- Huge thanks to [Olivier Lacan](https://github.com/olivierlacan) and [contributors](https://github.com/olivierlacan/keep-a-changelog/graphs/contributors) for [keepachangelog](https://keepachangelog.com/en/1.0.0/).\n    - Changelog format is arbitrary, but a consistent format unlocks tooling. It's such an abstract thing, keepachangelog is an outstanding achievement of branding for the greater good!\n- Thanks to [Romano Zabini](https://github.com/rzabini) for adding [annotated tag support](https://github.com/diffplug/spotless-changelog/pull/22).\n- Thanks to [Christian Aye](https://github.com/christianaye) for [adding SSH support](https://github.com/diffplug/spotless-changelog/pull/20).\n- Thanks to [Colin Dean](https://github.com/colindean) for [keepachangelog-parser-java](https://github.com/colindean/keepachangelog-parser-java).  We ended up not using it, but because it existed, we [thought](https://twitter.com/pinboard/status/761656824202276864?lang=en) this plugin would be easy to build.\n- Git stuff by [jgit](https://www.eclipse.org/jgit/).\n- Built by [gradle](https://gradle.org/).\n- Maintained by [DiffPlug](https://www.diffplug.com/).\n","funding_links":[],"categories":["Plugins"],"sub_categories":["Releasing"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdiffplug%2Fspotless-changelog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdiffplug%2Fspotless-changelog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdiffplug%2Fspotless-changelog/lists"}