Repository: orhun/git-cliff Branch: main Commit: 775beb07e996 Files: 445 Total size: 3.8 MB Directory structure: gitextract_m2e076c7/ ├── .cliffignore ├── .dockerignore ├── .editorconfig ├── .envrc ├── .git-blame-ignore-revs ├── .github/ │ ├── CODEOWNERS │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── config.yml │ │ ├── feature_request.yml │ │ └── integration.yml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── actions/ │ │ └── run-fixtures-test/ │ │ └── action.yml │ ├── bors.toml │ ├── config.yml │ ├── dependabot.yml │ ├── fixtures/ │ │ ├── README.md │ │ ├── new-fixture-template/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-always-render/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-always-render-unreleased/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-azure-devops-integration/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-azure-devops-integration-custom-range/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-bitbucket-integration/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-bitbucket-integration-custom-range/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-bump-initial-tag/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-bump-initial-tag-cli-arg/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-bump-initial-tag-default/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-bump-unreleased-with-tag-message-arg/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-bump-version/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-bump-version-custom-minor/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-bump-version-keep-zerover/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-bump-version-major/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-bump-version-minor/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-bump-version-patch/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-bumped-version/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-cli-arg-ignore-tags/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-cli-arg-skip-tags/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-commit-footers/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-commit-preprocessors/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-commit-range/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-commit-range-with-given-range/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-commit-range-with-sort-commits/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-configure-from-cargo-toml/ │ │ │ ├── Cargo.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-conventional-commit/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-custom-remote-api-url/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-custom-scope/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-custom-tag-pattern/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-date-order/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-fail-on-unmatched-commit/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.rc │ │ ├── test-fixtures-locally.sh │ │ ├── test-footer-filter/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-footer-template/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-from-context/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ ├── context.json │ │ │ └── expected.md │ │ ├── test-from-context-does-not-discard-fields/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ ├── context.json │ │ │ └── expected.md │ │ ├── test-gitea-integration/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-gitea-integration-custom-range/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-github-integration/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-github-integration-custom-range/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-gitlab-integration/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-gitlab-integration-custom-range/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-header-template/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-ignore-tags/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-invert-ignore-tags/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-keep-a-changelog-links/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-keep-a-changelog-links-current-arg/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-keep-a-changelog-links-latest-arg/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-keep-a-changelog-links-no-tags/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-keep-a-changelog-links-one-tag/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-keep-a-changelog-links-one-tag-bump-arg/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-keep-a-changelog-links-tag-arg/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-keep-a-changelog-links-unreleased-arg/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-latest-with-one-tag/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-limit-commits/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-monorepo-include-path/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-no-exec/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-offline/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-override-scope/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-regex-json-array/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-regex-label-grouping/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-regex-replace-parser/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-release-statistics/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-remote-config/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-require-conventional-negative/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.rc │ │ ├── test-require-conventional-skipped/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-skip-breaking-changes/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-skip-commits/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-skip-tags/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-split-commits/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-submodules/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-submodules-include-path/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-submodules-include-path-config/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-submodules-range/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-tag-message/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-topo-order/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-topo-order-arg/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-topo-order-commits/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-unchanged-tag-date/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ ├── test-unreleased-tag-missing-release-commit/ │ │ │ ├── cliff.toml │ │ │ ├── commit.sh │ │ │ └── expected.md │ │ └── test-workdir-include-path/ │ │ ├── cliff.toml │ │ ├── commit.sh │ │ └── expected.md │ ├── mergify.yml │ └── workflows/ │ ├── cd.yml │ ├── check-semver.yml │ ├── ci.yml │ ├── codeql.yml │ ├── dependency-review.yml │ ├── docker.yml │ ├── test-fixtures.yml │ └── website.yml ├── .gitignore ├── .lycheeignore ├── .well-known/ │ └── funding-manifest-urls ├── CHANGELOG.md ├── CNAME ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Cargo.toml ├── Dockerfile ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── RELEASE.md ├── SECURITY.md ├── cliff.toml ├── codecov.yml ├── config/ │ └── cliff.toml ├── examples/ │ ├── azure-devops-keepachangelog.toml │ ├── cocogitto.toml │ ├── detailed.toml │ ├── github-keepachangelog.toml │ ├── github.toml │ ├── keepachangelog.toml │ ├── minimal.toml │ ├── scoped.toml │ ├── scopesorted.toml │ ├── statistics.toml │ └── unconventional.toml ├── flake.nix ├── git-cliff/ │ ├── Cargo.toml │ ├── examples/ │ │ └── basic.rs │ └── src/ │ ├── args.rs │ ├── bin/ │ │ ├── completions.rs │ │ └── mangen.rs │ ├── lib.rs │ ├── logger.rs │ ├── main.rs │ └── profiler.rs ├── git-cliff-core/ │ ├── Cargo.toml │ ├── src/ │ │ ├── changelog.rs │ │ ├── command.rs │ │ ├── commit.rs │ │ ├── config.rs │ │ ├── contributor.rs │ │ ├── embed.rs │ │ ├── error.rs │ │ ├── lib.rs │ │ ├── release.rs │ │ ├── remote/ │ │ │ ├── azure_devops.rs │ │ │ ├── bitbucket.rs │ │ │ ├── gitea.rs │ │ │ ├── github.rs │ │ │ ├── gitlab.rs │ │ │ └── mod.rs │ │ ├── repo.rs │ │ ├── statistics.rs │ │ ├── summary.rs │ │ ├── tag.rs │ │ └── template.rs │ └── tests/ │ └── integration_test.rs ├── lychee.toml ├── npm/ │ ├── git-cliff/ │ │ ├── .gitignore │ │ ├── .yarn/ │ │ │ └── releases/ │ │ │ └── yarn-4.1.0.cjs │ │ ├── .yarnrc.yml │ │ ├── eslint.config.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── cli.ts │ │ │ ├── getExePath.ts │ │ │ ├── index.ts │ │ │ ├── options.ts │ │ │ └── optionsToStringArgs.ts │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ └── package.json.tmpl ├── pypi/ │ ├── .gitignore │ └── pyproject.toml ├── release.sh ├── rust-toolchain.toml ├── rustfmt.toml ├── typos.toml └── website/ ├── .gitignore ├── README.md ├── babel.config.js ├── blog/ │ ├── authors.yml │ ├── git-cliff-0.5.0.md │ ├── git-cliff-1.2.0.md │ ├── git-cliff-1.3.0.md │ ├── git-cliff-1.4.0.md │ ├── git-cliff-2.0.0.md │ ├── git-cliff-2.10.0.md │ ├── git-cliff-2.11.0.md │ ├── git-cliff-2.12.0.md │ ├── git-cliff-2.2.0.md │ ├── git-cliff-2.3.0.md │ ├── git-cliff-2.4.0.md │ ├── git-cliff-2.5.0.md │ ├── git-cliff-2.6.0.md │ ├── git-cliff-2.7.0.md │ ├── git-cliff-2.8.0.md │ └── git-cliff-2.9.0.md ├── docs/ │ ├── configuration/ │ │ ├── bump.md │ │ ├── changelog.md │ │ ├── git.md │ │ ├── index.md │ │ └── remote.md │ ├── development/ │ │ ├── _category_.json │ │ ├── contributing.md │ │ └── profiling.md │ ├── docker.md │ ├── github-actions/ │ │ ├── _category_.json │ │ ├── git-cliff-action.md │ │ ├── setup-git-cliff.md │ │ └── taiki-e-install-action.md │ ├── gitlab.md │ ├── index.md │ ├── installation/ │ │ ├── alpine-linux.md │ │ ├── arch-linux.md │ │ ├── binary-releases.md │ │ ├── build-from-source.md │ │ ├── conda-forge.md │ │ ├── crates-io.md │ │ ├── gentoo-linux.md │ │ ├── homebrew.md │ │ ├── index.md │ │ ├── macports.md │ │ ├── mise.md │ │ ├── nix.md │ │ ├── npm.md │ │ ├── pypi.md │ │ └── winget.md │ ├── integration/ │ │ ├── _category_.json │ │ ├── azure-devops.md │ │ ├── bitbucket.md │ │ ├── gitea.md │ │ ├── github.md │ │ ├── gitlab.md │ │ ├── python.md │ │ └── rust.md │ ├── sourcehut.md │ ├── templating/ │ │ ├── _category_.json │ │ ├── context.md │ │ ├── examples.md │ │ └── syntax.md │ ├── tips-and-tricks.md │ └── usage/ │ ├── _category_.json │ ├── adding-commits.md │ ├── adding-tag-messages.md │ ├── args.md │ ├── bump-version.md │ ├── examples.md │ ├── initializing.md │ ├── jujutsu.md │ ├── load-context.md │ ├── monorepos.md │ ├── multiple-repos.md │ ├── print-context.md │ ├── skipping-commits.md │ └── submodules.md ├── docusaurus.config.js ├── package.json ├── sidebars.js ├── src/ │ ├── components/ │ │ ├── HomepageFeatures/ │ │ │ ├── index.tsx │ │ │ └── styles.module.css │ │ └── Testimonials/ │ │ ├── index.tsx │ │ └── styles.module.css │ ├── css/ │ │ └── custom.css │ └── pages/ │ ├── index.module.css │ └── index.tsx ├── static/ │ ├── .nojekyll │ ├── 10k/ │ │ └── index.html │ ├── favicon/ │ │ └── site.webmanifest │ └── issues/ │ └── index.html └── tsconfig.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .cliffignore ================================================ # skip commits by their SHA1 4f88dda8c746173ea59f920b7579b7f6c74bd6c8 10c3194381f2cc4f93eb97404369568882ed8677 ================================================ FILE: .dockerignore ================================================ # Directories /.git/ /.github/ /npm/ /pypi/ /website/ # Files .editorconfig .gitignore *.md codecov.yml Dockerfile LICENSE rustfmt.toml _config.yml .lycheeignore lychee.toml # Ignore rust toolchain files as they would needlessly fetch the toolchain. # But the image already contains a sufficient toolchain. # Ignore both the latest naming and the legacy naming rust-toolchain.toml rust-toolchain ================================================ FILE: .editorconfig ================================================ # https://EditorConfig.org # top-most EditorConfig file root = true [{*.sh,*.rs}] indent_style = space indent_size = 4 ================================================ FILE: .envrc ================================================ use flake dotenv_if_exists .env ================================================ FILE: .git-blame-ignore-revs ================================================ 00273009e7553229bccc02e9f4a00d6f8acb9cd5 ================================================ FILE: .github/CODEOWNERS ================================================ # See https://help.github.com/articles/about-codeowners/ # for more info about CODEOWNERS file # It uses the same pattern rule for gitignore file # https://git-scm.com/docs/gitignore#_pattern_format # Core * @orhun ================================================ FILE: .github/FUNDING.yml ================================================ github: orhun patreon: orhunp buy_me_a_coffee: orhun ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.yml ================================================ name: Bug report 🐛 description: Report a bug to help us improve labels: ['bug'] assignees: - orhun body: - type: markdown attributes: value: | Thanks for taking the time to fill out this bug report! - type: checkboxes id: new-bug attributes: label: Is there an existing issue for this? description: Please search to see if an issue already exists for the bug you encountered. options: - label: I have searched the existing issues required: true - type: textarea id: bug-description attributes: label: Description of the bug description: Tell us what bug you encountered and what should have happened validations: required: true - type: textarea id: steps-to-reproduce attributes: label: Steps To Reproduce description: Steps to reproduce the behavior. placeholder: | Please tell us how to reproduce this bug, for example: 1. Build with '...' arguments 2. Run with '....' arguments 4. Use '...' configuration options 5. See the error validations: required: true - type: textarea id: expected-behavior attributes: label: Expected behavior description: What should be the expected behavior. placeholder: A clear and concise description of what you expected to happen. validations: required: true - type: textarea id: screenshots attributes: label: Screenshots / Logs description: If applicable, add screenshots to help explain your problem. placeholder: Paste your screenshots here. - type: textarea id: software-info attributes: label: Software information description: Please provide the following information about your environment. value: | - Operating system: - Rust version: - Project version: validations: required: true - type: textarea id: additional-context attributes: label: Additional context description: Do you want to share any additional context about this bug? placeholder: Add any other context about the problem here. ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ contact_links: - name: Discord Chat url: https://discord.gg/W3mAwMDWH4 about: Ask questions and have discussions about git-cliff on Discord - name: Matrix Chat url: https://matrix.to/#/#git-cliff:matrix.org about: Ask questions and have discussions about git-cliff on Matrix ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.yml ================================================ name: Feature request ⛰️ description: Suggest an idea for this project labels: ['feature/request'] assignees: - orhun body: - type: markdown attributes: value: Thank you for suggesting this feature! The more information you provide, the more likely it is that it will be picked up. - type: checkboxes id: new-feature attributes: label: Is there an existing issue or pull request for this? description: Please search to see if an issue or pull request already exists for the feature you desire. options: - label: I have searched the existing issues and pull requests required: true - type: textarea id: feature-description attributes: label: Feature description description: Is your feature request related to a problem? Please describe. placeholder: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] validations: required: true - type: textarea id: desired-solution attributes: label: Desired solution description: Describe the solution you'd like placeholder: A clear and concise description of what you want to happen. validations: required: true - type: textarea id: alternatives-considered attributes: label: Alternatives considered description: Describe alternatives you've considered placeholder: A clear and concise description of any alternative solutions or features you've considered. validations: required: true - type: textarea id: additional-context attributes: label: Additional context description: Do you want to share any additional context about this bug? placeholder: Add any other context about the problem here. ================================================ FILE: .github/ISSUE_TEMPLATE/integration.yml ================================================ name: Integration ⚙️ description: Report a bug or request a feature about an integration (e.g GitHub/GitLab/Gitea/Bitbucket) labels: ["integration"] assignees: - orhun body: - type: markdown attributes: value: | Thanks for taking the time to fill out this bug report! Please see https://git-cliff.org/docs/category/integration for more information about integrations. - type: checkboxes id: new-bug attributes: label: Is there an existing issue for this? description: Please search to see if an issue already exists for the bug you encountered. options: - label: I have searched the existing issues required: true - type: textarea id: bug-description attributes: label: Description of the bug description: Tell us what bug you encountered and what should have happened validations: required: true - type: textarea id: steps-to-reproduce attributes: label: Steps To Reproduce description: Steps to reproduce the behavior. placeholder: | Please tell us how to reproduce this bug, for example: 1. Build with '...' arguments 2. Run with '....' arguments 4. Use '...' configuration options 5. See the error validations: required: true - type: textarea id: expected-behavior attributes: label: Expected behavior description: What should be the expected behavior. placeholder: A clear and concise description of what you expected to happen. validations: required: true - type: textarea id: screenshots attributes: label: Screenshots / Logs description: If applicable, add screenshots to help explain your problem. placeholder: Paste your screenshots here. - type: textarea id: software-info attributes: label: Software information description: Please provide the following information about your environment. value: | - Operating system: - Rust version: - Project version: validations: required: true - type: textarea id: additional-context attributes: label: Additional context description: Do you want to share any additional context about this bug? placeholder: Add any other context about the problem here. ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ ## Description ## Motivation and Context ## How Has This Been Tested? ## Screenshots / Logs (if applicable) ## Types of Changes - [ ] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation (no code change) - [ ] Refactor (refactoring production code) - [ ] Other ## Checklist: - [ ] My code follows the code style of this project. - [ ] I have updated the documentation accordingly (if applicable). - [ ] I have formatted the code with [rustfmt](https://github.com/rust-lang/rustfmt). - [ ] `cargo +nightly fmt --all` - [ ] I checked the lints with [clippy](https://github.com/rust-lang/rust-clippy). - [ ] `cargo clippy --tests --verbose -- -D warnings` - [ ] I have added tests to cover my changes. - [ ] All new and existing tests passed. - [ ] `cargo test` ================================================ FILE: .github/actions/run-fixtures-test/action.yml ================================================ name: Run a fixtures test description: Run a fixtures test inputs: fixtures-dir: description: Path to the fixtures directory required: true command: description: The git-cliff command to run required: false default: "" date-format: description: The date format to use required: false default: "%Y-%m-%d" previous-release-timestamp: description: The timestamp of the previous release required: false default: "1970-01-01 00:00:00" runs: using: composite steps: - name: Install toolchain uses: dtolnay/rust-toolchain@nightly - name: Install git-cliff run: cargo install --path git-cliff/ --profile dev shell: bash - name: Set git config run: | git config --global user.name "github-actions[bot]" git config --global user.email "github-actions[bot]@users.noreply.github.com" shell: bash - name: Create commits and tags working-directory: ${{ inputs.fixtures-dir }} run: | git init ./commit.sh shell: bash - name: Generate a changelog working-directory: ${{ inputs.fixtures-dir }} shell: bash run: | set +e git cliff --config cliff.toml ${{ inputs.command }} > output.md echo "$?" > output.rc if [ -f output.md ]; then cat output.md fi - name: Compare the output with the expected output working-directory: ${{ inputs.fixtures-dir }} env: IN_DATE_FORMAT: ${{ inputs.date-format }} IN_PREVIOUS_RELEASE_TIMESTAMP: ${{ inputs.previous-release-timestamp }} shell: bash run: | if [ -f expected.md ]; then current_date=$(date +"$IN_DATE_FORMAT") previous_release_timestamp="$IN_PREVIOUS_RELEASE_TIMESTAMP" previous_release_timestamp=$(date -d "$previous_release_timestamp" +%s) current_release_timestamp=$(date +%s) days_since_last_release=$(( (current_release_timestamp - previous_release_timestamp) / 86400 )) sed -i "s/<>/$current_date/g" expected.md sed -i "s/<>/$days_since_last_release/g" expected.md if ! diff --strip-trailing-cr output.md expected.md; then echo '> expected' cat expected.md echo '> output' cat output.md echo "The generated changelog does not match the expected changelog." exit 1 fi fi - name: Compare the return code with the expected return code working-directory: ${{ inputs.fixtures-dir }} shell: bash run: | if [ -f expected.rc ]; then if ! diff --strip-trailing-cr --ignore-all-space output.rc expected.rc; then echo "The return code does not match the expected return code." exit 1 fi fi ================================================ FILE: .github/bors.toml ================================================ status = [ "Check", "Lints", "Formatting", "Test suite", "Audit check", "Links", "Check Rust version", ] delete_merged_branches = true update_base_for_deletes = true cut_body_after = "
" commit_title = "chore(pull): merge ${PR_REFS}" ================================================ FILE: .github/config.yml ================================================ # Configuration for welcome - https://github.com/behaviorbot/welcome # Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome # Comment to be posted to on first time issues newIssueWelcomeComment: > Thanks for opening your first issue at **git-cliff**! Be sure to follow the issue template! ⛰️ # Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome # Comment to be posted to on PRs from first time contributors in your repository newPRWelcomeComment: > Thanks for opening this pull request! Please check out our contributing guidelines! ⛰️ # Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge # Comment to be posted to on pull requests merged by a first time user firstPRMergeComment: > Congrats on merging your first pull request! ⛰️ ================================================ FILE: .github/dependabot.yml ================================================ version: 2 updates: # Maintain dependencies for Cargo - package-ecosystem: cargo directory: "/" schedule: interval: monthly open-pull-requests-limit: 10 groups: minor: update-types: - "minor" patch: update-types: - "patch" # Maintain dependencies for GitHub Actions - package-ecosystem: github-actions directory: "/" schedule: interval: monthly open-pull-requests-limit: 10 groups: minor: update-types: - "minor" patch: update-types: - "patch" # Maintain dependencies for NPM - package-ecosystem: "npm" directory: "/website" schedule: interval: monthly open-pull-requests-limit: 10 groups: minor: update-types: - "minor" patch: update-types: - "patch" - package-ecosystem: npm directory: /npm/git-cliff schedule: interval: monthly open-pull-requests-limit: 10 groups: minor: update-types: - "minor" patch: update-types: - "patch" ignore: # We intentionally ignore semver-major updates to avoid # PR noise when new Node versions are released. # Revisit this when updating the supported Node.js range. - dependency-name: "@types/node" update-types: ["version-update:semver-major"] # Maintain dependencies for Docker - package-ecosystem: docker directory: / schedule: interval: monthly open-pull-requests-limit: 10 ================================================ FILE: .github/fixtures/README.md ================================================ # Fixtures [Test fixtures](https://en.wikipedia.org/wiki/Test_fixture) are a way of testing the `git-cliff`'s functionality against a configuration file (`cliff.toml`) and asserting the output (`expected.md`). They are being [run](https://github.com/orhun/git-cliff/actions/workflows/test-fixtures.yml) as a part of the GitHub Actions and the workflow file can be viewed [here](../workflows/test-fixtures.yml). ## Adding new fixtures 1. Copy the `new-fixture-template` as `test-`. 2. Update the files accordingly to the function that is being tested. 3. Run the fixture locally. (see below) 4. Add the fixture to [`test-fixtures.yml`](../workflows/test-fixtures.yml) matrix. - If you need to specify custom arguments to `git-cliff` for the fixture test, you can do it here with using `command`. 5. Commit your changes. See [this commit](https://github.com/orhun/git-cliff/commit/c94cb6a37ae268953ab29dd35cb43b6a4fec47cc) as an example. ## Running locally To run the fixtures locally: ```sh ./test-fixtures-locally.sh ``` ## See also - [Contribution Guidelines](https://github.com/orhun/git-cliff/blob/main/CONTRIBUTING.md) ================================================ FILE: .github/fixtures/new-fixture-template/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's `scope` and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] ================================================ FILE: .github/fixtures/new-fixture-template/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2" GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2" git tag v0.2.0 GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests" ================================================ FILE: .github/fixtures/new-fixture-template/expected.md ================================================ ## [unreleased] ### Test - Add tests ## [0.2.0] - 2022-04-06 ### Bug Fixes - Fix feature 2 ### Features - Add feature 2 ## [0.1.0] - 2022-04-06 ### Bug Fixes - Fix feature 1 ### Features - Add feature 1 ================================================ FILE: .github/fixtures/test-always-render/cliff.toml ================================================ [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% if commits | length == 0 %} No significant changes. {% else %}\ {% for group, commits in commits | group_by(attribute="group") -%} ### {{ group | upper_first }} etc. {% endfor %} {% endif %}\ """ # render body even when there are no releases to process render_always = true ================================================ FILE: .github/fixtures/test-always-render/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1" git tag v0.1.0 ================================================ FILE: .github/fixtures/test-always-render/expected.md ================================================ ## [0.2.0] - <> No significant changes. ================================================ FILE: .github/fixtures/test-always-render-unreleased/cliff.toml ================================================ [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% if commits | length == 0 %} No significant changes. {% else %}\ {% for group, commits in commits | group_by(attribute="group") -%} ### {{ group | upper_first }} etc. {% endfor %} {% endif %}\ """ # render body even when there are no releases to process render_always = true ================================================ FILE: .github/fixtures/test-always-render-unreleased/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1" git tag v0.1.0 ================================================ FILE: .github/fixtures/test-always-render-unreleased/expected.md ================================================ ## [unreleased] No significant changes. ================================================ FILE: .github/fixtures/test-azure-devops-integration/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration # Azure DevOps integration for fetching commit metadata. [remote.azure_devops] owner = "shiftme/gitcliff" repo = "git-cliff-readme-example" [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {%- macro remote_url() -%} https://dev.azure.com/{{ remote.azure_devops.owner }}/_git/{{ remote.azure_devops.repo }} {%- endmacro -%} ## What's Changed {%- if version %} in {{ version }}{%- endif -%} {% for commit in commits %} * {{ commit.message | split(pat="\n") | first | trim }}\ {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%} {% if commit.remote.pr_number %} in \ [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pullrequest/{{ commit.remote.pr_number }})\ {%- endif %} {%- endfor -%} {% if azure_devops.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} {% raw %}\n{% endraw -%} ### New Contributors {%- endif %}\ {% for contributor in azure_devops.contributors | filter(attribute="is_first_time", value=true) %} * @{{ contributor.username }} made their first contribution {%- if contributor.pr_number %} in \ [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pullrequest/{{ contributor.pr_number }}) \ {%- endif %} {% endfor %}\ \n\n """ [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = false # Exclude commits that do not match the conventional commits specification. filter_unconventional = true # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [ # Remove issue numbers. { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, ] ================================================ FILE: .github/fixtures/test-azure-devops-integration/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://dev.azure.com/shiftme/gitcliff/_git/git-cliff-readme-example git pull origin master git fetch --tags ================================================ FILE: .github/fixtures/test-azure-devops-integration/expected.md ================================================ ## What's Changed * feat(config): support multiple file formats by @orhun * feat(cache): use cache while fetching pages by @orhun ## What's Changed in v1.0.1 * refactor(parser): expose string functions by @orhun * chore(release): add release script by @orhun ## What's Changed in v1.0.0 * Initial commit by @orhun * docs(project): add README.md by @orhun * feat(parser): add ability to parse arrays by @orhun * fix(args): rename help argument due to conflict by @orhun * docs(example)!: add tested usage example by @orhun ### New Contributors * @orhun made their first contribution ================================================ FILE: .github/fixtures/test-azure-devops-integration-custom-range/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration # Azure DevOps integration for fetching commit metadata. [remote.azure_devops] owner = "shiftme/gitcliff" repo = "git-cliff-readme-example" [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {%- macro remote_url() -%} https://dev.azure.com/{{ remote.azure_devops.owner }}/_git/{{ remote.azure_devops.repo }} {%- endmacro -%} ## What's Changed {%- if version %} in {{ version }}{%- endif -%} {% for commit in commits %} * {{ commit.message | split(pat="\n") | first | trim }}\ {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%} {% if commit.remote.pr_number %} in \ [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pullrequest/{{ commit.remote.pr_number }})\ {%- endif %} {%- endfor -%} {% if azure_devops.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} {% raw %}\n{% endraw -%} ### New Contributors {%- endif %}\ {% for contributor in azure_devops.contributors | filter(attribute="is_first_time", value=true) %} * @{{ contributor.username }} made their first contribution {%- if contributor.pr_number %} in \ [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pullrequest/{{ contributor.pr_number }}) \ {%- endif %} {% endfor %}\ \n\n """ [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = false # Exclude commits that do not match the conventional commits specification. filter_unconventional = true # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [ # Remove issue numbers. { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, ] ================================================ FILE: .github/fixtures/test-azure-devops-integration-custom-range/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://dev.azure.com/shiftme/gitcliff/_git/git-cliff-readme-example git pull origin master git fetch --tags ================================================ FILE: .github/fixtures/test-azure-devops-integration-custom-range/expected.md ================================================ ## What's Changed in v1.0.1 * refactor(parser): expose string functions by @orhun * chore(release): add release script by @orhun ================================================ FILE: .github/fixtures/test-bitbucket-integration/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration # Bitbucket integration for fetching commit metadata. [remote.bitbucket] owner = "mcwarman-playground" repo = "git-cliff-readme-example" [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {%- macro remote_url() -%} https://bitbucket.org/{{ remote.bitbucket.owner }}/{{ remote.bitbucket.repo }} {%- endmacro -%} ## What's Changed {%- if version %} in {{ version }}{%- endif -%} {% for commit in commits %} * {{ commit.message | split(pat="\n") | first | trim }}\ {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%} {% if commit.remote.pr_number %} in \ [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pull-requests/{{ commit.remote.pr_number }})\ {%- endif %} {%- endfor -%} {% if bitbucket.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} {% raw %}\n{% endraw -%} ### New Contributors {%- endif %}\ {% for contributor in bitbucket.contributors | filter(attribute="is_first_time", value=true) %} * @{{ contributor.username }} made their first contribution {%- if contributor.pr_number %} in \ [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull-requests/{{ contributor.pr_number }}) \ {%- endif %} {% endfor %}\ \n\n """ [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = false # Exclude commits that do not match the conventional commits specification. filter_unconventional = true # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [ # Remove issue numbers. { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, ] ================================================ FILE: .github/fixtures/test-bitbucket-integration/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://bitbucket.org/mcwarman-playground/git-cliff-readme-example git pull origin master git fetch --tags ================================================ FILE: .github/fixtures/test-bitbucket-integration/expected.md ================================================ ## What's Changed * feat(config): support multiple file formats by @orhun * feat(cache): use cache while fetching pages by @orhun * feat(ci): add pipeline config by @mcwarman <7236500+mcwarman@users.noreply.github.com> in [#1](https://bitbucket.org/mcwarman-playground/git-cliff-readme-example/pull-requests/1) ## What's Changed in v1.0.1 * refactor(parser): expose string functions by @orhun * chore(release): add release script by @orhun ## What's Changed in v1.0.0 * Initial commit by @orhun * docs(project): add README.md by @orhun * feat(parser): add ability to parse arrays by @orhun * fix(args): rename help argument due to conflict by @orhun * docs(example)!: add tested usage example by @orhun ### New Contributors * @orhun made their first contribution ================================================ FILE: .github/fixtures/test-bitbucket-integration-custom-range/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration # Bitbucket integration for fetching commit metadata. [remote.bitbucket] owner = "mcwarman-playground" repo = "git-cliff-readme-example" [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {%- macro remote_url() -%} https://bitbucket.org/{{ remote.bitbucket.owner }}/{{ remote.bitbucket.repo }} {%- endmacro -%} ## What's Changed {%- if version %} in {{ version }}{%- endif -%} {% for commit in commits %} * {{ commit.message | split(pat="\n") | first | trim }}\ {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%} {% if commit.remote.pr_number %} in \ [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pull-requests/{{ commit.remote.pr_number }})\ {%- endif %} {%- endfor -%} {% if bitbucket.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} {% raw %}\n{% endraw -%} ### New Contributors {%- endif %}\ {% for contributor in bitbucket.contributors | filter(attribute="is_first_time", value=true) %} * @{{ contributor.username }} made their first contribution {%- if contributor.pr_number %} in \ [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull-requests/{{ contributor.pr_number }}) \ {%- endif %} {% endfor %}\ \n\n """ [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = false # Exclude commits that do not match the conventional commits specification. filter_unconventional = true # Split commits on newlines, treating each line as an individual commit. split_commits = false # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [ # Remove issue numbers. { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, ] ================================================ FILE: .github/fixtures/test-bitbucket-integration-custom-range/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://bitbucket.org/mcwarman-playground/git-cliff-readme-example git pull origin master git fetch --tags ================================================ FILE: .github/fixtures/test-bitbucket-integration-custom-range/expected.md ================================================ ## What's Changed in v1.0.1 * refactor(parser): expose string functions by @orhun * chore(release): add release script by @orhun ================================================ FILE: .github/fixtures/test-bump-initial-tag/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] [bump] initial_tag = "1.15.5" ================================================ FILE: .github/fixtures/test-bump-initial-tag/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests" ================================================ FILE: .github/fixtures/test-bump-initial-tag/expected.md ================================================ ## [1.15.5] ### Test - Add tests ================================================ FILE: .github/fixtures/test-bump-initial-tag-cli-arg/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] [bump] initial_tag = "test" ================================================ FILE: .github/fixtures/test-bump-initial-tag-cli-arg/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests" ================================================ FILE: .github/fixtures/test-bump-initial-tag-cli-arg/expected.md ================================================ ## [2.1.1] ### Test - Add tests ================================================ FILE: .github/fixtures/test-bump-initial-tag-default/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] ================================================ FILE: .github/fixtures/test-bump-initial-tag-default/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests" ================================================ FILE: .github/fixtures/test-bump-initial-tag-default/expected.md ================================================ ## [0.1.0] ### Test - Add tests ================================================ FILE: .github/fixtures/test-bump-unreleased-with-tag-message-arg/cliff.toml ================================================ [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] {% if message %} {{ message }} {% endif %}\ {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # regex for parsing and grouping commits commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] ================================================ FILE: .github/fixtures/test-bump-unreleased-with-tag-message-arg/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2" GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2" git tag v0.2.0 GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests" ================================================ FILE: .github/fixtures/test-bump-unreleased-with-tag-message-arg/expected.md ================================================ ## [0.2.1] Some text ### Test - Add tests ================================================ FILE: .github/fixtures/test-bump-version/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ ================================================ FILE: .github/fixtures/test-bump-version/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat!: add breaking feature" GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2" ================================================ FILE: .github/fixtures/test-bump-version/expected.md ================================================ ## [1.0.0] ### 🚀 Features - [**breaking**] Add breaking feature ### 🐛 Bug Fixes - Fix feature 2 ## [0.1.0] ### 🚀 Features - Add feature 1 - Add feature 2 ================================================ FILE: .github/fixtures/test-bump-version-custom-minor/cliff.toml ================================================ [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [bump] features_always_bump_minor = true breaking_always_bump_major = true custom_minor_increment_regex = "minor|more" ================================================ FILE: .github/fixtures/test-bump-version-custom-minor/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "minor: add minor" GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2" ================================================ FILE: .github/fixtures/test-bump-version-custom-minor/expected.md ================================================ ## [0.2.0] ### 🐛 Bug Fixes - Fix feature 2 ### 💼 Other - Add minor ## [0.1.0] ### 🚀 Features - Add feature 1 - Add feature 2 ================================================ FILE: .github/fixtures/test-bump-version-keep-zerover/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [bump] features_always_bump_minor = false breaking_always_bump_major = false ================================================ FILE: .github/fixtures/test-bump-version-keep-zerover/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat!: add breaking feature" GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2" ================================================ FILE: .github/fixtures/test-bump-version-keep-zerover/expected.md ================================================ ## [0.2.0] ### Feat - [**breaking**] Add breaking feature ### Fix - Fix feature 2 ## [0.1.0] ### Feat - Add feature 1 - Add feature 2 ================================================ FILE: .github/fixtures/test-bump-version-major/cliff.toml ================================================ [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ ================================================ FILE: .github/fixtures/test-bump-version-major/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 1" GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2" ================================================ FILE: .github/fixtures/test-bump-version-major/expected.md ================================================ ## [1.0.0] ### 🐛 Bug Fixes - Fix feature 1 - Fix feature 2 ## [0.1.0] ### 🚀 Features - Add feature 1 - Add feature 2 ================================================ FILE: .github/fixtures/test-bump-version-minor/cliff.toml ================================================ [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ ================================================ FILE: .github/fixtures/test-bump-version-minor/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat!: add breaking feature" GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2" ================================================ FILE: .github/fixtures/test-bump-version-minor/expected.md ================================================ ## [0.2.0] ### 🚀 Features - [**breaking**] Add breaking feature ### 🐛 Bug Fixes - Fix feature 2 ## [0.1.0] ### 🚀 Features - Add feature 1 - Add feature 2 ================================================ FILE: .github/fixtures/test-bump-version-patch/cliff.toml ================================================ [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ ================================================ FILE: .github/fixtures/test-bump-version-patch/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat!: add breaking feature" GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2" ================================================ FILE: .github/fixtures/test-bump-version-patch/expected.md ================================================ ## [0.1.1] ### 🚀 Features - [**breaking**] Add breaking feature ### 🐛 Bug Fixes - Fix feature 2 ## [0.1.0] ### 🚀 Features - Add feature 1 - Add feature 2 ================================================ FILE: .github/fixtures/test-bumped-version/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ ================================================ FILE: .github/fixtures/test-bumped-version/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 1" GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2" ================================================ FILE: .github/fixtures/test-bumped-version/expected.md ================================================ v0.1.1 ================================================ FILE: .github/fixtures/test-cli-arg-ignore-tags/cliff.toml ================================================ [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # regex for skipping tags skip_tags = "" # regex for ignoring tags ignore_tags = "" ================================================ FILE: .github/fixtures/test-cli-arg-ignore-tags/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add first beta feature" git tag v1.0.0-beta.1 GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add second beta feature" git tag v1.0.0-beta.2 # WARNING: If we won't create this commit, 1.0.0 won't be created! GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "chore: why do i need a commit here?" git tag v1.0.0 GIT_COMMITTER_DATE="2021-01-23 01:23:49" git commit --allow-empty -m "fix: simple fix" git tag v1.0.1 ================================================ FILE: .github/fixtures/test-cli-arg-ignore-tags/expected.md ================================================ ## [1.0.1] - 2021-01-23 ### 🐛 Bug Fixes - Simple fix ## [1.0.0] - 2021-01-23 ### 🚀 Features - Add first beta feature - Add second beta feature ### ⚙️ Miscellaneous Tasks - Why do i need a commit here? ================================================ FILE: .github/fixtures/test-cli-arg-skip-tags/cliff.toml ================================================ [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # regex for skipping tags skip_tags = "" # regex for ignoring tags ignore_tags = "" ================================================ FILE: .github/fixtures/test-cli-arg-skip-tags/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add first beta feature" git tag v1.0.0-beta.1 GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add second beta feature" git tag v1.0.0-beta.2 # WARNING: If we won't create this commit, 1.0.0 won't be created! GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "chore: why do i need a commit here?" git tag v1.0.0 GIT_COMMITTER_DATE="2021-01-23 01:23:49" git commit --allow-empty -m "fix: simple fix" git tag v1.0.1 ================================================ FILE: .github/fixtures/test-cli-arg-skip-tags/expected.md ================================================ ## [1.0.1] - 2021-01-23 ### 🐛 Bug Fixes - Simple fix ## [1.0.0] - 2021-01-23 ### ⚙️ Miscellaneous Tasks - Why do i need a commit here? ================================================ FILE: .github/fixtures/test-commit-footers/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% if commit.footers %}\ {% for footer in commit.footers -%} , {{ footer.token }}{{ footer.separator }}{{ footer.value }}\ {% endfor %}\ {% endif %}\ {% endfor %} {% endfor %}\n """ ================================================ FILE: .github/fixtures/test-commit-footers/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" -m "footer: test" GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add feature 2" -m "Signed-off-by: bot" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "fix: fix feature 1" -m "footer1: xyz" -m "footer2: abc" ================================================ FILE: .github/fixtures/test-commit-footers/expected.md ================================================ ## [unreleased] ### 🐛 Bug Fixes - Fix feature 1, footer1:xyz, footer2:abc ## [0.1.0] - 2021-01-23 ### 🚀 Features - Add feature 1, footer:test - Add feature 2, Signed-off-by:bot ================================================ FILE: .github/fixtures/test-commit-preprocessors/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [ # Replace issue numbers with links to the issue. { pattern = '\(#([0-9]+)\)', replace = "([issue#${1}](https://github.com/orhun/git-cliff/issues/${1}))" }, # Trim multiple spaces. { pattern = " +", replace = " " }, ] ================================================ FILE: .github/fixtures/test-commit-preprocessors/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1 (#1)" GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "refactor: move classes" git tag v0.1.0 ================================================ FILE: .github/fixtures/test-commit-preprocessors/expected.md ================================================ ## [0.1.0] - 2022-04-06 ### 🚀 Features - Add feature 1 ### 🐛 Bug Fixes - Fix feature 1 ([issue#1](https://github.com/orhun/git-cliff/issues/1)) ### 🚜 Refactor - Move classes ================================================ FILE: .github/fixtures/test-commit-range/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %} {{ commit_range.from }}..{{ commit_range.to }} {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's `scope` and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] ================================================ FILE: .github/fixtures/test-commit-range/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://github.com/orhun/git-cliff-readme-example git pull origin master git fetch --tags ================================================ FILE: .github/fixtures/test-commit-range/expected.md ================================================ ## [unreleased] a9d4050212a18f6b3bd76e2e41fbb9045d268b80..df6aef41292f3ffe5887754232e6ea7831c50ba5 ### Features - Support multiple file formats - Use cache while fetching pages ## [1.0.1] - 2021-07-18 e4fd3cf8e2e6f49c0b57f66416e886c37cbb3715..06412ac1dd4071006c465dde6597a21d4367a158 ### Chore - Add release script ### Refactor - Expose string functions ## [1.0.0] - 2021-07-18 a78bc368e9ee382a3016c0c4bab41f7de4503bcd..ad27b43e8032671afb4809a1a3ecf12f45c60e0e ### Bug Fixes - Rename help argument due to conflict ### Features - Add ability to parse arrays ### Docs - Add README.md - Add tested usage example ================================================ FILE: .github/fixtures/test-commit-range-with-given-range/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %} {{ commit_range.from }}..{{ commit_range.to }} {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's `scope` and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] ================================================ FILE: .github/fixtures/test-commit-range-with-given-range/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://github.com/orhun/git-cliff-readme-example git pull origin master git fetch --tags ================================================ FILE: .github/fixtures/test-commit-range-with-given-range/expected.md ================================================ ## [unreleased] a140cef0405e0bcbfb5de44ff59e091527d91b38..a9d4050212a18f6b3bd76e2e41fbb9045d268b80 ### Bug Fixes - Rename help argument due to conflict ### Features - Add ability to parse arrays - Support multiple file formats ### Chore - Add release script ### Docs - Add tested usage example ### Refactor - Expose string functions ================================================ FILE: .github/fixtures/test-commit-range-with-sort-commits/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %} {{ commit_range.from }}..{{ commit_range.to }} {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's `scope` and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] sort_commits = "newest" ================================================ FILE: .github/fixtures/test-commit-range-with-sort-commits/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://github.com/orhun/git-cliff-readme-example git pull origin master git fetch --tags ================================================ FILE: .github/fixtures/test-commit-range-with-sort-commits/expected.md ================================================ ## [unreleased] a9d4050212a18f6b3bd76e2e41fbb9045d268b80..df6aef41292f3ffe5887754232e6ea7831c50ba5 ### Features - Use cache while fetching pages - Support multiple file formats ## [1.0.1] - 2021-07-18 e4fd3cf8e2e6f49c0b57f66416e886c37cbb3715..06412ac1dd4071006c465dde6597a21d4367a158 ### Chore - Add release script ### Refactor - Expose string functions ## [1.0.0] - 2021-07-18 a78bc368e9ee382a3016c0c4bab41f7de4503bcd..ad27b43e8032671afb4809a1a3ecf12f45c60e0e ### Bug Fixes - Rename help argument due to conflict ### Features - Add ability to parse arrays ### Docs - Add tested usage example - Add README.md ================================================ FILE: .github/fixtures/test-configure-from-cargo-toml/Cargo.toml ================================================ [package] name = "test" version = "0.1.0" edition = "2021" [package.metadata.git-cliff.changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file.\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ # A Tera template to be rendered as the changelog's footer. # See https://keats.github.io/tera/docs/#introduction footer = """ """ # Remove leading and trailing whitespaces from the changelog's body. trim = true [package.metadata.git-cliff.git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] ================================================ FILE: .github/fixtures/test-configure-from-cargo-toml/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2" GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2" git tag v0.2.0 GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests" ================================================ FILE: .github/fixtures/test-configure-from-cargo-toml/expected.md ================================================ # Changelog All notable changes to this project will be documented in this file. ## [unreleased] ### Test - Add tests ## [0.2.0] - 2022-04-06 ### Bug Fixes - Fix feature 2 ### Features - Add feature 2 ## [0.1.0] - 2022-04-06 ### Bug Fixes - Fix feature 1 ### Features - Add feature 1 ================================================ FILE: .github/fixtures/test-conventional-commit/cliff.toml ================================================ [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% for group, commits in commits | group_by(attribute="group") %}\ ## {{ group | striptags | trim | upper_first }} {% for commit in commits %} {% if commit.scope %}*({{ commit.scope }})* {% endif %}\ {% if commit.breaking %}[**breaking**]: {{ commit.breaking_description }}{% endif %} {{ commit.message }}: {{ commit.body }}\ {% for footer in commit.footers %} - {{ footer.token }}{{ footer.separator }} {{ footer.value }}\ {% endfor %} {% endfor %} {% endfor %}\ """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix" }, ] ================================================ FILE: .github/fixtures/test-conventional-commit/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m \ "feat(web): feature 1, breaking change in footer Body feature 1 BREAKING CHANGE: breaking change description feature 1 Signed-off-by: user1 Reviewed-by: user2 " GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m \ "feat(web)!: feature 2, breaking chain in description Body feature 2 Signed-off-by: user3 " GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m \ "feat!: feature 3, use default scope = app Body feature 2 Signed-off-by: user3 " GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m \ "fix(scope): fix 1, use scope as group Body fix 1 Fix: #1 " GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m \ "fix(front-end): fix 2, no footer Body fix 2 " GIT_COMMITTER_DATE="2022-04-06 01:25:14" git commit --allow-empty -m \ "fix(front-end): fix 3 and 4, no body but footer Fix: #3 Fix: #4 " git tag v0.1.0 ================================================ FILE: .github/fixtures/test-conventional-commit/expected.md ================================================ ## Features *(web)* [**breaking**]: breaking change description feature 1 feature 1, breaking change in footer: Body feature 1 - BREAKING CHANGE: breaking change description feature 1 - Signed-off-by: user1 - Reviewed-by: user2 *(web)* [**breaking**]: feature 2, breaking chain in description feature 2, breaking chain in description: Body feature 2 - Signed-off-by: user3 *(app)* [**breaking**]: feature 3, use default scope = app feature 3, use default scope = app: Body feature 2 - Signed-off-by: user3 ## Fix *(scope)* fix 1, use scope as group: Body fix 1 - Fix: #1 *(front-end)* fix 2, no footer: Body fix 2 *(front-end)* fix 3 and 4, no body but footer: - Fix: #3 - Fix: #4 ================================================ FILE: .github/fixtures/test-custom-remote-api-url/cliff.toml ================================================ [remote.gitlab] owner = "archlinux" repo = "arch-repro-status" api_url = "https://gitlab.archlinux.org/api/v4" [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ ## What's Changed {%- if version %} in {{ version }}{%- endif -%} {% for commit in commits %} * {{ commit.message | split(pat="\n") | first | trim }}\ {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%} {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %} {%- endfor -%} {% if gitlab.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} {% raw %}\n{% endraw -%} ### New Contributors {%- endif %}\ {% for contributor in gitlab.contributors | filter(attribute="is_first_time", value=true) %} * @{{ contributor.username }} made their first contribution {%- if contributor.pr_number %} in \ [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ {%- endif %} {%- endfor -%} {% if version %} {% if previous.version %} **Full Changelog**: https://gitlab.com/{{ remote.gitlab.owner }}/{{ remote.gitlab.repo }}/compare/{{ previous.version }}...{{ version }} {% endif %} {% else -%} {% raw %}\n{% endraw %} {% endif %} """ [git] # Exclude commits that do not match the conventional commits specification. filter_unconventional = false # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [ # Remove issue numbers. { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, ] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [] ================================================ FILE: .github/fixtures/test-custom-remote-api-url/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://gitlab.archlinux.org/archlinux/arch-repro-status git fetch git checkout 5fe2f324db566756ccaf066fe186100a09a87625 ================================================ FILE: .github/fixtures/test-custom-remote-api-url/expected.md ================================================ ## What's Changed in v1.4.1 * Update the copyright year in license by @Orhun Parmaksız * bump dependencies by @Orhun Parmaksız * update cargo-deny config by @Orhun Parmaksız * prepare for 1.4.1 by @Orhun Parmaksız **Full Changelog**: https://gitlab.com/archlinux/arch-repro-status/compare/v1.4.0...v1.4.1 ================================================ FILE: .github/fixtures/test-custom-scope/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for group, commits in commits | group_by(attribute="scope") %} #### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\ {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] ================================================ FILE: .github/fixtures/test-custom-scope/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2" GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2" git tag v0.1.0 ================================================ FILE: .github/fixtures/test-custom-scope/expected.md ================================================ ## [0.1.0] - 2022-04-06 ### Bug Fixes #### Cli - Fix feature 1 - Fix feature 2 ### Features #### App - Add feature 1 #### Gui - Add feature 2 ================================================ FILE: .github/fixtures/test-custom-tag-pattern/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="alpha-") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] ================================================ FILE: .github/fixtures/test-custom-tag-pattern/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" git tag beta-0.1.0 GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1" git tag alpha-0.1.0 GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2" git tag beta-0.2.0 GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2" git tag alpha-0.2.0 GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests" ================================================ FILE: .github/fixtures/test-custom-tag-pattern/expected.md ================================================ ## [unreleased] ### Test - Add tests ## [0.2.0] - 2022-04-06 ### Bug Fixes - Fix feature 2 ### Features - Add feature 2 ## [0.1.0] - 2022-04-06 ### Bug Fixes - Fix feature 1 ### Features - Add feature 1 ================================================ FILE: .github/fixtures/test-date-order/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ ================================================ FILE: .github/fixtures/test-date-order/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add feature 2" git tag v0.2.0 git checkout v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "feat: fix feature 1" git tag v0.1.1 ================================================ FILE: .github/fixtures/test-date-order/expected.md ================================================ ## [0.1.1] - 2021-01-23 ### 🚀 Features - Fix feature 1 ================================================ FILE: .github/fixtures/test-fail-on-unmatched-commit/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for group, commits in commits | group_by(attribute="scope") %} #### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\ {% endfor %}\n """ [git] fail_on_unmatched_commit = true # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", skip = true }, { message = "Initial commit", skip = true }, ] # Prevent commits that are breaking from being excluded by commit parsers. protect_breaking_commits = true ================================================ FILE: .github/fixtures/test-fail-on-unmatched-commit/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "invalid: text text" GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui)!: add feature 2" GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui)!: fix feature 2" git tag v0.1.0 ================================================ FILE: .github/fixtures/test-fail-on-unmatched-commit/expected.rc ================================================ 1 ================================================ FILE: .github/fixtures/test-fixtures-locally.sh ================================================ #!/usr/bin/env bash set -e SCRIPT_DIR=$(readlink -f "$(dirname "$0")") if [ -z "$1" ]; then echo "Please input a fixture name." exit 1 fi export FIXTURES_DIR="$SCRIPT_DIR/$1" # Set up a temporary repository cd "$(mktemp -d)" git init >&2 # Commit "$FIXTURES_DIR/commit.sh" # Check if we are running on Windows with MINGW64 and if cygpath is available if [ -n "$MSYSTEM" ] && [ "$MSYSTEM" = "MINGW64" ]; then echo "Running inside MINGW64 trying to convert paths to Windows format." if command -v cygpath > /dev/null 2>&1; then # Convert the path to Windows format SCRIPT_DIR=$(cygpath -w "$SCRIPT_DIR") FIXTURES_DIR=$(cygpath -w "$FIXTURES_DIR") else echo "WARNING: cygpath command not found in the PATH. The script may not work correctly on Windows." exit 1 fi fi # Show results echo -e "\n---Run git-cliff---" >&2 cargo run --manifest-path "$SCRIPT_DIR/../../Cargo.toml" -- -vv --config "$FIXTURES_DIR/cliff.toml" "${@:2}" -o "$FIXTURES_DIR/output.md" sed -i "s/2022-04-05/2022-04-06/g" "$FIXTURES_DIR/output.md" diff --strip-trailing-cr "$FIXTURES_DIR/output.md" "$FIXTURES_DIR/expected.md" ================================================ FILE: .github/fixtures/test-footer-filter/cliff.toml ================================================ [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # regex for parsing and grouping commits commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, # Accept both separators, ": " and ":". # Conventional commits require the separator to be ": ", but the reference implementation of the # conventional commits parser currently does not adhere to the specification. See also: # https://github.com/conventional-commits/parser/issues/47 { footer = "^changelog: ?ignore", skip = true }, ] ================================================ FILE: .github/fixtures/test-footer-filter/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 00:00:00" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 00:10:00" git commit --allow-empty -m "feat: add feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2022-04-06 01:00:00" git commit --allow-empty -m "refactor: change feature 1" -m "BREAKING CHANGE: feature 1 is now different" GIT_COMMITTER_DATE="2022-04-06 01:10:00" git commit --allow-empty -m "chore: upgrade dependencies" -m "changelog: ignore" git tag v0.2.0 GIT_COMMITTER_DATE="2022-04-06 02:00:00" git commit --allow-empty -m "test: add tests" -m "footer: some more info" GIT_COMMITTER_DATE="2022-04-06 02:10:00" git commit --allow-empty -m "test: add more tests" -m "changelog: ignore" ================================================ FILE: .github/fixtures/test-footer-filter/expected.md ================================================ ## [unreleased] ### Test - Add tests ## [0.2.0] - 2022-04-06 ### Refactor - Change feature 1 ## [0.1.0] - 2022-04-06 ### Features - Add feature 1 ================================================ FILE: .github/fixtures/test-footer-template/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ # A Tera template to be rendered as the changelog's footer. # See https://keats.github.io/tera/docs/#introduction footer = """ {% for release in releases %}\ {% if release.version %}\ {% if release.previous.version %}\ {% endif %}\ {% else %}\ {% endif %}\ {% endfor %}\ """ ================================================ FILE: .github/fixtures/test-footer-template/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 1" GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2" git tag v0.2.0 GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "feat: add footer" git tag v3.0.0 GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "test: footer" GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "perf: footer" ================================================ FILE: .github/fixtures/test-footer-template/expected.md ================================================ ## [unreleased] ### ⚡ Performance - Footer ### 🧪 Testing - Footer ## [3.0.0] ### 🚀 Features - Add footer ## [0.2.0] ### 🐛 Bug Fixes - Fix feature 1 - Fix feature 2 ## [0.1.0] ### 🚀 Features - Add feature 1 - Add feature 2 ================================================ FILE: .github/fixtures/test-from-context/cliff.toml ================================================ [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}{% if extra.note %} - {{ extra.note }}{% endif %} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}{% if commit.extra.note %} ({{ commit.extra.note }}){% endif %}\ {% endfor %} {% endfor %}\n """ [git] # regex for parsing and grouping commits commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] ================================================ FILE: .github/fixtures/test-from-context/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2" GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2 SHOULD NOT BE IN THE CHANGELOG" git tag v0.2.0 GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests" ================================================ FILE: .github/fixtures/test-from-context/context.json ================================================ [ { "version": null, "message": null, "commits": [ { "id": "c7541276668616c136d12a9ccd87087314d66fb6", "message": "add tests", "body": null, "footers": [], "group": "test", "breaking_description": null, "breaking": false, "scope": null, "links": [], "author": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1723730666 }, "committer": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1649201113 }, "conventional": true, "merge_commit": false, "github": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitlab": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitea": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "bitbucket": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "azure_devops": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false } } ], "commit_id": null, "timestamp": 0, "previous": { "version": "v0.2.0", "message": null, "commits": [ { "id": "ce8cecc9834e5cbdb5b4e79c8260cace3c0dd949", "message": "feat(gui): add feature 2\n", "group": null, "scope": null, "links": [], "author": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1723730666 }, "committer": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1649201111 }, "conventional": false, "merge_commit": false, "github": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitlab": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitea": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "bitbucket": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "azure_devops": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false } }, { "id": "5061081d6272b1da2146fab49d803c193db309d9", "message": "fix(gui): fix feature 2\n", "group": null, "scope": null, "links": [], "author": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1723730666 }, "committer": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1649201112 }, "conventional": false, "merge_commit": false, "github": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitlab": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitea": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "bitbucket": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "azure_devops": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false } } ], "commit_id": "5061081d6272b1da2146fab49d803c193db309d9", "timestamp": 1649201112, "previous": null, "repository": "/home/johndoe/repo/", "commit_range": null, "submodule_commits": {}, "github": { "contributors": [] }, "gitlab": { "contributors": [] }, "gitea": { "contributors": [] }, "bitbucket": { "contributors": [] }, "azure_devops": { "contributors": [] } }, "repository": "/home/johndoe/repo/", "commit_range": null, "submodule_commits": {}, "github": { "contributors": [] }, "gitlab": { "contributors": [] }, "gitea": { "contributors": [] }, "bitbucket": { "contributors": [] }, "azure_devops": { "contributors": [] } }, { "version": "v0.2.0", "message": null, "commits": [ { "id": "ce8cecc9834e5cbdb5b4e79c8260cace3c0dd949", "message": "add feature 2", "body": null, "footers": [], "group": "Features", "breaking_description": null, "breaking": false, "scope": "gui", "links": [], "author": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1723730666 }, "committer": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1649201111 }, "conventional": true, "merge_commit": false, "github": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitlab": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitea": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "bitbucket": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "azure_devops": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false } }, { "id": "5061081d6272b1da2146fab49d803c193db309d9", "message": "fix feature 2", "body": null, "footers": [], "group": "Bug Fixes", "breaking_description": null, "breaking": false, "scope": "cli", "links": [], "author": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1723730666 }, "committer": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1649201112 }, "conventional": true, "merge_commit": false, "extra": { "note": "that was a tough one" }, "github": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitlab": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitea": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "bitbucket": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "azure_devops": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false } } ], "commit_id": "5061081d6272b1da2146fab49d803c193db309d9", "timestamp": 1649201112, "previous": { "version": "v0.1.0", "message": null, "commits": [ { "id": "c6ba7fe73c3b639ff2f934f3f98e5f50350ab463", "message": "Initial commit\n", "group": null, "scope": null, "links": [], "author": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1723730666 }, "committer": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1649201108 }, "conventional": false, "merge_commit": false, "github": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitlab": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitea": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "bitbucket": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "azure_devops": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false } }, { "id": "9c10e506bf103998e303d8164c7b4a1a841e2471", "message": "feat: add feature 1\n", "group": null, "scope": null, "links": [], "author": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1723730666 }, "committer": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1649201109 }, "conventional": false, "merge_commit": false, "github": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitlab": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitea": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "bitbucket": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "azure_devops": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false } }, { "id": "98b1464c2f99a0c6812ce6d3ea4a5b953dd35fe2", "message": "fix: fix feature 1\n", "group": null, "scope": null, "links": [], "author": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1723730666 }, "committer": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1649201110 }, "conventional": false, "merge_commit": false, "github": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitlab": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitea": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "bitbucket": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "azure_devops": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false } } ], "commit_id": "98b1464c2f99a0c6812ce6d3ea4a5b953dd35fe2", "timestamp": 1649201110, "previous": null, "repository": "/home/johndoe/repo/", "commit_range": null, "submodule_commits": {}, "github": { "contributors": [] }, "gitlab": { "contributors": [] }, "gitea": { "contributors": [] }, "bitbucket": { "contributors": [] }, "azure_devops": { "contributors": [] } }, "extra": { "note": "This is so awesome!" }, "repository": "/home/johndoe/repo/", "commit_range": null, "submodule_commits": {}, "github": { "contributors": [] }, "gitlab": { "contributors": [] }, "gitea": { "contributors": [] }, "bitbucket": { "contributors": [] }, "azure_devops": { "contributors": [] } }, { "version": "v0.1.0", "message": null, "commits": [ { "id": "9c10e506bf103998e303d8164c7b4a1a841e2471", "message": "add feature 1", "body": null, "footers": [], "group": "Features", "breaking_description": null, "breaking": false, "scope": "app", "links": [], "author": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1723730666 }, "committer": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1649201109 }, "conventional": true, "merge_commit": false, "github": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitlab": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitea": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "bitbucket": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "azure_devops": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false } }, { "id": "98b1464c2f99a0c6812ce6d3ea4a5b953dd35fe2", "message": "fix feature 1", "body": null, "footers": [], "group": "Bug Fixes", "breaking_description": null, "breaking": false, "scope": "cli", "links": [], "author": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1723730666 }, "committer": { "name": "John Doe", "email": "john@doe.com", "timestamp": 1649201110 }, "conventional": true, "merge_commit": false, "github": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitlab": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitea": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "bitbucket": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "azure_devops": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false } } ], "commit_id": "98b1464c2f99a0c6812ce6d3ea4a5b953dd35fe2", "timestamp": 1649201110, "previous": { "version": null, "message": null, "commits": [], "commit_id": null, "timestamp": 0, "previous": null, "repository": null, "commit_range": null, "submodule_commits": {}, "github": { "contributors": [] }, "gitlab": { "contributors": [] }, "gitea": { "contributors": [] }, "bitbucket": { "contributors": [] }, "azure_devops": { "contributors": [] } }, "repository": "/home/johndoe/repo/", "commit_range": null, "submodule_commits": {}, "github": { "contributors": [] }, "gitlab": { "contributors": [] }, "gitea": { "contributors": [] }, "bitbucket": { "contributors": [] }, "azure_devops": { "contributors": [] } } ] ================================================ FILE: .github/fixtures/test-from-context/expected.md ================================================ ## [unreleased] ### Test - Add tests ## [0.2.0] - 2022-04-05 - This is so awesome! ### Bug Fixes - Fix feature 2 (that was a tough one) ### Features - Add feature 2 ## [0.1.0] - 2022-04-05 ### Bug Fixes - Fix feature 1 ### Features - Add feature 1 ================================================ FILE: .github/fixtures/test-from-context-does-not-discard-fields/cliff.toml ================================================ [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% for group, commits in commits | group_by(attribute="group") %} ## {{ group | striptags | trim | upper_first }} {% for commit in commits %} {% if commit.scope %}*({{ commit.scope }})* {% endif %}\ {% if commit.breaking %}[**breaking**]: {{ commit.breaking_description }}{% endif %} {{ commit.message }}: {{ commit.body }}\ {% for footer in commit.footers %} - {{ footer.token }}{{ footer.separator }} {{ footer.value }}\ {% endfor %} {% endfor %}\ {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix" }, ] ================================================ FILE: .github/fixtures/test-from-context-does-not-discard-fields/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m \ "feat(web): feature 1, breaking change in footer Body feature 1 BREAKING CHANGE: breaking change description feature 1 Signed-off-by: user1 Reviewed-by: user2 " GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m \ "feat(web)!: feature 2, breaking chain in description Body feature 2 Signed-off-by: user3 " GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m \ "feat!: feature 3, use default scope = app Body feature 2 Signed-off-by: user3 " GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m \ "fix(scope): fix 1, use scope as group Body fix 1 Fix: #1 " GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m \ "fix(front-end): fix 2, no footer Body fix 2 " GIT_COMMITTER_DATE="2022-04-06 01:25:14" git commit --allow-empty -m \ "fix(front-end): fix 3 and 4, no body but footer Fix: #3 Fix: #4 " git tag v0.1.0 ================================================ FILE: .github/fixtures/test-from-context-does-not-discard-fields/context.json ================================================ [ { "version": "v0.1.0", "message": null, "commits": [ { "id": "ab06a042344dbd1c4af974ef393049b44ad0ae28", "message": "feature 1, breaking change in footer", "body": "Body feature 1", "footers": [ { "token": "BREAKING CHANGE", "separator": ":", "value": "breaking change description feature 1", "breaking": true }, { "token": "Signed-off-by", "separator": ":", "value": "user1 ", "breaking": false }, { "token": "Reviewed-by", "separator": ":", "value": "user2", "breaking": false } ], "group": "Features", "breaking_description": "breaking change description feature 1", "breaking": true, "scope": "web", "links": [], "author": { "name": "github-actions[bot]", "email": "github-actions[bot]@users.noreply.github.com", "timestamp": 1728938297 }, "committer": { "name": "github-actions[bot]", "email": "github-actions[bot]@users.noreply.github.com", "timestamp": 1649175909 }, "conventional": true, "merge_commit": false, "extra": null, "github": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitlab": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitea": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "bitbucket": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "azure_devops": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "raw_message": "feat(web): feature 1, breaking change in footer\n\nBody feature 1\n\nBREAKING CHANGE: breaking change description feature 1\nSigned-off-by: user1 \nReviewed-by: user2" }, { "id": "a87599e6ecaf05e80ac4d87edd9a852fd8cad189", "message": "feature 2, breaking chain in description", "body": "Body feature 2", "footers": [ { "token": "Signed-off-by", "separator": ":", "value": "user3 ", "breaking": false } ], "group": "Features", "breaking_description": "feature 2, breaking chain in description", "breaking": true, "scope": "web", "links": [], "author": { "name": "github-actions[bot]", "email": "github-actions[bot]@users.noreply.github.com", "timestamp": 1728938297 }, "committer": { "name": "github-actions[bot]", "email": "github-actions[bot]@users.noreply.github.com", "timestamp": 1649175910 }, "conventional": true, "merge_commit": false, "extra": null, "github": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitlab": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitea": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "bitbucket": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "azure_devops": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "raw_message": "feat(web)!: feature 2, breaking chain in description\n\nBody feature 2\n\nSigned-off-by: user3 " }, { "id": "9d83e631a1c57eec825f724283041662edd9230b", "message": "feature 3, use default scope = app", "body": "Body feature 2", "footers": [ { "token": "Signed-off-by", "separator": ":", "value": "user3 ", "breaking": false } ], "group": "Features", "breaking_description": "feature 3, use default scope = app", "breaking": true, "scope": "app", "links": [], "author": { "name": "github-actions[bot]", "email": "github-actions[bot]@users.noreply.github.com", "timestamp": 1728938297 }, "committer": { "name": "github-actions[bot]", "email": "github-actions[bot]@users.noreply.github.com", "timestamp": 1649175911 }, "conventional": true, "merge_commit": false, "extra": null, "github": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitlab": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitea": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "bitbucket": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "azure_devops": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "raw_message": "feat!: feature 3, use default scope = app\n\nBody feature 2\n\nSigned-off-by: user3 " }, { "id": "3bb5b6f741fd40cc71f09d3c6a339e4b5d0843cc", "message": "fix 1, use scope as group", "body": "Body fix 1", "footers": [ { "token": "Fix", "separator": ":", "value": "#1", "breaking": false } ], "group": "fix", "breaking_description": null, "breaking": false, "scope": "scope", "links": [], "author": { "name": "github-actions[bot]", "email": "github-actions[bot]@users.noreply.github.com", "timestamp": 1728938297 }, "committer": { "name": "github-actions[bot]", "email": "github-actions[bot]@users.noreply.github.com", "timestamp": 1649175912 }, "conventional": true, "merge_commit": false, "extra": null, "github": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitlab": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitea": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "bitbucket": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "azure_devops": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "raw_message": "fix(scope): fix 1, use scope as group\n\nBody fix 1\n\nFix: #1" }, { "id": "856472f0e5b238278fe331dcc151a96982c5bbad", "message": "fix 2, no footer", "body": "Body fix 2", "footers": [], "group": "fix", "breaking_description": null, "breaking": false, "scope": "front-end", "links": [], "author": { "name": "github-actions[bot]", "email": "github-actions[bot]@users.noreply.github.com", "timestamp": 1728938297 }, "committer": { "name": "github-actions[bot]", "email": "github-actions[bot]@users.noreply.github.com", "timestamp": 1649175913 }, "conventional": true, "merge_commit": false, "extra": null, "github": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitlab": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitea": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "bitbucket": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "azure_devops": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "raw_message": "fix(front-end): fix 2, no footer\n\nBody fix 2" }, { "id": "6e7a2b8e670a348ccfbae696fd850d8769c54360", "message": "fix 3 and 4, no body but footer", "body": null, "footers": [ { "token": "Fix", "separator": ":", "value": "#3", "breaking": false }, { "token": "Fix", "separator": ":", "value": "#4", "breaking": false } ], "group": "fix", "breaking_description": null, "breaking": false, "scope": "front-end", "links": [], "author": { "name": "github-actions[bot]", "email": "github-actions[bot]@users.noreply.github.com", "timestamp": 1728938297 }, "committer": { "name": "github-actions[bot]", "email": "github-actions[bot]@users.noreply.github.com", "timestamp": 1649175914 }, "conventional": true, "merge_commit": false, "extra": null, "github": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitlab": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "gitea": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "bitbucket": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "azure_devops": { "username": null, "pr_title": null, "pr_number": null, "pr_labels": [], "is_first_time": false }, "raw_message": "fix(front-end): fix 3 and 4, no body but footer\n\nFix: #3\nFix: #4" } ], "commit_id": "6e7a2b8e670a348ccfbae696fd850d8769c54360", "timestamp": 1649175914, "previous": { "version": null, "message": null, "commits": [], "commit_id": null, "timestamp": 0, "previous": null, "repository": null, "commit_range": null, "submodule_commits": {}, "extra": null, "github": { "contributors": [] }, "gitlab": { "contributors": [] }, "gitea": { "contributors": [] }, "bitbucket": { "contributors": [] }, "azure_devops": { "contributors": [] } }, "repository": "/path/to/repository", "commit_range": null, "submodule_commits": {}, "extra": null, "github": { "contributors": [] }, "gitlab": { "contributors": [] }, "gitea": { "contributors": [] }, "bitbucket": { "contributors": [] }, "azure_devops": { "contributors": [] } } ] ================================================ FILE: .github/fixtures/test-from-context-does-not-discard-fields/expected.md ================================================ ## Features *(web)* [**breaking**]: breaking change description feature 1 feature 1, breaking change in footer: Body feature 1 - BREAKING CHANGE: breaking change description feature 1 - Signed-off-by: user1 - Reviewed-by: user2 *(web)* [**breaking**]: feature 2, breaking chain in description feature 2, breaking chain in description: Body feature 2 - Signed-off-by: user3 *(app)* [**breaking**]: feature 3, use default scope = app feature 3, use default scope = app: Body feature 2 - Signed-off-by: user3 ## Fix *(scope)* fix 1, use scope as group: Body fix 1 - Fix: #1 *(front-end)* fix 2, no footer: Body fix 2 *(front-end)* fix 3 and 4, no body but footer: - Fix: #3 - Fix: #4 ================================================ FILE: .github/fixtures/test-gitea-integration/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration # Gitea integration for fetching commit metadata. [remote.gitea] owner = "ThetaDev" repo = "git-cliff-readme-example" [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ ## What's Changed {%- if version %} in {{ version }}{%- endif -%} {% for commit in commits %} * {{ commit.message | split(pat="\n") | first | trim }}\ {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%} {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %} {%- endfor -%} {% if gitea.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} {% raw %}\n{% endraw -%} ### New Contributors {%- endif %}\ {% for contributor in gitea.contributors | filter(attribute="is_first_time", value=true) %} * @{{ contributor.username }} made their first contribution {%- if contributor.pr_number %} in \ [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ {%- endif %} {%- endfor -%} {% raw %}\n\n{% endraw -%} """ [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = false # Exclude commits that do not match the conventional commits specification. filter_unconventional = true # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [ # Remove issue numbers. { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, ] ================================================ FILE: .github/fixtures/test-gitea-integration/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://codeberg.org/ThetaDev/git-cliff-readme-example.git git pull origin master git fetch --tags ================================================ FILE: .github/fixtures/test-gitea-integration/expected.md ================================================ ## What's Changed * Initial commit by @ThetaDev * docs(project): add README.md by @ThetaDev * feat(parser): add ability to parse arrays by @ThetaDev * fix(args): rename help argument due to conflict by @ThetaDev * docs(example)!: add tested usage example by @ThetaDev * refactor(parser): expose string functions by @ThetaDev * chore(release): add release script by @ThetaDev * feat(config): support multiple file formats by @ThetaDev * feat(cache): use cache while fetching pages by @ThetaDev ### New Contributors * @ThetaDev made their first contribution ================================================ FILE: .github/fixtures/test-gitea-integration-custom-range/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration # Gitea integration for fetching commit metadata. [remote.gitea] owner = "ThetaDev" repo = "git-cliff-readme-example" [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ ## What's Changed {%- if version %} in {{ version }}{%- endif -%} {% for commit in commits %} * {{ commit.message | split(pat="\n") | first | trim }}\ {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%} {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %} {%- endfor -%} {% if gitea.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} {% raw %}\n{% endraw -%} ### New Contributors {%- endif %}\ {% for contributor in gitea.contributors | filter(attribute="is_first_time", value=true) %} * @{{ contributor.username }} made their first contribution {%- if contributor.pr_number %} in \ [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ {%- endif %} {%- endfor -%} {% raw %}\n\n{% endraw -%} """ [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = false # Exclude commits that do not match the conventional commits specification. filter_unconventional = true # Split commits on newlines, treating each line as an individual commit. split_commits = false # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [ # Remove issue numbers. { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, ] ================================================ FILE: .github/fixtures/test-gitea-integration-custom-range/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://codeberg.org/ThetaDev/git-cliff-readme-example.git git pull origin master git fetch --tags ================================================ FILE: .github/fixtures/test-gitea-integration-custom-range/expected.md ================================================ ## What's Changed * feat(config): support multiple file formats by @ThetaDev * feat(cache): use cache while fetching pages by @ThetaDev ================================================ FILE: .github/fixtures/test-github-integration/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration # GitHub integration for fetching commit metadata. [remote.github] owner = "orhun" repo = "git-cliff-readme-example" [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ ## What's Changed {%- if version %} in {{ version }}{%- endif -%} {% for commit in commits %} * {{ commit.message | split(pat="\n") | first | trim }}\ {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%} {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %} {%- endfor -%} {% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} {% raw %}\n{% endraw -%} ### New Contributors {%- endif %}\ {% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} * @{{ contributor.username }} made their first contribution {%- if contributor.pr_number %} in \ [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ {%- endif %} {%- endfor -%} {% if version %} {% if previous.version %} **Full Changelog**: https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}/compare/{{ previous.version }}...{{ version }} {% endif %} {% else -%} {% raw %}\n{% endraw %} {% endif %} """ [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = false # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [ # Remove issue numbers. { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, ] ================================================ FILE: .github/fixtures/test-github-integration/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://github.com/orhun/git-cliff-readme-example git pull origin master git fetch --tags ================================================ FILE: .github/fixtures/test-github-integration/expected.md ================================================ ## What's Changed * feat(config): support multiple file formats by @orhun * feat(cache): use cache while fetching pages by @orhun ## What's Changed in v1.0.1 * refactor(parser): expose string functions by @orhun * chore(release): add release script by @orhun **Full Changelog**: https://github.com/orhun/git-cliff-readme-example/compare/v1.0.0...v1.0.1 ## What's Changed in v1.0.0 * Initial commit by @orhun * docs(project): add README.md by @orhun * feat(parser): add ability to parse arrays by @orhun * fix(args): rename help argument due to conflict by @orhun * docs(example)!: add tested usage example by @orhun ### New Contributors * @orhun made their first contribution ================================================ FILE: .github/fixtures/test-github-integration-custom-range/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration # GitHub integration for fetching commit metadata. [remote.github] owner = "orhun" repo = "git-cliff-readme-example" [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ ## What's Changed {%- if version %} in {{ version }}{%- endif -%} {% for commit in commits %} * {{ commit.message | split(pat="\n") | first | trim }}\ {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%} {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %} {%- endfor -%} {% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} {% raw %}\n{% endraw -%} ### New Contributors {%- endif %}\ {% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} * @{{ contributor.username }} made their first contribution {%- if contributor.pr_number %} in \ [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ {%- endif %} {%- endfor -%} {% if version %} {% if previous.version %} **Full Changelog**: https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}/compare/{{ previous.version }}...{{ version }} {% endif %} {% else -%} {% raw %}\n{% endraw %} {% endif %} """ [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = false # Exclude commits that do not match the conventional commits specification. filter_unconventional = true # Split commits on newlines, treating each line as an individual commit. split_commits = false # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [ # Remove issue numbers. { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, ] ================================================ FILE: .github/fixtures/test-github-integration-custom-range/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://github.com/orhun/git-cliff-readme-example git pull origin master git fetch --tags ================================================ FILE: .github/fixtures/test-github-integration-custom-range/expected.md ================================================ ## What's Changed in v1.0.1 * refactor(parser): expose string functions by @orhun * chore(release): add release script by @orhun **Full Changelog**: https://github.com/orhun/git-cliff-readme-example/compare/v1.0.0...v1.0.1 ================================================ FILE: .github/fixtures/test-gitlab-integration/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration # GitLab integration for fetching commit metadata. [remote.gitlab] owner = "dark0dave" repo = "dotfiles" [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ ## What's Changed {%- if version %} in {{ version }}{%- endif -%} {% for commit in commits %} * {{ commit.message | split(pat="\n") | first | trim }}\ {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%} {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %} {%- endfor -%} {% if gitlab.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} {% raw %}\n{% endraw -%} ### New Contributors {%- endif %}\ {% for contributor in gitlab.contributors | filter(attribute="is_first_time", value=true) %} * @{{ contributor.username }} made their first contribution {%- if contributor.pr_number %} in \ [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ {%- endif %} {%- endfor -%} {% if version %} {% if previous.version %} **Full Changelog**: https://gitlab.com/{{ remote.gitlab.owner }}/{{ remote.gitlab.repo }}/compare/{{ previous.version }}...{{ version }} {% endif %} {% else -%} {% raw %}\n{% endraw %} {% endif %} """ [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = false # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [ # Remove issue numbers. { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, ] ================================================ FILE: .github/fixtures/test-gitlab-integration/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://gitlab.com/dark0dave/dotfiles git fetch git checkout 3c048a1b6a32e6d1076581225b06dd41ee5a02ff ================================================ FILE: .github/fixtures/test-gitlab-integration/expected.md ================================================ ## What's Changed * Initial commit by @dark0dave * Added tmux files by @dark0dave * Updated readme by @dark0dave * Updated readme and added zshrc files by @dark0dave * Added python files by @dark0dave * Added curl files by @dark0dave * Zsh update by @dark0dave * Update README.md by @dark0dave * Fix for path by @dark0dave * Update README.md by @dark0dave * Started setup files by @dark0dave * Updated tmux to be a little nicer by @dark0dave * Merge branch 'feature/tmux-improvements' into 'master' by @dark0dave in #2 ================================================ FILE: .github/fixtures/test-gitlab-integration-custom-range/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration # GitLab integration for fetching commit metadata. [remote.gitlab] owner = "dark0dave" repo = "dotfiles" [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ ## What's Changed {%- if version %} in {{ version }}{%- endif -%} {% for commit in commits %} * {{ commit.message | split(pat="\n") | first | trim }}\ {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%} {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %} {%- endfor -%} {% if gitlab.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} {% raw %}\n{% endraw -%} ### New Contributors {%- endif %}\ {% for contributor in gitlab.contributors | filter(attribute="is_first_time", value=true) %} * @{{ contributor.username }} made their first contribution {%- if contributor.pr_number %} in \ [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ {%- endif %} {%- endfor -%} {% if version %} {% if previous.version %} **Full Changelog**: https://gitlab.com/{{ remote.gitlab.owner }}/{{ remote.gitlab.repo }}/compare/{{ previous.version }}...{{ version }} {% endif %} {% else -%} {% raw %}\n{% endraw %} {% endif %} """ [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = false # Exclude commits that do not match the conventional commits specification. filter_unconventional = true # Split commits on newlines, treating each line as an individual commit. split_commits = false # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [ # Remove issue numbers. { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, ] ================================================ FILE: .github/fixtures/test-gitlab-integration-custom-range/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://gitlab.com/dark0dave/dotfiles git fetch git checkout 3c048a1b6a32e6d1076581225b06dd41ee5a02ff ================================================ FILE: .github/fixtures/test-gitlab-integration-custom-range/expected.md ================================================ ## What's Changed * Added curl files by @dark0dave * Zsh update by @dark0dave * Update README.md by @dark0dave * Fix for path by @dark0dave * Update README.md by @dark0dave ================================================ FILE: .github/fixtures/test-header-template/cliff.toml ================================================ [changelog] # template for the changelog footer header = """ # Changelog {% for release in releases %}\ {% if release.version %}\ {% if release.previous.version %}\ {% endif %}\ {% else %}\ {% endif %}\ {% endfor %}\ """ # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ ================================================ FILE: .github/fixtures/test-header-template/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 1" GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2" git tag v0.2.0 GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "feat: add footer" git tag v3.0.0 GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "test: footer" GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "perf: footer" ================================================ FILE: .github/fixtures/test-header-template/expected.md ================================================ # Changelog ## [unreleased] ### Perf - Footer ### Test - Footer ## [3.0.0] ### Feat - Add footer ## [0.2.0] ### Fix - Fix feature 1 - Fix feature 2 ## [0.1.0] ### Feat - Add feature 1 - Add feature 2 ================================================ FILE: .github/fixtures/test-ignore-tags/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # Regex to select git tags that do not represent proper releases. # Takes precedence over `tag_pattern`. # Changes belonging to these releases will be included in the next release. skip_tags = "v0.1.0-beta.1" # Regex to exclude git tags after applying the tag_pattern. ignore_tags = "v.*-beta.*" ================================================ FILE: .github/fixtures/test-ignore-tags/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add skip feature" git tag v0.1.0-beta.1 GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "feat: fix feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:48" git commit --allow-empty -m "feat: add feature 2" git tag v0.2.0-beta.1 GIT_COMMITTER_DATE="2021-01-23 01:23:49" git commit --allow-empty -m "feat: add feature 3" git tag v0.2.0 ================================================ FILE: .github/fixtures/test-ignore-tags/expected.md ================================================ ## [0.2.0] - 2021-01-23 ### 🚀 Features - Add feature 2 - Add feature 3 ## [0.1.0] - 2021-01-23 ### 🚀 Features - Add feature 1 - Fix feature 1 ================================================ FILE: .github/fixtures/test-invert-ignore-tags/cliff.toml ================================================ [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # regex for skipping tags skip_tags = "v0.1.0-beta.1" # regex for ignoring tags ignore_tags = "v.*-beta.*" count_tags = "v0.2.0" ================================================ FILE: .github/fixtures/test-invert-ignore-tags/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add skip feature" git tag v0.1.0-beta.1 GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "feat: fix feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:48" git commit --allow-empty -m "feat: add feature 2" git tag v0.2.0-beta.1 GIT_COMMITTER_DATE="2021-01-23 01:23:49" git commit --allow-empty -m "feat: add feature 3" git tag v0.2.0 ================================================ FILE: .github/fixtures/test-invert-ignore-tags/expected.md ================================================ ## [0.2.0] - 2021-01-23 ### 🚀 Features - Add feature 1 - Fix feature 1 - Add feature 2 - Add feature 3 ================================================ FILE: .github/fixtures/test-keep-a-changelog-links/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ {% if previous %}\ {% if previous.version %}\ ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/compare/{{ previous.version }}...{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% endif %}\ {% endif %}\ {% else %}\ {% if previous %}\ {% if previous.version %}\ ## [Unreleased](https://github.com/dummy/dummy/compare/{{ previous.version }}...HEAD) {% else %}\ ## [Unreleased] {% endif %}\ {% else %}\ ## [Unreleased] {% endif %}\ {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^.*: add", group = "Added" }, { message = "^.*: support", group = "Added" }, { message = "^.*: remove", group = "Removed" }, { message = "^.*: delete", group = "Removed" }, { message = "^test", group = "Fixed" }, { message = "^fix", group = "Fixed" }, { message = "^.*: fix", group = "Fixed" }, { message = "^.*", group = "Changed" }, ] # Exclude commits that are not matched by any commit parser. filter_commits = true # Regex to select git tags that represent releases. tag_pattern = "v[0-9]*" # Regex to select git tags that do not represent proper releases. # Takes precedence over `tag_pattern`. # Changes belonging to these releases will be included in the next release. skip_tags = "v0.1.0-beta.1" ================================================ FILE: .github/fixtures/test-keep-a-changelog-links/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-24 01:23:46" git commit --allow-empty -m "feat: add feature 2" git tag v0.2.0 GIT_COMMITTER_DATE="2021-01-25 01:23:47" git commit --allow-empty -m "fix: fix feature 1" ================================================ FILE: .github/fixtures/test-keep-a-changelog-links/expected.md ================================================ # Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased](https://github.com/dummy/dummy/compare/v0.2.0...HEAD) ### Fixed - Fix feature 1 ## [0.2.0](https://github.com/dummy/dummy/compare/v0.1.0...v0.2.0) - 2021-01-24 ### Added - Add feature 2 ## [0.1.0](https://github.com/dummy/dummy/releases/tag/v0.1.0) - 2021-01-23 ### Added - Add feature 1 ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-current-arg/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ {% if previous %}\ {% if previous.version %}\ ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/compare/{{ previous.version }}...{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% endif %}\ {% endif %}\ {% else %}\ {% if previous %}\ {% if previous.version %}\ ## [Unreleased](https://github.com/dummy/dummy/compare/{{ previous.version }}...HEAD) {% else %}\ ## [Unreleased] {% endif %}\ {% else %}\ ## [Unreleased] {% endif %}\ {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^.*: add", group = "Added" }, { message = "^.*: support", group = "Added" }, { message = "^.*: remove", group = "Removed" }, { message = "^.*: delete", group = "Removed" }, { message = "^test", group = "Fixed" }, { message = "^fix", group = "Fixed" }, { message = "^.*: fix", group = "Fixed" }, { message = "^.*", group = "Changed" }, ] # Exclude commits that are not matched by any commit parser. filter_commits = true # Regex to select git tags that represent releases. tag_pattern = "v[0-9]*" # Regex to select git tags that do not represent proper releases. # Takes precedence over `tag_pattern`. # Changes belonging to these releases will be included in the next release. skip_tags = "v0.1.0-beta.1" ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-current-arg/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-24 01:23:46" git commit --allow-empty -m "feat: add feature 2" git tag v0.2.0 ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-current-arg/expected.md ================================================ # Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [0.2.0](https://github.com/dummy/dummy/compare/v0.1.0...v0.2.0) - 2021-01-24 ### Added - Add feature 2 ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-latest-arg/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ {% if previous %}\ {% if previous.version %}\ ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/compare/{{ previous.version }}...{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% endif %}\ {% endif %}\ {% else %}\ {% if previous %}\ {% if previous.version %}\ ## [Unreleased](https://github.com/dummy/dummy/compare/{{ previous.version }}...HEAD) {% else %}\ ## [Unreleased] {% endif %}\ {% else %}\ ## [Unreleased] {% endif %}\ {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^.*: add", group = "Added" }, { message = "^.*: support", group = "Added" }, { message = "^.*: remove", group = "Removed" }, { message = "^.*: delete", group = "Removed" }, { message = "^test", group = "Fixed" }, { message = "^fix", group = "Fixed" }, { message = "^.*: fix", group = "Fixed" }, { message = "^.*", group = "Changed" }, ] # Exclude commits that are not matched by any commit parser. filter_commits = true # Regex to select git tags that represent releases. tag_pattern = "v[0-9]*" # Regex to select git tags that do not represent proper releases. # Takes precedence over `tag_pattern`. # Changes belonging to these releases will be included in the next release. skip_tags = "v0.1.0-beta.1" ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-latest-arg/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-24 01:23:46" git commit --allow-empty -m "feat: add feature 2" git tag v0.2.0 GIT_COMMITTER_DATE="2021-01-25 01:23:47" git commit --allow-empty -m "fix: fix feature 1" ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-latest-arg/expected.md ================================================ # Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [0.2.0](https://github.com/dummy/dummy/compare/v0.1.0...v0.2.0) - 2021-01-24 ### Added - Add feature 2 ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-no-tags/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ {% if previous %}\ {% if previous.version %}\ ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/compare/{{ previous.version }}...{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% endif %}\ {% endif %}\ {% else %}\ {% if previous %}\ {% if previous.version %}\ ## [Unreleased](https://github.com/dummy/dummy/compare/{{ previous.version }}...HEAD) {% else %}\ ## [Unreleased] {% endif %}\ {% else %}\ ## [Unreleased] {% endif %}\ {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^.*: add", group = "Added" }, { message = "^.*: support", group = "Added" }, { message = "^.*: remove", group = "Removed" }, { message = "^.*: delete", group = "Removed" }, { message = "^test", group = "Fixed" }, { message = "^fix", group = "Fixed" }, { message = "^.*: fix", group = "Fixed" }, { message = "^.*", group = "Changed" }, ] # Exclude commits that are not matched by any commit parser. filter_commits = true # Regex to select git tags that represent releases. tag_pattern = "v[0-9]*" # Regex to select git tags that do not represent proper releases. # Takes precedence over `tag_pattern`. # Changes belonging to these releases will be included in the next release. skip_tags = "v0.1.0-beta.1" ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-no-tags/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2021-01-24 01:23:46" git commit --allow-empty -m "feat: add feature 2" GIT_COMMITTER_DATE="2021-01-25 01:23:47" git commit --allow-empty -m "fix: fix feature 1" ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-no-tags/expected.md ================================================ # Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ### Added - Add feature 1 - Add feature 2 ### Fixed - Fix feature 1 ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-one-tag/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ {% if previous %}\ {% if previous.version %}\ ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/compare/{{ previous.version }}...{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% endif %}\ {% endif %}\ {% else %}\ {% if previous %}\ {% if previous.version %}\ ## [Unreleased](https://github.com/dummy/dummy/compare/{{ previous.version }}...HEAD) {% else %}\ ## [Unreleased] {% endif %}\ {% else %}\ ## [Unreleased] {% endif %}\ {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^.*: add", group = "Added" }, { message = "^.*: support", group = "Added" }, { message = "^.*: remove", group = "Removed" }, { message = "^.*: delete", group = "Removed" }, { message = "^test", group = "Fixed" }, { message = "^fix", group = "Fixed" }, { message = "^.*: fix", group = "Fixed" }, { message = "^.*", group = "Changed" }, ] # Exclude commits that are not matched by any commit parser. filter_commits = true # Regex to select git tags that represent releases. tag_pattern = "v[0-9]*" # Regex to select git tags that do not represent proper releases. # Takes precedence over `tag_pattern`. # Changes belonging to these releases will be included in the next release. skip_tags = "v0.1.0-beta.1" ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-one-tag/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" git tag v0.1.0 ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-one-tag/expected.md ================================================ # Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [0.1.0](https://github.com/dummy/dummy/releases/tag/v0.1.0) - 2021-01-23 ### Added - Add feature 1 ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-one-tag-bump-arg/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ {% if previous %}\ {% if previous.version %}\ ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/compare/{{ previous.version }}...{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% endif %}\ {% endif %}\ {% else %}\ {% if previous %}\ {% if previous.version %}\ ## [Unreleased](https://github.com/dummy/dummy/compare/{{ previous.version }}...HEAD) {% else %}\ ## [Unreleased] {% endif %}\ {% else %}\ ## [Unreleased] {% endif %}\ {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^.*: add", group = "Added" }, { message = "^.*: support", group = "Added" }, { message = "^.*: remove", group = "Removed" }, { message = "^.*: delete", group = "Removed" }, { message = "^test", group = "Fixed" }, { message = "^fix", group = "Fixed" }, { message = "^.*: fix", group = "Fixed" }, { message = "^.*", group = "Changed" }, ] # Exclude commits that are not matched by any commit parser. filter_commits = true # Regex to select git tags that represent releases. tag_pattern = "v[0-9]*" # Regex to select git tags that do not represent proper releases. # Takes precedence over `tag_pattern`. # Changes belonging to these releases will be included in the next release. skip_tags = "v0.1.0-beta.1" ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-one-tag-bump-arg/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-25 01:23:47" git commit --allow-empty -m "fix: fix feature 1" ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-one-tag-bump-arg/expected.md ================================================ # Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [0.1.1](https://github.com/dummy/dummy/compare/v0.1.0...v0.1.1) - <> ### Fixed - Fix feature 1 ## [0.1.0](https://github.com/dummy/dummy/releases/tag/v0.1.0) - 2021-01-23 ### Added - Add feature 1 ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-tag-arg/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ {% if previous %}\ {% if previous.version %}\ ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/compare/{{ previous.version }}...{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% endif %}\ {% endif %}\ {% else %}\ {% if previous %}\ {% if previous.version %}\ ## [Unreleased](https://github.com/dummy/dummy/compare/{{ previous.version }}...HEAD) {% else %}\ ## [Unreleased] {% endif %}\ {% else %}\ ## [Unreleased] {% endif %}\ {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^.*: add", group = "Added" }, { message = "^.*: support", group = "Added" }, { message = "^.*: remove", group = "Removed" }, { message = "^.*: delete", group = "Removed" }, { message = "^test", group = "Fixed" }, { message = "^fix", group = "Fixed" }, { message = "^.*: fix", group = "Fixed" }, { message = "^.*", group = "Changed" }, ] # Exclude commits that are not matched by any commit parser. filter_commits = true # Regex to select git tags that represent releases. tag_pattern = "v[0-9]*" # Regex to select git tags that do not represent proper releases. # Takes precedence over `tag_pattern`. # Changes belonging to these releases will be included in the next release. skip_tags = "v0.1.0-beta.1" ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-tag-arg/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-24 01:23:46" git commit --allow-empty -m "feat: add feature 2" git tag v0.2.0 GIT_COMMITTER_DATE="2021-01-25 01:23:47" git commit --allow-empty -m "fix: fix feature 1" ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-tag-arg/expected.md ================================================ # Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [0.3.0](https://github.com/dummy/dummy/compare/v0.2.0...v0.3.0) - <> ### Fixed - Fix feature 1 ## [0.2.0](https://github.com/dummy/dummy/compare/v0.1.0...v0.2.0) - 2021-01-24 ### Added - Add feature 2 ## [0.1.0](https://github.com/dummy/dummy/releases/tag/v0.1.0) - 2021-01-23 ### Added - Add feature 1 ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-unreleased-arg/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ {% if previous %}\ {% if previous.version %}\ ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/compare/{{ previous.version }}...{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% endif %}\ {% endif %}\ {% else %}\ {% if previous %}\ {% if previous.version %}\ ## [Unreleased](https://github.com/dummy/dummy/compare/{{ previous.version }}...HEAD) {% else %}\ ## [Unreleased] {% endif %}\ {% else %}\ ## [Unreleased] {% endif %}\ {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^.*: add", group = "Added" }, { message = "^.*: support", group = "Added" }, { message = "^.*: remove", group = "Removed" }, { message = "^.*: delete", group = "Removed" }, { message = "^test", group = "Fixed" }, { message = "^fix", group = "Fixed" }, { message = "^.*: fix", group = "Fixed" }, { message = "^.*", group = "Changed" }, ] # Exclude commits that are not matched by any commit parser. filter_commits = true # Regex to select git tags that represent releases. tag_pattern = "v[0-9]*" # Regex to select git tags that do not represent proper releases. # Takes precedence over `tag_pattern`. # Changes belonging to these releases will be included in the next release. skip_tags = "v0.1.0-beta.1" ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-unreleased-arg/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-24 01:23:46" git commit --allow-empty -m "feat: add feature 2" git tag v0.2.0 GIT_COMMITTER_DATE="2021-01-25 01:23:47" git commit --allow-empty -m "fix: fix feature 1" ================================================ FILE: .github/fixtures/test-keep-a-changelog-links-unreleased-arg/expected.md ================================================ # Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased](https://github.com/dummy/dummy/compare/v0.2.0...HEAD) ### Fixed - Fix feature 1 ================================================ FILE: .github/fixtures/test-latest-with-one-tag/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ ================================================ FILE: .github/fixtures/test-latest-with-one-tag/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: initial commit" GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add feature 1" git tag v0.1.0 ================================================ FILE: .github/fixtures/test-latest-with-one-tag/expected.md ================================================ ## [0.1.0] - 2021-01-23 ### 🚀 Features - Initial commit - Add feature 1 ================================================ FILE: .github/fixtures/test-limit-commits/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # Limit the total number of commits contained in the changelog. limit_commits = 2 ================================================ FILE: .github/fixtures/test-limit-commits/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1 (#1)" GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "refactor: move classes" git tag v0.1.0 ================================================ FILE: .github/fixtures/test-limit-commits/expected.md ================================================ ## [0.1.0] - 2022-04-06 ### 🐛 Bug Fixes - Fix feature 1 (#1) ### 🚜 Refactor - Move classes ================================================ FILE: .github/fixtures/test-monorepo-include-path/cliff.toml ================================================ [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # regex for parsing and grouping commits commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] ================================================ FILE: .github/fixtures/test-monorepo-include-path/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://github.com/orhun/git-cliff git fetch mv cliff.toml cliff.toml.bak git checkout 076feb74b4d8c8634669f57d4e2765c39490d80e mv cliff.toml.bak cliff.toml ================================================ FILE: .github/fixtures/test-monorepo-include-path/expected.md ================================================ ## [unreleased] ### Bug Fixes - Include the root commit when `--latest` is used with one tag (#901) - Match PR and release metadata correctly (#907) - Fix missing commit fields in context (#837) (#920) - Preserve first time contributors (#925) ### Features - Allow overriding the remote API URL via config (#896) ================================================ FILE: .github/fixtures/test-no-exec/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ # An array of regex based postprocessors to modify the changelog. postprocessors = [ { pattern = '.*', replace_command = 'this_command_does_not_exist' }, ] [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [ { pattern = '.*', replace_command = "this_command_does_not_exist" }, ] ================================================ FILE: .github/fixtures/test-no-exec/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2" GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2" git tag v0.2.0 GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests" ================================================ FILE: .github/fixtures/test-no-exec/expected.md ================================================ ## [unreleased] ### Test - Add tests ## [0.2.0] - 2022-04-06 ### Bug Fixes - Fix feature 2 ### Features - Add feature 2 ## [0.1.0] - 2022-04-06 ### Bug Fixes - Fix feature 1 ### Features - Add feature 1 ================================================ FILE: .github/fixtures/test-offline/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [remote] # Should make us avoid all calls to external services offline = true # GitHub integration for fetching commit metadata. [remote.github] owner = "orhun" repo = "git-cliff-readme-example" [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ ## What's Changed {%- if version %} in {{ version }}{%- endif -%} {% for commit in commits %} * {{ commit.message | split(pat="\n") | first | trim }}\ {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%} {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %} {%- endfor -%} {% if version %} {% if previous.version %} **Full Changelog**: https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}/compare/{{ previous.version }}...{{ version }} {% endif %} {% else -%} {% raw %}\n{% endraw %} {% endif %} """ [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = false ================================================ FILE: .github/fixtures/test-offline/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://github.com/orhun/git-cliff-readme-example git pull origin master git fetch --tags ================================================ FILE: .github/fixtures/test-offline/expected.md ================================================ ## What's Changed * feat(config): support multiple file formats * feat(cache): use cache while fetching pages ## What's Changed in v1.0.1 * refactor(parser): expose string functions * chore(release): add release script **Full Changelog**: https://github.com/orhun/git-cliff-readme-example/compare/v1.0.0...v1.0.1 ## What's Changed in v1.0.0 * Initial commit * docs(project): add README.md * feat(parser): add ability to parse arrays * fix(args): rename help argument due to conflict * docs(example)!: add tested usage example ================================================ FILE: .github/fixtures/test-override-scope/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## {{ version | trim_start_matches(pat="v") }} - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## Unreleased {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for group, commits in commits | group_by(attribute="scope") %} #### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\ {% endfor %}\n """ [git] conventional_commits = true filter_unconventional = false # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's `scope` and can decide to exclude commits from further processing. commit_parsers = [ { message = "([Xx]enon)", scope = "Xenon" } ] ================================================ FILE: .github/fixtures/test-override-scope/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "fix(Xenon): first commit" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix(Xenon): second commit" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix(xenon): third commit" git tag v0.1.0 ================================================ FILE: .github/fixtures/test-override-scope/expected.md ================================================ ## 0.1.0 - 2022-04-06 ### Fix #### Xenon - First commit - Second commit - Third commit ================================================ FILE: .github/fixtures/test-regex-json-array/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [remote.github] owner = "orhun" repo = "git-cliff-readme-example-one-pr-one-commit" [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | split(pat="\n") | nth(n=0) | trim_end }} \ {%- if commit.remote.pr_number -%} ([PR #{{ commit.remote.pr_number }}](https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}/pull/{{ commit.remote.pr_number }}))\ {%- endif -%} {% endfor %} {% endfor %}\n """ [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = false # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's `scope` and can decide to exclude commits from further processing. commit_parsers = [ { field = "remote.pr_labels", pattern = "area/documentation", group = "📝 Documentation" }, { field = "remote.pr_labels", pattern = "breaking change", group = "💥 Breaking Changes" }, { field = "remote.pr_labels", pattern = "type/bug", group = "🐛 Bug Fixes" }, { field = "remote.pr_labels", pattern = "type/enhancement", group = "✨ Enhancements" }, { field = "remote.pr_labels", pattern = "type/refactor", group = "🧹 Refactoring" }, { field = "remote.pr_labels", pattern = "type/update", group = "🚀 Feature Updates" }, { message = ".*", group = "🌀 Miscellaneous" }, ] ================================================ FILE: .github/fixtures/test-regex-json-array/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit git pull origin main git fetch --tags ================================================ FILE: .github/fixtures/test-regex-json-array/expected.md ================================================ ## [unreleased] ### ✨ Enhancements - feat(cache): use cache while fetching pages([PR #7](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/7)) - feat(config): support multiple file formats([PR #8](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/8)) - feat(parser): add ability to parse arrays([PR #9](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/9)) ## [1.0.1] - 2025-06-18 ### 🚀 Feature Updates - chore(release): add release script([PR #6](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/6)) ### 🐛 Bug Fixes - fix(args): rename help argument due to conflict([PR #5](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/5)) ## [1.0.0] - 2025-06-18 ### 💥 Breaking Changes - refactor(parser): expose string functions([PR #3](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/3)) ### 📝 Documentation - docs(project): add README.md([PR #2](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/2)) - docs(example)!: add tested usage example([PR #4](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/4)) ### 🌀 Miscellaneous - chore: initialize main - initial commit([PR #1](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/1)) ================================================ FILE: .github/fixtures/test-regex-label-grouping/cliff.toml ================================================ [changelog] body = """ ### What's changed {% for group, commits in commits | group_by(attribute="group") %} #### {{ group }} {% for commit in commits -%} - {{ commit.message }} {% endfor -%}\n {% endfor %}\n """ [git] commit_parsers = [ { field = "author.name", pattern = "testa", group = "TEST A" }, { field = "author.name", pattern = "testb", group = "TEST B" }, { field = "author.name", pattern = "testc", group = "TEST C" }, ] ================================================ FILE: .github/fixtures/test-regex-label-grouping/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty --author="testa " -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty --author="testa " -m "feat: add feature 2" GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty --author="testb " -m "feat: add feature 3" GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty --author="testb " -m "feat: add feature 4" GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty --author="testc " -m "feat: add feature 5" GIT_COMMITTER_DATE="2022-04-06 01:25:14" git commit --allow-empty --author="testc " -m "feat: add feature 6" ================================================ FILE: .github/fixtures/test-regex-label-grouping/expected.md ================================================ ### What's changed #### TEST A - add feature 1 - add feature 2 #### TEST B - add feature 3 - add feature 4 #### TEST C - add feature 5 - add feature 6 ================================================ FILE: .github/fixtures/test-regex-replace-parser/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - ({{ commit.scope }}) {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = '^fix\((.*)\)', group = 'Fix (${1}) 🧰' }, { message = '^feat\((.*)\)', group = 'Feature (${1}) 🚀' }, { message = "^\\[(.*)\\]", group = "Changes to ${1}", scope = "${1}" }, ] ================================================ FILE: .github/fixtures/test-regex-replace-parser/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat(config): add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix(config): fix feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2" GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2" git tag v0.2.0 GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "[tests]: add tests" GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "[codebase]: refactor stuff" GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "[codebase]: refactor more stuff" GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "[security]: rewrite everything in Rust" ================================================ FILE: .github/fixtures/test-regex-replace-parser/expected.md ================================================ ## [unreleased] ### Changes to codebase - (codebase) Refactor stuff - (codebase) Refactor more stuff ### Changes to security - (security) Rewrite everything in Rust ### Changes to tests - (tests) Add tests ## [0.2.0] - 2022-04-05 ### Feature (gui) 🚀 - (gui) Add feature 2 ### Fix (gui) 🧰 - (gui) Fix feature 2 ## [0.1.0] - 2022-04-05 ### Feature (config) 🚀 - (config) Add feature 1 ### Fix (config) 🧰 - (config) Fix feature 1 ================================================ FILE: .github/fixtures/test-release-statistics/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %} ### Commit Statistics\n - {{ statistics.commit_count }} commit(s) contributed to the release. - {{ statistics.commits_timespan | default(value=0) }} day(s) passed between the first and last commit. - {{ statistics.conventional_commit_count }} commit(s) parsed as conventional. - {{ statistics.links | length }} linked issue(s) detected in commits. {%- if statistics.links | length > 0 %} {%- for link in statistics.links %} {{ " " }}- [{{ link.text }}]({{ link.href }}) (referenced {{ link.count }} time(s)) {%- endfor %} {%- endif %} {%- if statistics.days_passed_since_last_release %} - {{ statistics.days_passed_since_last_release }} day(s) passed between releases. {%- endif %}\n\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's `scope` and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] # An array of link parsers for extracting external references, and turning them into URLs, using regex. link_parsers = [ { pattern = "#(\\d+)", href = "https://github.com/orhun/git-cliff/issues/$1"}, { pattern = "RFC(\\d+)", text = "ietf-rfc$1", href = "https://datatracker.ietf.org/doc/html/rfc$1"}, ] ================================================ FILE: .github/fixtures/test-release-statistics/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2" GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2" git tag v0.2.0 GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests" GIT_COMMITTER_DATE="2022-04-06 01:25:14" git commit --allow-empty -m "feat: add release statistics feature(#452)" GIT_COMMITTER_DATE="2022-04-06 01:25:14" git commit --allow-empty -m "fix: remove duplication (#452)" GIT_COMMITTER_DATE="2022-04-06 01:25:14" git commit --allow-empty -m "feat: make git short shat available(#1148)" GIT_COMMITTER_DATE="2022-04-06 01:25:15" git commit --allow-empty -m "fix(parser): ensure URI parsing is RFC3986-compliant" ================================================ FILE: .github/fixtures/test-release-statistics/expected.md ================================================ ## [unreleased] ### Bug Fixes - Remove duplication (#452) - Ensure URI parsing is RFC3986-compliant ### Features - Add release statistics feature(#452) - Make git short shat available(#1148) ### Test - Add tests ### Commit Statistics - 5 commit(s) contributed to the release. - 0 day(s) passed between the first and last commit. - 5 commit(s) parsed as conventional. - 3 linked issue(s) detected in commits. - [#452](https://github.com/orhun/git-cliff/issues/452) (referenced 2 time(s)) - [#1148](https://github.com/orhun/git-cliff/issues/1148) (referenced 1 time(s)) - [ietf-rfc3986](https://datatracker.ietf.org/doc/html/rfc3986) (referenced 1 time(s)) - <> day(s) passed between releases. ## [0.2.0] - 2022-04-06 ### Bug Fixes - Fix feature 2 ### Features - Add feature 2 ### Commit Statistics - 2 commit(s) contributed to the release. - 0 day(s) passed between the first and last commit. - 2 commit(s) parsed as conventional. - 0 linked issue(s) detected in commits. ## [0.1.0] - 2022-04-06 ### Bug Fixes - Fix feature 1 ### Commit Statistics - 1 commit(s) contributed to the release. - 0 day(s) passed between the first and last commit. - 1 commit(s) parsed as conventional. - 0 linked issue(s) detected in commits. ================================================ FILE: .github/fixtures/test-remote-config/cliff.toml ================================================ [changelog] header = "This is going to be overriden" ================================================ FILE: .github/fixtures/test-remote-config/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2" GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2" git tag v0.2.0 GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests" ================================================ FILE: .github/fixtures/test-remote-config/expected.md ================================================ ## [unreleased] ### Test - Add tests ## [0.2.0] - 2022-04-06 ### Bug Fixes - Fix feature 2 ### Features - Add feature 2 ## [0.1.0] - 2022-04-06 ### Bug Fixes - Fix feature 1 ### Features - Add feature 1 ================================================ FILE: .github/fixtures/test-require-conventional-negative/cliff.toml ================================================ [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file. """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% for group, commits in commits | group_by(attribute="group") %} ## {{ group | striptags | trim | upper_first }} {% for commit in commits %} {% if commit.scope %}*({{ commit.scope }})* {% endif %}\ {% if commit.breaking %}[**breaking**]: {{ commit.breaking_description }}{% endif %} {{ commit.message }}: {{ commit.body }}\ {% for footer in commit.footers %} - {{ footer.token }}{{ footer.separator }} {{ footer.value }}\ {% endfor %} {% endfor %}\ {% endfor %}\n """ [git] # Require all commits to be conventional. # Takes precedence over filter_unconventional. require_conventional = true # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix" }, ] ================================================ FILE: .github/fixtures/test-require-conventional-negative/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "This is unconventional." GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m \ "This is unconventional on multiple lines. Line 2 Some Footer: user3 " GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui)!: fix feature 2" git tag v0.1.0 ================================================ FILE: .github/fixtures/test-require-conventional-negative/expected.rc ================================================ 1 ================================================ FILE: .github/fixtures/test-require-conventional-skipped/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for group, commits in commits | group_by(attribute="scope") %} #### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\ {% endfor %}\n """ [git] # Require all commits to be conventional. # Takes precedence over filter_unconventional. require_conventional = true # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", skip = true }, { message = "Initial commit", skip = true }, ] # Prevent commits that are breaking from being excluded by commit parsers. protect_breaking_commits = true ================================================ FILE: .github/fixtures/test-require-conventional-skipped/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui)!: add feature 2" GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui)!: fix feature 2" git tag v0.1.0 ================================================ FILE: .github/fixtures/test-require-conventional-skipped/expected.md ================================================ ## [0.1.0] - 2022-04-06 ### Bug Fixes #### Gui - Fix feature 2 ### Features #### App - Add feature 1 #### Gui - Add feature 2 ================================================ FILE: .github/fixtures/test-skip-breaking-changes/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for group, commits in commits | group_by(attribute="scope") %} #### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\ {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app", skip = true }, { message = "^fix", group = "Bug Fixes", scope = "cli", skip = true }, ] # Prevent commits that are breaking from being excluded by commit parsers. protect_breaking_commits = true ================================================ FILE: .github/fixtures/test-skip-breaking-changes/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix!: fix feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui)!: add feature 2" GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui)!: fix feature 2" git tag v0.1.0 ================================================ FILE: .github/fixtures/test-skip-breaking-changes/expected.md ================================================ ## [0.1.0] - 2022-04-06 ### Bug Fixes #### Cli - Fix feature 1 - Fix feature 2 ### Features #### Gui - Add feature 2 ================================================ FILE: .github/fixtures/test-skip-commits/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "🚀 Features", default_scope = "app" }, { message = "^fix", group = "🐛 Bug Fixes", scope = "cli" }, ] # Exclude commits that are not matched by any commit parser. filter_commits = true ================================================ FILE: .github/fixtures/test-skip-commits/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://github.com/orhun/git-cliff-readme-example git pull origin master git fetch --tags { echo "06412ac1dd4071006c465dde6597a21d4367a158" echo "81fbc6365484abf0b4f4b05d384175763ad8db44" echo "e4fd3cf8e2e6f49c0b57f66416e886c37cbb3715" } >>.cliffignore ================================================ FILE: .github/fixtures/test-skip-commits/expected.md ================================================ ## [unreleased] ### 🚀 Features - Support multiple file formats - Use cache while fetching pages ## [1.0.0] - 2021-07-18 ### 🚀 Features - Add ability to parse arrays ### 🐛 Bug Fixes - Rename help argument due to conflict ================================================ FILE: .github/fixtures/test-skip-tags/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # Regex to select git tags that do not represent proper releases. # Takes precedence over `tag_pattern`. # Changes belonging to these releases will be included in the next release. skip_tags = "v0.0.1" ================================================ FILE: .github/fixtures/test-skip-tags/commit.sh ================================================ set -e GIT_COMMITTER_DATE="2025-06-24 21:01:21" git commit --allow-empty -m "init" git tag v0.0.1 GIT_COMMITTER_DATE="2025-06-24 21:01:22" git commit --allow-empty -m "feat: add feature 0" GIT_COMMITTER_DATE="2025-06-24 21:01:23" git commit --allow-empty -m "feat: add feature 1" git tag v0.1.0 ================================================ FILE: .github/fixtures/test-skip-tags/expected.md ================================================ ## [0.1.0] - 2025-06-24 ### 🚀 Features - Add feature 0 - Add feature 1 ================================================ FILE: .github/fixtures/test-split-commits/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # Split commits on newlines, treating each line as an individual commit. split_commits = true ================================================ FILE: .github/fixtures/test-split-commits/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m \ "feat: add feature 1 feat: add feature 2 fix: fix feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m \ "chore: bump deps style: apply formatting fix: fix feature 2" GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m \ "test: add initial tests test: add more tests test: update assert statements" git tag v0.1.0 ================================================ FILE: .github/fixtures/test-split-commits/expected.md ================================================ ## [0.1.0] - 2022-04-06 ### 🚀 Features - Add feature 1 - Add feature 2 ### 🐛 Bug Fixes - Fix feature 1 - Fix feature 2 ### 💼 Other - Initial commit ### 🎨 Styling - Apply formatting ### 🧪 Testing - Add initial tests - Add more tests - Update assert statements ### ⚙️ Miscellaneous Tasks - Bump deps ================================================ FILE: .github/fixtures/test-submodules/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\ {% for submodule_path, commits in submodule_commits %} ### {{ submodule_path | upper_first }} {% for group, commits in commits | group_by(attribute="group") %} #### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %} {% endfor %}\n """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's `scope` and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] recurse_submodules = true ================================================ FILE: .github/fixtures/test-submodules/commit.sh ================================================ #!/usr/bin/env bash set -e current_dir="$(pwd)" submodule_one_dir="$(mktemp -d)" submodule_two_dir="$(mktemp -d)" cd $submodule_one_dir && git init >&2 GIT_COMMITTER_DATE="2022-04-05 01:00:8" git commit --allow-empty -m "feat: submodule_one initial commit" cd $submodule_two_dir && git init >&2 GIT_COMMITTER_DATE="2022-04-05 01:00:12" git commit --allow-empty -m "feat: submodule_two feature B" cd $current_dir GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" git -c protocol.file.allow=always submodule add $submodule_one_dir submodule_one GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit -a -m "feat: add submodule_one" cd submodule_one GIT_COMMITTER_DATE="2022-04-05 01:00:10" git commit --allow-empty -m "feat: submodule_one feature A" GIT_COMMITTER_DATE="2022-04-05 01:00:11" git commit --allow-empty -m "fix: submodule_one fix A" cd .. GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit -a -m "feat: submodule_one update 1" git tag v0.1.0 git -c protocol.file.allow=always submodule add $submodule_two_dir submodule_two GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit -a -m "feat: submodule_two with initial commits" cd submodule_two GIT_COMMITTER_DATE="2022-04-05 01:00:13" git commit --allow-empty -m "fix: submodule_two fix B" cd .. GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit -a -m "feat: submodule_two update 1" git tag v0.2.0 cd submodule_two GIT_COMMITTER_DATE="2022-04-05 01:00:14" git commit --allow-empty -m "fix: submodule_two fix C" cd .. GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit -a -m "feat: submodule_two update 2" ================================================ FILE: .github/fixtures/test-submodules/expected.md ================================================ ## [unreleased] ### Features - Submodule_two update 2 ### Submodule_two #### Bug Fixes - Submodule_two fix C ## [0.2.0] - 2022-04-06 ### Features - Submodule_two with initial commits - Submodule_two update 1 ### Submodule_two #### Bug Fixes - Submodule_two fix B #### Features - Submodule_two feature B ## [0.1.0] - 2022-04-06 ### Features - Add submodule_one - Submodule_one update 1 ### Submodule_one #### Bug Fixes - Submodule_one fix A #### Features - Submodule_one feature A - Submodule_one initial commit ================================================ FILE: .github/fixtures/test-submodules-include-path/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\ {% for submodule_path, commits in submodule_commits %} ### {{ submodule_path | upper_first }} {% for group, commits in commits | group_by(attribute="group") %} #### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %} {% endfor %} """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's `scope` and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] recurse_submodules = true ================================================ FILE: .github/fixtures/test-submodules-include-path/commit.sh ================================================ #!/usr/bin/env bash set -e current_dir="$(pwd)" submodule_one_dir="$(mktemp -d)" submodule_two_dir="$(mktemp -d)" cd $submodule_one_dir && git init >&2 GIT_COMMITTER_DATE="2022-04-05 01:00:8" git commit --allow-empty -m "feat: submodule_one initial commit" cd $submodule_two_dir && git init >&2 GIT_COMMITTER_DATE="2022-04-05 01:00:12" git commit --allow-empty -m "feat: submodule_two feature B" cd $current_dir GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" git -c protocol.file.allow=always submodule add $submodule_one_dir submodule_one GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit -a -m "feat: add submodule_one" cd submodule_one GIT_COMMITTER_DATE="2022-04-05 01:00:10" git commit --allow-empty -m "feat: submodule_one feature A" GIT_COMMITTER_DATE="2022-04-05 01:00:11" git commit --allow-empty -m "fix: submodule_one fix A" cd .. GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit -a -m "feat: submodule_one update 1" git tag v0.1.0 git -c protocol.file.allow=always submodule add $submodule_two_dir submodule_two GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit -a -m "feat: submodule_two with initial commits" cd submodule_two GIT_COMMITTER_DATE="2022-04-05 01:00:13" git commit --allow-empty -m "fix: submodule_two fix B" cd .. GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit -a -m "feat: submodule_two update 1" git tag v0.2.0 cd submodule_two GIT_COMMITTER_DATE="2022-04-05 01:00:14" git commit --allow-empty -m "fix: submodule_two fix C" cd .. GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit -a -m "feat: submodule_two update 2" ================================================ FILE: .github/fixtures/test-submodules-include-path/expected.md ================================================ ## [unreleased] ### Features - Submodule_two update 2 ### Submodule_two #### Bug Fixes - Submodule_two fix C ## [0.2.0] - 2022-04-06 ### Features - Submodule_two with initial commits - Submodule_two update 1 ### Submodule_two #### Bug Fixes - Submodule_two fix B #### Features - Submodule_two feature B ================================================ FILE: .github/fixtures/test-submodules-include-path-config/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\ {% for submodule_path, commits in submodule_commits %} ### {{ submodule_path | upper_first }} {% for group, commits in commits | group_by(attribute="group") %} #### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %} {% endfor %} """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's `scope` and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] recurse_submodules = true include_paths = ["submodule_two"] ================================================ FILE: .github/fixtures/test-submodules-include-path-config/commit.sh ================================================ #!/usr/bin/env bash set -e current_dir="$(pwd)" submodule_one_dir="$(mktemp -d)" submodule_two_dir="$(mktemp -d)" cd $submodule_one_dir && git init >&2 GIT_COMMITTER_DATE="2022-04-05 01:00:8" git commit --allow-empty -m "feat: submodule_one initial commit" cd $submodule_two_dir && git init >&2 GIT_COMMITTER_DATE="2022-04-05 01:00:12" git commit --allow-empty -m "feat: submodule_two feature B" cd $current_dir GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" git -c protocol.file.allow=always submodule add $submodule_one_dir submodule_one GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit -a -m "feat: add submodule_one" cd submodule_one GIT_COMMITTER_DATE="2022-04-05 01:00:10" git commit --allow-empty -m "feat: submodule_one feature A" GIT_COMMITTER_DATE="2022-04-05 01:00:11" git commit --allow-empty -m "fix: submodule_one fix A" cd .. GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit -a -m "feat: submodule_one update 1" git tag v0.1.0 git -c protocol.file.allow=always submodule add $submodule_two_dir submodule_two GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit -a -m "feat: submodule_two with initial commits" cd submodule_two GIT_COMMITTER_DATE="2022-04-05 01:00:13" git commit --allow-empty -m "fix: submodule_two fix B" cd .. GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit -a -m "feat: submodule_two update 1" git tag v0.2.0 cd submodule_two GIT_COMMITTER_DATE="2022-04-05 01:00:14" git commit --allow-empty -m "fix: submodule_two fix C" cd .. GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit -a -m "feat: submodule_two update 2" ================================================ FILE: .github/fixtures/test-submodules-include-path-config/expected.md ================================================ ## [unreleased] ### Features - Submodule_two update 2 ### Submodule_two #### Bug Fixes - Submodule_two fix C ## [0.2.0] - 2022-04-06 ### Features - Submodule_two with initial commits - Submodule_two update 1 ### Submodule_two #### Bug Fixes - Submodule_two fix B #### Features - Submodule_two feature B ================================================ FILE: .github/fixtures/test-submodules-range/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\ {% for submodule_path, commits in submodule_commits %} ### {{ submodule_path | upper_first }} {% for group, commits in commits | group_by(attribute="group") %} #### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %} {% endfor %} """ [git] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's `scope` and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] recurse_submodules = true ================================================ FILE: .github/fixtures/test-submodules-range/commit.sh ================================================ #!/usr/bin/env bash set -e current_dir="$(pwd)" submodule_one_dir="$(mktemp -d)" submodule_two_dir="$(mktemp -d)" cd $submodule_one_dir && git init >&2 GIT_COMMITTER_DATE="2022-04-05 01:00:8" git commit --allow-empty -m "feat: submodule_one initial commit" cd $submodule_two_dir && git init >&2 GIT_COMMITTER_DATE="2022-04-05 01:00:12" git commit --allow-empty -m "feat: submodule_two feature B" cd $current_dir GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" git -c protocol.file.allow=always submodule add $submodule_one_dir submodule_one GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit -a -m "feat: add submodule_one" cd submodule_one GIT_COMMITTER_DATE="2022-04-05 01:00:10" git commit --allow-empty -m "feat: submodule_one feature A" GIT_COMMITTER_DATE="2022-04-05 01:00:11" git commit --allow-empty -m "fix: submodule_one fix A" cd .. GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit -a -m "feat: submodule_one update 1" git tag v0.1.0 git -c protocol.file.allow=always submodule add $submodule_two_dir submodule_two GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit -a -m "feat: submodule_two with initial commits" cd submodule_two GIT_COMMITTER_DATE="2022-04-05 01:00:13" git commit --allow-empty -m "fix: submodule_two fix B" cd .. GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit -a -m "feat: submodule_two update 1" git tag v0.2.0 cd submodule_two GIT_COMMITTER_DATE="2022-04-05 01:00:14" git commit --allow-empty -m "fix: submodule_two fix C" cd .. GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit -a -m "feat: submodule_two update 2" ================================================ FILE: .github/fixtures/test-submodules-range/expected.md ================================================ ## [unreleased] ### Features - Submodule_two update 2 ### Submodule_two #### Bug Fixes - Submodule_two fix C ## [0.2.0] - 2022-04-06 ### Features - Submodule_two with initial commits - Submodule_two update 1 ### Submodule_two #### Bug Fixes - Submodule_two fix B #### Features - Submodule_two feature B ================================================ FILE: .github/fixtures/test-tag-message/cliff.toml ================================================ [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% if message %} {{ message }} {% endif %}\ {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # regex for parsing and grouping commits commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] ================================================ FILE: .github/fixtures/test-tag-message/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1" git tag v0.1.0 -m "Some text" GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2" GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2" git tag v0.2.0 GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests" ================================================ FILE: .github/fixtures/test-tag-message/expected.md ================================================ ## [unreleased] ### Test - Add tests ## [0.2.0] - 2022-04-06 ### Bug Fixes - Fix feature 2 ### Features - Add feature 2 ## [0.1.0] - 2022-04-06 Some text ### Bug Fixes - Fix feature 1 ### Features - Add feature 1 ================================================ FILE: .github/fixtures/test-topo-order/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # Order releases topologically instead of chronologically. topo_order = true ================================================ FILE: .github/fixtures/test-topo-order/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add feature 2" git tag v0.2.0 git checkout v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "feat: fix feature 1" git tag v0.1.1 ================================================ FILE: .github/fixtures/test-topo-order/expected.md ================================================ ## [0.2.0] - 2021-01-23 ### 🚀 Features - Add feature 2 ================================================ FILE: .github/fixtures/test-topo-order-arg/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ ================================================ FILE: .github/fixtures/test-topo-order-arg/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add feature 2" git tag v0.2.0 git checkout v0.1.0 GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "feat: fix feature 1" git tag v0.1.1 ================================================ FILE: .github/fixtures/test-topo-order-arg/expected.md ================================================ ## [0.2.0] - 2021-01-23 ### 🚀 Features - Add feature 2 ================================================ FILE: .github/fixtures/test-topo-order-commits/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [git] topo_order_commits = false ================================================ FILE: .github/fixtures/test-topo-order-commits/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 03:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 03:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 03:25:10" git commit --allow-empty -m "fix: fix feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2022-04-06 03:25:11" git commit --allow-empty -m "feat(gui): add feature 2" GIT_COMMITTER_DATE="2022-04-06 03:25:12" git commit --allow-empty -m "fix(gui): fix feature 2" git tag v0.2.0 GIT_COMMITTER_DATE="2022-04-06 03:25:25" git commit --allow-empty -m "test: add tests" GIT_COMMITTER_DATE="2022-04-06 03:25:25" git checkout v0.1.0 GIT_COMMITTER_DATE="2022-04-06 03:25:13" git commit --allow-empty -m "fix: fix again feature 1" git tag v0.1.1 git checkout master git merge v0.1.1 --no-edit ================================================ FILE: .github/fixtures/test-topo-order-commits/expected.md ================================================ ## [unreleased] ### 🧪 Testing - Add tests ## [0.1.1] - 2022-04-06 ### 🐛 Bug Fixes - Fix again feature 1 ## [0.2.0] - 2022-04-06 ### 🚀 Features - *(gui)* Add feature 2 ### 🐛 Bug Fixes - *(gui)* Fix feature 2 ## [0.1.0] - 2022-04-06 ### 🚀 Features - Add feature 1 ### 🐛 Bug Fixes - Fix feature 1 ================================================ FILE: .github/fixtures/test-unchanged-tag-date/cliff.toml ================================================ [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # regex for parsing and grouping commits commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] ================================================ FILE: .github/fixtures/test-unchanged-tag-date/commit.sh ================================================ #!/usr/bin/env bash set -e GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1" git tag v0.1.0 GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2" GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2" git tag v0.2.0 ================================================ FILE: .github/fixtures/test-unchanged-tag-date/expected.md ================================================ ## [0.2.0] - 2022-04-06 ### Bug Fixes - Fix feature 2 ### Features - Add feature 2 ## [0.1.0] - 2022-04-06 ### Bug Fixes - Fix feature 1 ### Features - Add feature 1 ================================================ FILE: .github/fixtures/test-unreleased-tag-missing-release-commit/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [remote.github] owner = "orhun" repo = "git-cliff-readme-example" [changelog] body = """new_contributors: {{ github.contributors | filter(attribute="is_first_time", value=true) | length }}""" [git] conventional_commits = false ================================================ FILE: .github/fixtures/test-unreleased-tag-missing-release-commit/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://github.com/orhun/git-cliff-readme-example git pull origin master git fetch --tags GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "chore: local-only commit" ================================================ FILE: .github/fixtures/test-unreleased-tag-missing-release-commit/expected.md ================================================ new_contributors: 0 ================================================ FILE: .github/fixtures/test-workdir-include-path/cliff.toml ================================================ [changelog] # template for the changelog body # https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\n """ [git] # regex for parsing and grouping commits commit_parsers = [ { message = "^feat", group = "Features", default_scope = "app" }, { message = "^fix", group = "Bug Fixes", scope = "cli" }, ] ================================================ FILE: .github/fixtures/test-workdir-include-path/commit.sh ================================================ #!/usr/bin/env bash set -e git remote add origin https://github.com/orhun/git-cliff git fetch mv cliff.toml cliff.toml.bak git checkout 076feb74b4d8c8634669f57d4e2765c39490d80e mv cliff.toml.bak .github/fixtures/cliff.toml ================================================ FILE: .github/fixtures/test-workdir-include-path/expected.md ================================================ ## [unreleased] ### Bug Fixes - Include the root commit when `--latest` is used with one tag (#901) - Match PR and release metadata correctly (#907) - Fix missing commit fields in context (#837) (#920) - Preserve first time contributors (#925) ### Features - Allow overriding the remote API URL via config (#896) ================================================ FILE: .github/mergify.yml ================================================ pull_request_rules: - name: Automatic merge for Dependabot pull requests conditions: - author=dependabot[bot] actions: merge: method: squash ================================================ FILE: .github/workflows/cd.yml ================================================ name: Continuous Deployment on: push: tags: - "v*.*.*" jobs: generate-changelog: name: Generate changelog runs-on: ubuntu-22.04 outputs: release_body: ${{ steps.git-cliff.outputs.content }} steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 - name: Generate a changelog uses: orhun/git-cliff-action@07dda386992489f0a6151dee53f3a137713644de # main id: git-cliff with: config: cliff.toml args: -vv --latest --no-exec --github-repo ${{ github.repository }} publish-binaries: name: Publish binaries needs: generate-changelog runs-on: ${{ matrix.build.os }} strategy: fail-fast: false matrix: build: - { NAME: linux-x64-glibc, OS: ubuntu-22.04, TOOLCHAIN: stable, TARGET: x86_64-unknown-linux-gnu, NPM_PUBLISH: true, PYPI_PUBLISH: true, } - { NAME: linux-x64-musl, OS: ubuntu-22.04, TOOLCHAIN: stable, TARGET: x86_64-unknown-linux-musl, NPM_PUBLISH: false, PYPI_PUBLISH: true, } - { NAME: linux-x86-glibc, OS: ubuntu-22.04, TOOLCHAIN: stable, TARGET: i686-unknown-linux-gnu, NPM_PUBLISH: false, PYPI_PUBLISH: false, } - { NAME: linux-x86-musl, OS: ubuntu-22.04, TOOLCHAIN: stable, TARGET: i686-unknown-linux-musl, NPM_PUBLISH: false, PYPI_PUBLISH: true, } - { NAME: linux-arm64-glibc, OS: ubuntu-22.04, TOOLCHAIN: stable, TARGET: aarch64-unknown-linux-gnu, NPM_PUBLISH: true, PYPI_PUBLISH: true, } - { NAME: linux-arm64-musl, OS: ubuntu-22.04, TOOLCHAIN: stable, TARGET: aarch64-unknown-linux-musl, NPM_PUBLISH: false, PYPI_PUBLISH: true, } - { NAME: win32-x64-mingw, OS: windows-2025, TOOLCHAIN: stable, TARGET: x86_64-pc-windows-gnu, NPM_PUBLISH: false, PYPI_PUBLISH: false, } - { NAME: win32-x64-msvc, OS: windows-2025, TOOLCHAIN: stable, TARGET: x86_64-pc-windows-msvc, NPM_PUBLISH: true, PYPI_PUBLISH: true, } - { NAME: win32-x86-msvc, OS: windows-2025, TOOLCHAIN: stable, TARGET: i686-pc-windows-msvc, NPM_PUBLISH: false, PYPI_PUBLISH: true, } - { NAME: win32-arm64-msvc, OS: windows-2025, TOOLCHAIN: stable, TARGET: aarch64-pc-windows-msvc, NPM_PUBLISH: true, PYPI_PUBLISH: false, } - { NAME: darwin-x64, OS: macos-15, TOOLCHAIN: stable, TARGET: x86_64-apple-darwin, NPM_PUBLISH: true, PYPI_PUBLISH: true, } - { NAME: darwin-arm64, OS: macos-15, TOOLCHAIN: stable, TARGET: aarch64-apple-darwin, NPM_PUBLISH: true, PYPI_PUBLISH: true, } steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set the release version shell: bash run: echo "RELEASE_VERSION=${GITHUB_REF:11}" >> $GITHUB_ENV - name: Install dependencies shell: bash run: | if [[ "${{ matrix.build.NAME }}" = *"-musl" ]]; then sudo apt-get update sudo apt-get install -y --no-install-recommends \ --allow-unauthenticated musl-tools fi - name: Install Rust toolchain uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af # v1.0.7 with: toolchain: ${{ matrix.build.TOOLCHAIN }} target: ${{ matrix.build.TARGET }} override: true - name: Build (linux/macos) if: matrix.build.OS != 'windows-2025' uses: actions-rs/cargo@844f36862e911db73fe0815f00a4a2602c279505 # v1.0.3 with: use-cross: true command: build args: --release --locked --target ${{ matrix.build.TARGET }} - name: Build (windows) if: matrix.build.OS == 'windows-2025' uses: actions-rs/cargo@844f36862e911db73fe0815f00a4a2602c279505 # v1.0.3 with: command: build args: --release --locked --target ${{ matrix.build.TARGET }} # --no-default-features - name: Prepare release assets shell: bash run: | mkdir -p release/{man,completions} cp {LICENSE-MIT,LICENSE-APACHE,README.md,CHANGELOG.md} release/ OUT_DIR=release/completions/ cargo run --release --bin git-cliff-completions OUT_DIR=release/man/ cargo run --release --bin git-cliff-mangen for bin in 'git-cliff' 'git-cliff-completions' 'git-cliff-mangen'; do if [ "${{ matrix.build.OS }}" = "windows-2025" ]; then bin="${bin}.exe" fi cp "target/${{ matrix.build.TARGET }}/release/${bin}" release/ done mv release/ git-cliff-${{ env.RELEASE_VERSION }}/ - name: Create release artifacts shell: bash run: | if [ "${{ matrix.build.OS }}" = "windows-2025" ]; then 7z a -tzip "git-cliff-${{ env.RELEASE_VERSION }}-${{ matrix.build.TARGET }}.zip" \ git-cliff-${{ env.RELEASE_VERSION }}/ else tar -czvf git-cliff-${{ env.RELEASE_VERSION }}-${{ matrix.build.TARGET }}.tar.gz \ git-cliff-${{ env.RELEASE_VERSION }}/ shasum -a 512 git-cliff-${{ env.RELEASE_VERSION }}-${{ matrix.build.TARGET }}.tar.gz \ > git-cliff-${{ env.RELEASE_VERSION }}-${{ matrix.build.TARGET }}.tar.gz.sha512 fi - name: Sign the release if: matrix.build.OS == 'ubuntu-22.04' || matrix.build.OS == 'macos-15' run: | echo "${{ secrets.GPG_RELEASE_KEY }}" | base64 --decode > private.key echo "${{ secrets.GPG_PASSPHRASE }}" | gpg --pinentry-mode=loopback \ --passphrase-fd 0 --import private.key echo "${{ secrets.GPG_PASSPHRASE }}" | gpg --pinentry-mode=loopback \ --passphrase-fd 0 --detach-sign \ git-cliff-${{ env.RELEASE_VERSION }}-${{ matrix.build.TARGET }}.tar.gz - name: Publish to GitHub if: ${{ !contains(github.ref, '-') }} uses: svenstaro/upload-release-action@b98a3b12e86552593f3e4e577ca8a62aa2f3f22b # v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: git-cliff-${{ env.RELEASE_VERSION }}-${{ matrix.build.TARGET }}* file_glob: true overwrite: true tag: ${{ github.ref }} release_name: "Release v${{ env.RELEASE_VERSION }}" body: "${{ needs.generate-changelog.outputs.release_body }}" - name: Publish to GitHub (pre-release) if: ${{ contains(github.ref, '-') }} uses: svenstaro/upload-release-action@b98a3b12e86552593f3e4e577ca8a62aa2f3f22b # v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: git-cliff-${{ env.RELEASE_VERSION }}-${{ matrix.build.TARGET }}* file_glob: true overwrite: true tag: ${{ github.ref }} release_name: "Pre-release v${{ env.RELEASE_VERSION }}" prerelease: true - name: Install node if: matrix.build.NPM_PUBLISH == true uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 18 registry-url: "https://registry.npmjs.org" - name: Publish to NPM if: matrix.build.NPM_PUBLISH == true shell: bash run: | cd npm bin="git-cliff" node_os=$(echo "${{ matrix.build.NAME }}" | cut -d '-' -f1) export node_os node_arch=$(echo "${{ matrix.build.NAME }}" | cut -d '-' -f2) export node_arch export version="${{ env.RELEASE_VERSION }}" if [ "${{ matrix.build.OS }}" = "windows-2025" ]; then export node_pkg="${bin}-windows-${node_arch}" else export node_pkg="${bin}-${node_os}-${node_arch}" fi mkdir -p "${node_pkg}/bin" envsubst < package.json.tmpl > "${node_pkg}/package.json" if [ "${{ matrix.build.OS }}" = "windows-2025" ]; then bin="${bin}.exe" fi cp "../target/${{ matrix.build.TARGET }}/release/${bin}" "${node_pkg}/bin" cp ../README.md "${node_pkg}" cd "${node_pkg}" npm publish env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Build Python wheels (linux) if: matrix.build.PYPI_PUBLISH == true && startsWith(matrix.build.NAME, 'linux') uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1.50.1 with: working-directory: pypi target: ${{ matrix.build.TARGET }} args: --release --sdist --out wheels sccache: "true" # https://github.com/PyO3/maturin-action/issues/245 manylinux: ${{ matrix.build.TARGET == 'aarch64-unknown-linux-gnu' && '2_28' || 'auto' }} - name: Build Python wheels (macos & windows) if: | matrix.build.PYPI_PUBLISH == true && (startsWith(matrix.build.OS, 'macos') || startsWith(matrix.build.OS, 'windows')) uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1.50.1 with: working-directory: pypi target: ${{ matrix.build.TARGET }} args: --release --sdist --out wheels sccache: "true" - name: Build Python wheels (musl) if: matrix.build.PYPI_PUBLISH == true && endsWith(matrix.build.OS, 'musl') uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1.50.1 with: working-directory: pypi target: ${{ matrix.build.TARGET }} args: --release --sdist --out wheels sccache: "true" manylinux: musllinux_1_2 - name: Upload Python wheels uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: "wheels-${{ matrix.build.TARGET }}" working-directory: pypi path: pypi/wheels publish-npm: name: Publish the base package to NPM needs: publish-binaries runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install node uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 18 registry-url: "https://registry.npmjs.org" - name: Publish the package shell: bash working-directory: npm/git-cliff run: | yarn config set npmAuthToken ${NODE_AUTH_TOKEN} yarn config set npmPublishRegistry "https://registry.npmjs.org" yarn install yarn build cp ../../README.md . cp ../../CHANGELOG.md . if [ ${{ contains(github.ref, '-') }} = "true" ]; then yarn npm publish --tag rc else yarn npm publish fi env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} YARN_ENABLE_IMMUTABLE_INSTALLS: false publish-pypi: name: Publish PyPI package runs-on: ubuntu-22.04 needs: publish-binaries steps: - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: path: pypi/wheels pattern: wheels-* merge-multiple: true - name: Publish to PyPI uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1.50.1 env: MATURIN_PYPI_TOKEN: ${{ vars.USE_TESTPYPI == 'true' && secrets.TESTPYPI_API_TOKEN || secrets.PYPI_API_TOKEN }} MATURIN_REPOSITORY: ${{ vars.USE_TESTPYPI == 'true' && 'testpypi' || 'pypi' }} with: command: upload args: --skip-existing pypi/wheels/* publish-deb: name: Publish Debian package needs: generate-changelog runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set the release version shell: bash run: echo "RELEASE_VERSION=${GITHUB_REF:11}" >> $GITHUB_ENV - name: Install Rust toolchain uses: dtolnay/rust-toolchain@4305c38b25d97ef35a8ad1f985ccf2d2242004f2 # stable with: targets: x86_64-unknown-linux-gnu - name: Install cargo-deb run: cargo install cargo-deb - name: Build Debian package run: | # https://github.com/kornelski/cargo-deb/pull/62 sed "/readme = (.*)/d" -E -i git-cliff/Cargo.toml cargo build --release --locked -p git-cliff mkdir man/ OUT_DIR=man cargo run --bin git-cliff-mangen mkdir completions OUT_DIR=completions cargo run --bin git-cliff-completions cargo-deb --deb-revision="" --strip -p git-cliff -v -o git-cliff-${{ env.RELEASE_VERSION }}.deb - name: Sign the package run: | echo "${{ secrets.GPG_RELEASE_KEY }}" | base64 --decode > private.key echo "${{ secrets.GPG_PASSPHRASE }}" | gpg --pinentry-mode=loopback \ --passphrase-fd 0 --import private.key echo "${{ secrets.GPG_PASSPHRASE }}" | gpg --pinentry-mode=loopback \ --passphrase-fd 0 --detach-sign \ git-cliff-${{ env.RELEASE_VERSION }}.deb - name: Upload the release if: ${{ !contains(github.ref, '-') }} uses: svenstaro/upload-release-action@b98a3b12e86552593f3e4e577ca8a62aa2f3f22b # v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: git-cliff-${{ env.RELEASE_VERSION }}.deb tag: ${{ github.ref }} release_name: "Release v${{ env.RELEASE_VERSION }}" body: "${{ needs.generate-changelog.outputs.release_body }}" - name: Upload the pre-release if: ${{ contains(github.ref, '-') }} uses: svenstaro/upload-release-action@b98a3b12e86552593f3e4e577ca8a62aa2f3f22b # v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: git-cliff-${{ env.RELEASE_VERSION }}.deb tag: ${{ github.ref }} release_name: "Pre-release v${{ env.RELEASE_VERSION }}" prerelease: true publish-rpm: name: Publish RPM package needs: generate-changelog runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set the release version shell: bash run: echo "RELEASE_VERSION=${GITHUB_REF:11}" >> $GITHUB_ENV - name: Install Rust toolchain uses: dtolnay/rust-toolchain@4305c38b25d97ef35a8ad1f985ccf2d2242004f2 # stable with: targets: x86_64-unknown-linux-gnu - name: Install cargo-generate-rpm run: cargo install cargo-generate-rpm - name: Build RPM package run: | cargo build --release --locked -p git-cliff mkdir man/ OUT_DIR=man cargo run --bin git-cliff-mangen mkdir completions OUT_DIR=completions cargo run --bin git-cliff-completions cargo generate-rpm -p git-cliff -o git-cliff-${{ env.RELEASE_VERSION }}.x86_64.rpm - name: Sign the package run: | echo "${{ secrets.GPG_RELEASE_KEY }}" | base64 --decode > private.key echo "${{ secrets.GPG_PASSPHRASE }}" | gpg --pinentry-mode=loopback \ --passphrase-fd 0 --import private.key echo "${{ secrets.GPG_PASSPHRASE }}" | gpg --pinentry-mode=loopback \ --passphrase-fd 0 --detach-sign \ git-cliff-${{ env.RELEASE_VERSION }}.x86_64.rpm - name: Upload the release if: ${{ !contains(github.ref, '-') }} uses: svenstaro/upload-release-action@b98a3b12e86552593f3e4e577ca8a62aa2f3f22b # v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: git-cliff-${{ env.RELEASE_VERSION }}.x86_64.rpm tag: ${{ github.ref }} release_name: "Release v${{ env.RELEASE_VERSION }}" body: "${{ needs.generate-changelog.outputs.release_body }}" - name: Upload the pre-release if: ${{ contains(github.ref, '-') }} uses: svenstaro/upload-release-action@b98a3b12e86552593f3e4e577ca8a62aa2f3f22b # v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: git-cliff-${{ env.RELEASE_VERSION }}.x86_64.rpm tag: ${{ github.ref }} release_name: "Pre-release v${{ env.RELEASE_VERSION }}" prerelease: true publish-crates-io: name: Publish on crates.io runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set the release version run: echo "RELEASE_VERSION=${GITHUB_REF:11}" >> $GITHUB_ENV - name: Install Rust toolchain uses: dtolnay/rust-toolchain@4305c38b25d97ef35a8ad1f985ccf2d2242004f2 # stable with: targets: x86_64-unknown-linux-gnu - name: Prepare for the crates.io release run: | mkdir git-cliff-core/config/ cp config/cliff.toml git-cliff-core/config/ sed -i 's|"../config/"|"config/"|' git-cliff-core/src/embed.rs mkdir git-cliff-core/examples/ cp -r examples git-cliff-core sed -i 's|"../examples/"|"examples/"|' git-cliff-core/src/embed.rs - name: Publish the library run: | cargo publish --allow-dirty --manifest-path git-cliff-core/Cargo.toml \ --locked --token ${{ secrets.CARGO_TOKEN }} - name: Wait for library to update shell: bash run: | crate_status="https://raw.githubusercontent.com/rust-lang/crates.io-index/master/gi/t-/git-cliff-core" until curl -s "$crate_status" | grep -q '"vers":"${{ env.RELEASE_VERSION }}"'; do sleep 5; done; - name: Publish the binary run: | cargo publish --allow-dirty --manifest-path git-cliff/Cargo.toml \ --locked --token ${{ secrets.CARGO_TOKEN }} publish-homebrew: name: Publish Homebrew formula if: ${{ !contains(github.ref, '-') }} runs-on: ubuntu-22.04 permissions: contents: read steps: - name: Bump formula uses: mislav/bump-homebrew-formula-action@56a283fa15557e9abaa4bdb63b8212abc68e655c # v3.6 with: formula-name: git-cliff formula-path: Formula/g/git-cliff.rb env: COMMITTER_TOKEN: ${{ secrets.HOMEBREW_COMMITTER_TOKEN }} ================================================ FILE: .github/workflows/check-semver.yml ================================================ name: Check Semver # on: # pull_request: # branches: # - main on: workflow_dispatch jobs: check-semver: name: Check semver runs-on: ubuntu-latest outputs: error_message: ${{ steps.check_semver.outputs.error_message }} steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Run cargo-semver-checks id: check_semver uses: orhun/cargo-semver-checks-action@cc19b888f2062f8cc964c1d52f7f29d910becb31 # feat/add_action_output comment-on-pr: name: Comment on pull request runs-on: ubuntu-latest needs: check-semver if: always() permissions: pull-requests: write steps: - name: Comment if: ${{ needs.check-semver.outputs.error_message != null }} uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2.9.4 with: header: pr-semver-check-error message: | Thank you for opening this pull request! Reviewer note: [cargo-semver-checks](https://github.com/obi1kenobi/cargo-semver-checks) reported the current version number is not SemVer-compatible with the changes made since the last release. Details: ``` ${{ needs.check-semver.outputs.error_message }} ``` - name: Delete comment if: ${{ needs.check-semver.outputs.error_message == null }} uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2.9.4 with: header: pr-semver-check-error delete: true ================================================ FILE: .github/workflows/ci.yml ================================================ name: Continuous Integration on: pull_request: push: branches: - main - staging # for bors - trying # for bors schedule: - cron: "0 0 * * 0" permissions: pull-requests: write jobs: check: name: Check runs-on: ubuntu-22.04 steps: - name: Install toolchain uses: dtolnay/rust-toolchain@4305c38b25d97ef35a8ad1f985ccf2d2242004f2 # stable - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Check uses: actions-rs/cargo@844f36862e911db73fe0815f00a4a2602c279505 # v1.0.3 with: command: check args: --locked --verbose - name: Check without default features uses: actions-rs/cargo@844f36862e911db73fe0815f00a4a2602c279505 # v1.0.3 with: command: check args: --locked --no-default-features --verbose typos: name: Typos runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Check typos uses: crate-ci/typos@3504f4613b41e223d38c08c6953c3ef30bf29fac # master test: name: Test suite runs-on: ubuntu-22.04 steps: - name: Install toolchain uses: dtolnay/rust-toolchain@b95584d8105b9ab200e15821fa671848cf2b7017 # nightly - name: Checkout if: github.event_name != 'pull_request' uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 - name: Checkout if: github.event_name == 'pull_request' uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 0 - name: Setup cargo-tarpaulin uses: taiki-e/install-action@db542c1ee140717096741d8188a70ff7cb9efb87 # cargo-tarpaulin - name: Run tests run: | cargo test --no-default-features \ -- --skip "repo::test::git_upstream_remote" - name: Run tests run: | cargo tarpaulin --out xml --verbose --all-features \ -- --skip "repo::test::git_upstream_remote" - name: Upload reports to codecov if: github.actor != 'dependabot[bot]' uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2 with: name: code-coverage-report files: cobertura.xml flags: unit-tests fail_ci_if_error: true verbose: true token: ${{ secrets.CODECOV_TOKEN }} clippy: name: Lints runs-on: ubuntu-22.04 steps: - name: Install toolchain uses: dtolnay/rust-toolchain@b95584d8105b9ab200e15821fa671848cf2b7017 # nightly with: components: clippy - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Check the lints uses: actions-rs/cargo@844f36862e911db73fe0815f00a4a2602c279505 # v1.0.3 with: # Lints are configured via CLI arguments to avoid confusion with Cargo.toml precedence. command: clippy args: --tests --verbose -- -D warnings - name: Check the pedantic lints uses: actions-rs/cargo@844f36862e911db73fe0815f00a4a2602c279505 # v1.0.3 with: # Lints are configured via CLI arguments to avoid confusion with Cargo.toml precedence. command: clippy args: --all-targets --verbose -- -W clippy::pedantic rustfmt: name: Formatting runs-on: ubuntu-22.04 steps: - name: Install toolchain uses: dtolnay/rust-toolchain@b95584d8105b9ab200e15821fa671848cf2b7017 # nightly with: toolchain: nightly components: rustfmt - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Check the formatting run: cargo +nightly fmt --all -- --check --verbose doctest: name: Doctests runs-on: ubuntu-22.04 steps: - name: Install toolchain uses: dtolnay/rust-toolchain@b95584d8105b9ab200e15821fa671848cf2b7017 # nightly with: components: rustfmt - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Check the formatting uses: actions-rs/cargo@844f36862e911db73fe0815f00a4a2602c279505 # v1.0.3 with: command: test args: --doc lychee: name: Links runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Check website links uses: lycheeverse/lychee-action@8646ba30535128ac92d33dfc9133794bfdd9b411 # v2.8.0 with: args: > -v --config lychee.toml --root-dir website website/docs/* website/blog/* fail: true token: ${{ secrets.GITHUB_TOKEN }} - name: Check root markdown links uses: lycheeverse/lychee-action@8646ba30535128ac92d33dfc9133794bfdd9b411 # v2.8.0 with: args: > -v --config lychee.toml *.md fail: true token: ${{ secrets.GITHUB_TOKEN }} msrv: name: Check Rust version runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install cargo-binstall uses: taiki-e/install-action@f45419ef14ff13c4459e1c4310c1ff046eff6b30 # cargo-binstall - name: Install cargo-msrv run: cargo binstall -y cargo-msrv - name: Run cargo-msrv shell: bash run: | for package in "git-cliff" "git-cliff-core"; do printf "Checking MSRV for $package..." cargo msrv --output-format json --path "$package" verify | tail -n 1 | jq --exit-status '.success' done tarball: name: Check NodeJS tarball runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install node uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 18 registry-url: "https://registry.npmjs.org" - name: Validate the files in the tarball shell: bash working-directory: npm/git-cliff run: | yarn install yarn build cp ../../README.md . cp ../../CHANGELOG.md . files_expected_in_tarball=( "CHANGELOG.md" "README.md" "lib/cjs/index.cjs" "lib/cjs/index.cjs.map" "lib/cjs/index.d.cts" "lib/cli/cli.js" "lib/esm/index.d.ts" "lib/esm/index.js" "lib/esm/index.js.map" "package.json" ) tarball_output=$(yarn pack --dry-run) for file in "${files_expected_in_tarball[@]}"; do if [[ ! "$tarball_output" == *"$file"* ]]; then echo "Error: Expected file '$file' not found in tarball." exit 1 fi done profiler: name: Run profiler runs-on: ubuntu-22.04 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 - name: Install toolchain uses: dtolnay/rust-toolchain@4305c38b25d97ef35a8ad1f985ccf2d2242004f2 # stable - name: Run profiler run: cargo run --profile bench --features profiler -- --no-exec - name: Upload report uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: git-cliff.${{ github.run_id }}-profiler-report path: git-cliff.**.flamegraph.svg nix-flake: name: Build Nix flake runs-on: ubuntu-latest steps: - name: Checkout the repository uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install Nix uses: nixbuild/nix-quick-install-action@2c9db80fb984ceb1bcaa77cdda3fdf8cfba92035 # v34 - name: Restore and cache Nix store uses: nix-community/cache-nix-action@7df957e333c1e5da7721f60227dbba6d06080569 # v7.0.2 with: primary-key: nix-${{ runner.os }}-${{ hashFiles('**/*.nix') }} restore-prefixes-first-match: nix-${{ runner.os }}- gc-max-store-size-linux: 1073741824 purge: false - name: Check Nix flake run: nix flake check --all-systems -Lv --show-trace ================================================ FILE: .github/workflows/codeql.yml ================================================ # For most projects, this workflow file will not need changing; you simply need # to commit it to your repository. # # You may wish to alter this file to override the set of languages analyzed, # or to provide custom queries or build logic. # # ******** NOTE ******** # We have attempted to detect the languages in your repository. Please check # the `language` matrix defined below to confirm you have the correct set of # supported CodeQL languages. # name: "CodeQL" on: push: branches: ["main"] pull_request: # The branches below must be a subset of the branches above branches: ["main"] schedule: - cron: "0 0 * * 1" permissions: contents: read jobs: analyze: name: Analyze runs-on: ubuntu-latest permissions: actions: read contents: read security-events: write strategy: fail-fast: false matrix: language: ["javascript", "typescript"] # CodeQL supports [ $supported-codeql-languages ] # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support steps: - name: Checkout repository uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@0d579ffd059c29b07949a3cce3983f0780820c98 # v4.32.6 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild uses: github/codeql-action/autobuild@0d579ffd059c29b07949a3cce3983f0780820c98 # v4.32.6 # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun # If the Autobuild fails above, remove it and uncomment the following three lines. # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. # - run: | # echo "Run, Build Application using script" # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@0d579ffd059c29b07949a3cce3983f0780820c98 # v4.32.6 with: category: "/language:${{matrix.language}}" ================================================ FILE: .github/workflows/dependency-review.yml ================================================ # Dependency Review Action # # This Action will scan dependency manifest files that change as part of a Pull Request, # surfacing known-vulnerable versions of the packages declared or updated in the PR. # Once installed, if the workflow run is marked as required, # PRs introducing known-vulnerable packages will be blocked from merging. # # Source repository: https://github.com/actions/dependency-review-action name: 'Dependency Review' on: [pull_request] permissions: contents: read jobs: dependency-review: runs-on: ubuntu-latest steps: - name: 'Checkout Repository' uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: 'Dependency Review' uses: actions/dependency-review-action@2031cfc080254a8a887f58cffee85186f0e49e48 # v4.9.0 ================================================ FILE: .github/workflows/docker.yml ================================================ name: Docker Automated Builds on: push: branches: - main tags: - "v*.*.*" pull_request: branches: - main schedule: - cron: "0 0 * * 0" jobs: docker: name: Docker Build and Push runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Docker meta id: meta uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0 with: images: | orhunp/git-cliff ghcr.io/${{ github.repository_owner }}/git-cliff/git-cliff tags: | type=schedule type=ref,event=branch type=ref,event=pr type=sha type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') }} type=raw,value=main,enable=${{ github.ref == 'refs/heads/main' }} type=semver,pattern={{version}} - name: Find Image by SHA Tag id: image_sha_tag env: META_JSON: ${{ steps.meta.outputs.json }} # This jq script is the most direct way to pull the current sha tag for targeting # the security scan. # The JSON output is currently an object and one property is the tags array. # That array contains and entry like "ghcr.io/orhun/git-cliff/git-cliff:sha-1810ad6" # This JQ script pulls the tags, then selects the first one that contains both # `ghcr.io` and `:sha-`. The full tag value is then exported to be used later. run: | tag_value="$( jq -r ' first(.tags[] | select(contains("ghcr.io") and contains(":sha-"))) ' <<< "$META_JSON" )" echo "image=$tag_value" >> "$GITHUB_OUTPUT" - name: Set up QEMU uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0 with: platforms: arm64 - name: Set up Docker Buildx id: buildx uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 - name: Cache Docker layers uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 with: path: /tmp/.buildx-cache key: ${{ runner.os }}-buildx-${{ github.sha }} restore-keys: | ${{ runner.os }}-buildx- - name: Login to Docker Hub if: github.event_name != 'pull_request' uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Login to GHCR if: github.event_name != 'pull_request' uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push id: docker_build uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7.0.0 with: context: ./ file: ./Dockerfile platforms: linux/amd64,linux/arm64 builder: ${{ steps.buildx.outputs.name }} push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} sbom: true provenance: true labels: ${{ steps.meta.outputs.labels }} cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache - name: Scan the image if: github.event_name != 'pull_request' uses: anchore/sbom-action@57aae528053a48a3f6235f2d9461b05fbcb7366d # v0.23.1 with: image: ${{ steps.image_sha_tag.outputs.image }} - name: Image digest run: echo ${{ steps.docker_build.outputs.digest }} ================================================ FILE: .github/workflows/test-fixtures.yml ================================================ name: Test fixtures on: push: branches: - main pull_request: branches: - main jobs: test-fixtures: name: Test fixtures runs-on: ubuntu-22.04 strategy: fail-fast: false matrix: include: - fixtures-name: new-fixture-template - fixtures-name: test-github-integration - fixtures-name: test-github-integration-custom-range command: v1.0.0..v1.0.1 - fixtures-name: test-gitlab-integration - fixtures-name: test-gitlab-integration-custom-range command: 9f66ac0f76..89de5e8e50 - fixtures-name: test-gitea-integration - fixtures-name: test-gitea-integration-custom-range command: 5ed596d935..c074c439b5 - fixtures-name: test-bitbucket-integration - fixtures-name: test-bitbucket-integration-custom-range command: v1.0.0..v1.0.1 - fixtures-name: test-azure-devops-integration - fixtures-name: test-azure-devops-integration-custom-range command: v1.0.0..v1.0.1 - fixtures-name: test-ignore-tags - fixtures-name: test-invert-ignore-tags - fixtures-name: test-topo-order command: --latest - fixtures-name: test-date-order command: --latest - fixtures-name: test-topo-order-arg command: --latest --topo-order - fixtures-name: test-latest-with-one-tag command: --latest - fixtures-name: test-commit-footers - fixtures-name: test-commit-preprocessors - fixtures-name: test-conventional-commit - fixtures-name: test-custom-scope - fixtures-name: test-limit-commits - fixtures-name: test-skip-breaking-changes - fixtures-name: test-split-commits - fixtures-name: test-bump-version command: --bump - fixtures-name: test-bump-version-major command: --bump major - fixtures-name: test-bump-version-minor command: --bump minor - fixtures-name: test-bump-version-patch command: --bump patch - fixtures-name: test-bump-version-custom-minor command: --bump - fixtures-name: test-bumped-version command: --bumped-version - fixtures-name: test-footer-template - fixtures-name: test-keep-a-changelog-links - fixtures-name: test-keep-a-changelog-links-current-arg command: --current - fixtures-name: test-keep-a-changelog-links-current-arg command: --latest - fixtures-name: test-keep-a-changelog-links-latest-arg command: --latest - fixtures-name: test-keep-a-changelog-links-no-tags - fixtures-name: test-keep-a-changelog-links-no-tags command: --unreleased - fixtures-name: test-keep-a-changelog-links-no-tags command: --latest - fixtures-name: test-keep-a-changelog-links-no-tags command: --current - fixtures-name: test-keep-a-changelog-links-one-tag - fixtures-name: test-keep-a-changelog-links-tag-arg command: --tag v0.3.0 - fixtures-name: test-keep-a-changelog-links-unreleased-arg command: --unreleased - fixtures-name: test-keep-a-changelog-links-unreleased-arg command: --latest --unreleased - fixtures-name: test-keep-a-changelog-links-one-tag-bump-arg command: --bump - fixtures-name: test-skip-commits command: --skip-commit ad27b43e8032671afb4809a1a3ecf12f45c60e0e - fixtures-name: test-no-exec command: --no-exec - fixtures-name: test-custom-tag-pattern command: --tag-pattern "alpha.*" - fixtures-name: test-configure-from-cargo-toml - fixtures-name: test-bump-initial-tag command: --bump - fixtures-name: test-bump-initial-tag-default command: --bump - fixtures-name: test-bump-initial-tag-cli-arg command: --bump --tag=2.1.1 - fixtures-name: test-cli-arg-ignore-tags command: --ignore-tags ".*beta" - fixtures-name: test-cli-arg-skip-tags command: --skip-tags ".*beta" - fixtures-name: test-tag-message - fixtures-name: test-bump-unreleased-with-tag-message-arg command: --bump --unreleased --with-tag-message "Some text" - fixtures-name: test-unreleased-tag-missing-release-commit command: --unreleased --tag 0.3.0 - fixtures-name: test-from-context command: --from-context context.json - fixtures-name: test-from-context-does-not-discard-fields command: --from-context context.json - fixtures-name: test-always-render-unreleased command: --unreleased - fixtures-name: test-always-render command: --unreleased --tag v0.2.0 - fixtures-name: test-unchanged-tag-date command: --tag v0.2.0 - fixtures-name: test-custom-remote-api-url command: v1.4.0..v1.4.1 - fixtures-name: test-monorepo-include-path command: v2.6.1..v2.7.0 --include-path .github/fixtures/ - fixtures-name: test-require-conventional-negative - fixtures-name: test-require-conventional-skipped - fixtures-name: test-submodules - fixtures-name: test-submodules-range command: v0.1.0..HEAD - fixtures-name: test-submodules-include-path command: --include-path submodule_two - fixtures-name: test-submodules-include-path-config - fixtures-name: test-remote-config command: --config-url "https://github.com/orhun/git-cliff/blob/main/.github/fixtures/new-fixture-template/cliff.toml?raw=true" - fixtures-name: test-topo-order-commits - fixtures-name: test-commit-range - fixtures-name: test-commit-range-with-sort-commits - fixtures-name: test-commit-range-with-given-range command: a140cef^..a9d4050 --ignore-tags "." - fixtures-name: test-override-scope - fixtures-name: test-regex-json-array - fixtures-name: test-release-statistics previous-release-timestamp: "2022-04-06 01:25:12" - fixtures-name: test-workdir-include-path command: v2.6.1..v2.7.0 --workdir .github/fixtures/ - fixtures-name: test-fail-on-unmatched-commit - fixtures-name: test-offline steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Run a fixtures test uses: ./.github/actions/run-fixtures-test env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: fixtures-dir: .github/fixtures/${{ matrix.fixtures-name }} command: ${{ matrix.command }} previous-release-timestamp: ${{ matrix.previous-release-timestamp }} ================================================ FILE: .github/workflows/website.yml ================================================ name: Deploy website on: push: branches: - main tags: - "v*.*.*" pull_request: branches: - main workflow_dispatch: permissions: contents: read pages: write id-token: write concurrency: group: "pages" cancel-in-progress: true env: NODE_OPTIONS: --max-old-space-size=6144 jobs: test-deploy: name: Test deployment if: ${{ !startsWith(github.ref, 'refs/tags/v') }} runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 20 cache: yarn cache-dependency-path: ./website/yarn.lock - name: Enable Corepack run: corepack enable - name: Install dependencies working-directory: ./website run: yarn install --frozen-lockfile --non-interactive - name: Build working-directory: ./website run: yarn build deploy: name: Deploy website if: ${{ startsWith(github.ref, 'refs/tags/v') || github.event_name == 'workflow_dispatch' }} runs-on: ubuntu-22.04 environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 20 cache: yarn cache-dependency-path: ./website/yarn.lock - name: Enable Corepack run: corepack enable - name: Install dependencies working-directory: ./website run: yarn install --frozen-lockfile --non-interactive - name: Build working-directory: ./website run: yarn build - name: Setup Pages uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0 - name: Upload artifact uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0 with: path: website/build - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5 ================================================ FILE: .gitignore ================================================ # Compiled files and executables /target/ # Backup files generated by rustfmt **/*.rs.bk *.flamegraph.svg # direnv /.direnv/ # Potential Nix stuff /result /result-* ================================================ FILE: .lycheeignore ================================================ file:/// %7Busername%7D https://datatracker.ietf.org protonmail https://github.com/cocogitto/cocogitto pypi.org https://console.substack.com git-cliff/commit/ patreon # Currently commented out; kept as a reference in case we want to skip npm in the future. # See: https://github.com/orgs/community/discussions/174098 #https://www.npmjs.com # GitHub issues and PR links are occasionally unstable (502/403) due to GitHub edge/CDN behavior. # These links are mostly generated in CHANGELOGs and do not need strict availability checks in CI. https://github.com/.*/issues/.* https://github.com/.*/pull/.* ================================================ FILE: .well-known/funding-manifest-urls ================================================ https://orhun.dev/funding.json ================================================ FILE: CHANGELOG.md ================================================ [![animation](https://raw.githubusercontent.com/orhun/git-cliff/main/website/static/img/git-cliff-anim.gif)](https://git-cliff.org) ## [2.12.0](https://github.com/orhun/git-cliff/compare/v2.11.0..v2.12.0) - 2026-01-20 ### ⛰️ Features - *(args)* Add offline flag ([#1321](https://github.com/orhun/git-cliff/issues/1321)) - ([f19f1cd](https://github.com/orhun/git-cliff/commit/f19f1cdf661d9a8176549c1608290448ebabd7c4)) - *(args)* Add `--skip-tags` cli argument ([#1334](https://github.com/orhun/git-cliff/issues/1334)) - ([32cf8c5](https://github.com/orhun/git-cliff/commit/32cf8c508cdf21a2fa6a1151ef2a51db81a8c739)) - *(logging)* Implement commit processing summary ([#1355](https://github.com/orhun/git-cliff/issues/1355)) - ([aa01a09](https://github.com/orhun/git-cliff/commit/aa01a09de21a737d5715a0fcf34504d036cdb53b)) ### 🐛 Bug Fixes - *(config)* Respect the changelog.output configuration ([#1349](https://github.com/orhun/git-cliff/issues/1349)) - ([cfcc5ae](https://github.com/orhun/git-cliff/commit/cfcc5ae1c2c3bbb125cae27186649aaaeb32eb10)) - *(logging)* Revert the noisy warn log level to trace ([#1353](https://github.com/orhun/git-cliff/issues/1353)) - ([eb99e41](https://github.com/orhun/git-cliff/commit/eb99e41191483d9cb285b7e9c4aa5f7695615143)) - *(remote)* Avoid false first-time contributors when tag timestamp missing ([#1348](https://github.com/orhun/git-cliff/issues/1348)) - ([de7cf02](https://github.com/orhun/git-cliff/commit/de7cf022e9d33a8ecdaf44fe56445a9d02fc1f1a)) - *(remote)* Remove reqwest::Response::error_for_status ([#1336](https://github.com/orhun/git-cliff/issues/1336)) - ([081ba68](https://github.com/orhun/git-cliff/commit/081ba68753d388d5d6369da4460fe56060d7b359)) ### 📚 Documentation - *(contributing)* Clarify Rust toolchain requirements ([#1344](https://github.com/orhun/git-cliff/issues/1344)) - ([97b0322](https://github.com/orhun/git-cliff/commit/97b0322210ceaaaf12c96ab2ae63646a4d844f1c)) - *(install)* Add mise alternative method installation ([#1320](https://github.com/orhun/git-cliff/issues/1320)) - ([34b8d30](https://github.com/orhun/git-cliff/commit/34b8d30988ee486ff3e2462301f75488ab6dcfb7)) - *(website)* Add highlights for 2.12.0 ([#1356](https://github.com/orhun/git-cliff/issues/1356)) - ([0228f43](https://github.com/orhun/git-cliff/commit/0228f438ec41614e53611928ade7d7a971211522)) ### ⚙️ Miscellaneous Tasks - *(azure_devops)* [**breaking**] Rename azureDevops variable to azure_devops ([#1319](https://github.com/orhun/git-cliff/issues/1319)) - ([5d955c1](https://github.com/orhun/git-cliff/commit/5d955c1e5addc76a12ead7e4cc0fe08eabeeea2c)) - *(ci)* Fix codecov action inputs and skip upload for dependabot PRs ([#1343](https://github.com/orhun/git-cliff/issues/1343)) - ([d7a47bb](https://github.com/orhun/git-cliff/commit/d7a47bb03ed794a9f8701f801600e06d8dbde834)) - *(clippy)* Fix pedantic lints ([#1346](https://github.com/orhun/git-cliff/issues/1346)) - ([0260b0a](https://github.com/orhun/git-cliff/commit/0260b0a7ca4ea9281f5b9ca48709d46891376852)) - Update yarn.lock ([#1322](https://github.com/orhun/git-cliff/issues/1322)) - ([0cec8a0](https://github.com/orhun/git-cliff/commit/0cec8a0c0dd2bc0ef94ab608f8d01f7482311792)) ## New Contributors ❤️ * @taladar made their first contribution in [#1319](https://github.com/orhun/git-cliff/pull/1319) * @barskern made their first contribution in [#1321](https://github.com/orhun/git-cliff/pull/1321) * @ooooo-create made their first contribution in [#1334](https://github.com/orhun/git-cliff/pull/1334) * @jylenhof made their first contribution in [#1320](https://github.com/orhun/git-cliff/pull/1320) ## [2.11.0](https://github.com/orhun/git-cliff/compare/v2.10.1..v2.11.0) - 2025-12-14 ### ⛰️ Features - *(changelog)* Support failing on unmatched commits ([#1298](https://github.com/orhun/git-cliff/issues/1298)) - ([a22a1a3](https://github.com/orhun/git-cliff/commit/a22a1a39975eb28af5a640266e8abb7c464b1c8d)) - *(integration)* Add support for azure devops ([#1283](https://github.com/orhun/git-cliff/issues/1283)) - ([ef65be6](https://github.com/orhun/git-cliff/commit/ef65be6cfb024e99086f10ef7d533014dee3af33)) - *(repo)* Improve repository/directory path resolution ([#1290](https://github.com/orhun/git-cliff/issues/1290)) - ([7b1825b](https://github.com/orhun/git-cliff/commit/7b1825bd7a10a10bee5b538337cce41edbe1880c)) - *(template)* Add split_regex, replace_regex, find_regex filters ([#1287](https://github.com/orhun/git-cliff/issues/1287)) - ([8270084](https://github.com/orhun/git-cliff/commit/8270084ccd35e09a63d79132ad291b192f89e893)) ### 🐛 Bug Fixes - *(args)* Set the include-path if workdir is set ([#1293](https://github.com/orhun/git-cliff/issues/1293)) - ([50b8312](https://github.com/orhun/git-cliff/commit/50b8312adcf03992a2e9eb334c4c604450110d91)) - *(bump)* Write bumped version to stdout even when output config is set ([#1307](https://github.com/orhun/git-cliff/issues/1307)) - ([314ff57](https://github.com/orhun/git-cliff/commit/314ff57d9138da86027164b7cbeb7045c6f550f7)) - *(remote)* Use optional default branch for GitLab ([#1305](https://github.com/orhun/git-cliff/issues/1305)) - ([d3cb938](https://github.com/orhun/git-cliff/commit/d3cb93861037e722f10194b77a70d83489fabd02)) - *(repo)* Always discover repositories - ([b4db79f](https://github.com/orhun/git-cliff/commit/b4db79f01a3e65fde5e9a9caf5d17a0a7a8fdac6)) - *(workdir)* Use the correct glob value for include-path - ([0fbc625](https://github.com/orhun/git-cliff/commit/0fbc625616baecc14cfacb9d690f746448f39fec)) ### 🚜 Refactor - *(core)* Improve the generation API ([#1306](https://github.com/orhun/git-cliff/issues/1306)) - ([1e80739](https://github.com/orhun/git-cliff/commit/1e807398bd7d031cfb9df3054cdccba9817605ea)) - *(remote)* Expose commits and PRs as streams ([#1272](https://github.com/orhun/git-cliff/issues/1272)) - ([b82221a](https://github.com/orhun/git-cliff/commit/b82221abd1981b6ecce8ab428fede8165ebb4246)) ### 📚 Documentation - *(config)* Fix comment for topo_order_commits ([#1314](https://github.com/orhun/git-cliff/issues/1314)) - ([c8aad00](https://github.com/orhun/git-cliff/commit/c8aad006c5f42df4659eb21a5feb7cf71a25c3e5)) - *(installation)* Mention the side-bar ([#1226](https://github.com/orhun/git-cliff/issues/1226)) - ([16ca78e](https://github.com/orhun/git-cliff/commit/16ca78e82e28f404d2dc95d57b837c46cb760512)) - *(website)* Add highlights for 2.11.0 ([#1316](https://github.com/orhun/git-cliff/issues/1316)) - ([5af715d](https://github.com/orhun/git-cliff/commit/5af715d3c0a0a907eaa35814a4a939936e9fc4b2)) - *(website)* Fix styling in installation page - ([58c4cfb](https://github.com/orhun/git-cliff/commit/58c4cfbf0a5aaf497b33c225ec6987fcf0a8eeb8)) - *(website)* Use the correct link for Github PR labels as groups ([#1285](https://github.com/orhun/git-cliff/issues/1285)) - ([85cc05d](https://github.com/orhun/git-cliff/commit/85cc05dda8a3b96864cbb62ca648275a1323e2fc)) ### 🎨 Styling - *(args)* Group remote-related CLI arguments under REMOTE OPTIONS heading ([#1271](https://github.com/orhun/git-cliff/issues/1271)) - ([0b6af12](https://github.com/orhun/git-cliff/commit/0b6af122bb8d39f000591a4a700f8c011ac1827d)) ### ⚙️ Miscellaneous Tasks - *(ci)* Stabilize lychee link checking in CI ([#1295](https://github.com/orhun/git-cliff/issues/1295)) - ([7ed1db0](https://github.com/orhun/git-cliff/commit/7ed1db0527211c9be2f54425498f823c503482c2)) - *(logging)* Increase log verbosity ([#1244](https://github.com/orhun/git-cliff/issues/1244)) - ([ee9f742](https://github.com/orhun/git-cliff/commit/ee9f7428958d2b602f0c82749f8ed8da7214fac8)) - *(npm)* Update git-cliff to v2.10.1 ([#1265](https://github.com/orhun/git-cliff/issues/1265)) - ([3da8f26](https://github.com/orhun/git-cliff/commit/3da8f2678b872569a2875e1ca05707bc26124c78)) ## New Contributors ❤️ * @Lewiscowles1986 made their first contribution in [#1226](https://github.com/orhun/git-cliff/pull/1226) * @OpenSauce made their first contribution in [#1314](https://github.com/orhun/git-cliff/pull/1314) * @amd989 made their first contribution in [#1283](https://github.com/orhun/git-cliff/pull/1283) * @asweet-confluent made their first contribution in [#1272](https://github.com/orhun/git-cliff/pull/1272) * @linus-skold made their first contribution in [#1287](https://github.com/orhun/git-cliff/pull/1287) * @simoncdna made their first contribution in [#1305](https://github.com/orhun/git-cliff/pull/1305) * @haidaraM made their first contribution in [#1285](https://github.com/orhun/git-cliff/pull/1285) * @ritoban23 made their first contribution in [#1271](https://github.com/orhun/git-cliff/pull/1271) ## [2.10.1](https://github.com/orhun/git-cliff/compare/v2.10.0..v2.10.1) - 2025-09-21 ### ⛰️ Features - *(cli)* Honor XDG_CONFIG_HOME on macOS ([#1259](https://github.com/orhun/git-cliff/issues/1259)) - ([6b8f1dc](https://github.com/orhun/git-cliff/commit/6b8f1dc515ed18792128aeaecf6f483a47989165)) - *(lib)* Add 'integrations' feature flag for enabling all integrations ([#1263](https://github.com/orhun/git-cliff/issues/1263)) - ([3b98d19](https://github.com/orhun/git-cliff/commit/3b98d19d25738f33be8c1f7ebb078987f97abc7f)) ### 🐛 Bug Fixes - *(config)* Link to tree link for first tag in keepachangelog template ([#1250](https://github.com/orhun/git-cliff/issues/1250)) - ([c0c4bf7](https://github.com/orhun/git-cliff/commit/c0c4bf71aaebb2d1ffa96edc117225b01b9a50d4)) ### 📚 Documentation - *(website)* Add a FAQ section for commit and PR strategies ([#1218](https://github.com/orhun/git-cliff/issues/1218)) - ([d822586](https://github.com/orhun/git-cliff/commit/d822586cc99d438136939f416d6e7eb1d6e27d36)) - *(website)* Add missing gitea feature flag ([#1262](https://github.com/orhun/git-cliff/issues/1262)) - ([20295ac](https://github.com/orhun/git-cliff/commit/20295ac3409106c9a36f2fc0b866fdc30fb9d3a8)) - *(website)* Add note about nested submodules - ([524f51f](https://github.com/orhun/git-cliff/commit/524f51fb60baf57b61b0df3ee56e8289fb50185f)) - *(website)* Update git-cliff-action to v4 ([#1241](https://github.com/orhun/git-cliff/issues/1241)) - ([9857d86](https://github.com/orhun/git-cliff/commit/9857d8602129bd1a75144f5a55ba22876a6140a2)) - *(website)* Add note about next version being checked - ([05eb192](https://github.com/orhun/git-cliff/commit/05eb1923aef586d7fabf14c9894af43da5124d76)) ### ⚙️ Miscellaneous Tasks - *(cd)* Update windows runners to windows-2025 - ([3819a0b](https://github.com/orhun/git-cliff/commit/3819a0bafb1afba67ceee48bc64c5c2d15e9cf15)) - *(examples)* Improve the GitHub templates ([#1249](https://github.com/orhun/git-cliff/issues/1249)) - ([c86647d](https://github.com/orhun/git-cliff/commit/c86647d173b2e3640bdd86c982e485cdb94e7130)) - *(typescript)* Update execa to v9 ([#1228](https://github.com/orhun/git-cliff/issues/1228)) - ([44c8eec](https://github.com/orhun/git-cliff/commit/44c8eecc134ae33627619bad0d79bf9653442805)) ### ◀️ Revert - *(repo)* Use the correct order while diffing paths ([#1188](https://github.com/orhun/git-cliff/issues/1188)) ([#1257](https://github.com/orhun/git-cliff/issues/1257)) - ([fb61cb5](https://github.com/orhun/git-cliff/commit/fb61cb51aa3223eca231f172f655c75ea03255b0)) ## New Contributors ❤️ * @tessus made their first contribution in [#1263](https://github.com/orhun/git-cliff/pull/1263) * @mrdomino made their first contribution in [#1250](https://github.com/orhun/git-cliff/pull/1250) * @Oakchris1955 made their first contribution in [#1253](https://github.com/orhun/git-cliff/pull/1253) * @codemountains made their first contribution in [#1241](https://github.com/orhun/git-cliff/pull/1241) ## [2.10.0](https://github.com/orhun/git-cliff/compare/v2.9.1..v2.10.0) - 2025-07-27 ### ⛰️ Features - *(config)* Support using include and exclude paths in the config ([#1173](https://github.com/orhun/git-cliff/issues/1173)) - ([7c2f922](https://github.com/orhun/git-cliff/commit/7c2f9225f363d5727dcb557b9c708f0023598777)) - *(parser)* Support regex matching on JSON arrays with scalar elements ([#1163](https://github.com/orhun/git-cliff/issues/1163)) - ([dc458ea](https://github.com/orhun/git-cliff/commit/dc458eab65b711841ba996209404534a254b1775)) - *(template)* Support adding commit statistics to the changelog ([#1151](https://github.com/orhun/git-cliff/issues/1151)) - ([05a50d7](https://github.com/orhun/git-cliff/commit/05a50d7d9aef7f80dede9a29eac079c4837d08f9)) ### 🐛 Bug Fixes - *(config)* [**breaking**] Use empty header and footer as default ([#1161](https://github.com/orhun/git-cliff/issues/1161)) ([#1172](https://github.com/orhun/git-cliff/issues/1172)) - ([3e9311e](https://github.com/orhun/git-cliff/commit/3e9311ea8ad23da7c09f0771686bd36b24e92265)) - *(config)* Check if commit.footers is defined in detailed example ([#1170](https://github.com/orhun/git-cliff/issues/1170)) - ([078545f](https://github.com/orhun/git-cliff/commit/078545f55facbd0a82717b723e98589155bedd7e)) - *(fixtures)* Update expected.md after config change ([#1176](https://github.com/orhun/git-cliff/issues/1176)) - ([76d3e81](https://github.com/orhun/git-cliff/commit/76d3e819b126837d7d8541c18c083cdd9f80ec62)) - *(generation)* Ensure skip_tags condition is evaluated first ([#1190](https://github.com/orhun/git-cliff/issues/1190)) - ([318be66](https://github.com/orhun/git-cliff/commit/318be6637609c289cf58270222f1fcd29bf893ec)) - *(repo)* Use the correct order while diffing paths ([#1188](https://github.com/orhun/git-cliff/issues/1188)) - ([ff6c310](https://github.com/orhun/git-cliff/commit/ff6c3105012b5827145ba4bf2bb660cce0b9c7bf)) ### 🚜 Refactor - *(ci)* Apply security best practices ([#1180](https://github.com/orhun/git-cliff/issues/1180)) - ([a32deca](https://github.com/orhun/git-cliff/commit/a32deca80823cf99fd968647217f72fa58c8ccc2)) - *(config)* Implement FromStr instead of Config::parse_from_str() ([#1185](https://github.com/orhun/git-cliff/issues/1185)) - ([692345e](https://github.com/orhun/git-cliff/commit/692345e4454127e31c44fe46aaccc065ac0854cc)) - *(test)* Standardize unit tests for commit module ([#1147](https://github.com/orhun/git-cliff/issues/1147)) - ([0446d6a](https://github.com/orhun/git-cliff/commit/0446d6a95fbba03ca17c14b2cc2da48aa06abe6f)) ### 📚 Documentation - *(context)* Add example usage for statistics ([#1162](https://github.com/orhun/git-cliff/issues/1162)) - ([4f7379a](https://github.com/orhun/git-cliff/commit/4f7379a73160d23dcdcca24b63758958e5ca974f)) - *(quickstart)* Remove repetitive words ([#1200](https://github.com/orhun/git-cliff/issues/1200)) - ([434f9ee](https://github.com/orhun/git-cliff/commit/434f9ee50709ccb07d0b72fe717c6e2309de3320)) - *(readme)* Fix twitter badge ([#1164](https://github.com/orhun/git-cliff/issues/1164)) - ([68bd85e](https://github.com/orhun/git-cliff/commit/68bd85ed8cd0277bdde19a252091e29ccd9fd8d7)) - *(readme)* Polish badges ([#1159](https://github.com/orhun/git-cliff/issues/1159)) - ([941cc2b](https://github.com/orhun/git-cliff/commit/941cc2b76084d4e4ab177cbe548bdc5e687f9ae1)) - *(remote)* Fix inconsistency in remote integration documentation ([#1165](https://github.com/orhun/git-cliff/issues/1165)) - ([deb29dc](https://github.com/orhun/git-cliff/commit/deb29dc3fc04b0aefb140bfed0fbbd795a8a2452)) - *(website)* Add highlights for 2.10.0 ([#1225](https://github.com/orhun/git-cliff/issues/1225)) - ([a3fe8c9](https://github.com/orhun/git-cliff/commit/a3fe8c95fec8dad9f048626f4b2b1aec9b895cf4)) - *(website)* Add installation instructions for gentoo-linux ([#1203](https://github.com/orhun/git-cliff/issues/1203)) - ([07fe6bf](https://github.com/orhun/git-cliff/commit/07fe6bfb7624688c99879e761e124ae092afb737)) ### 🎨 Styling - *(formatting)* Use spaces instead of tabs ([#1184](https://github.com/orhun/git-cliff/issues/1184)) - ([0027300](https://github.com/orhun/git-cliff/commit/00273009e7553229bccc02e9f4a00d6f8acb9cd5)) ### 🧪 Testing - *(fixture)* Add test fixture for overriding the conventional scope ([#1166](https://github.com/orhun/git-cliff/issues/1166)) - ([cb84a08](https://github.com/orhun/git-cliff/commit/cb84a08e60ca4c0f6108c95b4f2a62d47069014b)) ### ⚙️ Miscellaneous Tasks - *(build)* Bump MSRV to 1.85.1 - ([d8279d4](https://github.com/orhun/git-cliff/commit/d8279d4d047ebf9e7c00948bbba266ccc75d262a)) - *(cd)* Use macos-15 runner - ([c156fc5](https://github.com/orhun/git-cliff/commit/c156fc5edb405737b62a802ed9b1e91f9789ef9b)) - *(cd)* Re-enable sccache for maturin - ([871c3c9](https://github.com/orhun/git-cliff/commit/871c3c949d9f0cb23600a0f4d16e360d20d32ad7)) - *(crate)* Remove Rust nightly requirement - ([4f3e5af](https://github.com/orhun/git-cliff/commit/4f3e5af46bb51e412dff88001b3d135d8575bbe8)) - *(fixture)* Update test-regex-json-array fixture ([#1178](https://github.com/orhun/git-cliff/issues/1178)) - ([95f4056](https://github.com/orhun/git-cliff/commit/95f40563a3a9607143e0acc03e81bdeef479bf09)) - *(format)* Format module imports for readability ([#1183](https://github.com/orhun/git-cliff/issues/1183)) - ([6db7d49](https://github.com/orhun/git-cliff/commit/6db7d49488a248a2fab010480cb955621d4bcf5a)) - *(git)* Add .git-blame-ignore-revs - ([5b64131](https://github.com/orhun/git-cliff/commit/5b641319336485bbf1294c5da2e9f95378799864)) - *(npm)* Bump git-cliff to 2.9.1 ([#1156](https://github.com/orhun/git-cliff/issues/1156)) - ([e13b158](https://github.com/orhun/git-cliff/commit/e13b158744bddb17154963f777cb58b4ba424205)) - *(website)* Update the node version - ([566c2a1](https://github.com/orhun/git-cliff/commit/566c2a11ebda002eae566b06d19263bdfa03af30)) ## New Contributors ❤️ * @Nick2bad4u made their first contribution in [#1180](https://github.com/orhun/git-cliff/pull/1180) * @aspann made their first contribution in [#1203](https://github.com/orhun/git-cliff/pull/1203) * @muzimuzhi made their first contribution in [#1200](https://github.com/orhun/git-cliff/pull/1200) * @j-g00da made their first contribution in [#1188](https://github.com/orhun/git-cliff/pull/1188) * @Kriskras99 made their first contribution in [#1173](https://github.com/orhun/git-cliff/pull/1173) * @wetneb made their first contribution in [#1165](https://github.com/orhun/git-cliff/pull/1165) * @gmeligio made their first contribution in [#1170](https://github.com/orhun/git-cliff/pull/1170) * @LitoMore made their first contribution in [#1164](https://github.com/orhun/git-cliff/pull/1164) ## [2.9.1](https://github.com/orhun/git-cliff/compare/v2.9.0..v2.9.1) - 2025-06-03 ### 🐛 Bug Fixes - *(cd)* Upgrade bump-homebrew-formula-action to fix import error - ([2da982f](https://github.com/orhun/git-cliff/commit/2da982f3e7c27ea86eb87625d7371a9bea6587db)) - *(cd)* Disable sccache for maturin - ([f0a2dc6](https://github.com/orhun/git-cliff/commit/f0a2dc6b08f97f3d96e1a33d60a8a56c97c2339b)) ## [2.9.0](https://github.com/orhun/git-cliff/compare/v2.8.0..v2.9.0) - 2025-06-02 ### ⛰️ Features - *(changelog)* Support recursing into submodules ([#1082](https://github.com/orhun/git-cliff/issues/1082)) - ([4a3c0c0](https://github.com/orhun/git-cliff/commit/4a3c0c0312491a8767645ed4d41b2016049dbe4b)) - *(config)* Support configuring with a remote URL ([#1083](https://github.com/orhun/git-cliff/issues/1083)) - ([eb9b6bd](https://github.com/orhun/git-cliff/commit/eb9b6bdff712f63bac74b76e3dfbdc8ef1b3ccc8)) - *(config)* Add `require_conventional` option ([#1061](https://github.com/orhun/git-cliff/issues/1061)) - ([bf50336](https://github.com/orhun/git-cliff/commit/bf50336f5997c28fc95c03eb14b9e70d5d3edddf)) - *(context)* Add release commit range ([#1138](https://github.com/orhun/git-cliff/issues/1138)) - ([3dab0d1](https://github.com/orhun/git-cliff/commit/3dab0d1a5dec3a54c390c1ebdee7ef5131afd162)) - *(git)* Support disabling sorting commits topologically ([#804](https://github.com/orhun/git-cliff/issues/804)) ([#1121](https://github.com/orhun/git-cliff/issues/1121)) - ([c3e25c3](https://github.com/orhun/git-cliff/commit/c3e25c31ee66b86b0e631e023bb4b687f606c599)) - *(remote)* Fetch commits from non-default branches using remotes ([#1086](https://github.com/orhun/git-cliff/issues/1086)) - ([aec41be](https://github.com/orhun/git-cliff/commit/aec41befc701e786c01ec4ba5399c67df1981779)) ### 🐛 Bug Fixes - *(bump)* Check the next version against tag_pattern regex ([#1070](https://github.com/orhun/git-cliff/issues/1070)) - ([c4f0d28](https://github.com/orhun/git-cliff/commit/c4f0d28c39f34bc886c00c51cdeff851beda93de)) - *(bump)* Accept lowercase values for bump_type config ([#1101](https://github.com/orhun/git-cliff/issues/1101)) - ([77632b2](https://github.com/orhun/git-cliff/commit/77632b276001a879ed4e3328a38a1cedfef67ca3)) - *(deps)* Make glob dependency mandatory ([#1035](https://github.com/orhun/git-cliff/issues/1035)) - ([0f653bf](https://github.com/orhun/git-cliff/commit/0f653bf13a52543c5ef492c2d4e81ad085b19321)) - *(fixtures)* Evaluate the rc of git-cliff correctly ([#1104](https://github.com/orhun/git-cliff/issues/1104)) - ([fa54a6a](https://github.com/orhun/git-cliff/commit/fa54a6adbcb8704ee828450f110516ccbb4067de)) - *(fixtures)* Use the correct syntax while checking fixture results ([#1099](https://github.com/orhun/git-cliff/issues/1099)) - ([51af66e](https://github.com/orhun/git-cliff/commit/51af66e30668c3ec8e1336d7a26a7a5d35fcdb76)) - *(git)* Handle worktrees while retrieving the path of repository ([#1054](https://github.com/orhun/git-cliff/issues/1054)) - ([fab02b0](https://github.com/orhun/git-cliff/commit/fab02b09833eb18be6ca540a436b254d13d7c678)) - *(remote)* Fix detection of GitLab merge request sha if commits were squashed ([#1043](https://github.com/orhun/git-cliff/issues/1043)) - ([5f3a3d0](https://github.com/orhun/git-cliff/commit/5f3a3d0b4dbae5ec3239c79148258ba4fb47f376)) - *(submodules)* Fix submodules handling when using custom range ([#1136](https://github.com/orhun/git-cliff/issues/1136)) - ([451a694](https://github.com/orhun/git-cliff/commit/451a694ad4d9db1f0545ef92bd0c6643b3d26600)) - *(template)* Correctly serialize JSON for the commit fields ([#1145](https://github.com/orhun/git-cliff/issues/1145)) - ([e981e1d](https://github.com/orhun/git-cliff/commit/e981e1d1b27a65fc2d2fd51b025c27692a6c8910)) ### 🚜 Refactor - *(config)* Initialize config structs with default values ([#1090](https://github.com/orhun/git-cliff/issues/1090)) - ([9e4bd07](https://github.com/orhun/git-cliff/commit/9e4bd077b5a18922021afd8ffd671b7d7958ee5c)) - *(lint)* Apply clippy suggestions - ([4d3b2d5](https://github.com/orhun/git-cliff/commit/4d3b2d5abefeb3bccf8b8d9faf16d4efd572f3c4)) - *(lint)* Use IOError::other ([#1074](https://github.com/orhun/git-cliff/issues/1074)) - ([30e8193](https://github.com/orhun/git-cliff/commit/30e81930860105f081205ba5c90d1ea5e4b81d48)) ### 📚 Documentation - *(config)* Fix typo on commit.links ([#1132](https://github.com/orhun/git-cliff/issues/1132)) - ([cbeca6d](https://github.com/orhun/git-cliff/commit/cbeca6da93b25a0f2fce38de6e87571268d8d17e)) - *(config)* Update comments for all configuration options ([#1057](https://github.com/orhun/git-cliff/issues/1057)) - ([63129ce](https://github.com/orhun/git-cliff/commit/63129ce0c481c00c06bc9ee6271da76e99a6e933)) - *(quickstart)* Clarify git-cliff command ([#1051](https://github.com/orhun/git-cliff/issues/1051)) - ([cd26bb2](https://github.com/orhun/git-cliff/commit/cd26bb2de35ebd6ba293ee969c3796ac32a08e21)) - *(readme)* Add blog posts from the community ([#1102](https://github.com/orhun/git-cliff/issues/1102)) - ([f302e43](https://github.com/orhun/git-cliff/commit/f302e433d52bed284e97bd75e92589773b52f44f)) - *(release)* Fix Docker Hub URL - ([9babe06](https://github.com/orhun/git-cliff/commit/9babe0649c365f6c499ec6db62450625d8a21987)) - *(security)* Extend security policy ([#1142](https://github.com/orhun/git-cliff/issues/1142)) - ([4c3c946](https://github.com/orhun/git-cliff/commit/4c3c94692d88ee3d9d2931cabeeec67946aba381)) - *(website)* Add highlights for 2.9.0 ([#1153](https://github.com/orhun/git-cliff/issues/1153)) - ([d7f9cf5](https://github.com/orhun/git-cliff/commit/d7f9cf5a02980289efdbf1999011cb69034dd4c7)) - *(website)* Remove references of tj-actions ([#1097](https://github.com/orhun/git-cliff/issues/1097)) - ([729aa47](https://github.com/orhun/git-cliff/commit/729aa47797bfc073850eb24745e692244f4a6381)) ### ⚙️ Miscellaneous Tasks - *(dependabot)* Make dependency updates less noisy - ([cdce20f](https://github.com/orhun/git-cliff/commit/cdce20f39104b797c17a85aa5988c608f3437e11)) - *(dependabot)* Check dependency updates weekly - ([b8be055](https://github.com/orhun/git-cliff/commit/b8be05542f0f8362522794c155bf0e0445bcee22)) - *(docs)* Fix some typos ([#1149](https://github.com/orhun/git-cliff/issues/1149)) - ([7148b2d](https://github.com/orhun/git-cliff/commit/7148b2dbff518eb71c276f3c256db49970730863)) - *(project)* Migrate to Rust 2024 edition ([#1128](https://github.com/orhun/git-cliff/issues/1128)) - ([4445f06](https://github.com/orhun/git-cliff/commit/4445f063518bd8514ac19381e3ee6c61828c72a9)) ## New Contributors ❤️ * @vardbabayan made their first contribution in [#1149](https://github.com/orhun/git-cliff/pull/1149) * @ognis1205 made their first contribution in [#1145](https://github.com/orhun/git-cliff/pull/1145) * @janderssonse made their first contribution in [#1142](https://github.com/orhun/git-cliff/pull/1142) * @jdrst made their first contribution in [#1138](https://github.com/orhun/git-cliff/pull/1138) * @lehmanju made their first contribution in [#1136](https://github.com/orhun/git-cliff/pull/1136) * @Jean-Beru made their first contribution in [#1132](https://github.com/orhun/git-cliff/pull/1132) * @william-stacken made their first contribution in [#1086](https://github.com/orhun/git-cliff/pull/1086) * @SebClapie made their first contribution in [#1121](https://github.com/orhun/git-cliff/pull/1121) * @okydk made their first contribution in [#1051](https://github.com/orhun/git-cliff/pull/1051) ## [2.8.0](https://github.com/orhun/git-cliff/compare/v2.7.0..v2.8.0) - 2025-01-24 ### ⛰️ Features - *(cli)* Support initializing config with a custom filename ([#992](https://github.com/orhun/git-cliff/issues/992)) - ([76bf9cf](https://github.com/orhun/git-cliff/commit/76bf9cf7aa26b58f2ae68edd007c9885b02af616)) - *(config)* Discover the configuration file when run in a sub directory - ([a23eeb4](https://github.com/orhun/git-cliff/commit/a23eeb480961cd2b252acb7e1e6dc38807458e57)) - *(git)* Improve the set commit range error ([#990](https://github.com/orhun/git-cliff/issues/990)) - ([f29e815](https://github.com/orhun/git-cliff/commit/f29e8150a8166d7364ed71b24675136d2e9bd382)) - *(monorepo)* Automatically set include-path for current directory - ([ceda1f7](https://github.com/orhun/git-cliff/commit/ceda1f753adc3459b88417ae363410d2586a33af)) - *(remote)* Support enabling native TLS ([#1021](https://github.com/orhun/git-cliff/issues/1021)) - ([fe7c464](https://github.com/orhun/git-cliff/commit/fe7c464c3bdbfd4e49f596615d6736ea441a4d16)) - *(repo)* Allow running from sub directories ([#975](https://github.com/orhun/git-cliff/issues/975)) - ([98453b3](https://github.com/orhun/git-cliff/commit/98453b3eee754e1ffe08b685d84c039b17ac8e5e)) ### 🐛 Bug Fixes - *(config)* Allow environment overwrites when using builtin config ([#961](https://github.com/orhun/git-cliff/issues/961)) - ([7ba3b55](https://github.com/orhun/git-cliff/commit/7ba3b55448bdbf7a4a475df2081b6d7c2e2ceb34)) - *(docker)* Use the correct Debian runner - ([36ad993](https://github.com/orhun/git-cliff/commit/36ad993d5956270c0df8c12d201068c1b4d7c580)) - *(fixtures)* Update the arguments for custom GitLab API fixture test - ([e522f8d](https://github.com/orhun/git-cliff/commit/e522f8d9f1efddc43a15120e52a2f1b426468b56)) - *(monorepo)* Do not set include-path if workdir is set ([#1022](https://github.com/orhun/git-cliff/issues/1022)) - ([20483be](https://github.com/orhun/git-cliff/commit/20483be93fbcd33eae3b7b54f625e53796281aff)) - *(remote)* Fix detection of GitLab merge request sha ([#968](https://github.com/orhun/git-cliff/issues/968)) - ([1297655](https://github.com/orhun/git-cliff/commit/12976550d35bad8d535518010046bd136875736b)) ### 🚜 Refactor - *(lib)* Add changelog modifier callback to run function ([#922](https://github.com/orhun/git-cliff/issues/922)) - ([2321882](https://github.com/orhun/git-cliff/commit/2321882b12cc6aae03fbd4f7ea3e131fc8763631)) - *(lint)* Use a shared lint config for the workspace - ([bfc1d4f](https://github.com/orhun/git-cliff/commit/bfc1d4fb8f8bd8faa350ec217f4d09d57c20b12d)) - *(lint)* Apply clippy suggestions - ([299a1c7](https://github.com/orhun/git-cliff/commit/299a1c74b28ac41015bc436de6d37b5ef5d59b04)) ### 📚 Documentation - *(docker)* Fix typo in comment ([#959](https://github.com/orhun/git-cliff/issues/959)) - ([dbda091](https://github.com/orhun/git-cliff/commit/dbda091aa15806523c2be371ec8a31fbba4ccdc7)) - *(highlights)* Add link to the Nix flake - ([c449229](https://github.com/orhun/git-cliff/commit/c449229513da7444ea02fe275f410e4b2048c9ff)) - *(jujutsu)* Update links to the upstream documentation - ([ed6b646](https://github.com/orhun/git-cliff/commit/ed6b64628f4bfd21b32021b3decf842ae14c9f51)) - *(lib)* Allow doc lint - ([62a6d3e](https://github.com/orhun/git-cliff/commit/62a6d3e20cf72c8e2dcc7938894c5c65278e6c4e)) - *(license)* Update copyright years - ([8178c9b](https://github.com/orhun/git-cliff/commit/8178c9b2ca41fb0b974d3387e07b3067256bdb0b)) - *(tips)* Extend the merge commit filter example ([#963](https://github.com/orhun/git-cliff/issues/963)) - ([09c0f90](https://github.com/orhun/git-cliff/commit/09c0f905d8b20b585b0bc8183f14250d1a381ca0)) - *(website)* Add highlights for 2.8.0 ([#1023](https://github.com/orhun/git-cliff/issues/1023)) - ([32dc15e](https://github.com/orhun/git-cliff/commit/32dc15efe5ea8be8f1691fbc16d9e5aaa1c5ebdc)) ### 🧪 Testing - *(fixture)* Add fixture for include-path - ([e85888f](https://github.com/orhun/git-cliff/commit/e85888f5d8dbd4db0674613c4c354416a9be84d1)) ### ⚙️ Miscellaneous Tasks - *(build)* Bump MSRV to 1.83.0 - ([37598c2](https://github.com/orhun/git-cliff/commit/37598c2d417a1646ec90590ab2a1f6d9da66296c)) - *(docker)* Bump the Rust version in Docker image - ([729f433](https://github.com/orhun/git-cliff/commit/729f4336d169e9fc5cdefdb201208638eee17995)) - *(funding)* Add wellKnown directory - ([8704518](https://github.com/orhun/git-cliff/commit/8704518fb71b88fa8985c660e67f77d9a33431c8)) - *(lint)* Allow false positive lint - ([1b779a6](https://github.com/orhun/git-cliff/commit/1b779a698f845cb449da0640aeac45d53c6c43b9)) - *(nix)* Update flakes - ([22fbe9d](https://github.com/orhun/git-cliff/commit/22fbe9dafbbeaa4bd68082787ea8231dbe12c9ae)) ## New Contributors ❤️ * @xsadia made their first contribution in [#992](https://github.com/orhun/git-cliff/pull/992) * @chenrui333 made their first contribution in [#1002](https://github.com/orhun/git-cliff/pull/1002) * @hackenbergstefan made their first contribution in [#968](https://github.com/orhun/git-cliff/pull/968) * @paul-uz made their first contribution in [#963](https://github.com/orhun/git-cliff/pull/963) * @jmartens made their first contribution in [#959](https://github.com/orhun/git-cliff/pull/959) ## [2.7.0](https://github.com/orhun/git-cliff/compare/v2.6.1..v2.7.0) - 2024-11-20 ### ⛰️ Features - *(args)* Add color to the help text ([#897](https://github.com/orhun/git-cliff/issues/897)) - ([f423484](https://github.com/orhun/git-cliff/commit/f4234844bf66da3de8d5d6e1d6fd7a414d2e059a)) - *(ci)* Add Nix CI ([#939](https://github.com/orhun/git-cliff/issues/939)) - ([d0848ff](https://github.com/orhun/git-cliff/commit/d0848ff04099a287157fbd22935f870e0636139d)) - *(config)* Allow overriding the remote API URL via config ([#896](https://github.com/orhun/git-cliff/issues/896)) - ([6d86e2c](https://github.com/orhun/git-cliff/commit/6d86e2c9426f7f68207c2ea389629e67eca54277)) - *(docker)* Build arm64 images again ([#879](https://github.com/orhun/git-cliff/issues/879)) ([#919](https://github.com/orhun/git-cliff/issues/919)) - ([84771f6](https://github.com/orhun/git-cliff/commit/84771f63d04bafec8023a7e9fd4694da6e4d9a25)) - *(jujutsu)* Add jujustu support ([#930](https://github.com/orhun/git-cliff/issues/930)) - ([ab95626](https://github.com/orhun/git-cliff/commit/ab956263945798ec07214a5234ba6fafa8171ff7)) - *(nix)* Add a basic Nix environment ([#918](https://github.com/orhun/git-cliff/issues/918)) - ([6b17736](https://github.com/orhun/git-cliff/commit/6b1773685f09a5e091b10f709b3a4f63b63c47b9)) - *(website)* Add user testimonials ([#895](https://github.com/orhun/git-cliff/issues/895)) - ([ef2374c](https://github.com/orhun/git-cliff/commit/ef2374cab17e896b38b12bfe7d6b011f45e9f840)) ### 🐛 Bug Fixes - *(bitbucket)* Match PR and release metadata correctly ([#907](https://github.com/orhun/git-cliff/issues/907)) - ([e936ed5](https://github.com/orhun/git-cliff/commit/e936ed571533ea6c41a1dd2b1a29d085c8dbada5)) - *(changelog)* Fix missing commit fields in context ([#837](https://github.com/orhun/git-cliff/issues/837)) ([#920](https://github.com/orhun/git-cliff/issues/920)) - ([f8641ee](https://github.com/orhun/git-cliff/commit/f8641ee8f75da74637ab1f0d3d7c11bfcda8acf9)) - *(changelog)* Include the root commit when `--latest` is used with one tag ([#901](https://github.com/orhun/git-cliff/issues/901)) - ([508a97e](https://github.com/orhun/git-cliff/commit/508a97edb088f77d01f232676d1e3c7f129071b2)) - *(remote)* Preserve first time contributors ([#925](https://github.com/orhun/git-cliff/issues/925)) - ([99b78b5](https://github.com/orhun/git-cliff/commit/99b78b52f2d81484fa4e5ea7a66de6e9bea2b3df)) ### 📚 Documentation - *(git)* Improve docs for commit_preprocessors and commit_parsers ([#928](https://github.com/orhun/git-cliff/issues/928)) - ([c1f1215](https://github.com/orhun/git-cliff/commit/c1f12154e7efa75f19ce632dc3052dae390c9211)) - *(readme)* Add blog post about git-cliff - ([82b10ac](https://github.com/orhun/git-cliff/commit/82b10ac22c657113f8f7f215bdc1bee68ebe1e55)) - *(website)* Add highlights for 2.7.0 ([#955](https://github.com/orhun/git-cliff/issues/955)) - ([b6b5449](https://github.com/orhun/git-cliff/commit/b6b544949d7763056fb87686f533ed814395f253)) - *(website)* Add more testimonials - ([bfe9beb](https://github.com/orhun/git-cliff/commit/bfe9beb093df42badf762945cf04548fbe75949a)) - *(website)* Update sourcehut ([#894](https://github.com/orhun/git-cliff/issues/894)) - ([bcc32ca](https://github.com/orhun/git-cliff/commit/bcc32ca5d1cc157902e04018655c5445237d1407)) ### ⚡ Performance - *(test)* Don't create regex inside a loop ([#937](https://github.com/orhun/git-cliff/issues/937)) - ([0fabf22](https://github.com/orhun/git-cliff/commit/0fabf22c526e1d4b8cb7c718dd0a5d0af99950f8)) ### 🧪 Testing - *(git)* Find upstream remote when using ssh ([#926](https://github.com/orhun/git-cliff/issues/926)) - ([2e65a72](https://github.com/orhun/git-cliff/commit/2e65a72bb044bad94f2568c491e4907f92331a56)) - *(repo)* Expand unit tests of the repo module ([#909](https://github.com/orhun/git-cliff/issues/909)) - ([da1cb61](https://github.com/orhun/git-cliff/commit/da1cb61c9147631c9a2ba6598e3105132b41c2c3)) ### ⚙️ Miscellaneous Tasks - *(config)* Add the 'other' parser to the default config - ([12cb1df](https://github.com/orhun/git-cliff/commit/12cb1df561cde39a9a0d0f719156a000f3f4d61b)) - *(docker)* Upgrade Rust and libc version in Dockerfile - ([8bd0607](https://github.com/orhun/git-cliff/commit/8bd0607e231e219f9b60eb4c7f0d8353ef4462e0)) - *(docker)* Bump the Rust version in Docker image - ([c28121c](https://github.com/orhun/git-cliff/commit/c28121c1aa427c3169df218a9803d838172f7c24)) - *(integration)* Remove experimental feature disclaimer - ([237c327](https://github.com/orhun/git-cliff/commit/237c327839aa12672abe4255a62ce3c85737bd2c)) - *(log)* Add trace log about which command is being run - ([a9b2690](https://github.com/orhun/git-cliff/commit/a9b26901e38aa3d3b1042d3bc10d2fe7c6c06565)) - *(nix)* Update flakes - ([7654e67](https://github.com/orhun/git-cliff/commit/7654e67d971b795e238220dfabe894b2a1b23992)) - *(website)* Add new testimonials - ([0c207d6](https://github.com/orhun/git-cliff/commit/0c207d606e5a65b4dca3287f2aa2b3c6d624f83d)) ### ◀️ Revert - *(docker)* Bump the Rust version in Docker image - ([fc142e4](https://github.com/orhun/git-cliff/commit/fc142e4b9d4b5b54bc8a0fca6e336345951c9c7b)) ## New Contributors ❤️ * @pauliyobo made their first contribution in [#896](https://github.com/orhun/git-cliff/pull/896) * @blackheaven made their first contribution in [#939](https://github.com/orhun/git-cliff/pull/939) * @Muhammad-Owais-Warsi made their first contribution in [#928](https://github.com/orhun/git-cliff/pull/928) * @kemitix made their first contribution in [#930](https://github.com/orhun/git-cliff/pull/930) * @mcwarman made their first contribution in [#925](https://github.com/orhun/git-cliff/pull/925) * @LtdSauce made their first contribution in [#919](https://github.com/orhun/git-cliff/pull/919) * @dqkqd made their first contribution in [#920](https://github.com/orhun/git-cliff/pull/920) * @gsquire made their first contribution in [#909](https://github.com/orhun/git-cliff/pull/909) * @rarescosma made their first contribution in [#901](https://github.com/orhun/git-cliff/pull/901) * @vsn4ik made their first contribution in [#894](https://github.com/orhun/git-cliff/pull/894) ## [2.6.1](https://github.com/orhun/git-cliff/compare/v2.6.0..v2.6.1) - 2024-09-27 ### 🐛 Bug Fixes - *(npm)* Add missing `--use-branch-tags` flag to TS options ([#874](https://github.com/orhun/git-cliff/issues/874)) - ([e21fb1d](https://github.com/orhun/git-cliff/commit/e21fb1d3895d893fd6a371ecd48aa4632cf4231d)) - *(remote)* Avoid setting multiple remotes ([#885](https://github.com/orhun/git-cliff/issues/885)) - ([a344c68](https://github.com/orhun/git-cliff/commit/a344c68238cf3bb87d4f7eb9be46e97cc964eed9)) ### 📚 Documentation - *(website)* Add conversion to pdf to tips-and-tricks ([#889](https://github.com/orhun/git-cliff/issues/889)) - ([58dc108](https://github.com/orhun/git-cliff/commit/58dc1087ed86794c2f678707f2fbb8199167b0c3)) - *(website)* Add get_env filter example for GitLab CI - ([dfe4459](https://github.com/orhun/git-cliff/commit/dfe4459c5cadd465dec4ea860580ecf82b2b8860)) ### ⚙️ Miscellaneous Tasks - *(ci)* Update pedantic lint command ([#890](https://github.com/orhun/git-cliff/issues/890)) - ([8d10edb](https://github.com/orhun/git-cliff/commit/8d10edb7450aaf189fbce5f78a72274739f73ba9)) - *(docker)* Disable building arm64 docker images temporarily ([#879](https://github.com/orhun/git-cliff/issues/879)) - ([cde2a8e](https://github.com/orhun/git-cliff/commit/cde2a8e3222f5e8f8bdd9ae841fd0e5c42f68846)) - *(fixtures)* Build binaries using dev profile ([#886](https://github.com/orhun/git-cliff/issues/886)) - ([a394f88](https://github.com/orhun/git-cliff/commit/a394f88f1d1742dfa3d30887bcb387361de306bc)) ## New Contributors ❤️ * @ckrenslehner made their first contribution in [#889](https://github.com/orhun/git-cliff/pull/889) ## [2.6.0](https://github.com/orhun/git-cliff/compare/v2.5.0..v2.6.0) - 2024-09-22 ### ⛰️ Features - *(changelog)* Support generating changelog for different branches ([#808](https://github.com/orhun/git-cliff/issues/808)) - ([2a581a8](https://github.com/orhun/git-cliff/commit/2a581a82bbdee057eff8051b261edc9a8c7f4491)) - *(config)* Add changelog.render_always option ([#859](https://github.com/orhun/git-cliff/issues/859)) - ([ad039d5](https://github.com/orhun/git-cliff/commit/ad039d56b66563cc0299035650582a0518e94679)) - *(config)* Allow configuring output file from config ([#829](https://github.com/orhun/git-cliff/issues/829)) - ([c2db791](https://github.com/orhun/git-cliff/commit/c2db791a6e2891b5eb46f40d43a490fc6923d038)) - *(core)* Add `remote` to commit and deprecate fields ([#822](https://github.com/orhun/git-cliff/issues/822)) - ([87e2c1d](https://github.com/orhun/git-cliff/commit/87e2c1d0dd251c81796f607699d2c85ee12584ac)) - *(npm)* Add missing options and document all options with tsdoc comments - ([2eae2f1](https://github.com/orhun/git-cliff/commit/2eae2f1f1f258b6c270e544d12fae1b150fb2610)) - *(npm)* Add possibility for `skipCommit` to take an array of values - ([a6e3b78](https://github.com/orhun/git-cliff/commit/a6e3b78948a730aae18f156b2fb787b7ff26bb64)) ### 🐛 Bug Fixes - *(args)* Support using use_branch_tags from both config and args ([#848](https://github.com/orhun/git-cliff/issues/848)) - ([35b7fd8](https://github.com/orhun/git-cliff/commit/35b7fd8007e781b65ef6c3112a349bfd8c8fda15)) - *(bump)* Suppress template warning when `--bumped-version` is used ([#855](https://github.com/orhun/git-cliff/issues/855)) - ([8bebbf9](https://github.com/orhun/git-cliff/commit/8bebbf9f575e6e3f1bc50332e5703fde9dd1b55f)) - *(changelog)* Do not change the tag date if tag already exists ([#861](https://github.com/orhun/git-cliff/issues/861)) - ([fbb643b](https://github.com/orhun/git-cliff/commit/fbb643b2e1096ac74a6ea9e9881ed4fd8161d3be)) - *(changelog)* Correctly set the tag message for the latest release ([#854](https://github.com/orhun/git-cliff/issues/854)) - ([e41e8dd](https://github.com/orhun/git-cliff/commit/e41e8dd4a2e5ed12149078492cf6fd6eedebd0fa)) - *(changelog)* Don't change the context when provided via `--from-context` ([#820](https://github.com/orhun/git-cliff/issues/820)) - ([ff72406](https://github.com/orhun/git-cliff/commit/ff7240633fcb46e6190dfed22150cbf8d3012df5)) - *(commit)* Trim the trailing newline for git2 commits ([#872](https://github.com/orhun/git-cliff/issues/872)) - ([1cdbbf6](https://github.com/orhun/git-cliff/commit/1cdbbf604c27c8a597f72985b1d15359244e5186)) - *(core)* Avoid the unnecessary loop when no remote feature is activated - ([1d8a2fe](https://github.com/orhun/git-cliff/commit/1d8a2fe84917d7bc7c0cb26afc559198ad806184)) - *(template)* Resolve parsing issues with `raw`/`endraw` in Jinja ([#824](https://github.com/orhun/git-cliff/issues/824)) - ([63bf5b7](https://github.com/orhun/git-cliff/commit/63bf5b7438e2660d410ca825c63b1982fd4d43f5)) ### 🚜 Refactor - *(template)* [**breaking**] Add name parameter to the constructor - ([e577113](https://github.com/orhun/git-cliff/commit/e577113bd69147936e391976c8b06cba76764eec)) ### 📚 Documentation - *(args)* Fix copy-paste mistake where gitea mentioned gitlab - ([c41eacb](https://github.com/orhun/git-cliff/commit/c41eacb0b8181a26d95744e26965272cc105f629)) - *(contributing)* Mention fetching the tags for running tests successfully ([#850](https://github.com/orhun/git-cliff/issues/850)) - ([a82dac3](https://github.com/orhun/git-cliff/commit/a82dac3cb15490f5b4e543d2f404e54a5126395c)) - *(website)* Add highlights for 2.6.0 ([#873](https://github.com/orhun/git-cliff/issues/873)) - ([050fb55](https://github.com/orhun/git-cliff/commit/050fb55e86fd2f33fccd5760ddd4913602d5a552)) - *(website)* Clarify comment about tag argument - ([e56cd8d](https://github.com/orhun/git-cliff/commit/e56cd8de17f08461dcff4ff88518872577fb73fb)) ### ⚙️ Miscellaneous Tasks - *(ci)* Check pedantic lints ([#853](https://github.com/orhun/git-cliff/issues/853)) - ([c77420c](https://github.com/orhun/git-cliff/commit/c77420cf5a35e2658125030b6d9aee97a1e1bd57)) - *(examples)* Improve example templates ([#835](https://github.com/orhun/git-cliff/issues/835)) - ([08e761c](https://github.com/orhun/git-cliff/commit/08e761c20fb98730249aef2047da02a7dfca86ad)) - *(lib)* Fix typos in code comments - ([81854d2](https://github.com/orhun/git-cliff/commit/81854d2166fc265168effde50fa892265b83efdf)) - *(npm)* Bump dev dependencies - ([61b86f1](https://github.com/orhun/git-cliff/commit/61b86f162bee28fffb3b3b06f19261d568fbf60b)) ## New Contributors ❤️ * @nejcgalof made their first contribution in [#853](https://github.com/orhun/git-cliff/pull/853) * @pplmx made their first contribution in [#824](https://github.com/orhun/git-cliff/pull/824) ## [2.5.0](https://github.com/orhun/git-cliff/compare/v2.4.0..v2.5.0) - 2024-08-24 ### ⛰️ Features - *(args)* Allow GitLab groups with `--gitlab-repo` ([#807](https://github.com/orhun/git-cliff/issues/807)) - ([6fbfdb5](https://github.com/orhun/git-cliff/commit/6fbfdb5963ad7d39a389001b660df5bf7f38dd37)) - *(bump)* Support bumping to a specific semver type ([#744](https://github.com/orhun/git-cliff/issues/744)) - ([9dbf47b](https://github.com/orhun/git-cliff/commit/9dbf47bac596be7bacc335e8afa3cdc383dc8ebb)) - *(changelog)* Support count_tags option ([#599](https://github.com/orhun/git-cliff/issues/599)) - ([b8045e9](https://github.com/orhun/git-cliff/commit/b8045e97ed2b50eee68cb29d5fd28e350c6ca745)) - *(changelog)* Skip ssh and x509 signatures in tag messages ([#748](https://github.com/orhun/git-cliff/issues/748)) - ([ecbabbf](https://github.com/orhun/git-cliff/commit/ecbabbfb39b986e8445d2feb3189bab4307fd854)) - *(cli)* Generate changelog from JSON context ([#784](https://github.com/orhun/git-cliff/issues/784)) - ([3b6156d](https://github.com/orhun/git-cliff/commit/3b6156ddd66a256a89e12da98b5cbc611a394c72)) - *(parser)* Allow whole commit context to be used in commit parsers ([#758](https://github.com/orhun/git-cliff/issues/758)) - ([ccf2ab7](https://github.com/orhun/git-cliff/commit/ccf2ab769aef9fc6d9bbaebc02c41fe4105da24c)) - *(profiler)* Support performance profiling via pprof ([#768](https://github.com/orhun/git-cliff/issues/768)) - ([35dc1e4](https://github.com/orhun/git-cliff/commit/35dc1e46fd57c32dc475ac545a86013a5c3258c8)) - *(remote)* Activate integration if remote is set manually ([#782](https://github.com/orhun/git-cliff/issues/782)) - ([4b33e7e](https://github.com/orhun/git-cliff/commit/4b33e7e9869bde035d70ae9525c917340ff90bc3)) ### 🐛 Bug Fixes - *(changelog)* Allow using `--bumped-version` without conventional commits ([#806](https://github.com/orhun/git-cliff/issues/806)) - ([e74080c](https://github.com/orhun/git-cliff/commit/e74080cec4283a45f0f81b1b656af466ae4bd693)) - *(config)* Allow using environment variables without config file present ([#783](https://github.com/orhun/git-cliff/issues/783)) - ([2471745](https://github.com/orhun/git-cliff/commit/2471745e110955be49310afe11e24719ab79b658)) - *(fixture)* Fix fetching repository for gitlab integration test - ([72847c6](https://github.com/orhun/git-cliff/commit/72847c6c7e71bf8f5b452f4943f0ddfc99cf6cb5)) - *(gitlab)* URL-encode the owner in remote requests for GitLab ([#742](https://github.com/orhun/git-cliff/issues/742)) - ([e3e7c07](https://github.com/orhun/git-cliff/commit/e3e7c0794082e418a78f99e7d9c09161f4d14d5f)) - *(template)* Include for-loop arguments in template variables ([#812](https://github.com/orhun/git-cliff/issues/812)) - ([9a6430b](https://github.com/orhun/git-cliff/commit/9a6430bc5142d356d16df2ce96869f7a0af05493)) ### 🚜 Refactor - *(config)* Make example templates more user-friendly - ([6f8ea19](https://github.com/orhun/git-cliff/commit/6f8ea19baafea2718a00a046b74f0cbbfacc8d46)) - *(gitlab)* Clean up url encoding for GitLab - ([c791418](https://github.com/orhun/git-cliff/commit/c791418c7e86def636ed2e0aac8d7cc30ef88791)) - *(lib)* Clean up some code ([#709](https://github.com/orhun/git-cliff/issues/709)) - ([4b0c0eb](https://github.com/orhun/git-cliff/commit/4b0c0eb09abf1264b5cc92bf40f75c8e05e17da6)) ### 📚 Documentation - *(config)* Fix typo in comment of default config file ([#776](https://github.com/orhun/git-cliff/issues/776)) - ([e2fb043](https://github.com/orhun/git-cliff/commit/e2fb0430786c1f746a7eb2a1b299f8491df2c584)) - *(readme)* Remove underscored spaces between badges ([#809](https://github.com/orhun/git-cliff/issues/809)) - ([1956c83](https://github.com/orhun/git-cliff/commit/1956c8321e4ef2c5ceb46631e5370fbb66a999b2)) - *(readme)* Add git-changelog to similar projects section ([#774](https://github.com/orhun/git-cliff/issues/774)) - ([c208a97](https://github.com/orhun/git-cliff/commit/c208a9791e3899668d48947f59757613f4e5fba1)) - *(readme)* Add KaiCode Open Source Festival link - ([58b729c](https://github.com/orhun/git-cliff/commit/58b729c71f7255589fa6645163d355309a04dd7a)) - *(website)* Add highlights for 2.5.0 ([#815](https://github.com/orhun/git-cliff/issues/815)) - ([49df8cb](https://github.com/orhun/git-cliff/commit/49df8cb0d6880e5a1ef806d17b066070c7492f3a)) - *(website)* Clarify authentication with GitHub token ([#787](https://github.com/orhun/git-cliff/issues/787)) - ([85bfa95](https://github.com/orhun/git-cliff/commit/85bfa952e48108dbdcfa49105d072b3170d08a0f)) - *(website)* Correct inverted consequences of configuration value ([#760](https://github.com/orhun/git-cliff/issues/760)) - ([dc144dd](https://github.com/orhun/git-cliff/commit/dc144dd9d0451ec5240efa36d83c187720a17323)) - *(website)* Add header to 2.4.0 blog post - ([227a307](https://github.com/orhun/git-cliff/commit/227a307d8563e942f4d1e97b53e21953148395f6)) ### ⚡ Performance - *(changelog)* Cache commit retain checks (258 times faster generation) ([#772](https://github.com/orhun/git-cliff/issues/772)) - ([8430c5c](https://github.com/orhun/git-cliff/commit/8430c5c539a8de34f465e33fe43aed560cd581ca)) ### ⚙️ Miscellaneous Tasks - *(cd)* Remove unnecessary git-cliff-action output file ([#738](https://github.com/orhun/git-cliff/issues/738)) - ([9f39bcb](https://github.com/orhun/git-cliff/commit/9f39bcb8bf87ede149c11be0eb913583ded191c5)) - *(config)* Include new contributors in repository changelog - ([5474978](https://github.com/orhun/git-cliff/commit/5474978f8aa72112595e342864138b9b14fb6366)) - *(config)* Check for null commit_id in detailed template ([#786](https://github.com/orhun/git-cliff/issues/786)) - ([388b007](https://github.com/orhun/git-cliff/commit/388b007b0f7a6beb66e045a6007f17c1642953e1)) - *(config)* Fix comment for changelog header template - ([35b886e](https://github.com/orhun/git-cliff/commit/35b886e50dd13e85436b36d9b1280a88eafdccf8)) - *(config)* Update keepachangelog.toml comment ([#779](https://github.com/orhun/git-cliff/issues/779)) - ([f9e500e](https://github.com/orhun/git-cliff/commit/f9e500e27c543807e28132aa6c34244cd3c4238b)) - *(website)* Remove v2 announcement - ([a71649b](https://github.com/orhun/git-cliff/commit/a71649b6cd5a72c2a6b20c08dc1b8dfa37c19a6b)) - *(website)* Add discord button to navbar - ([565b9c8](https://github.com/orhun/git-cliff/commit/565b9c8df0e1a3eb3b5a4415cadfcae065743a40)) ## New Contributors ❤️ * @weichweich made their first contribution in [#807](https://github.com/orhun/git-cliff/pull/807) * @janbuchar made their first contribution in [#784](https://github.com/orhun/git-cliff/pull/784) * @rich-ayr made their first contribution in [#809](https://github.com/orhun/git-cliff/pull/809) * @tisonkun made their first contribution in [#599](https://github.com/orhun/git-cliff/pull/599) * @DerTiedemann made their first contribution in [#758](https://github.com/orhun/git-cliff/pull/758) * @DaniPopes made their first contribution in [#709](https://github.com/orhun/git-cliff/pull/709) * @artrz made their first contribution in [#779](https://github.com/orhun/git-cliff/pull/779) * @braineo made their first contribution in [#744](https://github.com/orhun/git-cliff/pull/744) * @myl7 made their first contribution in [#776](https://github.com/orhun/git-cliff/pull/776) * @pawamoy made their first contribution in [#774](https://github.com/orhun/git-cliff/pull/774) * @tonybutt made their first contribution in [#742](https://github.com/orhun/git-cliff/pull/742) * @PigeonF made their first contribution in [#748](https://github.com/orhun/git-cliff/pull/748) ## [2.4.0](https://github.com/orhun/git-cliff/compare/v2.3.0..v2.4.0) - 2024-06-26 ### ⛰️ Features - *(args)* Add `--ignore-tags` argument ([#696](https://github.com/orhun/git-cliff/issues/696)) - ([94891c2](https://github.com/orhun/git-cliff/commit/94891c2c27b1f46cb840fbea1e167c161609cbcd)) - *(bump)* Support bumping based on configurable custom pattern ([#725](https://github.com/orhun/git-cliff/issues/725)) - ([8e03356](https://github.com/orhun/git-cliff/commit/8e03356706c8aa89eac80953bc2a01ed3f93bb52)) - *(bump)* Support setting the `initial_tag` ([#701](https://github.com/orhun/git-cliff/issues/701)) - ([7341500](https://github.com/orhun/git-cliff/commit/734150020e1e2763eaac7aa10acf80f82169b60e)) - *(changelog)* Add tag message to release context ([#713](https://github.com/orhun/git-cliff/issues/713)) - ([3eb828e](https://github.com/orhun/git-cliff/commit/3eb828e69ad3a5b94833f67dfe287e7d8b31a274)) - *(changelog)* Make `changelog.header` a template ([#698](https://github.com/orhun/git-cliff/issues/698)) - ([9fc12bb](https://github.com/orhun/git-cliff/commit/9fc12bb90cac732d8621446e4d4de775e7f0ba9a)) - *(changelog)* Support parsing commits by footer ([#569](https://github.com/orhun/git-cliff/issues/569)) - ([50c240c](https://github.com/orhun/git-cliff/commit/50c240c25b632c670b23e0bac943ff94eeb3dfb7)) - *(changelog)* Make remote data available in context ([#703](https://github.com/orhun/git-cliff/issues/703)) - ([d14774a](https://github.com/orhun/git-cliff/commit/d14774ae4afb086819d9669dfc050fac1c237de8)) - *(codeberg)* Add Gitea support ([#680](https://github.com/orhun/git-cliff/issues/680)) - ([403d3dc](https://github.com/orhun/git-cliff/commit/403d3dcd32246fba5c1e1c50bc1f95410e3ee5e4)) - *(context)* Add repository path to template context ([#721](https://github.com/orhun/git-cliff/issues/721)) - ([e7807e1](https://github.com/orhun/git-cliff/commit/e7807e13c4b38aaa4a735ff05b69fdd6b57a7a85)) ### 🐛 Bug Fixes - *(fixture)* Support running fixtures on mingw64 ([#708](https://github.com/orhun/git-cliff/issues/708)) - ([dabe716](https://github.com/orhun/git-cliff/commit/dabe716c201fedf3021d89c5a8564794bda07f2a)) - *(website)* Update dependencies to fix search issue - ([8a9f9f4](https://github.com/orhun/git-cliff/commit/8a9f9f48da42ec95f47a169370c6c5cdf2a0b327)) ### 🚜 Refactor - *(bump)* Add documentation and simplify implementation - ([bea4916](https://github.com/orhun/git-cliff/commit/bea49161e9bd9bc999889aca22ed4c0f18f53ca1)) ### 📚 Documentation - *(website)* Add highlights for 2.4.0 ([#729](https://github.com/orhun/git-cliff/issues/729)) - ([5558cc5](https://github.com/orhun/git-cliff/commit/5558cc51b17cbc9c09bf9a2938ed227f1d1bda11)) - *(website)* Add more context about `ignore_tags` matching commits ([#710](https://github.com/orhun/git-cliff/issues/710)) - ([854b411](https://github.com/orhun/git-cliff/commit/854b411e474b21c870afb0636512b471bf737c4c)) - *(website)* Fix link to github-keepachangelog template ([#694](https://github.com/orhun/git-cliff/issues/694)) - ([eac2195](https://github.com/orhun/git-cliff/commit/eac2195963e1688cd865969a01cc944d6a4af7b4)) - *(website)* Add information about `--bump` with `tag prefixes` ([#695](https://github.com/orhun/git-cliff/issues/695)) - ([4cd18c2](https://github.com/orhun/git-cliff/commit/4cd18c2bcdb2ce21234776364598d42261df004d)) ### 🎨 Styling - *(lint)* Fix formatting - ([5b58a37](https://github.com/orhun/git-cliff/commit/5b58a3771d056a95b9ec93ff4a7d0d5bf49b8473)) - *(lint)* Fix formatting ([#702](https://github.com/orhun/git-cliff/issues/702)) - ([b7e323f](https://github.com/orhun/git-cliff/commit/b7e323f8ec948f7ab9d2f821e0da77e4d936475d)) ### 🧪 Testing - *(template)* Add tests ([#674](https://github.com/orhun/git-cliff/issues/674)) - ([a51422d](https://github.com/orhun/git-cliff/commit/a51422dda9431a3f24b4b061ab055ac97fa018de)) ## New Contributors ❤️ * @bukowa made their first contribution in [#710](https://github.com/orhun/git-cliff/pull/710) * @MeitarR made their first contribution in [#713](https://github.com/orhun/git-cliff/pull/713) * @Cyclonit made their first contribution in [#698](https://github.com/orhun/git-cliff/pull/698) * @jan-ferdinand made their first contribution in [#569](https://github.com/orhun/git-cliff/pull/569) * @Theta-Dev made their first contribution in [#680](https://github.com/orhun/git-cliff/pull/680) * @tcarmet made their first contribution in [#694](https://github.com/orhun/git-cliff/pull/694) ## [2.3.0](https://github.com/orhun/git-cliff/compare/v2.2.2..v2.3.0) - 2024-06-03 ### ⛰️ Features - *(bitbucket)* Add Bitbucket support ([#663](https://github.com/orhun/git-cliff/issues/663)) - ([8ffc054](https://github.com/orhun/git-cliff/commit/8ffc0548fe0fd8930627412fecb9bc08a7879504)) - *(gitlab)* [**breaking**] Add GitLab support ([#654](https://github.com/orhun/git-cliff/issues/654)) - ([b490f2a](https://github.com/orhun/git-cliff/commit/b490f2a24e3ebeb6ee54382ce9aa642ecff17b01)) - *(output)* Support using stdout via dash (`-o -`) ([#644](https://github.com/orhun/git-cliff/issues/644)) - ([df81f63](https://github.com/orhun/git-cliff/commit/df81f636f53e63d305d06944ff014a21612cb666)) ### 🐛 Bug Fixes - *(args)* Allow -o and -p together if they point to different files ([#653](https://github.com/orhun/git-cliff/issues/653)) - ([076f859](https://github.com/orhun/git-cliff/commit/076f85915386c4769c838ca9a359d216249d2a97)) ### 📚 Documentation - *(nix)* Add installation instructions for Nix ([#669](https://github.com/orhun/git-cliff/issues/669)) - ([63c8ad4](https://github.com/orhun/git-cliff/commit/63c8ad43e9ecaa825ef1f0a67164265497f3a1dd)) - *(website)* Add highlights for 2.3.0 ([#670](https://github.com/orhun/git-cliff/issues/670)) - ([1338703](https://github.com/orhun/git-cliff/commit/1338703a2aedb4116dcae849ada4941432f57e74)) - *(website)* Clean up Nix docs - ([2c2a300](https://github.com/orhun/git-cliff/commit/2c2a300616fa151b91858a2a7d88bdc9b9dae497)) - *(website)* Add more git range examples ([#655](https://github.com/orhun/git-cliff/issues/655)) - ([d451252](https://github.com/orhun/git-cliff/commit/d4512521fbcfb971c94aa7794d78bced1ddec7a1)) ### ⚙️ Miscellaneous Tasks - *(cd)* Use macos-14 runner - ([22c94ed](https://github.com/orhun/git-cliff/commit/22c94ed8355d71a5fe99d8c1e9c8a3824338debf)) - *(example)* Allow using github template without github variables ([#672](https://github.com/orhun/git-cliff/issues/672)) - ([6a9feba](https://github.com/orhun/git-cliff/commit/6a9feba98f36de1980bab313f6b0a861f5009d71)) - *(links)* Ignore patreon links - ([bfe2774](https://github.com/orhun/git-cliff/commit/bfe27744701296185d2f1d37dba7cfb48bd70519)) ## New Contributors ❤️ * @R11baka made their first contribution in [#672](https://github.com/orhun/git-cliff/pull/672) * @0x61nas made their first contribution in [#669](https://github.com/orhun/git-cliff/pull/669) * @dark0dave made their first contribution in [#663](https://github.com/orhun/git-cliff/pull/663) * @antonengelhardt made their first contribution in [#653](https://github.com/orhun/git-cliff/pull/653) ## [2.2.2](https://github.com/orhun/git-cliff/compare/v2.2.1..v2.2.2) - 2024-05-11 ### ⛰️ Features - *(changelog)* Allow adding custom context ([#613](https://github.com/orhun/git-cliff/issues/613)) - ([522bd53](https://github.com/orhun/git-cliff/commit/522bd536a4ad63dfbfbaebcac8a92202b32b202f)) ### 🐛 Bug Fixes - *(changelog)* Ignore empty lines when using `split_commits` ([#608](https://github.com/orhun/git-cliff/issues/608)) - ([b8fb852](https://github.com/orhun/git-cliff/commit/b8fb85220e86138ad8b129ebf1e0599ce8aa5938)) - *(parser)* Allow matching empty commit body ([#605](https://github.com/orhun/git-cliff/issues/605)) - ([1d1b3b8](https://github.com/orhun/git-cliff/commit/1d1b3b80e163baf34113456f24e3fbbc203e355d)) ### 📚 Documentation - *(readme)* Add social media badges - ([d53b905](https://github.com/orhun/git-cliff/commit/d53b9051840b46f41ccaeca6de3c37c1379a6e5a)) - *(website)* Add note about supported platforms for NPM - ([4e4d7cd](https://github.com/orhun/git-cliff/commit/4e4d7cdbfced3618bdfaf392dbe0a3f4bbbba799)) - *(website)* Add SourceHut builds example ([#617](https://github.com/orhun/git-cliff/issues/617)) - ([f636cfc](https://github.com/orhun/git-cliff/commit/f636cfc5ce0fdbe07d9010c1690876abcc017d29)) ### ⚙️ Miscellaneous Tasks - *(npm)* Add minimum supported Node versions ([#621](https://github.com/orhun/git-cliff/issues/621)) - ([95bdf2d](https://github.com/orhun/git-cliff/commit/95bdf2db3724715f76a7b649367541ace5ca9d1f)) - *(pypi)* Disable PyPi builds for x86_64-pc-windows-gnu - ([f675b0b](https://github.com/orhun/git-cliff/commit/f675b0b5bdbe57437e39dbe4c0b78e7c4f373936)) - *(tests)* Don't check last commit ([#619](https://github.com/orhun/git-cliff/issues/619)) - ([68b9839](https://github.com/orhun/git-cliff/commit/68b98393e72d4a38a2e9166477784a9e1a55c9cf)) ## New Contributors ❤️ * @lanesawyer made their first contribution in [#621](https://github.com/orhun/git-cliff/pull/621) * @timharek made their first contribution in [#617](https://github.com/orhun/git-cliff/pull/617) * @AntoineGS made their first contribution in [#608](https://github.com/orhun/git-cliff/pull/608) ## [2.2.1](https://github.com/orhun/git-cliff/compare/v2.2.0..v2.2.1) - 2024-04-10 ### 🐛 Bug Fixes - *(npm)* Include the proper files in the npm tarball ([#594](https://github.com/orhun/git-cliff/issues/594)) - ([800c896](https://github.com/orhun/git-cliff/commit/800c8964933deda12ef17a27c566dde430a7cae9)) ### 📚 Documentation - *(readme)* Mention git-changelog-command-line tool ([#589](https://github.com/orhun/git-cliff/issues/589)) - ([d65b443](https://github.com/orhun/git-cliff/commit/d65b4433ce784a713355f47b30096031c7dc05f4)) - *(website)* Add GITHUB_REPO variable to GitHub action ([#597](https://github.com/orhun/git-cliff/issues/597)) - ([3b74254](https://github.com/orhun/git-cliff/commit/3b742548cccf7a55bc071a7614fa224b41078aa2)) - *(website)* Update release date - ([45132da](https://github.com/orhun/git-cliff/commit/45132da64284eb60330021ab8ca6d1db07206610)) ### ⚙️ Miscellaneous Tasks - *(ci)* Remove audit check - ([6ba6809](https://github.com/orhun/git-cliff/commit/6ba6809ea1ff9b34f192b387e77da06cf0570606)) ## New Contributors ❤️ * @clementnuss made their first contribution in [#597](https://github.com/orhun/git-cliff/pull/597) * @tomasbjerre made their first contribution in [#589](https://github.com/orhun/git-cliff/pull/589) ## [2.2.0](https://github.com/orhun/git-cliff/compare/v2.1.2..v2.2.0) - 2024-03-30 ### ⛰️ Features - *(changelog)* Make rendering errors more verbose - ([7ee3c86](https://github.com/orhun/git-cliff/commit/7ee3c860afac12238d37141566759c17b38ac594)) - *(config)* Support detecting config from project manifest ([#571](https://github.com/orhun/git-cliff/issues/571)) - ([9eb3d65](https://github.com/orhun/git-cliff/commit/9eb3d65945d70d04a99a2ea7a3042c404ea6f78b)) - *(release)* Make the bump version rules configurable ([#530](https://github.com/orhun/git-cliff/issues/530)) - ([152414c](https://github.com/orhun/git-cliff/commit/152414cb817778a2deca320c034a97284d520d30)) ### 🐛 Bug Fixes - *(changelog)* Update the commit processing order ([#556](https://github.com/orhun/git-cliff/issues/556)) - ([c5ef9ab](https://github.com/orhun/git-cliff/commit/c5ef9ab2916552b92875a67ebb41460b9928a7fc)) - *(changelog)* Return the last version if there is nothing to bump - ([45c87f2](https://github.com/orhun/git-cliff/commit/45c87f2f307e8441c128b81835b662362e6b380a)) - *(command)* Add missing environment variables for Windows ([#532](https://github.com/orhun/git-cliff/issues/532)) - ([9722784](https://github.com/orhun/git-cliff/commit/972278439613d6187699fec02db8e1c4826ec92b)) - *(commit)* Trim the text before matching with commit parser ([#573](https://github.com/orhun/git-cliff/issues/573)) - ([4971b23](https://github.com/orhun/git-cliff/commit/4971b236ace1d6a8af96f4527256ceeb8c8c4551)) - *(config)* Drop extra '(' in first commit URL in github-keepachangelog ([#535](https://github.com/orhun/git-cliff/issues/535)) - ([8b3d09f](https://github.com/orhun/git-cliff/commit/8b3d09f7766f8dc2ae5ac1f5afab0dc51283ef3d)) - *(npm)* Fix authenticating for `yarn npm publish` ([#574](https://github.com/orhun/git-cliff/issues/574)) - ([5a0ce6a](https://github.com/orhun/git-cliff/commit/5a0ce6acc1dab99698db73315215322d922dfde3)) - *(release)* Fix typo in the installation of typos-cli ([#545](https://github.com/orhun/git-cliff/issues/545)) - ([700281a](https://github.com/orhun/git-cliff/commit/700281a25be52d896329027672a26b722c359283)) ### 📚 Documentation - *(website)* Add highlights for 2.2.0 ([#575](https://github.com/orhun/git-cliff/issues/575)) - ([2e81ad0](https://github.com/orhun/git-cliff/commit/2e81ad0022e6354a5af2d6110ea10e0e46079429)) - *(website)* Fix the documentation for `--include-path` ([#567](https://github.com/orhun/git-cliff/issues/567)) - ([4a7aa7e](https://github.com/orhun/git-cliff/commit/4a7aa7e91f78d8d436842d289f5f61a4bd8e5a2f)) - *(website)* Update setup-git-cliff action documentation - ([4f46396](https://github.com/orhun/git-cliff/commit/4f4639647bc73428c71ab1944b3e330023961924)) - *(website)* Add documentation for taiki-e/install-action ([#563](https://github.com/orhun/git-cliff/issues/563)) - ([85db777](https://github.com/orhun/git-cliff/commit/85db77760914a2ac5e35d919613b744af15d0b05)) ### ⚙️ Miscellaneous Tasks - *(ci)* Temporarily disable semver checks - ([f26fbe0](https://github.com/orhun/git-cliff/commit/f26fbe09ffc4ad0bf24260d7bd8a93d991817a2a)) - *(ci)* Comment on pull requests about semver checks - ([ccdc152](https://github.com/orhun/git-cliff/commit/ccdc15217cfcc1c1c3bf09d4d997f7f99526b10e)) - *(config)* Skip clippy commits in changelog - ([830528c](https://github.com/orhun/git-cliff/commit/830528c0c0c8d45362869df54c835afab2936c90)) - *(github)* Remove cname - ([679aa46](https://github.com/orhun/git-cliff/commit/679aa4671984c8a5c1f5ea6929afa3fc26f667fc)) - *(github)* Update funding options - ([4bedf76](https://github.com/orhun/git-cliff/commit/4bedf764e33454d44db9020a0dd3149df09489e2)) - *(github)* Use form based issue templates ([#529](https://github.com/orhun/git-cliff/issues/529)) - ([8f8e221](https://github.com/orhun/git-cliff/commit/8f8e2215636262b21074963ac0d846edc55a80ab)) - *(npm)* Publish rc version for prereleases ([#528](https://github.com/orhun/git-cliff/issues/528)) - ([16bea51](https://github.com/orhun/git-cliff/commit/16bea5179a89af26dd0bfb07c7d6b7d1efa3c54e)) - *(pypi)* Update maturin version ([#539](https://github.com/orhun/git-cliff/issues/539)) - ([10b7ab8](https://github.com/orhun/git-cliff/commit/10b7ab829f30beba19d13437ebafc35b9bb38476)) - *(website)* Allow deploying website manually - ([0b64bc0](https://github.com/orhun/git-cliff/commit/0b64bc032523f6565e47352cccd0d92f8bf9eae9)) - *(website)* Only deploy website when there is a new release - ([8651832](https://github.com/orhun/git-cliff/commit/8651832926afa83dac4b9cbb5d298bbea5e7af6d)) ## New Contributors ❤️ * @aminya made their first contribution in [#567](https://github.com/orhun/git-cliff/pull/567) * @jsurkont made their first contribution in [#530](https://github.com/orhun/git-cliff/pull/530) * @dupuy made their first contribution in [#535](https://github.com/orhun/git-cliff/pull/535) * @daniel-carr-3000 made their first contribution in [#532](https://github.com/orhun/git-cliff/pull/532) ## [2.1.2](https://github.com/orhun/git-cliff/compare/v2.0.4..v2.1.2) - 2024-03-03 ### ⛰️ Features - *(args)* Add `--tag-pattern` argument ([#526](https://github.com/orhun/git-cliff/issues/526)) - ([b4e7a34](https://github.com/orhun/git-cliff/commit/b4e7a3400f0675bba63339cd89513ffcb7acb688)) - *(npm)* Add programmatic API for TypeScript ([#523](https://github.com/orhun/git-cliff/issues/523)) - ([8b33267](https://github.com/orhun/git-cliff/commit/8b332679677ab7690d718d0d81954bff8d4cc585)) ### 🐛 Bug Fixes - *(cd)* Set the correct GitHub repository URL - ([7f379a9](https://github.com/orhun/git-cliff/commit/7f379a9c8377baa206d05c5cb0dfc6150905b19a)) - *(cd)* Set a flag as a workaround for the NPM package - ([717abce](https://github.com/orhun/git-cliff/commit/717abce767906f752408e2745f47d0fc9013699c)) - *(cd)* Set node version to 18 for building NPM packages - ([5dd0d2e](https://github.com/orhun/git-cliff/commit/5dd0d2ebf8f1e9fa81d8b933c33ed62654039ce6)) - *(cd)* Explicitly set the Homebrew formula path - ([8d2f1fa](https://github.com/orhun/git-cliff/commit/8d2f1fab2b70da990921dfc55202ef1413ec63f1)) - *(cd)* Set the GitHub repository explicitly - ([0e46500](https://github.com/orhun/git-cliff/commit/0e46500199f9b7cc7c83a51499f6e90a2adf5888)) - *(config)* Fix commit parser regex in the default config - ([110b9b8](https://github.com/orhun/git-cliff/commit/110b9b8d2676800ebe169287fa5d2a93c9f6b55f)) - *(github)* Sanitize the GitHub token in debug logs - ([be34949](https://github.com/orhun/git-cliff/commit/be34949df76f9f174dce0b9e593bda594a9d33a5)) ### 🚜 Refactor - *(cd)* Simplify checking pre-releases - ([87a04fb](https://github.com/orhun/git-cliff/commit/87a04fb437ce8d74c53461f2a46316ff611f074f)) - *(changelog)* Do not output to stdout when prepend is used - ([8ee0da1](https://github.com/orhun/git-cliff/commit/8ee0da1f74a0f2cae699ce19accc073434f5b538)) ### 📚 Documentation - *(website)* Add tip about skipping commits by PR label - ([6d3354c](https://github.com/orhun/git-cliff/commit/6d3354ca1b0e401e5374f0cd28b2f96753ac4f2b)) - *(website)* Add instructions for installing from WinGet ([#520](https://github.com/orhun/git-cliff/issues/520)) - ([eeaa406](https://github.com/orhun/git-cliff/commit/eeaa40673fbf28eafef462fbc61506e7d9f97678)) ### 🎨 Styling - *(website)* Use a short link for reporting issues - ([ba83c8a](https://github.com/orhun/git-cliff/commit/ba83c8ae71b838137682ff0c92424e064ca4f62e)) ### ⚙️ Miscellaneous Tasks - *(ci)* Auto-bump the homebrew formula - ([61d055b](https://github.com/orhun/git-cliff/commit/61d055b9169b9eb3d5a458b1dc1cb6ff8d919807)) - *(ci)* Enable default features for windows builds - ([18f4923](https://github.com/orhun/git-cliff/commit/18f4923897a4f54ebe9870014463a67f3a655c9d)) - *(ci)* Check semver violations via CI - ([a25a114](https://github.com/orhun/git-cliff/commit/a25a1148d92ee07402c9069eaad74574e392339c)) - *(fixtures)* Enable verbose logging for output - ([2927231](https://github.com/orhun/git-cliff/commit/292723109f328f96b84a629d61fd38b02ceef4e8)) ## New Contributors ❤️ * @lloydjatkinson made their first contribution in [#520](https://github.com/orhun/git-cliff/pull/520) ## [2.0.4](https://github.com/orhun/git-cliff/compare/v2.0.2..v2.0.4) - 2024-02-22 ### ⛰️ Features - *(docker)* Enable github feature for the docker image - ([bc882e3](https://github.com/orhun/git-cliff/commit/bc882e3884ca8ce1391fc70e3dcaa02204de0dd4)) - *(github)* Support overriding the GitHub API URL ([#512](https://github.com/orhun/git-cliff/issues/512)) - ([8199699](https://github.com/orhun/git-cliff/commit/819969924bbad25484971c84a4c8d02ae48f1db9)) ### 🐛 Bug Fixes - *(cd)* Do not execute commands for the release changelog - ([1aaa9b2](https://github.com/orhun/git-cliff/commit/1aaa9b2150f539116007afc199f57a61bbe4ee20)) ### 📚 Documentation - *(website)* Add instructions for installing from conda-forge ([#511](https://github.com/orhun/git-cliff/issues/511)) - ([75a04bb](https://github.com/orhun/git-cliff/commit/75a04bb1b0d929f03a2bd224fc728dcf14b6e896)) ### ⚙️ Miscellaneous Tasks - *(config)* Add animation to the header of the changelog - ([4f741a7](https://github.com/orhun/git-cliff/commit/4f741a7c9ebd52404503c60dc91e053f1b9c0171)) - *(website)* Bump the version of git-cliff-action - ([f255ad3](https://github.com/orhun/git-cliff/commit/f255ad38b2640b3f42a40eda3b76cddb6c06d2ff)) - *(website)* Add announcement bar for the new release - ([1d32a14](https://github.com/orhun/git-cliff/commit/1d32a14175355ef83dbaa0dd80f17a9c2493e7de)) ## [2.0.2](https://github.com/orhun/git-cliff/compare/v2.0.1..v2.0.2) - 2024-02-19 ### 📚 Documentation - *(release)* Add note about GitHub variables - ([54e21de](https://github.com/orhun/git-cliff/commit/54e21de5eebe61f23328e92c6fb8f8de7fd900fd)) ## [2.0.1](https://github.com/orhun/git-cliff/compare/v2.0.0..v2.0.1) - 2024-02-19 ### ⚙️ Miscellaneous Tasks - *(cd)* Disable PyPI builds for linux-x86-glibc - ([30d8e41](https://github.com/orhun/git-cliff/commit/30d8e41b06e2b277e700731fe193906e49e2509a)) ## [2.0.0](https://github.com/orhun/git-cliff/compare/v1.4.0..v2.0.0) - 2024-02-19 ### ⛰️ Features - *(args)* Add `--no-exec` flag for skipping command execution ([#458](https://github.com/orhun/git-cliff/issues/458)) - ([7ae77ff](https://github.com/orhun/git-cliff/commit/7ae77ff0e0a22b5f5e42737204cbf0ab8680f9d7)) - *(args)* Add `-x` short argument for `--context` - ([327512a](https://github.com/orhun/git-cliff/commit/327512a9d522e67252becd46628ef5ebe95539d7)) - *(args)* Support initialization with built-in templates ([#370](https://github.com/orhun/git-cliff/issues/370)) - ([4bee628](https://github.com/orhun/git-cliff/commit/4bee628867a242a0165829db2ca70bfba964e345)) - *(args)* Allow returning the bumped version ([#362](https://github.com/orhun/git-cliff/issues/362)) - ([5e01e4c](https://github.com/orhun/git-cliff/commit/5e01e4c775d1e3e7d2caa52d5bafed99dcfa0660)) - *(args)* Set `CHANGELOG.md` as default missing value for output option ([#354](https://github.com/orhun/git-cliff/issues/354)) - ([04d149e](https://github.com/orhun/git-cliff/commit/04d149e1245d892a50307f9637b5f665b47b50d4)) - *(changelog)* Set the timestamp of the previous release - ([d408e63](https://github.com/orhun/git-cliff/commit/d408e6377a5157f6d285b2733e6640d36316cfd4)) - *(changelog)* Improve skipping via `.cliffignore` and `--skip-commit` ([#413](https://github.com/orhun/git-cliff/issues/413)) - ([faa00c6](https://github.com/orhun/git-cliff/commit/faa00c6e6cee3c4fa7bd06e5dd409d81ca4b6b8f)) - *(changelog)* Support tag prefixes with `--bump` ([#347](https://github.com/orhun/git-cliff/issues/347)) - ([2399e57](https://github.com/orhun/git-cliff/commit/2399e57fd3b715875d5dc3897fad85a70cc199eb)) - *(changelog)* [**breaking**] Set tag to `0.0.1` via `--bump` if no tags exist - ([3291eb9](https://github.com/orhun/git-cliff/commit/3291eb99acf228086633852fac9b78c30e0db673)) - *(changelog)* [**breaking**] Support templating in the footer ([#369](https://github.com/orhun/git-cliff/issues/369)) - ([0945fa8](https://github.com/orhun/git-cliff/commit/0945fa806cc1714f92277142d974e4591c55e04f)) - *(commit)* Add merge_commit flag to the context ([#389](https://github.com/orhun/git-cliff/issues/389)) - ([dd27a9a](https://github.com/orhun/git-cliff/commit/dd27a9a404272f3e4ea40bbfcb30a07929014442)) - *(github)* [**breaking**] Support integration with GitHub repos ([#363](https://github.com/orhun/git-cliff/issues/363)) - ([5238326](https://github.com/orhun/git-cliff/commit/52383267905e8d007b60e4b2e21cbe2280952d72)) - *(parser)* Support using SHA1 of the commit ([#385](https://github.com/orhun/git-cliff/issues/385)) - ([1039f85](https://github.com/orhun/git-cliff/commit/1039f8575ad5e956355bfbf0394e49d8557faa2e)) - *(parser)* Support using regex scope values ([#372](https://github.com/orhun/git-cliff/issues/372)) - ([19e65c2](https://github.com/orhun/git-cliff/commit/19e65c25b3631004bdd032ee36eccdf79dfb618d)) - *(template)* Support using PR labels in the GitHub template ([#467](https://github.com/orhun/git-cliff/issues/467)) - ([30d15bb](https://github.com/orhun/git-cliff/commit/30d15bbab77efecda9941bf885cb93bedbd0563c)) - *(template)* Support using PR title in the GitHub template ([#418](https://github.com/orhun/git-cliff/issues/418)) - ([6f32f33](https://github.com/orhun/git-cliff/commit/6f32f3376e2b0b85206bc33795be57b0dad16afe)) - *(website)* Add search bar to the website - ([2d30491](https://github.com/orhun/git-cliff/commit/2d30491bdb7914229ba417e29aa5b813b056b6ef)) ### 🐛 Bug Fixes - *(cd)* Use workaround for linux-arm64-glibc maturin builds - ([dc79ed5](https://github.com/orhun/git-cliff/commit/dc79ed5fe25afd6255b2d93d06d2b47016769c4b)) - *(cd)* Disable PyPI publish for linux-arm64-glibc - ([e24af12](https://github.com/orhun/git-cliff/commit/e24af123dbd2c242f2aa98c67f98cc82ae9a3f78)) - *(cd)* Avoid creating artifacts with the same name - ([1647fd8](https://github.com/orhun/git-cliff/commit/1647fd82e901f66e3ca00fae2688fd31fe238149)) - *(cd)* Fix embedding examples for crates.io release - ([46b7d88](https://github.com/orhun/git-cliff/commit/46b7d880cf4f6e2ed30946f7f10a46d82f96af9a)) - *(changelog)* Fix previous version links ([#364](https://github.com/orhun/git-cliff/issues/364)) - ([44c93b7](https://github.com/orhun/git-cliff/commit/44c93b7c704b01d371eb826fc9ffcb459f7370b1)) - *(changelog)* Set the correct previous tag when a custom tag is given - ([6203f77](https://github.com/orhun/git-cliff/commit/6203f77dab5c19981f9dc8f8408c97344eb73003)) - *(ci)* Update cargo-msrv arguments - ([131dd10](https://github.com/orhun/git-cliff/commit/131dd10c53087ce1ceaea07f030478fca393c253)) - *(cli)* Fix broken pipe when stdout is interrupted ([#407](https://github.com/orhun/git-cliff/issues/407)) - ([bdce4b5](https://github.com/orhun/git-cliff/commit/bdce4b504e0b1984283ad056931fc4fe7b893dc3)) - *(commit)* Trim the trailing newline from message ([#403](https://github.com/orhun/git-cliff/issues/403)) - ([514ca4b](https://github.com/orhun/git-cliff/commit/514ca4bda172d8fdfb612dd28f4bde8aae9e29fe)) - *(git)* Sort commits in topological order ([#415](https://github.com/orhun/git-cliff/issues/415)) - ([29bf355](https://github.com/orhun/git-cliff/commit/29bf355205da4860ceb3777de983beb93ec47a08)) - *(links)* Skip checking the GitHub commit URLs - ([273d6dc](https://github.com/orhun/git-cliff/commit/273d6dc14b000ab556ac7af5732e75f8857020f7)) - *(website)* Use node version 18 - ([46dcce3](https://github.com/orhun/git-cliff/commit/46dcce38444132f851bc9dff2bdd994632c56e1c)) - *(website)* Use prism-react-renderer v2 with docusaurus - ([664ff9b](https://github.com/orhun/git-cliff/commit/664ff9bc14e2da3c44b7cf5f11c780223c25ce53)) - Allow version bump with a single previous release - ([d65aec9](https://github.com/orhun/git-cliff/commit/d65aec9d249b3ad941ccfac77c3248d12d3d30d3)) ### 🚜 Refactor - *(changelog)* Support `--bump` for processed releases ([#408](https://github.com/orhun/git-cliff/issues/408)) - ([89e4c72](https://github.com/orhun/git-cliff/commit/89e4c729a915d456c1b83f666637bf85c7125350)) - *(ci)* Use hardcoded workspace members for cargo-msrv command - ([ec6035a](https://github.com/orhun/git-cliff/commit/ec6035a7e77c60e8b7f752619aeee36f08c80aad)) - *(ci)* Simplify cargo-msrv installation - ([f04bf6e](https://github.com/orhun/git-cliff/commit/f04bf6eca155eec32f82aca482e5c00ab16d61a9)) - *(config)* Use postprocessors for checking the typos - ([764e858](https://github.com/orhun/git-cliff/commit/764e858a1e948dbc507cde3264a72e3458c98833)) - *(config)* Remove unnecessary newline from configs - ([8edec7f](https://github.com/orhun/git-cliff/commit/8edec7fd50f703811d55f14a3c5f0fd02b43d9e7)) ### 📚 Documentation - *(configuration)* Fix typo ([#466](https://github.com/orhun/git-cliff/issues/466)) - ([34a58e6](https://github.com/orhun/git-cliff/commit/34a58e6e2bea34bbcc5190fd10fddd0fb3e7e73f)) - *(fixtures)* Add instructions for adding new fixtures - ([8290769](https://github.com/orhun/git-cliff/commit/82907693c19a38699c57f9206564e8a9c7d9d705)) - *(readme)* Mention RustLab 2023 talk - ([668a957](https://github.com/orhun/git-cliff/commit/668a95774c076b53f719cdd0708b9385168dbc6e)) - *(readme)* Use the raw link for the animation - ([2c524b8](https://github.com/orhun/git-cliff/commit/2c524b8e64a8d248a6345b4eee3afbde21bf38a8)) - *(security)* Update security policy - ([fcaa502](https://github.com/orhun/git-cliff/commit/fcaa5021083ff7cb8f70044801fff19e1b012493)) - *(website)* Add highlights for 2.0.0 ([#504](https://github.com/orhun/git-cliff/issues/504)) - ([49684d0](https://github.com/orhun/git-cliff/commit/49684d0fd8a6876cf09f29f3b860c2851fe7a992)) - *(website)* Improve matching gitmoji tip ([#486](https://github.com/orhun/git-cliff/issues/486)) - ([0731646](https://github.com/orhun/git-cliff/commit/0731646c26142a92f90a6b567dfeee877d45f3c5)) - *(website)* Add tips and tricks section - ([82e93c2](https://github.com/orhun/git-cliff/commit/82e93c26deaa0eeebe0f46f91fa2d35154bcfe2c)) - *(website)* Add tip about link parsers - ([4bd47a6](https://github.com/orhun/git-cliff/commit/4bd47a69e9d0fbd2656fb43abab930225411259b)) - *(website)* Add git-cliff animation to the website ([#404](https://github.com/orhun/git-cliff/issues/404)) - ([0561124](https://github.com/orhun/git-cliff/commit/05611245d9ee42d5eff7e2a64eb041b452129356)) - *(website)* Split the configuration section - ([67486cc](https://github.com/orhun/git-cliff/commit/67486ccb72882562d94718afc4f5db3b631d49f6)) - *(website)* Add installation instructions for Homebrew ([#357](https://github.com/orhun/git-cliff/issues/357)) - ([b2f8091](https://github.com/orhun/git-cliff/commit/b2f8091bd485a81add367a8a01066c7957e45772)) ### 🎨 Styling - *(website)* Add GitHub logo to the header - ([1da7cac](https://github.com/orhun/git-cliff/commit/1da7cac7ce5df4de0a49ddbb9a52621ffa849124)) - *(website)* [**breaking**] Use dark theme as default - ([dcc5116](https://github.com/orhun/git-cliff/commit/dcc511609f42a7ae10069cd31a50540a77b59234)) ### 🧪 Testing - *(changelog)* Use the correct version for missing tags - ([0ca4cdb](https://github.com/orhun/git-cliff/commit/0ca4cdb45d9f910adb4d52cb6c58ec6539dabca6)) - *(fixture)* Update the date for example test fixture - ([991a035](https://github.com/orhun/git-cliff/commit/991a035e0e070416bbde7769ac3646ae563d1f13)) - *(fixture)* Add test fixture for bumping version - ([c94cb6a](https://github.com/orhun/git-cliff/commit/c94cb6a37ae268953ab29dd35cb43b6a4fec47cc)) - *(fixtures)* Update the bumped value output to add prefix - ([f635bae](https://github.com/orhun/git-cliff/commit/f635bae964386c42474659f3d7903258f4ef8ee9)) ### ⚙️ Miscellaneous Tasks - *(changelog)* Disable the default behavior of next-version ([#343](https://github.com/orhun/git-cliff/issues/343)) - ([4eef684](https://github.com/orhun/git-cliff/commit/4eef684c568ad16357e5d256180a51b1a46dd0cb)) - *(changelog)* Use 0.1.0 as default next release if no tag is found - ([3123fd2](https://github.com/orhun/git-cliff/commit/3123fd2eac0da0e800923d8b9f3c86bc6814edd4)) - *(command)* Explicitly set the directory of command to current dir - ([722efd6](https://github.com/orhun/git-cliff/commit/722efd6598a580f995bf282184c400c095c49eae)) - *(config)* Skip dependabot commits for dev updates - ([7f89160](https://github.com/orhun/git-cliff/commit/7f891602e4818f612ef928e84488053c7aad56d9)) - *(config)* Revamp the configuration files - ([9500bf8](https://github.com/orhun/git-cliff/commit/9500bf8ef88df8ff0fbfaf08d2eb531d09e472ef)) - *(dependabot)* Group the dependency updates for creating less PRs - ([c6a92bf](https://github.com/orhun/git-cliff/commit/c6a92bf6871a436e60ca9774d0b0df770727e664)) - *(docker)* Update versions in Dockerfile - ([51198a5](https://github.com/orhun/git-cliff/commit/51198a5a56ca1f8a09d527c37695231520a130d4)) - *(embed)* Do not allow missing docs - ([7754cab](https://github.com/orhun/git-cliff/commit/7754cab1c8a53ce8703596bbc921a2a3867a4155)) - *(example)* Use full links in GitHub templates ([#503](https://github.com/orhun/git-cliff/issues/503)) - ([a521891](https://github.com/orhun/git-cliff/commit/a521891b557772451f37a791bde04067d3f20626)) - *(example)* Remove limited commits example - ([8e1e0d7](https://github.com/orhun/git-cliff/commit/8e1e0d73c3bb7a0294bc20c01a0a6800ebbfbb1a)) - *(github)* Update templates about GitHub integration - ([3f5107a](https://github.com/orhun/git-cliff/commit/3f5107a02c3bb50bbd7712e81c95eeb7344e01f6)) - *(mergify)* Don't update PRs for the main branch - ([96a220c](https://github.com/orhun/git-cliff/commit/96a220c8e9b665f96c6794ca423f04464007fe0f)) - *(project)* Add readme to core package - ([9e6bad2](https://github.com/orhun/git-cliff/commit/9e6bad28db23b39311c4231c96f1d7805296c3b9)) - *(project)* Bump MSRV to 1.74.1 - ([bd5e4d2](https://github.com/orhun/git-cliff/commit/bd5e4d2217c307177f6f1de99cae5f5ae5024b33)) - *(project)* Update copyright years - ([edc6bc0](https://github.com/orhun/git-cliff/commit/edc6bc0adbf2952b8a532a44ccf11f6f1b5448f2)) - *(website)* Fix URLs in navigation bar ([#438](https://github.com/orhun/git-cliff/issues/438)) - ([70cab99](https://github.com/orhun/git-cliff/commit/70cab990cce4ba4e9077fb69cef385e2ec209080)) - *(website)* Rename the header for GitHub integration - ([3fd9476](https://github.com/orhun/git-cliff/commit/3fd9476a565212343d3af4e2d7387d7ef265b4f1)) - *(website)* Fix broken anchors - ([34593dd](https://github.com/orhun/git-cliff/commit/34593dd46f3ce0f0ab809416fc37294a62658036)) - *(website)* Bump docusaurus to 3.1.0 - ([af4482b](https://github.com/orhun/git-cliff/commit/af4482b4158ccdee71912d78f5fb0a1c280e6ed6)) - *(website)* Update the titles for distro installations - ([ff2881b](https://github.com/orhun/git-cliff/commit/ff2881bebd1020420db04927b2ac7893edf973a6)) - *(website)* Add Mastodon link to the website - ([2e761c9](https://github.com/orhun/git-cliff/commit/2e761c936dbe54b1c9a683f67d4556d2e64b2fec)) ### ◀️ Revert - *(config)* Use postprocessors for checking the typos - ([5212cc9](https://github.com/orhun/git-cliff/commit/5212cc9446bc1389274516ed3d7eb7b334b1b606)) ## New Contributors ❤️ * @welpo made their first contribution in [#486](https://github.com/orhun/git-cliff/pull/486) * @bobrik made their first contribution in [#415](https://github.com/orhun/git-cliff/pull/415) * @vbx made their first contribution in [#403](https://github.com/orhun/git-cliff/pull/403) * @nappa85 made their first contribution in [#362](https://github.com/orhun/git-cliff/pull/362) * @sh-cho made their first contribution in [#357](https://github.com/orhun/git-cliff/pull/357) ## [1.4.0](https://github.com/orhun/git-cliff/compare/v1.3.1..v1.4.0) - 2023-10-29 ### ⛰️ Features - *(changelog)* Support bumping the semantic version via `--bump` ([#309](https://github.com/orhun/git-cliff/issues/309)) - ([bcfcd1f](https://github.com/orhun/git-cliff/commit/bcfcd1fd59fa2c1ef3222d588f3a563c3e10027e)) - *(ci)* Add 'typos' check ([#317](https://github.com/orhun/git-cliff/issues/317)) - ([88c34ab](https://github.com/orhun/git-cliff/commit/88c34abe2c6572d401e0bd77d2aec4138bd2c88b)) - *(command)* Log the output of failed external commands - ([205cdbb](https://github.com/orhun/git-cliff/commit/205cdbb391b03244abaf2e5e0651976544c78ff4)) - *(config)* [**breaking**] Support regex in 'tag_pattern' configuration ([#318](https://github.com/orhun/git-cliff/issues/318)) - ([3c2fb60](https://github.com/orhun/git-cliff/commit/3c2fb6072612a38ab7c6ea41e7c2ae34435fde99)) - *(config)* Add field and value matchers to the commit parser ([#312](https://github.com/orhun/git-cliff/issues/312)) - ([04fbcb8](https://github.com/orhun/git-cliff/commit/04fbcb88a5cb85a2f192b3ecc7261bd55548be9e)) ### 📚 Documentation - *(blog)* Fix the TOML format in 1.4.0 blog post - ([4d691d2](https://github.com/orhun/git-cliff/commit/4d691d2620f6fcd574c2be64c6a8f6023db063c2)) - *(blog)* Add blog post for 1.4.0 release - ([e3f1b3b](https://github.com/orhun/git-cliff/commit/e3f1b3bdb3d7f8a0dce695fed18077aacdc1d3bd)) - *(changelog)* Fix typos ([#316](https://github.com/orhun/git-cliff/issues/316)) - ([edd3c30](https://github.com/orhun/git-cliff/commit/edd3c30000af1542c0df5b3ca5e0ea4fcc6efb74)) - *(config)* Update the comment for tag_pattern - ([596fd4d](https://github.com/orhun/git-cliff/commit/596fd4d14d57ce6357c299181c523a00af11b36c)) - *(core)* Update the doc comment for commit preprocessors - ([7faccc6](https://github.com/orhun/git-cliff/commit/7faccc65a87fe29aa26cdfce63880899a0e8bf3d)) - *(image)* Use images from the repository - ([91c0cda](https://github.com/orhun/git-cliff/commit/91c0cda9dc79740d322275f45184facfc8300163)) - *(lib)* Extract feature documentation from Cargo.toml - ([1f8098c](https://github.com/orhun/git-cliff/commit/1f8098cd7f0f5473a3a7f847aaaa62b1cfdc7759)) - *(lib)* Add logo and favicon to docs.rs page - ([32b1fe1](https://github.com/orhun/git-cliff/commit/32b1fe1556e25c2a29adffe0a68e68183bc9ae63)) - *(readme)* Add link to emacs package support git-cliff ([#307](https://github.com/orhun/git-cliff/issues/307)) - ([fa471c7](https://github.com/orhun/git-cliff/commit/fa471c7178dce184ca6fe5bbb24b9c2db96d68ce)) - *(website)* Fix typos in configuration docs ([#329](https://github.com/orhun/git-cliff/issues/329)) - ([d863c94](https://github.com/orhun/git-cliff/commit/d863c9481a7882a1a1ecc59050c2d30b2b9a1728)) - *(website)* Add instructions for installing the latest git version - ([be87608](https://github.com/orhun/git-cliff/commit/be87608002d6beba58368af4fed73e746cde352a)) ### ⚙️ Miscellaneous Tasks - *(ci)* Update the link checker configuration ([#315](https://github.com/orhun/git-cliff/issues/315)) - ([32cbea8](https://github.com/orhun/git-cliff/commit/32cbea8e48300746879e754618672c5a1270ba95)) - *(config)* Update tag_pattern value for backwards compatibility - ([2c621f7](https://github.com/orhun/git-cliff/commit/2c621f71e6cdca05b17516d2a9ba80fbabd4d3f8)) - *(img)* Add more images - ([2792362](https://github.com/orhun/git-cliff/commit/2792362a52a8fc862fa7899cda911ce7e56786b1)) - *(img)* Add git-cliff logo - ([51f5e5b](https://github.com/orhun/git-cliff/commit/51f5e5b16f7f509c59bd1d6e990989ba33581e7b)) - *(release)* Update cargo-deb usage - ([213f383](https://github.com/orhun/git-cliff/commit/213f383b54c9a40a351f341c28bbdf03b73f701d)) - *(website)* Update the tracking link - ([eb9f8e9](https://github.com/orhun/git-cliff/commit/eb9f8e970d2adcb6c6f512b20ca8a9f77d09ff54)) ## New Contributors ❤️ * @woshilapin made their first contribution in [#318](https://github.com/orhun/git-cliff/pull/318) * @debghs made their first contribution in [#329](https://github.com/orhun/git-cliff/pull/329) * @dpecos made their first contribution in [#312](https://github.com/orhun/git-cliff/pull/312) * @eki3z made their first contribution in [#307](https://github.com/orhun/git-cliff/pull/307) ## [1.3.1](https://github.com/orhun/git-cliff/compare/v1.3.0..v1.3.1) - 2023-09-30 ### ⛰️ Features - *(args)* Support tilde for options ([#266](https://github.com/orhun/git-cliff/issues/266)) - ([8698bc2](https://github.com/orhun/git-cliff/commit/8698bc2ce4d58fdeb9563c18f7430798b6359029)) - *(ci)* Distribute RPM package ([#159](https://github.com/orhun/git-cliff/issues/159)) - ([baf4da8](https://github.com/orhun/git-cliff/commit/baf4da80639682628ca4ae538b4555ff1b6262da)) ### 🐛 Bug Fixes - *(ci)* Update cargo-tarpaulin arguments - ([83a0371](https://github.com/orhun/git-cliff/commit/83a03711185df20f37bbcbad955e7783b8bdb662)) ### 🚜 Refactor - *(ci)* Simplify cargo-tarpaulin installation - ([95f8d53](https://github.com/orhun/git-cliff/commit/95f8d53ac158d81433f6a49cf0794d92b0eb21ef)) ### 📚 Documentation - *(installation)* Update instructions for Arch Linux - ([291a928](https://github.com/orhun/git-cliff/commit/291a9282888547b4c45d64ccb8f1495448544201)) - *(installation)* Add instructions for Alpine Linux - ([3199bba](https://github.com/orhun/git-cliff/commit/3199bba672e8045141debf1268873811f17ac405)) - *(license)* Re-license under the MIT + Apache 2.0 license ([#303](https://github.com/orhun/git-cliff/issues/303)) - ([cd56344](https://github.com/orhun/git-cliff/commit/cd563444dec852bacc2586dea55a7b0d5dcdc844)) - Update Tera links to the new URL ([#272](https://github.com/orhun/git-cliff/issues/272)) - ([890de00](https://github.com/orhun/git-cliff/commit/890de0007e108059378b134e9b9d0af2a6965027)) ### ⚙️ Miscellaneous Tasks - Remove GPL code ([#293](https://github.com/orhun/git-cliff/issues/293)) - ([e3606ba](https://github.com/orhun/git-cliff/commit/e3606babdf35022b662c870cb720c1f5339e1543)) ### ◀️ Revert - *(args)* Update clap and clap extras to v4 ([#137](https://github.com/orhun/git-cliff/issues/137)) ([#292](https://github.com/orhun/git-cliff/issues/292)) - ([fb4c733](https://github.com/orhun/git-cliff/commit/fb4c733a70a4dbc25060481ee5f3c644bb0bb83b)) ## New Contributors ❤️ * @joshka made their first contribution in [#293](https://github.com/orhun/git-cliff/pull/293) * @dnaka91 made their first contribution in [#272](https://github.com/orhun/git-cliff/pull/272) ## [1.3.0](https://github.com/orhun/git-cliff/compare/v1.2.0..v1.3.0) - 2023-08-31 ### ⛰️ Features - *(changelog)* [**breaking**] Add postprocessors ([#155](https://github.com/orhun/git-cliff/issues/155)) - ([5dc5fb7](https://github.com/orhun/git-cliff/commit/5dc5fb786db922322faacf928cc571a2d785cab2)) ### 🐛 Bug Fixes - *(cd)* Do not publish release notes for pre-releases ([#249](https://github.com/orhun/git-cliff/issues/249)) - ([7a82aa1](https://github.com/orhun/git-cliff/commit/7a82aa1a769b2170ea7563d7df3c59da5a134201)) - *(cd)* Disable win32-arm64 PyPI builds - ([baf34a8](https://github.com/orhun/git-cliff/commit/baf34a81f0b27be30f24f8899d44dfd1f3afaa13)) - *(deps)* Avoid problematic serde release - ([87f74bc](https://github.com/orhun/git-cliff/commit/87f74bc78feb94c390ad421849e9b356e71657ca)) - *(examples)* Add missing newline ([#253](https://github.com/orhun/git-cliff/issues/253)) - ([aad4222](https://github.com/orhun/git-cliff/commit/aad4222986ea9d65807f3dcb06446d19455e3865)) - *(informer)* Do not inform about pre-releases ([#249](https://github.com/orhun/git-cliff/issues/249)) - ([87e47e6](https://github.com/orhun/git-cliff/commit/87e47e68b6154a4da870342e0973123a974cb105)) - Fix previous release references - ([fbb605e](https://github.com/orhun/git-cliff/commit/fbb605e4f663d96ad140767bf816b5af8c97a92e)) ### 🚜 Refactor - *(config)* Use a macro for generating commit list - ([c695ca3](https://github.com/orhun/git-cliff/commit/c695ca308e5aada03cbd65085497436ac5c341e9)) - *(docker)* Avoid copying volume inside container ([#142](https://github.com/orhun/git-cliff/issues/142)) - ([65d365c](https://github.com/orhun/git-cliff/commit/65d365c7b521e30ebc173d97f10c41da604582ae)) - *(lib)* Use implicit serde imports - ([c8cf855](https://github.com/orhun/git-cliff/commit/c8cf855939ce588824d7a4109ddf0f1c0828b6c6)) ### 📚 Documentation - *(blog)* Add blog post for 1.3.0 release ([#264](https://github.com/orhun/git-cliff/issues/264)) - ([93d4aa4](https://github.com/orhun/git-cliff/commit/93d4aa41e362d8f1c332930a8a400a2781146625)) - *(example)* Update the header of configuration examples - ([0bf5ebe](https://github.com/orhun/git-cliff/commit/0bf5ebe79b293d28a3ed168ef26e4d7c2477614a)) - *(example)* Add example for generating changelog similar to cocogitto - ([e1cf26e](https://github.com/orhun/git-cliff/commit/e1cf26e2a57266e786b395a76f0fc95a7b723cc3)) - *(readme)* Add contributors graph - ([3c9ced0](https://github.com/orhun/git-cliff/commit/3c9ced0b0526c5f5c63c160a03ae06076624eb6c)) ### 🎨 Styling - *(config)* Further beautify the changelog in this repo - ([fd7446c](https://github.com/orhun/git-cliff/commit/fd7446ce2f977da44620dc61a95a7e642f6fd000)) - *(config)* Apply formatting to configuration files - ([e9aa991](https://github.com/orhun/git-cliff/commit/e9aa9918b650cc88b53e4c96783d5161a94cee9a)) - Fix formatting - ([14725e5](https://github.com/orhun/git-cliff/commit/14725e547bb40cd4c3c152515b7c5994eed4a49e)) ### 🧪 Testing - *(changelog)* Add cases for `docs:` prefix ([#167](https://github.com/orhun/git-cliff/issues/167)) - ([3a717e2](https://github.com/orhun/git-cliff/commit/3a717e25aa8fb757dd7af80463938be426313139)) - *(repo)* Add an informative error message to failing test - ([7d7470b](https://github.com/orhun/git-cliff/commit/7d7470b2d0d030135aab09369d6484837c2bd6c7)) - Fix keep a changelog test case - ([0a6ed62](https://github.com/orhun/git-cliff/commit/0a6ed62f57929657c1c464c371c100217f7eeb50)) - Fix keep a changelog test case - ([f5d3365](https://github.com/orhun/git-cliff/commit/f5d336522682d31ba5f4486c6ef0880e8160de95)) ### ⚙️ Miscellaneous Tasks - *(cargo)* Update MSRV to 1.70.0 - ([1068912](https://github.com/orhun/git-cliff/commit/10689128222865515c32c9730fc5742beb7e6b03)) - *(cd)* Use the latest git-cliff-action for releases - ([3eb97b8](https://github.com/orhun/git-cliff/commit/3eb97b8426ec42e28ed1d623f8d8a15a7a64756e)) - *(cd)* Support creating prereleases on GitHub - ([a22426a](https://github.com/orhun/git-cliff/commit/a22426a37d6278f1d348751d00928a20057b578c)) - *(config)* Add additional parsers for default config - ([b745778](https://github.com/orhun/git-cliff/commit/b7457785e6b753ccd9c163b18ad557a0a621f87c)) - *(config)* Update configuration for alpha/beta/rc releases - ([7e7e5a7](https://github.com/orhun/git-cliff/commit/7e7e5a7e09acf6e91e45b25cb567a8f9bdd56bb5)) - *(config)* Skip dependency updates in the changelog - ([b2edc23](https://github.com/orhun/git-cliff/commit/b2edc231a6d999f3af737a2bff00309b499e13d7)) - *(core)* Make git2 optional - ([5fdf39a](https://github.com/orhun/git-cliff/commit/5fdf39ae32441ce70a942e577e31ba0cd2323137)) - *(docker)* Update versions in Dockerfile - ([0ccab91](https://github.com/orhun/git-cliff/commit/0ccab915868b2e594e7bef0b9e56eb290ca500dc)) - *(github)* Add config for welcome bot - ([a4725d4](https://github.com/orhun/git-cliff/commit/a4725d4ce43340cdb0483ac2bb7566c00dc7a991)) - *(mergify)* Rename mergify configuration file - ([9fd1be6](https://github.com/orhun/git-cliff/commit/9fd1be6dc6a5189911572caab99f13c72903af09)) - *(mergify)* Add configuration file for automatic merge ([#245](https://github.com/orhun/git-cliff/issues/245)) - ([0a79aae](https://github.com/orhun/git-cliff/commit/0a79aae3576aaa17385d17d114ef6d3f3aa1fb48)) - *(pypi)* Publish `git-cliff` on PyPI ([#158](https://github.com/orhun/git-cliff/issues/158)) - ([2b7a1ef](https://github.com/orhun/git-cliff/commit/2b7a1efaafca017c4a21f1af25c6047347119e8d)) - Check without default features - ([e323621](https://github.com/orhun/git-cliff/commit/e323621094141acaab360d6fa42990c7cdd4bac4)) ## New Contributors ❤️ * @alexfertel made their first contribution in [#253](https://github.com/orhun/git-cliff/pull/253) * @tvcsantos made their first contribution * @beeb made their first contribution in [#167](https://github.com/orhun/git-cliff/pull/167) * @PSeitz made their first contribution in [#155](https://github.com/orhun/git-cliff/pull/155) * @alerque made their first contribution in [#142](https://github.com/orhun/git-cliff/pull/142) ## [1.2.0](https://github.com/orhun/git-cliff/compare/v1.1.2..v1.2.0) - 2023-04-28 ### ⛰️ Features - *(args)* Update clap and clap extras to v4 ([#137](https://github.com/orhun/git-cliff/issues/137)) - ([0e710c2](https://github.com/orhun/git-cliff/commit/0e710c256b1bbb7e0ab9e4cd5e16e01bac037d42)) - *(commit)* Make the fields of `Signature` public - ([104aac9](https://github.com/orhun/git-cliff/commit/104aac93b468071c107e95ba0d377a69993e3403)) - *(config)* Add a custom configuration file for the repository - ([0d4e689](https://github.com/orhun/git-cliff/commit/0d4e689115bdef19b3c44d110bde81820201518f)) - *(config)* Support placing configuration inside pyproject.toml ([#147](https://github.com/orhun/git-cliff/issues/147)) - ([fe5e5b8](https://github.com/orhun/git-cliff/commit/fe5e5b841a27b48c9b9d49483deaf72431c771c4)) - *(docker)* Generate SBOM/provenance for the Docker image - ([2ef259e](https://github.com/orhun/git-cliff/commit/2ef259e8cc79cfaabd5b51cccf85dde3c381e7c6)) - *(parser)* Support using regex group values ([#145](https://github.com/orhun/git-cliff/issues/145)) - ([7767ace](https://github.com/orhun/git-cliff/commit/7767ace8f8c7a38a27c9850438f7fcc752502c81)) ### 🐛 Bug Fixes - *(ci)* Use MUSL build of cargo-tarpaulin - ([98c9e00](https://github.com/orhun/git-cliff/commit/98c9e00aefcf625a27ee335927a24d36dbf25f75)) - *(ci)* Update cargo-tarpaulin installation command for CI - ([3019eff](https://github.com/orhun/git-cliff/commit/3019eff86929289b8f1d6b13705d95a9a3cc7952)) - *(config)* [**breaking**] Nested environment config overrides ([#157](https://github.com/orhun/git-cliff/issues/157)) - ([bb9a889](https://github.com/orhun/git-cliff/commit/bb9a889f1b06dd44f7183771644ce95520995e58)) - *(config)* Set max of `limit_commits` to the number of commits ([#140](https://github.com/orhun/git-cliff/issues/140)) - ([06f6732](https://github.com/orhun/git-cliff/commit/06f6732b77c19e69333fe53196e2d3b4ac5eb557)) - *(deploy)* Set the node cache dependency path - ([020b02d](https://github.com/orhun/git-cliff/commit/020b02d3e3fa2ea40057d001028f38335d402dbf)) - *(docker)* Remove target directory from .dockerignore - ([c0f97bd](https://github.com/orhun/git-cliff/commit/c0f97bd0b7a4ffbfd898dfefa614bf5a928d75f0)) - *(release)* Use the correct argument in release script - ([b3eef4a](https://github.com/orhun/git-cliff/commit/b3eef4a6889cdedac1c0760455849067ef2d887d)) - *(website)* Fix broken links - ([77dda53](https://github.com/orhun/git-cliff/commit/77dda538431b94b4577223ea381db9f756519e3d)) ### 🚜 Refactor - *(cd)* Remove unnecessary config update - ([e42f910](https://github.com/orhun/git-cliff/commit/e42f91013b8be1d0cba55fa638f702b9bfa85df2)) - *(ci)* Test the website deployment with a different job - ([2d72125](https://github.com/orhun/git-cliff/commit/2d721259ca747813c8f9502d84f41b69d5fc685c)) - *(lib)* [**breaking**] Move changelog module to git-cliff-core - ([2ab2c8f](https://github.com/orhun/git-cliff/commit/2ab2c8fb5e0c56b5ec51689ea33ebd4ec98a5310)) - *(test)* Handle errors for changelog module tests - ([ed389b7](https://github.com/orhun/git-cliff/commit/ed389b70e22f056549637573917a23adcb345733)) - *(website)* Update header location - ([72af8ac](https://github.com/orhun/git-cliff/commit/72af8ac129bce5cb1dee119d3e8743112506a939)) ### 📚 Documentation - *(blog)* Add blog post about what's new in 1.2.0 - ([e0a29ef](https://github.com/orhun/git-cliff/commit/e0a29efe3f4cc6a4162727f7322af2aaf73da619)) - *(blog)* Update the blog post style - ([74cf47e](https://github.com/orhun/git-cliff/commit/74cf47e380d3dae4622a54ad1f0b3e31a96c59c6)) - *(config)* Update the sections - ([c402452](https://github.com/orhun/git-cliff/commit/c4024523fac06f1a886979d2fe748078f7b3267d)) - *(config)* Add comments to the default configuration file - ([7e3adb0](https://github.com/orhun/git-cliff/commit/7e3adb0442384e76219dc5f92083f6cbd2a59968)) - *(contributing)* Mention the nightly requirement for rustfmt - ([a5a78fc](https://github.com/orhun/git-cliff/commit/a5a78fc4c5a44353b570327e7c21d51266d8e712)) - *(contributing)* Update MSRV - ([a824f48](https://github.com/orhun/git-cliff/commit/a824f48f12842ed730fd46413937212763cb38c9)) - *(examples)* Move examples to separate file - ([db43437](https://github.com/orhun/git-cliff/commit/db434371518005d43819fd361617d94ac9e613f7)) - *(github)* Update the pull request template about GitHub labels - ([54f735a](https://github.com/orhun/git-cliff/commit/54f735ab1ab0528447b4a3cd70f583d563b99d8c)) - *(github)* Update pull request template - ([c261fad](https://github.com/orhun/git-cliff/commit/c261fad137a5332cd1ab611970c845565a3b57fe)) - *(github)* Update issue templates - ([6a076ca](https://github.com/orhun/git-cliff/commit/6a076cabeb725a851530cda707355f6493a9fd68)) - *(github)* Update funding options - ([6e35834](https://github.com/orhun/git-cliff/commit/6e3583423698f0b9b18bef236e9f22f30272e848)) - *(github)* Add security policy - ([823d272](https://github.com/orhun/git-cliff/commit/823d272a9e54faae287cd9b782855026b1476567)) - *(readme)* Update README.md about documentation website - ([56240fd](https://github.com/orhun/git-cliff/commit/56240fd11f4d7142d1b734f1afdd419ba2a6e6d8)) - *(readme)* Add tj-actions/git-cliff to the list of actions ([#152](https://github.com/orhun/git-cliff/issues/152)) - ([2520dd2](https://github.com/orhun/git-cliff/commit/2520dd2fda2e88aa3dd1888e559260c9819c4844)) - *(readme)* Add discord badge - ([9fa5dd4](https://github.com/orhun/git-cliff/commit/9fa5dd44c1b65cd801db6d4a677e77ba12ddf9d8)) - *(readme)* Add release-plz to related projects ([#151](https://github.com/orhun/git-cliff/issues/151)) - ([f781e29](https://github.com/orhun/git-cliff/commit/f781e299ca4a631dbd0c686e640804a98d85fbf6)) - *(readme)* Fix typos in README.md - ([38943e8](https://github.com/orhun/git-cliff/commit/38943e8bac1d9535118121a4fea1821f85b93566)) - *(readme)* Remove unneeded word in README.md ([#141](https://github.com/orhun/git-cliff/issues/141)) - ([6f1459b](https://github.com/orhun/git-cliff/commit/6f1459bcc06f06b72e33bf450bd57958cbdf5830)) - *(readme)* Add link to the Console #141 interview about git-cliff - ([d057390](https://github.com/orhun/git-cliff/commit/d057390b14cb72db2a6b159790d1b4bdb0cb2b55)) - *(website)* Add Twitter link to banner - ([ee5ea85](https://github.com/orhun/git-cliff/commit/ee5ea855b85ac809b9b732165f71dd84471e4ec5)) - *(website)* Move documentation to the website ([#153](https://github.com/orhun/git-cliff/issues/153)) - ([56d3544](https://github.com/orhun/git-cliff/commit/56d3544454633927b889d8b921a465b967b4e002)) ### 🎨 Styling - *(docs)* Fix the grammar for tj-actions - ([53c0c1d](https://github.com/orhun/git-cliff/commit/53c0c1d0758fe20734d4b7ec792faa5413d4c533)) - *(docs)* Update the formatting for python integration example - ([3ee6724](https://github.com/orhun/git-cliff/commit/3ee672483790ec71c700907a6e93af4698492026)) - *(readme)* Update the style for project name - ([c41bbe0](https://github.com/orhun/git-cliff/commit/c41bbe05a2594ea945994de97f77b1ec292f49b1)) - *(readme)* Apply formatting - ([a4290c7](https://github.com/orhun/git-cliff/commit/a4290c7be832aaac894f9b4e69837f0eb13d9287)) - *(website)* Update the style for environment variable section - ([24ba433](https://github.com/orhun/git-cliff/commit/24ba43330a3b98d1d2c11dfa2e92c44eeabe2b7d)) ### 🧪 Testing - *(deploy)* Test the website deployment for pull requests - ([6f8a2f9](https://github.com/orhun/git-cliff/commit/6f8a2f96da1239f1261e597a6a358d9261f2c5e0)) ### ⚙️ Miscellaneous Tasks - *(cargo)* Update MSRV to 1.64.0 - ([84f20f9](https://github.com/orhun/git-cliff/commit/84f20f906fbb7995c656bd0ea14432ff6ff8d969)) - *(cd)* Temporarily switch back to action-rs/toolchain - ([1f897e3](https://github.com/orhun/git-cliff/commit/1f897e3d70dfe278de824c508febec42855878f3)) - *(ci)* Switch to dtolnay/rust-toolchain action - ([d54f72a](https://github.com/orhun/git-cliff/commit/d54f72aff416fcf6f4897ff69b0c114796f154e1)) - *(ci)* Update runner images - ([07e7938](https://github.com/orhun/git-cliff/commit/07e7938b6eb4dc9cf789e84bd007f02c500d31e9)) - *(docker)* Update versions in Dockerfile - ([95e8408](https://github.com/orhun/git-cliff/commit/95e8408ae661bb5fe003e2388d8449b1eb7f168c)) - *(docker)* Bump the action versions in docker workflow - ([c02538f](https://github.com/orhun/git-cliff/commit/c02538f85c1cf4e8ecba8556dad9c9e806de9e49)) - *(docker)* Bump build-push-action to v4 - ([0c84ed8](https://github.com/orhun/git-cliff/commit/0c84ed8eea663d9d78912080d3fe953f35c39216)) - *(editorconfig)* Fix editorconfig syntax - ([e35d83d](https://github.com/orhun/git-cliff/commit/e35d83d2cfb88b0552f648eda9193ffab9f0bbd4)) - *(editorconfig)* Update editorconfig for better code readability - ([8a4f928](https://github.com/orhun/git-cliff/commit/8a4f928f9e925cbf70ad373d71b4f677817ac8f2)) - *(examples)* Remove EXAMPLES.md - ([8038659](https://github.com/orhun/git-cliff/commit/80386597033090e427d1359b4797ee5dbbf113e5)) - *(github)* Integrate Dependabot - ([fe5a4dd](https://github.com/orhun/git-cliff/commit/fe5a4dd8f0fe4997f340967082ee9204f345a2a4)) - *(github)* Integrate bors - ([1ab6f39](https://github.com/orhun/git-cliff/commit/1ab6f39c849fe191992257622ea03618d76b3464)) - *(github)* Add contact links for issues - ([d3cb25b](https://github.com/orhun/git-cliff/commit/d3cb25bc9962b348e240b73ccd513b90c2b765e0)) - *(website)* Add workflow file for deploying the website - ([f550458](https://github.com/orhun/git-cliff/commit/f550458414f4c35dd1c23e3d05d1115424404a3c)) - *(website)* Move website to website folder - ([5644d10](https://github.com/orhun/git-cliff/commit/5644d1036508ffb420e12503adb671708e087cd9)) - *(website)* Move website to docs for GitHub pages deployment - ([b6e52e1](https://github.com/orhun/git-cliff/commit/b6e52e128e7a105682adf885850d14deefdff3ec)) ## New Contributors ❤️ * @bors[bot] made their first contribution in [#161](https://github.com/orhun/git-cliff/pull/161) * @dependabot[bot] made their first contribution * @mackness made their first contribution in [#157](https://github.com/orhun/git-cliff/pull/157) * @jackton1 made their first contribution in [#152](https://github.com/orhun/git-cliff/pull/152) * @radusuciu made their first contribution in [#147](https://github.com/orhun/git-cliff/pull/147) * @lbowenwest made their first contribution in [#137](https://github.com/orhun/git-cliff/pull/137) * @jankatins made their first contribution in [#141](https://github.com/orhun/git-cliff/pull/141) * @saidsay-so made their first contribution in [#140](https://github.com/orhun/git-cliff/pull/140) ## [1.1.2](https://github.com/orhun/git-cliff/compare/v1.1.1..v1.1.2) - 2023-01-20 ### 🐛 Bug Fixes - *(changelog)* Allow saving context to a file ([#138](https://github.com/orhun/git-cliff/issues/138)) - ([08ea900](https://github.com/orhun/git-cliff/commit/08ea900de09a124710d07783b2271cdbf453dd94)) - *(changelog)* Do not skip all tags when `skip_tags` is empty ([#136](https://github.com/orhun/git-cliff/issues/136)) - ([eee35ad](https://github.com/orhun/git-cliff/commit/eee35ad1eeeb89313e69086ad265ab400a6b4898)) - *(git)* Derive the tag order from commits instead of timestamp ([#139](https://github.com/orhun/git-cliff/issues/139)) - ([4df5656](https://github.com/orhun/git-cliff/commit/4df5656c1239b0252ce9e7571efa06e9d11490ea)) ### 🎨 Styling - *(fmt)* Update the derives in config module - ([336b25f](https://github.com/orhun/git-cliff/commit/336b25f3ae9da5d972304662fcdb88f4719c721d)) ### ⚙️ Miscellaneous Tasks - *(cargo)* Add metadata for cargo-binstall - ([31dac34](https://github.com/orhun/git-cliff/commit/31dac3410c04b837c7ede271faf9d862c58966af)) - *(docker)* Update versions in Dockerfile - ([353ca62](https://github.com/orhun/git-cliff/commit/353ca62260e8d71c68ec5a3a4ce1abe795f2cab5)) ### ◀️ Revert - *(git)* Use timestamp for deriving the tag order ([#139](https://github.com/orhun/git-cliff/issues/139)) - ([accfb0f](https://github.com/orhun/git-cliff/commit/accfb0fcdd06c66d3e9d98f8848cbb9ab0944d09)) ## [1.1.1](https://github.com/orhun/git-cliff/compare/v1.1.0..v1.1.1) - 2023-01-09 ### 🐛 Bug Fixes - *(npm)* Fix the type casting in base NPM package - ([bc0807f](https://github.com/orhun/git-cliff/commit/bc0807fe935d1ea1b1fe81025f8f4da0aad3387c)) - *(npm)* Fix the variable declaration for NPM package OS - ([f40a565](https://github.com/orhun/git-cliff/commit/f40a56588e22de2f6ed83e9d7b333da11cc0a797)) - *(npm)* Rename the NPM binary package for Windows - ([ce1d468](https://github.com/orhun/git-cliff/commit/ce1d468f0bd045f584d2ce4c0ed5f046cdc13777)) ### 📚 Documentation - *(readme)* Update README.md about the NPM package - ([e0177c2](https://github.com/orhun/git-cliff/commit/e0177c25e13812306aab0b0991562d58b6d14767)) ### ⚙️ Miscellaneous Tasks - *(cd)* Parallelize releasing on crates.io - ([24c8e3e](https://github.com/orhun/git-cliff/commit/24c8e3e4cf092dc347f90c6621238d86f0001f2a)) - *(cd)* Add README.md to the base NPM package - ([e2e124e](https://github.com/orhun/git-cliff/commit/e2e124ed4bc9ff77413af1b5cd075f5a55ca98de)) - *(npm)* Add more keywords to the base NPM package - ([abe68a2](https://github.com/orhun/git-cliff/commit/abe68a28847ec9d444337fb1adec522fca7aac1b)) - *(npm)* Package `git-cliff` for npm ([#133](https://github.com/orhun/git-cliff/issues/133)) - ([b7dd592](https://github.com/orhun/git-cliff/commit/b7dd592653a722a764609a3eacff5e1eee58c07e)) ## [1.1.0](https://github.com/orhun/git-cliff/compare/v1.0.0..v1.1.0) - 2023-01-08 ### ⛰️ Features - *(git)* Support generating changelog for multiple git repositories ([#13](https://github.com/orhun/git-cliff/issues/13)) - ([8b17a1f](https://github.com/orhun/git-cliff/commit/8b17a1f02619027bebc5df1a8938aaf76adcd631)) ### 🚜 Refactor - *(cd)* Use the git-cliff-action output for GitHub release body - ([03cf3a7](https://github.com/orhun/git-cliff/commit/03cf3a7028ec273bf23085d4bdac729422d83b42)) ### 📚 Documentation - *(readme)* Update copyright years - ([261ee4f](https://github.com/orhun/git-cliff/commit/261ee4f146ac7d68353dd052c62a510aadebfad4)) - *(readme)* Disable Liquid parsing in README.md by using raw blocks - ([6e8c7ed](https://github.com/orhun/git-cliff/commit/6e8c7edd3ab3a7efb53bb8197407c295a8252396)) ### ⚙️ Miscellaneous Tasks - *(cd)* Publish binaries for more platforms/architectures - ([ce1b7c3](https://github.com/orhun/git-cliff/commit/ce1b7c3d7b7622af03994bd7a2fbcbb00a7be8bf)) - *(cd)* Bump git-cliff-action to v2 - ([1b3cba8](https://github.com/orhun/git-cliff/commit/1b3cba8dca0d8e9da76c9d7c2444d04a3cd30528)) - *(config)* Update the description in the default config - ([0350bfd](https://github.com/orhun/git-cliff/commit/0350bfdee229ee50bb289b68190b9737d7ab572c)) - *(docker)* Add Jekyll configuration to .dockerignore - ([5dd1a15](https://github.com/orhun/git-cliff/commit/5dd1a15a6cf393de8efd1a63de5374f65e706120)) - *(github)* Add Jekyll theme configuration for GitHub pages - ([81e5720](https://github.com/orhun/git-cliff/commit/81e5720376346a2b0d3ef5a3ef4408507044f6e0)) - *(release)* Improve the release script with additional messages - ([09ab59f](https://github.com/orhun/git-cliff/commit/09ab59f12e8d295e607966f295b39d3ad2457fd0)) ## [1.0.0](https://github.com/orhun/git-cliff/compare/v0.10.0..v1.0.0) - 2022-12-25 ### ⛰️ Features - *(cd)* Publish Debian package via release workflow ([#113](https://github.com/orhun/git-cliff/issues/113)) - ([efd827f](https://github.com/orhun/git-cliff/commit/efd827f59f8394dd894ebd35a5d630ff558a3ebe)) - *(cd)* Include completions and mangen in binary releases ([#115](https://github.com/orhun/git-cliff/issues/115)) - ([9a070b2](https://github.com/orhun/git-cliff/commit/9a070b248d4ae0b58c9463f0627c87ca647c3023)) - *(changelog)* [**breaking**] Use current time for `--tag` argument ([#107](https://github.com/orhun/git-cliff/issues/107)) - ([e2cd07b](https://github.com/orhun/git-cliff/commit/e2cd07bcc92a6bdd011bbbb34843f22e6c4da271)) - *(changelog)* Allow running with `--prepend` and `--output` ([#120](https://github.com/orhun/git-cliff/issues/120)) - ([7325be8](https://github.com/orhun/git-cliff/commit/7325be84045ad376e0989a111ed3c44a3e1400ea)) - *(changelog, config)* [**breaking**] Replace `--date-order` by `--topo-order` - ([77731ec](https://github.com/orhun/git-cliff/commit/77731ec7aeb279b5b7a49b5f7d17cc51009afca2)) ### 🐛 Bug Fixes - *(fixtures)* Fix test fixture failures - ([29b3dd1](https://github.com/orhun/git-cliff/commit/29b3dd15982f8645d3f75c185d7a5adbfbb2a06f)) ### 📚 Documentation - *(readme)* Fix GitHub badges in README.md - ([acf2d52](https://github.com/orhun/git-cliff/commit/acf2d52602c008352de9ef98df7bb8d6f19b5222)) ### 🎨 Styling - *(readme)* Update README.md about the styling of footer field - ([47a7345](https://github.com/orhun/git-cliff/commit/47a7345167b78f824c80e41f9f8e2bf9df53d654)) ### ⚙️ Miscellaneous Tasks - *(cd)* Remove deprecated set-output usage - ([5187f02](https://github.com/orhun/git-cliff/commit/5187f029ec3d004a0acf7ffacec4621cce3ec1f1)) - *(ci)* Update actions/checkout to v3 - ([6c37611](https://github.com/orhun/git-cliff/commit/6c37611e162adb71d78203ad7d24d7c7f17774e3)) - *(config)* Comment out custom commit preprocessor ([#112](https://github.com/orhun/git-cliff/issues/112)) - ([8f77caf](https://github.com/orhun/git-cliff/commit/8f77caf86a1e5dd23eda1b9e9b5a7a6606642b8a)) - *(fixtures)* Run all test fixtures - ([53c1c50](https://github.com/orhun/git-cliff/commit/53c1c50a1e1a66c684bb1319c0bf48648ed01eab)) ## [0.10.0](https://github.com/orhun/git-cliff/compare/v0.9.2..v0.10.0) - 2022-11-20 ### ⛰️ Features - *(args)* Add a short variant `-d` for specifying `--date-order` flag - ([5913e24](https://github.com/orhun/git-cliff/commit/5913e24596a32625ce59ca819cbcf3329e7b3b5b)) - *(changelog)* Do not skip breaking changes if configured ([#114](https://github.com/orhun/git-cliff/issues/114)) - ([1c98995](https://github.com/orhun/git-cliff/commit/1c98995454f2df1e6766d55e026c16e857aa938b)) - *(config)* Changelog for the last n commits ([#116](https://github.com/orhun/git-cliff/issues/116)) - ([0c7769b](https://github.com/orhun/git-cliff/commit/0c7769b52fe3dee6afd0321c58021cf157acb964)) ### 🐛 Bug Fixes - *(changelog)* Warn against invalid tag range for `--current` flag ([#124](https://github.com/orhun/git-cliff/issues/124)) - ([e73fd9f](https://github.com/orhun/git-cliff/commit/e73fd9f821a5f16ab2581839be17c0c5ade85dc6)) - *(docker)* Fix syntax error in Dockerfile - ([5f9b2d5](https://github.com/orhun/git-cliff/commit/5f9b2d5d02d75c49d11e930ac80657eabb882140)) - *(docker)* Use an alternative method to fetch registry - ([876b13b](https://github.com/orhun/git-cliff/commit/876b13b1deea184cb423b82bccec7d6b7bf5bde4)) ### 🚜 Refactor - *(deps)* Utilize workspace dependencies - ([f2def40](https://github.com/orhun/git-cliff/commit/f2def401ba0b2b5aa4092b7167cd334d5bd54cd8)) - *(docker)* Improve cargo-chef caching in Dockerfile - ([0f38960](https://github.com/orhun/git-cliff/commit/0f38960851ac0fd159727d5dffb36f50268eec18)) ### 📚 Documentation - *(readme)* Update badge URL for Docker builds - ([a8fa7f9](https://github.com/orhun/git-cliff/commit/a8fa7f9fb5e334ff58e9ae371cc2ffb0a873c345)) - *(readme)* Add MacPorts install info ([#111](https://github.com/orhun/git-cliff/issues/111)) - ([f9d4b88](https://github.com/orhun/git-cliff/commit/f9d4b88a3324a10b918bab8c272a60214bcdcd13)) ### ⚙️ Miscellaneous Tasks - *(docker)* Update versions in Dockerfile - ([02e2b8e](https://github.com/orhun/git-cliff/commit/02e2b8e58e0e4a518fe5318be2bec6d1360ad34e)) ## New Contributors ❤️ * @FlrnFrmm made their first contribution in [#116](https://github.com/orhun/git-cliff/pull/116) * @sbmueller made their first contribution in [#114](https://github.com/orhun/git-cliff/pull/114) * @herbygillot made their first contribution in [#111](https://github.com/orhun/git-cliff/pull/111) ## [0.9.2](https://github.com/orhun/git-cliff/compare/v0.9.1..v0.9.2) - 2022-09-24 ### 🐛 Bug Fixes - *(docker)* Remove custom user creation from the Dockerfile ([#109](https://github.com/orhun/git-cliff/issues/109)) - ([5cb991d](https://github.com/orhun/git-cliff/commit/5cb991d4e3a39dd15ae22b661c23d18ccbd45004)) ### ⚙️ Miscellaneous Tasks - *(audit)* Remove cargo-audit config - ([078bdc3](https://github.com/orhun/git-cliff/commit/078bdc3f7a482e752bb983fad057a37f15528698)) - *(ci)* Switch to cargo-tarpaulin for measuring code coverage ([#110](https://github.com/orhun/git-cliff/issues/110)) - ([17f3a09](https://github.com/orhun/git-cliff/commit/17f3a0994d85022650170ff3a9fef942aa414303)) ## [0.9.1](https://github.com/orhun/git-cliff/compare/v0.9.0..v0.9.1) - 2022-09-20 ### 🐛 Bug Fixes - *(docker)* Configure git safe.directory for Docker image ([#108](https://github.com/orhun/git-cliff/issues/108)) - ([4fc2217](https://github.com/orhun/git-cliff/commit/4fc2217868fceea81ab5e6aeeb63ca719a07fe91)) ### 🎨 Styling - *(readme)* Update styling for with-commit example - ([8247301](https://github.com/orhun/git-cliff/commit/82473017ca627a8d736099a928f03cfb56c895dc)) ## [0.9.0](https://github.com/orhun/git-cliff/compare/v0.8.1..v0.9.0) - 2022-08-16 ### ⛰️ Features - *(changelog)* Support setting commit SHA while using `--with-commit` - ([d453d4c](https://github.com/orhun/git-cliff/commit/d453d4cbebbb607ff7dbe530542802e8ca60b585)) - *(changelog)* Support splitting commits by lines ([#101](https://github.com/orhun/git-cliff/issues/101)) - ([e3eae33](https://github.com/orhun/git-cliff/commit/e3eae33abcf212e56efcdbb873411e7d8e761b4f)) - *(commit)* Add commit author and committer to the context ([#100](https://github.com/orhun/git-cliff/issues/100)) - ([940065b](https://github.com/orhun/git-cliff/commit/940065b5754d4db4d6bb24c1ac8c7c5ddba75af0)) ### 🚜 Refactor - *(commit)* Use a more concise conversion for string - ([1b13b97](https://github.com/orhun/git-cliff/commit/1b13b97f7359987e027cfc55dc52b3ea40894d5b)) ### 📚 Documentation - *(readme)* Add test repository link to README.md - ([da484a3](https://github.com/orhun/git-cliff/commit/da484a33644acda9f93f46e48fae2186ce0397e2)) ### ⚙️ Miscellaneous Tasks - *(build)* Enable strip option for release profile - ([f70fefd](https://github.com/orhun/git-cliff/commit/f70fefd88acae2e599880af5a8bcff7710fbe6c1)) - *(docker)* Upgrade versions in Dockerfile - ([6bb4f5b](https://github.com/orhun/git-cliff/commit/6bb4f5b43e257941191a49756e3388aacb5f4978)) - *(docker)* Disable updating the description on Docker Hub - ([cd1306c](https://github.com/orhun/git-cliff/commit/cd1306cffdd01cc002c68d0e2297fa5a4589766b)) - *(docker)* Update the description on Docker Hub on push - ([9c0e7a2](https://github.com/orhun/git-cliff/commit/9c0e7a2ab8c3efdfb1be66ac55fba519b9bbb20c)) - *(docker)* Enable building arm64 docker images - ([f2968cd](https://github.com/orhun/git-cliff/commit/f2968cdf6ca1bfc9126c07af0894c0b2bd7f9a64)) - *(docker)* Use an alternative method to fetch registry - ([220d6e6](https://github.com/orhun/git-cliff/commit/220d6e64f4c786f1e4e353e506f98cb9eefb34ec)) - *(funding)* Add GitHub Sponsors option for funding - ([f3fada7](https://github.com/orhun/git-cliff/commit/f3fada723d680dab4f0cd435dc0430425a7fe995)) - *(project)* Update MSRV to 1.60.0 - ([b55e678](https://github.com/orhun/git-cliff/commit/b55e678a4ea669e195d0adae0694a340ab724c31)) ## New Contributors ❤️ * @AaronFriel made their first contribution in [#101](https://github.com/orhun/git-cliff/pull/101) ## [0.8.1](https://github.com/orhun/git-cliff/compare/v0.8.0..v0.8.1) - 2022-07-12 ### 🐛 Bug Fixes - *(cd)* Set fail-fast strategy to false - ([4b2ded0](https://github.com/orhun/git-cliff/commit/4b2ded0cf17d57b76c505372bebd098256200c5a)) ### ⚙️ Miscellaneous Tasks - *(cd)* Update windows runners to windows-2022 - ([8621a59](https://github.com/orhun/git-cliff/commit/8621a59d47b9e13dd449e6c781e847086e501153)) ## [0.8.0](https://github.com/orhun/git-cliff/compare/v0.7.0..v0.8.0) - 2022-07-12 ### ⛰️ Features - *(changelog)* Support external commands for commit preprocessors ([#86](https://github.com/orhun/git-cliff/issues/86)) - ([7d0786c](https://github.com/orhun/git-cliff/commit/7d0786ca55423950f0779de4e6a907fc25ae203a)) - *(commit)* [**breaking**] Pass footer token and separator to template ([#97](https://github.com/orhun/git-cliff/issues/97)) - ([0bf499e](https://github.com/orhun/git-cliff/commit/0bf499ec940a22a2bed052db21e89f7fc4b824ba)) - *(config)* Support changing commit scope with `commit_parsers` ([#94](https://github.com/orhun/git-cliff/issues/94)) - ([e220768](https://github.com/orhun/git-cliff/commit/e22076843b91be3680617db5686e070dedcfef29)) ### 🐛 Bug Fixes - *(ci)* Update lychee arguments to skip checking protonmail - ([a5aaca1](https://github.com/orhun/git-cliff/commit/a5aaca1a01e6e380c35a70bc512cb11d17e4b964)) ### 📚 Documentation - *(readme)* Switch chronological and topological ([#99](https://github.com/orhun/git-cliff/issues/99)) - ([2289199](https://github.com/orhun/git-cliff/commit/22891992a2e7898238b9d4e154bfffc6d84b180f)) - *(readme)* Clarify that `--tag` argument can be an unexisting tag - ([d540f5d](https://github.com/orhun/git-cliff/commit/d540f5d8938bc84b01b4fafaa69c3290eb72cd08)) ### ⚙️ Miscellaneous Tasks - *(docker)* Disable building arm64 docker images temporarily - ([175f7d7](https://github.com/orhun/git-cliff/commit/175f7d70559c642721c0c82215224cfba2cb0221)) - *(project)* Set MSRV to 1.58.1 ([#87](https://github.com/orhun/git-cliff/issues/87)) - ([bfcd0d9](https://github.com/orhun/git-cliff/commit/bfcd0d97ba2fc2271e754f6c9ecb834edf7f1190)) ## New Contributors ❤️ * @hawkw made their first contribution in [#97](https://github.com/orhun/git-cliff/pull/97) * @7596ff made their first contribution in [#99](https://github.com/orhun/git-cliff/pull/99) * @ofsahof made their first contribution in [#94](https://github.com/orhun/git-cliff/pull/94) ## [0.7.0](https://github.com/orhun/git-cliff/compare/v0.6.1..v0.7.0) - 2022-04-24 ### ⛰️ Features - *(args)* [**breaking**] Prefix environment variables with `GIT_CLIFF_` ([#76](https://github.com/orhun/git-cliff/issues/76)) - ([84507dd](https://github.com/orhun/git-cliff/commit/84507dd361f4c1ba37bfdb7005714bb817afb6b0)) - *(args)* Add `--context` flag for outputting context ([#71](https://github.com/orhun/git-cliff/issues/71)) - ([95ad55d](https://github.com/orhun/git-cliff/commit/95ad55d542cb772881f12ae2a25f7e06202c8587)) - *(cli)* Show a message if a newer version is available ([#69](https://github.com/orhun/git-cliff/issues/69)) - ([720a7c1](https://github.com/orhun/git-cliff/commit/720a7c1ec2cde510733d119b7b3b8a938ff945ff)) - *(config)* Support placing configuration inside Cargo.toml ([#46](https://github.com/orhun/git-cliff/issues/46)) - ([f48d207](https://github.com/orhun/git-cliff/commit/f48d2077c33b878337edc2e5fe8a97be990b4773)) - *(git)* Support preprocessing commit messages using regex ([#62](https://github.com/orhun/git-cliff/issues/62)) - ([64317f2](https://github.com/orhun/git-cliff/commit/64317f21168a9e9aa088befbd2841632f72e13a3)) - *(log)* Print more debug information when `-vv` is used ([#79](https://github.com/orhun/git-cliff/issues/79)) - ([a8efffc](https://github.com/orhun/git-cliff/commit/a8efffc7d57691999583a5a13bfd5d0e48aca095)) - *(man)* Add man page generation script ([#35](https://github.com/orhun/git-cliff/issues/35)) - ([03d55c8](https://github.com/orhun/git-cliff/commit/03d55c8eb1483fa783ea724b12bdd209fc2eaca2)) ### 🐛 Bug Fixes - *(build)* Pin the Rust nightly version - ([97c3044](https://github.com/orhun/git-cliff/commit/97c30449a1b7f9a551c5c57fc7518027aaf52f3b)) - *(changelog)* Allow custom commit range while prepending ([#68](https://github.com/orhun/git-cliff/issues/68)) - ([1bacc7f](https://github.com/orhun/git-cliff/commit/1bacc7f194f70fea5378d2609dd72e64eb62bdfb)) - *(ci)* Pin the Rust nightly version - ([1b04dbf](https://github.com/orhun/git-cliff/commit/1b04dbf1a8760281babcf699c0126063c131d6fe)) - *(fixtures)* Update expected changelog date - ([2b484f0](https://github.com/orhun/git-cliff/commit/2b484f078cb0c5236aa10fbb8c375e5b368ec0a1)) - *(log)* Remove redundant logging while using `--context` ([#71](https://github.com/orhun/git-cliff/issues/71)) - ([efd40e0](https://github.com/orhun/git-cliff/commit/efd40e02b3c7be29da6e2a161423b92a74c4f46e)) ### 🚜 Refactor - *(cli)* Make update-informer opt-out via feature flag ([#69](https://github.com/orhun/git-cliff/issues/69)) - ([cddb4d4](https://github.com/orhun/git-cliff/commit/cddb4d49fb03191208bc61d00cbaafde62ad8f92)) - *(completions)* Use implicit Result type in completions script - ([fa2639a](https://github.com/orhun/git-cliff/commit/fa2639aafe6082d937534d77f8ae3268f718b722)) ### 📚 Documentation - *(readme)* Update the title of projects section - ([4f4a82c](https://github.com/orhun/git-cliff/commit/4f4a82cbe3d7e03058a77f7757cf138716353b2a)) - *(readme)* Add `cliff-jumper` to similar projects ([#83](https://github.com/orhun/git-cliff/issues/83)) - ([2a21890](https://github.com/orhun/git-cliff/commit/2a218902d3d42ea233d8cf087944b575d05399c3)) - *(readme)* Update GitHub Actions reference link in README.md - ([9801963](https://github.com/orhun/git-cliff/commit/980196357bbf41c4b7596b81237ce36051196b6f)) - *(readme)* Add more regex examples for commit_preprocessors - ([9b83518](https://github.com/orhun/git-cliff/commit/9b83518a59cb8275f58f6076bd5ff23be606df2a)) ### 🎨 Styling - *(release)* Update the changelog template for tag message - ([72544b1](https://github.com/orhun/git-cliff/commit/72544b18073295362174200189a0f4e165c6d296)) ### ⚙️ Miscellaneous Tasks - *(cd)* Include man page in the release assets - ([a5ddf75](https://github.com/orhun/git-cliff/commit/a5ddf75152764bce42b9b5484989aea227d175b2)) - *(ci)* Return to nightly builds ([#73](https://github.com/orhun/git-cliff/issues/73)) - ([312b654](https://github.com/orhun/git-cliff/commit/312b654b07f000f49a7d1a3d1b9b4649c37842fe)) - *(docker)* Strip the binaries in Docker image - ([aca4ccf](https://github.com/orhun/git-cliff/commit/aca4ccfb7ff8c47bbe3c16203ef617dde94d3ad5)) - *(docker)* Disable default features for the Docker image - ([e6fb20d](https://github.com/orhun/git-cliff/commit/e6fb20d11c50c2989abecd27b7fb325d9d3ac490)) - *(docker)* Build Docker images for arm64 - ([8475e1f](https://github.com/orhun/git-cliff/commit/8475e1fd63b89bb56c2cf68de62dbb4d9e66b4bb)) - *(docker)* Upgrade versions in Dockerfile - ([3aa9a1a](https://github.com/orhun/git-cliff/commit/3aa9a1a059f876b66ce03bc1a4a7735a2c27e146)) ## New Contributors ❤️ * @favna made their first contribution in [#83](https://github.com/orhun/git-cliff/pull/83) * @kaushalmodi made their first contribution in [#80](https://github.com/orhun/git-cliff/pull/80) * @uyha made their first contribution in [#76](https://github.com/orhun/git-cliff/pull/76) * @mgrachev made their first contribution in [#73](https://github.com/orhun/git-cliff/pull/73) ## [0.6.1](https://github.com/orhun/git-cliff/compare/v0.6.0..v0.6.1) - 2022-03-13 ### 🐛 Bug Fixes - *(changelog)* Use root commit when --latest and there is only one tag ([#59](https://github.com/orhun/git-cliff/issues/59)) - ([3ccec7f](https://github.com/orhun/git-cliff/commit/3ccec7f93a917a4feaa5baf17b604fe3de76b0e1)) - *(changelog)* Do not skip all tags when `skip_tags` is empty ([#63](https://github.com/orhun/git-cliff/issues/63)) - ([ff1d981](https://github.com/orhun/git-cliff/commit/ff1d981fd9a5dba26422f56582e06b3b463eb8a3)) - *(example)* Fix `keepachangelog` config example ([#66](https://github.com/orhun/git-cliff/issues/66)) - ([9b5f0bb](https://github.com/orhun/git-cliff/commit/9b5f0bb5fdadf15cccb738f1bb96937be058795e)) - *(project)* Use the correct branch for codecov ([#65](https://github.com/orhun/git-cliff/issues/65)) - ([8f3325e](https://github.com/orhun/git-cliff/commit/8f3325e758d25d814c5c9831d128907696a12536)) ### 📚 Documentation - *(core)* Document timestamp format of `Release` struct ([#67](https://github.com/orhun/git-cliff/issues/67)) - ([d68eb12](https://github.com/orhun/git-cliff/commit/d68eb120c0a0a98bc1e7264a3aede17b5f5c54be)) - *(readme)* Add another option of GitHub Actions ([#64](https://github.com/orhun/git-cliff/issues/64)) - ([db7edf5](https://github.com/orhun/git-cliff/commit/db7edf5707f2bfdf49c749026969fd1833530ed7)) ## New Contributors ❤️ * @marcoieni made their first contribution in [#67](https://github.com/orhun/git-cliff/pull/67) ## [0.6.0](https://github.com/orhun/git-cliff/compare/v0.5.0..v0.6.0) - 2022-02-12 ### ⛰️ Features - *(changelog)* [**breaking**] Use conventional commit body to check against commit parsers - ([e1da611](https://github.com/orhun/git-cliff/commit/e1da61150f07f641dfe471e240033e13cc19d089)) - *(changelog)* Add `link_parsers` for parsing/extracting links ([#42](https://github.com/orhun/git-cliff/issues/42)) - ([b88e7d3](https://github.com/orhun/git-cliff/commit/b88e7d30bee74667028602fed1337ceb24829145)) - *(changelog, config)* [**breaking**] Replace --topo-order by --date-order ([#58](https://github.com/orhun/git-cliff/issues/58)) - ([a3980f4](https://github.com/orhun/git-cliff/commit/a3980f4632cea95d939c044ef5687123f5b91546)) - *(config)* Make the `changelog` section optional ([#45](https://github.com/orhun/git-cliff/issues/45)) - ([e02ae0b](https://github.com/orhun/git-cliff/commit/e02ae0b3661b3379175a10cb273a9c7744747765)) - *(config)* Make the `git` section optional ([#45](https://github.com/orhun/git-cliff/issues/45)) - ([8202e37](https://github.com/orhun/git-cliff/commit/8202e37dbd5dd98b3f9de8470e41776b5afb1b51)) ### 🐛 Bug Fixes - *(changelog)* Set the previous release when using `--unreleased` ([#47](https://github.com/orhun/git-cliff/issues/47)) - ([2be04f8](https://github.com/orhun/git-cliff/commit/2be04f8b2214513d08d349b254a97a8c783073fb)) - *(changelog)* Only drop previous releases if skipped ([#44](https://github.com/orhun/git-cliff/issues/44)) - ([943c23f](https://github.com/orhun/git-cliff/commit/943c23fd350eea1154deb2e294257c22d2bc76e5)) - *(ci)* Update grcov download command - ([5bfb454](https://github.com/orhun/git-cliff/commit/5bfb45411da940eb7d0df874558b31b50911bb59)) - *(ci)* Use the correct tar command for extracting grcov archive - ([a3f3aa6](https://github.com/orhun/git-cliff/commit/a3f3aa6405846419fabeafab5fea204ec0e4be9b)) - *(ci)* Update the download link of latest grcov release - ([c47133a](https://github.com/orhun/git-cliff/commit/c47133ac2423f7581b711fa97f1b30094907a3c2)) - *(ci)* Run clippy from nightly toolchain - ([7d766d7](https://github.com/orhun/git-cliff/commit/7d766d7e34726faf69f91a3941f1470356e4dda5)) - *(config)* Lower the priority of global configuration file ([#51](https://github.com/orhun/git-cliff/issues/51)) - ([2595952](https://github.com/orhun/git-cliff/commit/25959529d60340caac668e0dd3e5c5b105ab4290)) - *(test)* Update tests about optional config values - ([8bb48b0](https://github.com/orhun/git-cliff/commit/8bb48b09ef4488e4fb6b03a43e1d862b4645971b)) - *(tests)* Update custom error tests - ([58165c7](https://github.com/orhun/git-cliff/commit/58165c730e4ef370a448001193d90ff29a57449d)) ### 🚜 Refactor - *(config)* [**breaking**] Change the default value of `trim` to `true` - ([3b3ef7e](https://github.com/orhun/git-cliff/commit/3b3ef7e4d8d2cb680419e7175bc948b895c7de24)) - *(lib)* Unify serde and serde_derive using derive feature ([#57](https://github.com/orhun/git-cliff/issues/57)) - ([bedabc9](https://github.com/orhun/git-cliff/commit/bedabc93ddc30be69d27cbb42b23d3ff68e96f95)) ### 📚 Documentation - *(config)* Add minimal example - ([848d8a5](https://github.com/orhun/git-cliff/commit/848d8a587efd5f611a98b647b954c06938fac24a)) - *(readme)* Update copyright years - ([0a3c56c](https://github.com/orhun/git-cliff/commit/0a3c56c7ecdf01133d0e857269076052febadd91)) - *(readme)* Update template contexts about link_parsers - ([dce09d7](https://github.com/orhun/git-cliff/commit/dce09d71a05f5d1e1d8939d688d19c4740ba6a93)) ### 🎨 Styling - *(changelog)* Comply with MD022 and fix minor typos ([#61](https://github.com/orhun/git-cliff/issues/61)) - ([0293b28](https://github.com/orhun/git-cliff/commit/0293b281090f74a5855678acbb3dc9a259ba7126)) - *(readme)* Update the styling - ([dcb3141](https://github.com/orhun/git-cliff/commit/dcb3141ac969c52009f3f13314da65f1cf0e2604)) ### ⚙️ Miscellaneous Tasks - *(args)* Update arg parsing to clap v3 ([#49](https://github.com/orhun/git-cliff/issues/49)) - ([d961b53](https://github.com/orhun/git-cliff/commit/d961b53ba5ceb99adccfc5df3909c96cda682341)) - *(cd)* Update the runner to macos-11 - ([960cb4a](https://github.com/orhun/git-cliff/commit/960cb4ac6f4ffb0398a39c36637f53c1307d44ab)) - *(ci)* Run cargo-audit for checking vulnerabilities - ([cfe41fe](https://github.com/orhun/git-cliff/commit/cfe41fe56eddb38c109e178e02d3567d10ad78ff)) - *(docker)* Bump the Rust version in Dockerfile - ([d4cbb85](https://github.com/orhun/git-cliff/commit/d4cbb857388f8d5686715fcba62f8adaeb92230a)) ## New Contributors ❤️ * @tranzystorekk made their first contribution in [#57](https://github.com/orhun/git-cliff/pull/57) * @bachp made their first contribution in [#42](https://github.com/orhun/git-cliff/pull/42) ## [0.5.0](https://github.com/orhun/git-cliff/compare/v0.4.2..v0.5.0) - 2021-12-15 ### ⛰️ Features - *(args)* Add `--with-commit` argument for including custom commit messages in changelog - ([e4c60b2](https://github.com/orhun/git-cliff/commit/e4c60b20be8b7f1fa19429b1b1f984dc4caf9340)) - *(args)* Add `--current` flag for processing the current tag ([#37](https://github.com/orhun/git-cliff/issues/37)) - ([02a6187](https://github.com/orhun/git-cliff/commit/02a6187a58583f27e4604d7ea518b52b4bc7a833)) - *(args)* Add `--exclude-path` argument for excluding related commits - ([25a1d49](https://github.com/orhun/git-cliff/commit/25a1d49c0993685d8bf95225e81ee7d614131115)) - *(args)* Support multiple values for `--commit-path` argument - ([edb343a](https://github.com/orhun/git-cliff/commit/edb343a10e76a33b7223aa36d37df350d4ac6df1)) - *(args)* Accept glob patterns for `--commit-path` argument - ([ad11cbf](https://github.com/orhun/git-cliff/commit/ad11cbf6c528e1cf80075d986658774be3fabff7)) - *(changelog)* Support having both conventional and unconventional commits in the changelog - ([8445313](https://github.com/orhun/git-cliff/commit/8445313b13f6f087f79ea73bc1c12b0340a87d92)) - *(changelog)* Add `--topo-order` flag for sorting tags ([#29](https://github.com/orhun/git-cliff/issues/29)) - ([cc09d63](https://github.com/orhun/git-cliff/commit/cc09d637ff4edfcba625e469dcd3eb0062ac2a4f)) - *(config)* Add `ignore_tags` option ([#40](https://github.com/orhun/git-cliff/issues/40)) - ([de11cce](https://github.com/orhun/git-cliff/commit/de11ccecac10de6069d7a1ba0a1013582fc8bd25)) - *(config)* Support specifying the sorting methods in config ([#31](https://github.com/orhun/git-cliff/issues/31)) - ([4eb334d](https://github.com/orhun/git-cliff/commit/4eb334da06c1bde3b53d95ea50d086daab07e4bb)) - *(template)* Use more explanatory error messages about templates - ([1a9c3e3](https://github.com/orhun/git-cliff/commit/1a9c3e310f1b7ae8de6f5d62bd2095afd616c463)) ### 🐛 Bug Fixes - *(args)* Override the sort related config if args are present ([#39](https://github.com/orhun/git-cliff/issues/39)) - ([ef63727](https://github.com/orhun/git-cliff/commit/ef63727b5f0a5aba7024e2afe5dc24a1b218d978)) - *(changelog)* Drop the skipped releases from 'previous' field - ([7f867ae](https://github.com/orhun/git-cliff/commit/7f867ae647ff30f54aae314596cbc7c7ce4f50c1)) - *(fixtures)* Strip the carriage return on fixtures while comparing - ([d7e8ce2](https://github.com/orhun/git-cliff/commit/d7e8ce25286a2dc1ce5d134df871cdc07f4a9211)) - *(fixtures)* Update the multi line docker command - ([c8d288c](https://github.com/orhun/git-cliff/commit/c8d288c4c8dafd011b2d324d3ba3052b0fe11794)) - *(fixtures)* Use the defined configuration file for fixtures - ([bbc58d7](https://github.com/orhun/git-cliff/commit/bbc58d7bd01091b71c38323ba71cc07b97285c19)) - *(fixtures)* Checkout the repository before running fixtures - ([cb412a9](https://github.com/orhun/git-cliff/commit/cb412a905f7121bb3277de1086fb48f34bbb7319)) - *(tests)* Update log test about exclude path - ([9d213f5](https://github.com/orhun/git-cliff/commit/9d213f5713af3a27e1026d275be1676a739d6c3a)) ### 🚜 Refactor - *(config)* Rename the config value for commit order - ([6cec37d](https://github.com/orhun/git-cliff/commit/6cec37d1ecb23507f0bf47cd7fe942368faca92d)) ### 📚 Documentation - *(readme)* Update `--with-commit` example in README.md - ([47d124a](https://github.com/orhun/git-cliff/commit/47d124add2669e541d992aba83759dc31cd9d18d)) ### 🎨 Styling - *(args)* [**breaking**] Rename `--commit-path` argument to `--include-path` - ([7b000ad](https://github.com/orhun/git-cliff/commit/7b000ad43ef5d25941057b38bb6747f9f1514b17)) ### ⚙️ Miscellaneous Tasks - *(config)* Indicate the breaking changes via default config - ([316c11b](https://github.com/orhun/git-cliff/commit/316c11b60756f8b38174433450d42f25919368b7)) - *(fixtures)* Run test fixtures on ubuntu-latest - ([dea65f2](https://github.com/orhun/git-cliff/commit/dea65f235e2091001d8de41794bf3c98a7223917)) - *(fixtures)* Improve the workflow for test fixtures - ([92a54d6](https://github.com/orhun/git-cliff/commit/92a54d67b825b53b6993a769ea9d5cf37ea2e43e)) ## New Contributors ❤️ * @kenji-miyake made their first contribution in [#40](https://github.com/orhun/git-cliff/pull/40) ## [0.4.2](https://github.com/orhun/git-cliff/compare/v0.4.1..v0.4.2) - 2021-10-22 ### 🐛 Bug Fixes - *(cd)* Install the Rust toolchain explicitly for crates.io releases - ([2cee3bf](https://github.com/orhun/git-cliff/commit/2cee3bf9ecc00e21b871e88a34a949fbca6b646b)) ## [0.4.1](https://github.com/orhun/git-cliff/compare/v0.4.0..v0.4.1) - 2021-10-22 ### 🐛 Bug Fixes - *(changelog)* Add support for special characters in scopes ([#26](https://github.com/orhun/git-cliff/issues/26)) - ([10771f4](https://github.com/orhun/git-cliff/commit/10771f43c0f252dec9ad414b780bb22d866d00e2)) ### 🚜 Refactor - *(git)* Use a better error message for invalid repo path - ([f447cc2](https://github.com/orhun/git-cliff/commit/f447cc2e73ea707c2f4694507e9c7847fcff29e9)) ### 📚 Documentation - *(readme)* Update GitLab CI/CD section - ([2925340](https://github.com/orhun/git-cliff/commit/2925340368da5c74104f7c9befa47ee27f49c02d)) - *(readme)* Add GitLab CI/CD section to README.md ([#24](https://github.com/orhun/git-cliff/issues/24)) - ([90a87c5](https://github.com/orhun/git-cliff/commit/90a87c58741b3cdeee87a3c162cd10ddef59adaf)) ### ⚙️ Miscellaneous Tasks - *(ci)* Run CI workflows periodically - ([627d4ef](https://github.com/orhun/git-cliff/commit/627d4eff7f6e4da9ea942ac05c6743a4153f4cc2)) - *(docker)* Bump the Rust version in Dockerfile - ([fc33efd](https://github.com/orhun/git-cliff/commit/fc33efde85fb6c3a8c82c37e795b598706aea609)) - *(project)* Migrate to Rust 2021 edition - ([0000000](https://github.com/orhun/git-cliff/commit/0000000ef0e2d0710f4c1294408da2639f6f3217)) - *(project)* Remove unnecessary Cargo.lock entry from .gitignore - ([481713c](https://github.com/orhun/git-cliff/commit/481713cbb74fc2bce4a46ab6f8d4649b03d96fc2)) ## New Contributors ❤️ * @pataar made their first contribution in [#26](https://github.com/orhun/git-cliff/pull/26) * @alteregoart made their first contribution in [#24](https://github.com/orhun/git-cliff/pull/24) ## [0.4.0](https://github.com/orhun/git-cliff/compare/v0.3.0..v0.4.0) - 2021-10-01 ### ⛰️ Features - *(changelog)* Add `--sort` argument for sorting commits ([#15](https://github.com/orhun/git-cliff/issues/15)) - ([2950a41](https://github.com/orhun/git-cliff/commit/2950a412c2aaa0d96609753129047cef39fd3e1c)) ### 🐛 Bug Fixes - *(ci)* Update lychee arguments to skip checking files - ([ba3f1ca](https://github.com/orhun/git-cliff/commit/ba3f1cac50338672c555581659e098e11796f466)) - *(config)* Remove only the leading "v" from tags ([#18](https://github.com/orhun/git-cliff/issues/18)) - ([e444615](https://github.com/orhun/git-cliff/commit/e444615c02749da5fc64ae3286bfde1b616e7271)) - *(docker)* Remove tags from the base image names - ([ece0481](https://github.com/orhun/git-cliff/commit/ece0481e73e63371dab87ec6a71da59999db7d47)) ### 📚 Documentation - *(config)* Add scope-sorted example ([#16](https://github.com/orhun/git-cliff/issues/16)) - ([05584b6](https://github.com/orhun/git-cliff/commit/05584b614aa593558674243cfbf14dafe7b6b8db)) - *(readme)* Add "build from source" section to README.md - ([b193f42](https://github.com/orhun/git-cliff/commit/b193f42e258e8fdee8b1b645d5a614d606f7e079)) - *(readme)* Mention the signing key for binary releases ([#17](https://github.com/orhun/git-cliff/issues/17)) - ([9022af5](https://github.com/orhun/git-cliff/commit/9022af533d3d967a09352a1bdf542f8ba97e9930)) - *(readme)* Add packaging status badge to installation section - ([5409e06](https://github.com/orhun/git-cliff/commit/5409e06e4cf3b6833ba3a9b1eb224014280069dd)) - *(readme)* Add raw/rendered output for scoped-sorted example - ([f64459d](https://github.com/orhun/git-cliff/commit/f64459dd9f6030697e51903f91136fa857332425)) ### 🎨 Styling - *(config)* Fix the newline issues in scoped-sorted example - ([428d407](https://github.com/orhun/git-cliff/commit/428d407df581dd00e26b320c3872eb21cfc8c803)) ### ⚙️ Miscellaneous Tasks - *(docker)* Use docker.yml workflow for CI/CD - ([7756266](https://github.com/orhun/git-cliff/commit/7756266b17f3c3ba55f5d00f8e55aea0a3a68ef2)) - *(docker)* Use explicit image name for docker automated builds - ([777375f](https://github.com/orhun/git-cliff/commit/777375f67703b2833509700273cb0bec9a659525)) - *(docker)* Specify the latest tag explicitly - ([6bafc5d](https://github.com/orhun/git-cliff/commit/6bafc5d1a124dea5423338afd75a5136944bebb5)) - *(docker)* Rename the GHCR package due to legacy reasons - ([71b8846](https://github.com/orhun/git-cliff/commit/71b88466ebd37b2bf5f0489afed117417ad20b24)) - *(docker)* Extend the tags for docker meta - ([dff2e62](https://github.com/orhun/git-cliff/commit/dff2e62edc3886346375a2451faabe5e8cf679f9)) - *(docker)* Use docker meta for tagging for GHCR - ([081b2d2](https://github.com/orhun/git-cliff/commit/081b2d257ba853c1d31d35ebfeae1cb92a641746)) - *(docker)* Use cache for docker builds - ([d3140ed](https://github.com/orhun/git-cliff/commit/d3140ed9882b6df8c07196c8f68bae67ab8da684)) - *(workflow)* Update the runner to ubuntu-20.04 - ([5069594](https://github.com/orhun/git-cliff/commit/5069594f1800e409665609224995b25dcb9df438)) - *(workflow)* Set a version for the checkout action - ([b323e60](https://github.com/orhun/git-cliff/commit/b323e60996595976fbe8261b5f8c4a9f67d2a8f8)) ## New Contributors ❤️ * @FoxxMD made their first contribution in [#16](https://github.com/orhun/git-cliff/pull/16) ## [0.3.0](https://github.com/orhun/git-cliff/compare/v0.2.6..v0.3.0) - 2021-09-10 ### ⛰️ Features - *(changelog)* Support generating a changelog scoped to a directory ([#11](https://github.com/orhun/git-cliff/issues/11)) - ([0bb7c91](https://github.com/orhun/git-cliff/commit/0bb7c910b45436cbf69b444ccb29a530ede4aea0)) - *(changelog)* Support parsing the missing scopes with `default_scope` ([#8](https://github.com/orhun/git-cliff/issues/8)) - ([b5df656](https://github.com/orhun/git-cliff/commit/b5df656e61035f6230f2613f3dba6a92f88708cd)) ### 🐛 Bug Fixes - *(config)* Fix default regexes and references in docs ([#7](https://github.com/orhun/git-cliff/issues/7)) - ([8a18e4d](https://github.com/orhun/git-cliff/commit/8a18e4d48debbe522cefa9acd662bcc9a825c74e)) ### 📚 Documentation - *(config)* Update the default regex in scoped config example - ([0d793ad](https://github.com/orhun/git-cliff/commit/0d793ad9db43f0290ff6286f6aa1a618feb714ea)) - *(readme)* Update example regexes - ([f420a5a](https://github.com/orhun/git-cliff/commit/f420a5ac6cf56f3167cac23d40b43ec9aa370005)) - *(readme)* Add badge for joining the Matrix chat - ([b5edfc2](https://github.com/orhun/git-cliff/commit/b5edfc279d0290fecaacab469ecccdadf63eb3ab)) - *(readme)* Update installation instructions for Arch Linux - ([8fb18b7](https://github.com/orhun/git-cliff/commit/8fb18b784808222fdf3c4328ac9c871b93524fee)) ## New Contributors ❤️ * @Groxx made their first contribution in [#7](https://github.com/orhun/git-cliff/pull/7) ## [0.2.6](https://github.com/orhun/git-cliff/compare/v0.2.5..v0.2.6) - 2021-09-04 ### 🐛 Bug Fixes - *(docker)* Pin the cargo-chef version in Dockerfile - ([af1851c](https://github.com/orhun/git-cliff/commit/af1851c0111d66ec3dd190baf7a456bcf44fdcdc)) ### 📚 Documentation - *(readme)* Update docker commands to only mount the .git directory - ([4398828](https://github.com/orhun/git-cliff/commit/4398828df7b3710550adee8ec09a34a59783265b)) ### ⚙️ Miscellaneous Tasks - *(docker)* Bump cargo-chef version in Dockerfile - ([612192b](https://github.com/orhun/git-cliff/commit/612192b3aa638be9ccd38ecda27bdee6b6ff6655)) ## [0.2.5](https://github.com/orhun/git-cliff/compare/v0.2.4..v0.2.5) - 2021-08-20 ### ⛰️ Features - *(template)* Add `breaking_description` to the template context ([#4](https://github.com/orhun/git-cliff/issues/4)) - ([e0f6ca1](https://github.com/orhun/git-cliff/commit/e0f6ca151af1b0561cfcc4b757e430923f3d81b5)) ### 📚 Documentation - *(readme)* Update template examples to mention how to contribute - ([4c6e64b](https://github.com/orhun/git-cliff/commit/4c6e64bd13badf6bff55d608fcff4a06585f226c)) - *(readme)* Mention breaking changes for templating - ([6fa5d28](https://github.com/orhun/git-cliff/commit/6fa5d288d35c9f4218e33631b942bdd0cc381d3c)) ### ⚙️ Miscellaneous Tasks - *(release)* Show the committed changes before creating a tag - ([59ffe53](https://github.com/orhun/git-cliff/commit/59ffe53a7cb4791e4877a74f2e14d15139d2aca9)) ## [0.2.4](https://github.com/orhun/git-cliff/compare/v0.2.3..v0.2.4) - 2021-08-20 ### 🐛 Bug Fixes - *(cd)* Change the config file location for crates.io release - ([a9b286c](https://github.com/orhun/git-cliff/commit/a9b286cf023148da0800c2a0408d87571c239847)) ## [0.2.3](https://github.com/orhun/git-cliff/compare/v0.2.2..v0.2.3) - 2021-08-18 ### 🐛 Bug Fixes - *(cd)* Fetch the dependencies before copying the file to embed - ([9e29c95](https://github.com/orhun/git-cliff/commit/9e29c95319abd1747fbf6fd1e205d414617b0447)) ## [0.2.2](https://github.com/orhun/git-cliff/compare/v0.2.1..v0.2.2) - 2021-08-18 ### 🐛 Bug Fixes - *(cd)* Copy the config file into registry to resolve it for embed - ([48ea157](https://github.com/orhun/git-cliff/commit/48ea1578b5ecc17f5cc9a4249fb7b38610028fc6)) ## [0.2.1](https://github.com/orhun/git-cliff/compare/v0.2.0..v0.2.1) - 2021-08-18 ### 🐛 Bug Fixes - *(cd)* Copy the configuration file to embed into package - ([68dda36](https://github.com/orhun/git-cliff/commit/68dda364278870df84891495a3ff546ddbcae6a1)) ## [0.2.0](https://github.com/orhun/git-cliff/compare/v0.1.2..v0.2.0) - 2021-08-18 ### ⛰️ Features - *(config)* Support a global location for configuration file ([#2](https://github.com/orhun/git-cliff/issues/2)) - ([210b634](https://github.com/orhun/git-cliff/commit/210b6341137016b902b20736f76c358e47d53c97)) - *(config)* Add `--init` flag for creating the default config - ([183481b](https://github.com/orhun/git-cliff/commit/183481bac374707fbb7c579e2df83296e27f7251)) - *(config)* Embed the default configuration file into the binary - ([e5148e3](https://github.com/orhun/git-cliff/commit/e5148e3ae1f6d459c0faeba6b6a78cf221f6f7ff)) ### 🐛 Bug Fixes - *(config)* Use custom error type for UTF-8 errors - ([45889c0](https://github.com/orhun/git-cliff/commit/45889c0a05ad64598d4e6b053bc0d90ff5449b51)) ### 🚜 Refactor - *(lib)* Update the log message for unprocessed tags - ([6f154ce](https://github.com/orhun/git-cliff/commit/6f154ce4eef33e5d36e07a6c78878eb01ebc024f)) - *(lib)* Create a constant for default configuration file - ([c478f2c](https://github.com/orhun/git-cliff/commit/c478f2c6167c53a814810eb65ab96084f020d928)) ### 📚 Documentation - *(changelog)* Update the doc comment of `prepend` - ([e7ae5a0](https://github.com/orhun/git-cliff/commit/e7ae5a062d3c446c6a0bc7d2784c52b63485259f)) ### 🎨 Styling - *(args)* Update the message of `--init` flag - ([927776b](https://github.com/orhun/git-cliff/commit/927776b9db06ff2de8555b57c862c4a9e4991469)) ### ⚙️ Miscellaneous Tasks - *(config)* Move `cliff.toml` to config/ - ([acda195](https://github.com/orhun/git-cliff/commit/acda1954dc192a3b706c21a48821f75e5a8e0d22)) ## [0.1.2](https://github.com/orhun/git-cliff/compare/v0.1.1..v0.1.2) - 2021-08-14 ### 🐛 Bug Fixes - *(cd)* Use the correct name of completions binary - ([3ae64f4](https://github.com/orhun/git-cliff/commit/3ae64f4dd01f05a7896821c55642b8cac6e59bec)) ### 📚 Documentation - *(completions)* Update the example completion command - ([f1fd88a](https://github.com/orhun/git-cliff/commit/f1fd88af8f7fdfb021109ed9a24bd3d43045d534)) ## [0.1.1](https://github.com/orhun/git-cliff/compare/v0.1.0..v0.1.1) - 2021-08-14 ### 🐛 Bug Fixes - *(changelog)* Set the previous release when using `--latest` ([#3](https://github.com/orhun/git-cliff/issues/3)) - ([29db41a](https://github.com/orhun/git-cliff/commit/29db41aa12332f14a421109fe8d6d09b549abd61)) ### 📚 Documentation - *(readme)* Add installation instructions for the AUR - ([f1b495d](https://github.com/orhun/git-cliff/commit/f1b495d7b1aeb016911150faa0d49f847cc7b17c)) ### ⚡ Performance - *(changelog)* Optimize the release vector size - ([7e84797](https://github.com/orhun/git-cliff/commit/7e84797900f1b6f61e16d8a4766b8209673a7acb)) - *(changelog)* Process only the last 'previous' release - ([f859747](https://github.com/orhun/git-cliff/commit/f85974761be11e0ecc85575bc4b6d5a02e438fd2)) ### ⚙️ Miscellaneous Tasks - *(project)* Rename the shell completions binary - ([718f535](https://github.com/orhun/git-cliff/commit/718f53573b9f48a60ad1930cd9555063414f8b96)) ## [0.1.0] - 2021-08-12 ### ⛰️ Features - *(args)* Add `--output` argument - ([e0cda23](https://github.com/orhun/git-cliff/commit/e0cda238105e0ce22ac71409d6e3ee0e32a6bad7)) - *(args)* Add `--workdir` argument - ([de439be](https://github.com/orhun/git-cliff/commit/de439bef01e0e1209b8517ce7b241bb0db2cb530)) - *(changelog)* Support setting the body template via args - ([9fc08f4](https://github.com/orhun/git-cliff/commit/9fc08f4c50160374298bf77701ee5e299fa435a0)) - *(logs)* Show the processed commit message - ([45dccf7](https://github.com/orhun/git-cliff/commit/45dccf74a4a5449d92d453d21b6566acd8f30ebe)) ### 🐛 Bug Fixes - *(cd)* Wait for core library to update on crates.io before publish - ([e795460](https://github.com/orhun/git-cliff/commit/e795460c9bb7275294d1fa53a9d73258fb51eb10)) - *(cd)* Wait between publishing crates - ([777b3e5](https://github.com/orhun/git-cliff/commit/777b3e573f20e913a68293eb155076d52914b4d4)) - *(cd)* Generate changelog on a dedicated/different job - ([2f16dd5](https://github.com/orhun/git-cliff/commit/2f16dd5ae7f4bbff7b9944db039192d8ce148655)) - *(cd)* Fix the syntax of publish step arguments - ([6414789](https://github.com/orhun/git-cliff/commit/6414789067780d0551292c004a8aaff04483906d)) - *(cd)* Use a separate step for setting the changelog body - ([f038054](https://github.com/orhun/git-cliff/commit/f038054417f608b5792b89f60b4d384b74b317dd)) - *(cd)* Publish the cargo workspace members separately - ([acc1d34](https://github.com/orhun/git-cliff/commit/acc1d3453ca865ddbf3e8e786fcc157c8e31eae6)) - *(cd)* Strip the changelog header before escaping - ([6b97c2d](https://github.com/orhun/git-cliff/commit/6b97c2d18c05fb9cf27088a39b24d12ab1b0c556)) - *(cd)* Use printf to prevent field splitting the variable - ([92a4b0d](https://github.com/orhun/git-cliff/commit/92a4b0d5bfb8c27627886005d0e6d823a3cc6476)) - *(cd)* Double quote the environment variable - ([85aa1cd](https://github.com/orhun/git-cliff/commit/85aa1cdc688b74d1d2df46dc61e6aa5561fc6ace)) - *(changelog)* Return error if there is not a latest tag to process - ([8232111](https://github.com/orhun/git-cliff/commit/8232111aa1fab0089fdb3b025202729b59dcf906)) - *(changelog)* Use footers field as an array for the context - ([3e5c23d](https://github.com/orhun/git-cliff/commit/3e5c23d342ef96bececf41254cb609025a012fb3)) - *(ci)* Update lychee arguments to exclude invalid links - ([e1d604c](https://github.com/orhun/git-cliff/commit/e1d604cbdf049f30c33380c591bfedf0baa3f0a7)) - *(config)* Update the environment variable parsing settings - ([9984abf](https://github.com/orhun/git-cliff/commit/9984abfe04e6bed0745b52701ce3f45dd92529f6)) - *(config)* Update config to skip release commits - ([2e5f30a](https://github.com/orhun/git-cliff/commit/2e5f30a5c3b920dc2b52fe12774fccb2fb3fd124)) - *(config)* Update commit parsers to match the commit type - ([24b9068](https://github.com/orhun/git-cliff/commit/24b9068d308b9818fab8fd631120a79e4069521d)) - *(example)* Remove symbolic link - ([ed010be](https://github.com/orhun/git-cliff/commit/ed010be74fb745a9147315bcbbe0f9ac0aae85fb)) - *(example)* Update symbolic link to the default config - ([ee377cc](https://github.com/orhun/git-cliff/commit/ee377cc42d2d8771d67b0907151b1bb2ee012d69)) - *(git)* Sort the commits in topological order - ([a1b4b5b](https://github.com/orhun/git-cliff/commit/a1b4b5b18a6061392fc27b66a5726824212c114c)) - *(git)* Return tags by their creation order - ([000a67c](https://github.com/orhun/git-cliff/commit/000a67cd8aae7ae20848baa04cd6212376dcde12)) - *(release)* Fix the character escape in release script - ([5d616ee](https://github.com/orhun/git-cliff/commit/5d616ee249aaee9f38d6d9b7a9e14170b9b7405a)) - *(release)* Specify the committer email in release script - ([381c941](https://github.com/orhun/git-cliff/commit/381c941a94188fb40bcce1129c29e6a5379ac7a7)) - *(release)* Strip the unreleased title from tag message - ([c7f08fe](https://github.com/orhun/git-cliff/commit/c7f08fe4a3113f656bb45a29141aa127d4e453e5)) - *(template)* Use 7 digits for short SHA - ([1f85263](https://github.com/orhun/git-cliff/commit/1f85263f84bf15285fd3fd75af00fa21b12e9738)) - *(test)* Use default tag_pattern for tests - ([e6fb8de](https://github.com/orhun/git-cliff/commit/e6fb8de5d834eb5fe5ff3b5fab1986fcf5e720b6)) ### 🚜 Refactor - *(args)* Rename changelog argument to prepend - ([5a5a042](https://github.com/orhun/git-cliff/commit/5a5a042134c4829d98271607f697f77701f80860)) - *(args)* Update value names and description - ([c697b17](https://github.com/orhun/git-cliff/commit/c697b17f67c9438a1fb159db74b1e225aeb28853)) - *(args)* Update the value name for `--strip` - ([e8a3c35](https://github.com/orhun/git-cliff/commit/e8a3c35fa1f2a9a1a99ad8c60b82899c2af212eb)) - *(config)* Make tag_pattern optional - ([3a27a3e](https://github.com/orhun/git-cliff/commit/3a27a3e1a2d3813def0405ddf89914c5f10f7b36)) - *(error)* Use custom error message for GroupError - ([1be66ee](https://github.com/orhun/git-cliff/commit/1be66eebebaa3a5849399433ad5823345668ffb1)) - *(logs)* Improve logging - ([5333453](https://github.com/orhun/git-cliff/commit/53334533eb6399dc4b931fa3f61c32b5e28bd9e7)) ### 📚 Documentation - *(bin)* Update the doc comment for completions script - ([c056196](https://github.com/orhun/git-cliff/commit/c056196af9ee3f7109876639a0fb3b230661e1e4)) - *(contributing)* Add CONTRIBUTING.md - ([0fe28b3](https://github.com/orhun/git-cliff/commit/0fe28b322e4dd83bef1ba39d1028922065aa8aee)) - *(readme)* Add preview image to README.md - ([6e6bdde](https://github.com/orhun/git-cliff/commit/6e6bddeadd3ee43ac6bb626ce5ebd582ffd1f7cb)) - *(readme)* Update detailed template example - ([441ed4d](https://github.com/orhun/git-cliff/commit/441ed4d8b499a46ce22800da3d969ea6165d6ddf)) - *(readme)* Add examples for templating - ([a406158](https://github.com/orhun/git-cliff/commit/a40615860871d4bbb351ae1571192a624b1b539d)) - *(readme)* Add examples for CLI usage - ([32f837e](https://github.com/orhun/git-cliff/commit/32f837e3f0d642f5dc16f1e144ef5040652173ec)) - *(readme)* Update README.md about template and examples - ([2f2b2fc](https://github.com/orhun/git-cliff/commit/2f2b2fc50a5aa4cdd7842448b9fde7f73564f5d7)) - *(readme)* Update README.md about usage - ([7f4a9c2](https://github.com/orhun/git-cliff/commit/7f4a9c20128af75a8972e58130ac0ed4ce52d995)) - *(readme)* Add usage section - ([c87fbbe](https://github.com/orhun/git-cliff/commit/c87fbbe7cf869dd343269f6f23d9e4776a7d952b)) - *(release)* Add RELEASE.md - ([ce2246b](https://github.com/orhun/git-cliff/commit/ce2246bcfdcbce2e2ef30ec44fbfae26d3914139)) - *(release)* Add link to the signer key of the tag - ([59b7c6e](https://github.com/orhun/git-cliff/commit/59b7c6ef79c6377b3de26247a232412c765ab6a8)) ### 🎨 Styling - *(config)* Update the order of entries in config - ([9f84fe5](https://github.com/orhun/git-cliff/commit/9f84fe58a76c4aed97844e648bf42ad0c1d46303)) - *(readme)* Remove quotes from rendered output - ([dfab978](https://github.com/orhun/git-cliff/commit/dfab97842fe78fb8f217a5185fb6ec92682a53ca)) - *(readme)* Wrap table of contents into summary - ([fa6a38b](https://github.com/orhun/git-cliff/commit/fa6a38b339d7a56e976820b363f48d5c13d5cdf5)) - *(readme)* Remove comments from template context - ([1cf1ac7](https://github.com/orhun/git-cliff/commit/1cf1ac73fa26d015f7316c7c27639c1c7f4a7995)) - *(readme)* Update the comments in template context - ([3749490](https://github.com/orhun/git-cliff/commit/37494901ef4826b57f82946a6cd6c7cd21f5ca2c)) - *(readme)* Center the badges - ([f08ff0c](https://github.com/orhun/git-cliff/commit/f08ff0c4136a2257bfe7e586c03bcf7a520f06bd)) ### 🧪 Testing - *(config)* Add tests - ([11a7a7e](https://github.com/orhun/git-cliff/commit/11a7a7eb3eec4e801b6ab6576db2849bc771987f)) - *(git)* Update repository tests about getting the latest tag - ([9cf9ac1](https://github.com/orhun/git-cliff/commit/9cf9ac1586cf0f582b9a48bc5ce6f351d8350721)) ### ⚙️ Miscellaneous Tasks - *(cargo)* Update project details - ([22f0a7e](https://github.com/orhun/git-cliff/commit/22f0a7ef73cb1649d9ed59e43ee0e410b456233d)) - *(cd)* Enable crates.io releases - ([31ecfd8](https://github.com/orhun/git-cliff/commit/31ecfd8ad041e36090575e5851ff00d491ccebca)) - *(cd)* Use only one step for uploading releases - ([42a714f](https://github.com/orhun/git-cliff/commit/42a714f31cf5b6f924fe68d966189e2c278a11a6)) - *(cd)* Use separate steps for uploading releases - ([0182533](https://github.com/orhun/git-cliff/commit/01825330d90a9399c9285b5a286b1d69aa1494e7)) - *(cd)* Remove the custom changelog template - ([d826b9d](https://github.com/orhun/git-cliff/commit/d826b9d2e5bdd30b132731ff6d1dc87748543ccb)) - *(cd)* Override the changelog template - ([41053fb](https://github.com/orhun/git-cliff/commit/41053fbe90a08648b70e5cca6a2504e94202bd06)) - *(cd)* Set the release body on linux - ([7623977](https://github.com/orhun/git-cliff/commit/76239771662bf342d742c12907619eece1bf946d)) - *(cd)* Fix setting the release body - ([62403be](https://github.com/orhun/git-cliff/commit/62403be828ac75f5689f27ad5d5e0421b514be62)) - *(cd)* Set the changelog as release body - ([66dfbf4](https://github.com/orhun/git-cliff/commit/66dfbf40ec0ef91dc2016c1bdf2044a07e4580d5)) - *(cd)* Set the release name explicitly - ([0e5a7b1](https://github.com/orhun/git-cliff/commit/0e5a7b1dd54afff0085930bf8c058803cfe3ea03)) - *(config)* Update template to include commit ids - ([e3d3482](https://github.com/orhun/git-cliff/commit/e3d34821911ffb44e4c6e61e8d0c6ecd2d31a341)) - *(config)* Update the skip_tags regex - ([28171f0](https://github.com/orhun/git-cliff/commit/28171f0f98f0980f9b0a6d3ca89ed3d6c70eb0ef)) - *(docker)* Bump the rust version - ([a2df26f](https://github.com/orhun/git-cliff/commit/a2df26ff8602095707ebcfcfc4c278d12a9463f4)) - *(docker)* Rename the docker automated builds action - ([ad3126e](https://github.com/orhun/git-cliff/commit/ad3126e15144f98b5845c31149214cdce5ffb3d5)) - *(docker)* Remove user directive from Dockerfile - ([076fc85](https://github.com/orhun/git-cliff/commit/076fc8580aee74755003d99d902b3e64abcad535)) - *(git)* Remove etc directory from .gitignore - ([8881083](https://github.com/orhun/git-cliff/commit/8881083520e5fcdbdfa27520f0a1aa29752067cc)) - *(project)* Update .editorconfig about shell scripts - ([c898912](https://github.com/orhun/git-cliff/commit/c8989122d06af2abb70edf5d42d7297411d0b093)) - *(project)* Update the release script about arguments - ([098c6ad](https://github.com/orhun/git-cliff/commit/098c6ad3803d728f4cd25320cb557d2a0bb22bd1)) - *(project)* Add release script - ([d76bb9b](https://github.com/orhun/git-cliff/commit/d76bb9b3e5ff41df96b27c4fb202a2dd2344d6b2)) - *(release)* Indicate which versions are managed by the script - ([f481081](https://github.com/orhun/git-cliff/commit/f48108109e84ea6d869c75e98143be9b7ed5d069)) - *(release)* Verify the created tag after creation - ([99f2f07](https://github.com/orhun/git-cliff/commit/99f2f0701cbf92c5b4ec235e307549af53336db7)) - *(release)* Set the new version in release script - ([6619c38](https://github.com/orhun/git-cliff/commit/6619c385ed5220293b4a9af1c405a364f0085bc9)) - *(release)* Include the commit id in the custom template - ([5677281](https://github.com/orhun/git-cliff/commit/5677281b2ca594789a32c53e7f304cae734c089f)) - *(release)* Set a custom changelog for the tag message - ([c4df0fa](https://github.com/orhun/git-cliff/commit/c4df0fa892568f1491b62c47d5757fb70b7f4316)) - *(release)* Add release title to the tag message - ([6099b2d](https://github.com/orhun/git-cliff/commit/6099b2d0c7c7d51a44a0e05a53908a9a370a7e83)) - *(release)* Strip the markdown format from tag message - ([3cb6761](https://github.com/orhun/git-cliff/commit/3cb67618ef475bf0eb144c5b84cd68af0758f564)) ### ◀️ Revert - Chore(config): update template to include commit ids - ([f95fca9](https://github.com/orhun/git-cliff/commit/f95fca966bacb520e958fe783e239f98dfe026bc)) ================================================ FILE: CNAME ================================================ git-cliff.org ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Contributor Covenant 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 both within project spaces and in public spaces when an individual is representing the project or its community. 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 project team at git-cliff@protonmail.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][homepage], version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see https://www.contributor-covenant.org/faq ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing Thank you for considering contributing to [git-cliff](https://github.com/orhun/git-cliff)! When contributing, please first discuss the change you wish to make via [issue](https://github.com/orhun/git-cliff/issues), [email](mailto:orhunparmaksiz@gmail.com), or any other method with the owners of this repository before making a change. Note that we have a [Code of Conduct](./CODE_OF_CONDUCT.md), please follow it in all your interactions with the project. --- ## Required Tooling - Install the nightly toolchain (required for `rustfmt`): ```sh rustup toolchain install nightly ``` - Optional: set up editor/IDE integration to use **nightly** `rustfmt` for this repository. --- ## Setup 1. Fork this repository and create your branch from `main`. 2. Clone your forked repository. ```sh git clone https://github.com/{username}/git-cliff && cd git-cliff # OR git clone git@github.com:{username}/git-cliff && cd git-cliff ``` 3. Fetch tags (required for tests): ```sh git fetch --tags https://github.com/orhun/git-cliff ``` 4. Install [Rust](https://www.rust-lang.org/) `1.85.1` or later and build the project: ```sh cargo build ``` > [!NOTE] > > - The project uses **stable** Rust for builds and tests. > - Formatting and linting are run with the **nightly toolchain** in CI due to the use of unstable `rustfmt` options. > Contributors are expected to run the same checks locally. --- ## Development Workflow 1. Start committing your changes. Follow the [Conventional Commits](https://www.conventionalcommits.org/) specification. 2. Add your tests (if you haven't already) or update the existing tests according to the changes. And check if the tests are passed: ```sh cargo test ``` 3. If you changed snapshot tests (i.e. `expect_test`), update snapshots: ```sh env UPDATE_EXPECT=1 cargo test ``` 4. Run CI checks locally - `clippy` (warnings are errors) ```sh cargo clippy --tests --verbose -- -D warnings ``` 5. Run CI checks locally - `clippy` (**optional**, but recommended for pedantic linting) ```sh cargo clippy --all-targets --verbose -- -W clippy::pedantic ``` > [!NOTE] > > - You may allow specific pedantic lints **only with a clear justification**. > - Running `clippy` with pedantic lints is **optional**, but it can serve as a helpful guideline for new code and implementations, helping maintain consistency and catch potential issues early. 6. Run formatting checks – `rustfmt` ```sh cargo +nightly fmt --all -- --check --verbose ``` If formatting fails, please run: ```sh cargo +nightly fmt --all ``` --- ## Create a Pull Request 1. Ensure that you updated the documentation and filled the [Pull Request template](./.github/PULL_REQUEST_TEMPLATE.md) according to the changes you made. 2. Wait for approval from the project owner/maintainer. Discuss the possible changes and update your Pull Request if necessary. 3. You may merge the Pull Request once you have the sign-off of the project owner/maintainer, or if you do not have permission to do that, you may request the project owner/maintainer to merge it in case they haven't done it after a while. # License By contributing, you agree that your contributions will be licensed under [The MIT License](./LICENSE-MIT) or [Apache License 2.0](./LICENSE-APACHE). ================================================ FILE: Cargo.toml ================================================ [workspace] resolver = "2" members = ["git-cliff-core", "git-cliff"] [workspace.dependencies] regex = "1.11.1" glob = "0.3.2" log = "0.4.21" secrecy = { version = "0.8.0", features = ["serde"] } lazy_static = "1.5.0" dirs = "6.0.0" url = "2.5.3" reqwest = { version = "0.12.28", default-features = false, features = [ "blocking", "rustls-tls", "rustls-tls-native-roots", "json", "zstd", ] } [profile.dev] opt-level = 0 debug = true panic = "abort" [profile.test] opt-level = 0 debug = true [profile.release] opt-level = 3 debug = false panic = "unwind" lto = true codegen-units = 1 strip = true [profile.bench] opt-level = 3 debug = true # used by the profiler strip = false # keep symbols for the profiler [workspace.lints.clippy] # NOTE: # `clippy` is intentionally not configured at the workspace level. # CLI arguments take precedence over this configuration, which can # lead to confusing behavior. ================================================ FILE: Dockerfile ================================================ # syntax=docker/dockerfile:1.4.3-labs FROM lukemathwalker/cargo-chef:0.1.77-rust-1.94.0-slim-bookworm@sha256:fc6754f2b0004a589fe817877a719e9252d4cdfa3aa8d03fd885e9b734b6fbf8 AS chef WORKDIR app FROM chef AS planner COPY . . RUN cargo chef prepare --recipe-path recipe.json FROM chef AS builder COPY --from=planner /app/recipe.json recipe.json ENV CARGO_NET_GIT_FETCH_WITH_CLI=true RUN cargo chef cook --release --recipe-path recipe.json COPY . . RUN cargo build --release --locked --no-default-features --features github --features gitlab --features bitbucket RUN rm -f target/release/deps/git_cliff* FROM debian:bookworm-slim@sha256:74d56e3931e0d5a1dd51f8c8a2466d21de84a271cd3b5a733b803aa91abf4421 as runner # Install ca-certificates (required for `--use-native-tls` argument) RUN apt-get update \ && apt-get install -y --no-install-recommends ca-certificates \ && rm -rf /var/lib/apt/lists/* # Everything inside this container will be explicitly mounted by the end user, # so we can sidestep some Git security restrictions. This app recommends # mounting data to /app, but this *can* be changed externally and *will* be # changed when run by GitHub Actions, so we need to cover our bases. RUN echo '[safe]\n\tdirectory = *' > /etc/gitconfig COPY --from=builder /app/target/release/git-cliff /usr/local/bin WORKDIR app # Even if the repository is marked as safe, GitHub Actions and some other # environments insist on running the entrypoint as root inside the container # even when being run by a non privileged user on their own files. Here we # check the ownership of the workdir (which may or may not be /app) and change # our effective user/group ID to match. RUN cat <<'EOF' > /usr/local/bin/entrypoint.sh #!/bin/sh if [ "$(id -u)" -ne "$(stat -c '%u' .)" ]; then eids="$(stat -c '--euid %u --egid %g' .)" fi exec ${eids:+setpriv --clear-groups $eids} git-cliff $@ EOF ENTRYPOINT ["sh", "/usr/local/bin/entrypoint.sh"] ================================================ FILE: LICENSE-APACHE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS ================================================ FILE: LICENSE-MIT ================================================ The MIT License (MIT) Copyright (c) 2021-2025 Orhun Parmaksız Copyright (c) 2021-2025 git-cliff contributors 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. ================================================ FILE: README.md ================================================




Documentation | Website

**git-cliff** can generate [changelog](https://en.wikipedia.org/wiki/Changelog) files from the [Git](https://git-scm.com/) history by utilizing [conventional commits](https://git-cliff.org/docs/configuration/git#conventional_commits) as well as regex-powered [custom parsers](https://git-cliff.org/docs/configuration/git#commit_parsers). The [changelog template](https://git-cliff.org/docs/category/templating) can be customized with a [configuration file](https://git-cliff.org/docs/configuration) to match the desired format. ![animation](https://raw.githubusercontent.com/orhun/git-cliff/main/website/static/img/git-cliff-anim.gif) ## Documentation Learn how to use **git-cliff** from the [official documentation](https://git-cliff.org/docs). - [Installation](https://git-cliff.org/docs/installation/) - [Usage](https://git-cliff.org/docs/usage/examples) - [Configuration](https://git-cliff.org/docs/configuration) - [Templating](https://git-cliff.org/docs/category/templating) You can also check out the blog posts written by the community: - [An introduction to git-cliff for release management](https://substack.evancarroll.com/p/git-cliff-for-automated-release-management): Learn how to automate your software releases - [Git-cliff and monorepos](https://substack.evancarroll.com/p/git-cliff-and-monorepos): An introduction to the monorepo capabilities of git-cliff - [git-cliff: The Smart Way to Handle Changelogs](https://medium.com/@toniomasotti/git-cliff-96449950db48) ## In The Media - [Turning Git commits into changelog with git-cliff](https://www.youtube.com/watch?v=RWh8qbiLRts) - RustLab 2023 (Talk) - [An Interview with Orhun of git-cliff](https://console.substack.com/p/console-141) - Console #141 (Newsletter) - [KaiCode Open Source Festival 2024](https://www.kaicode.org/2024.html) (Second place winner) ## Editor Support - [git-cliff.el](https://github.com/liuyinz/git-cliff.el) - Generate, update and release changelog in Emacs ## Similar/Related Projects - [git-journal](https://github.com/saschagrunert/git-journal) - The Git Commit Message and Changelog Generation Framework - [clog-cli](https://github.com/clog-tool/clog-cli) - Generate beautiful changelogs from your Git commit history - [relnotes](https://crates.io/crates/relnotes) - A tool to automatically generate release notes for your project. - [cocogitto](https://github.com/oknozor/cocogitto) - A set of CLI tools for the conventional commit and semver specifications. - [cliff-jumper](https://github.com/favware/cliff-jumper) - A NodeJS CLI tool that combines git-cliff and [conventional-recommended-bump](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-recommended-bump) to semantically bump a NodeJS package and generate a git-cliff powered changelog. - [release-plz](https://github.com/MarcoIeni/release-plz) - Release Rust packages from CI. - [git-changelog-command-line](https://github.com/tomasbjerre/git-changelog-command-line) - Generate changelog and determine next version with conventional commits. - [git-changelog](https://github.com/pawamoy/git-changelog): Automatic Changelog generator using Jinja2 templates. ## Contributors Thanks goes to these wonderful people ✨ Made with [contrib.rocks](https://contrib.rocks). ## Socials
## License Licensed under either of [Apache License Version 2.0](./LICENSE-APACHE) or [The MIT License](./LICENSE-MIT) at your option. ## Copyright Copyright © 2021-2025, [git-cliff contributors](mailto:git-cliff@protonmail.com) ================================================ FILE: RELEASE.md ================================================ # Creating a Release [GitHub](https://github.com/orhun/git-cliff/releases), [crates.io](https://crates.io/crates/git-cliff/) and [Docker Hub](https://hub.docker.com/r/orhunp/git-cliff) releases are automated via [GitHub actions](./.github/workflows/cd.yml) and triggered by pushing a tag. 1. Run the [release script](./release.sh): `./release.sh v[X.Y.Z]` 2. Push the changes: `git push` 3. Check if [Continuous Integration](https://github.com/orhun/git-cliff/actions) workflow is completed successfully. 4. Push the tags: `git push --tags` 5. Wait for [Continuous Deployment](https://github.com/orhun/git-cliff/actions) workflow to finish. - Do not forget to set `vars.USE_TESTPYPI` variable to `false` before release. ================================================ FILE: SECURITY.md ================================================ # Security If you wish to report a security vulnerability privately, we appreciate your diligence. Please follow the guidelines below to submit your report. ## Supported Versions The following versions are supported with security updates: | Version | Supported | | ------- | ------------------ | | 2.x.x | :white_check_mark: | | 1.x.x | :white_check_mark: | | 1.0.x | :x: | | < 0.1.0 | :x: | ## Reporting To report a security vulnerability, please provide the following information: 1. **PUBLIC** - Indicate whether this vulnerability has already been publicly discussed or disclosed. - If so, provide relevant links. 2. **DESCRIPTION** - Provide a detailed description of the security vulnerability. - Include as much information as possible to help us understand and address the issue. Send this information, along with any additional relevant details, to . ## Confidentiality We kindly ask you to keep the report confidential until a public announcement is made. ## Notes - Vulnerabilities will be handled on a best-effort basis. - You may request an advance copy of the patched release, but we cannot guarantee early access before the public release. - You will be notified via email simultaneously with the public announcement. - We will respond within a few weeks to confirm whether your report has been accepted or rejected. Thank you for helping to improve the security of **git-cliff**! ⛰️ ================================================ FILE: cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [remote.github] owner = "orhun" repo = "git-cliff" [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ [![animation](https://raw.githubusercontent.com/orhun/git-cliff/main/website/static/img/git-cliff-anim.gif)](https://git-cliff.org)\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {%- macro remote_url() -%} https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} {%- endmacro -%} {% macro print_commit(commit) -%} - {% if commit.scope %}*({{ commit.scope }})* {% endif %}\ {% if commit.breaking %}[**breaking**] {% endif %}\ {{ commit.message | upper_first }} - \ ([{{ commit.id | truncate(length=7, end="") }}]({{ self::remote_url() }}/commit/{{ commit.id }}))\ {% endmacro -%} {% if version %}\ {% if previous.version %}\ ## [{{ version | trim_start_matches(pat="v") }}]\ ({{ self::remote_url() }}/compare/{{ previous.version }}..{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% endif %}\ {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | striptags | trim | upper_first }} {% for commit in commits | filter(attribute="scope") | sort(attribute="scope") %} {{ self::print_commit(commit=commit) }} {%- endfor %} {% for commit in commits %} {%- if not commit.scope -%} {{ self::print_commit(commit=commit) }} {% endif -%} {% endfor -%} {% endfor -%} {%- if github -%} {% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} ## New Contributors ❤️ {% endif %}\ {% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} * @{{ contributor.username }} made their first contribution {%- if contributor.pr_number %} in \ [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ {%- endif %} {%- endfor -%} {%- endif %} """ # A Tera template to be rendered as the changelog's footer. # See https://keats.github.io/tera/docs/#introduction footer = """ """ # Remove leading and trailing whitespaces from the changelog's body. trim = true # An array of regex based postprocessors to modify the changelog. postprocessors = [ # Replace the placeholder `` with a URL. { pattern = '', replace = "https://github.com/orhun/git-cliff" }, # replace repository URL ] [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = true # Exclude commits that do not match the conventional commits specification. filter_unconventional = true # Split commits on newlines, treating each line as an individual commit. split_commits = false # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [ # Replace issue numbers with link templates to be updated in `changelog.postprocessors`. { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))" }, # Check spelling of the commit message using https://github.com/crate-ci/typos. # If the spelling is incorrect, it will be fixed automatically. { pattern = '.*', replace_command = 'typos --write-changes -' }, ] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "⛰️ Features" }, { message = "^fix", group = "🐛 Bug Fixes" }, { message = "^doc", group = "📚 Documentation" }, { message = "^perf", group = "⚡ Performance" }, { message = "^refactor\\(clippy\\)", skip = true }, { message = "^refactor", group = "🚜 Refactor" }, { message = "^style", group = "🎨 Styling" }, { message = "^test", group = "🧪 Testing" }, { message = "^chore\\(release\\): prepare for", skip = true }, { message = "^chore\\(deps.*\\)", skip = true }, { message = "^chore\\(pr\\)", skip = true }, { message = "^chore\\(pull\\)", skip = true }, { message = "^chore\\(npm\\).*yarn\\.lock", skip = true }, { message = "^chore|^ci", group = "⚙️ Miscellaneous Tasks" }, { body = ".*security", group = "🛡️ Security" }, { message = "^revert", group = "◀️ Revert" }, ] # Prevent commits that are breaking from being excluded by commit parsers. protect_breaking_commits = false # Exclude commits that are not matched by any commit parser. filter_commits = false # Regex to select git tags that represent releases. tag_pattern = "v[0-9].*" # Regex to select git tags that do not represent proper releases. # Takes precedence over `tag_pattern`. # Changes belonging to these releases will be included in the next release. skip_tags = "beta|alpha" # Regex to exclude git tags after applying the tag_pattern. ignore_tags = "rc|v2.1.0|v2.1.1" # Order releases topologically instead of chronologically. topo_order = false # Order of commits in each group/release within the changelog. # Allowed values: newest, oldest sort_commits = "newest" ================================================ FILE: codecov.yml ================================================ coverage: range: 50..75 round: up precision: 2 status: project: default: target: auto threshold: 5% branches: - main if_ci_failed: error patch: off ================================================ FILE: config/cliff.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | striptags | trim | upper_first }} {% for commit in commits %} - {% if commit.scope %}*({{ commit.scope }})* {% endif %}\ {% if commit.breaking %}[**breaking**] {% endif %}\ {{ commit.message | upper_first }}\ {% endfor %} {% endfor %} """ # Remove leading and trailing whitespaces from the changelog's body. trim = true # Render body even when there are no releases to process. render_always = true # An array of regex based postprocessors to modify the changelog. postprocessors = [ # Replace the placeholder with a URL. #{ pattern = '', replace = "https://github.com/orhun/git-cliff" }, ] # render body even when there are no releases to process # render_always = true # output file path # output = "test.md" [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = true # Exclude commits that do not match the conventional commits specification. filter_unconventional = true # Require all commits to be conventional. # Takes precedence over filter_unconventional. require_conventional = false # Split commits on newlines, treating each line as an individual commit. split_commits = false # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [ # Replace issue numbers with link templates to be updated in `changelog.postprocessors`. #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))"}, # Check spelling of the commit message using https://github.com/crate-ci/typos. # If the spelling is incorrect, it will be fixed automatically. #{ pattern = '.*', replace_command = 'typos --write-changes -' }, ] # Prevent commits that are breaking from being excluded by commit parsers. protect_breaking_commits = false # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "🚀 Features" }, { message = "^fix", group = "🐛 Bug Fixes" }, { message = "^doc", group = "📚 Documentation" }, { message = "^perf", group = "⚡ Performance" }, { message = "^refactor", group = "🚜 Refactor" }, { message = "^style", group = "🎨 Styling" }, { message = "^test", group = "🧪 Testing" }, { message = "^chore\\(release\\): prepare for", skip = true }, { message = "^chore\\(deps.*\\)", skip = true }, { message = "^chore\\(pr\\)", skip = true }, { message = "^chore\\(pull\\)", skip = true }, { message = "^chore|^ci", group = "⚙️ Miscellaneous Tasks" }, { body = ".*security", group = "🛡️ Security" }, { message = "^revert", group = "◀️ Revert" }, { message = ".*", group = "💼 Other" }, ] # Exclude commits that are not matched by any commit parser. filter_commits = false # Fail on a commit that is not matched by any commit parser. fail_on_unmatched_commit = false # An array of link parsers for extracting external references, and turning them into URLs, using regex. link_parsers = [] # Include only the tags that belong to the current branch. use_branch_tags = false # Order releases topologically instead of chronologically. topo_order = false # Order commits topologically instead of chronologically. topo_order_commits = true # Order of commits in each group/release within the changelog. # Allowed values: newest, oldest sort_commits = "oldest" # Process submodules commits recurse_submodules = false ================================================ FILE: examples/azure-devops-keepachangelog.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration # [remote.azure_devops] # owner = "Owner/Project" # repo = "Repo" # api_url = "https://dev.azure.com" # token = "" [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version -%} ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else -%} ## [Unreleased] {% endif -%} {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | split(pat="\n") | first | upper_first | trim }}\ {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif %}\ {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %} {% endfor %} {% endfor %}\n """ # A Tera template to be rendered as the changelog's footer. # See https://keats.github.io/tera/docs/#introduction footer = """ {% for release in releases -%} {% if release.version -%} {% if release.previous.version -%} [{{ release.version | trim_start_matches(pat="v") }}]: \ https://dev.azure.com/{{ remote.azure_devops.owner }}\ /_git/{{ remote.azure_devops.repo }}/branchCompare?baseVersion=GT{{ release.previous.version }}&targetVersion=GT{{ release.version }} {% endif -%} {% else -%} [unreleased]: https://dev.azure.com/{{ remote.azure_devops.owner }}\ /_git/{{ remote.azure_devops.repo }}/branchCompare?baseVersion=GT{{ release.previous.version }}&targetVersion=GBmaster&_a=commits {% endif -%} {% endfor %} """ # Remove leading and trailing whitespaces from the changelog's body. trim = true [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = true # Exclude commits that do not match the conventional commits specification. filter_unconventional = false # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^[a|A]dd", group = "Added" }, { message = "^[s|S]upport", group = "Added" }, { message = "^[r|R]emove", group = "Removed" }, { message = "^.*: add", group = "Added" }, { message = "^.*: support", group = "Added" }, { message = "^.*: remove", group = "Removed" }, { message = "^.*: delete", group = "Removed" }, { message = "^test", group = "Fixed" }, { message = "^fix", group = "Fixed" }, { message = "^.*: fix", group = "Fixed" }, { message = "^.*", group = "Changed" }, ] # Prevent commits that are breaking from being excluded by commit parsers. filter_commits = false # Order releases topologically instead of chronologically. topo_order = false # Order of commits in each group/release within the changelog. # Allowed values: newest, oldest sort_commits = "oldest" ================================================ FILE: examples/cocogitto.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered as the changelog's footer. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines.\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ --- {% if version %}\ {% if previous.version %}\ ## [{{ version | trim_start_matches(pat="v") }}]($REPO/compare/{{ previous.version }}..{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% endif %}\ {% else %}\ ## [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | striptags | trim | upper_first }} {% for commit in commits | filter(attribute="scope") | sort(attribute="scope") %} - **({{commit.scope}})**{% if commit.breaking %} [**breaking**]{% endif %} \ {{ commit.message }} - ([{{ commit.id | truncate(length=7, end="") }}]($REPO/commit/{{ commit.id }})) - {{ commit.author.name }} {%- endfor -%} {% raw %}\n{% endraw %}\ {%- for commit in commits %} {%- if commit.scope -%} {% else -%} - {% if commit.breaking %} [**breaking**]{% endif %}\ {{ commit.message }} - ([{{ commit.id | truncate(length=7, end="") }}]($REPO/commit/{{ commit.id }})) - {{ commit.author.name }} {% endif -%} {% endfor -%} {% endfor %}\n """ # A Tera template to be rendered as the changelog's footer. # See https://keats.github.io/tera/docs/#introduction footer = """ """ # Remove leading and trailing whitespaces from the changelog's body. trim = true # postprocessors postprocessors = [ # Replace the placeholder `` with a URL. { pattern = '\$REPO', replace = "https://github.com/cocogitto/cocogitto" }, # replace repository URL ] [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = true # Exclude commits that do not match the conventional commits specification. filter_unconventional = true # Split commits on newlines, treating each line as an individual commit. split_commits = false # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [ # Replace issue numbers with link templates to be updated in `changelog.postprocessors`. #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](https://github.com/orhun/git-cliff/issues/${2}))"}, ] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features" }, { message = "^fix", group = "Bug Fixes" }, { message = "^doc", group = "Documentation" }, { message = "^perf", group = "Performance" }, { message = "^refactor", group = "Refactoring" }, { message = "^style", group = "Style" }, { message = "^revert", group = "Revert" }, { message = "^test", group = "Tests" }, { message = "^chore\\(version\\):", skip = true }, { message = "^chore", group = "Miscellaneous Chores" }, { body = ".*security", group = "Security" }, ] # Exclude commits that are not matched by any commit parser. filter_commits = false # Order releases topologically instead of chronologically. topo_order = false # Order of commits in each group/release within the changelog. # Allowed values: newest, oldest sort_commits = "oldest" ================================================ FILE: examples/detailed.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file.\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## {{ version | trim_start_matches(pat="v") }} - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## Unreleased {% endif %}\ {% if previous %}\ {% if previous.commit_id and commit_id %} [{{ previous.commit_id | truncate(length=7, end="") }}]({{ previous.commit_id }})...\ [{{ commit_id | truncate(length=7, end="") }}]({{ commit_id }}) {% endif %}\ {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | split(pat="\n") | first | upper_first | trim }} ([{{ commit.id | truncate(length=7, end="") }}]({{ commit.id }}))\ {% if commit.footers %}\ {% for footer in commit.footers -%} , {{ footer.token }}{{ footer.separator }}{{ footer.value }}\ {% endfor %}\ {% endif %}\ {% endfor %} {% endfor %}\n """ # A Tera template to be rendered as the changelog's footer. # See https://keats.github.io/tera/docs/#introduction footer = """ """ # Remove leading and trailing whitespaces from the changelog's body. trim = true [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = true # Exclude commits that do not match the conventional commits specification. filter_unconventional = false # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features" }, { message = "^fix", group = "Bug Fixes" }, { message = "^doc", group = "Documentation" }, { message = "^perf", group = "Performance" }, { message = "^refactor", group = "Refactor" }, { message = "^style", group = "Styling" }, { message = "^test", group = "Testing" }, { message = "^chore\\(deps.*\\)", skip = true }, { message = "^chore\\(pr\\)", skip = true }, { message = "^chore\\(pull\\)", skip = true }, { message = "^chore\\(release\\): prepare for", skip = true }, { message = "^chore|^ci", group = "Miscellaneous Tasks" }, { body = ".*security", group = "Security" }, ] # Exclude commits that are not matched by any commit parser. filter_commits = false # Order releases topologically instead of chronologically. topo_order = false # Order of commits in each group/release within the changelog. # Allowed values: newest, oldest sort_commits = "oldest" ================================================ FILE: examples/github-keepachangelog.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {%- macro remote_url() -%} https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} {%- endmacro -%} {% if version -%} ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else -%} ## [Unreleased] {% endif -%} {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {%- for commit in commits %} - {{ commit.message | split(pat="\n") | first | upper_first | trim }}\ {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%} {% if commit.remote.pr_number %} in \ [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pull/{{ commit.remote.pr_number }}) \ {%- endif -%} {% endfor %} {% endfor %} {%- if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} ### New Contributors {%- endif -%} {% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} * @{{ contributor.username }} made their first contribution {%- if contributor.pr_number %} in \ [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ {%- endif %} {%- endfor %}\n {%- if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}{% raw %}\n{% endraw -%}{% endif %} """ # A Tera template to be rendered as the changelog's footer. # See https://keats.github.io/tera/docs/#introduction footer = """ {%- macro remote_url() -%} https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} {%- endmacro -%} {% for release in releases -%} {% if release.version -%} {% if release.previous.version -%} [{{ release.version | trim_start_matches(pat="v") }}]: \ {{ self::remote_url() }}/compare/{{ release.previous.version }}...{{ release.version }} {% endif -%} {% else -%} [unreleased]: {{ self::remote_url() }}/compare/{{ release.previous.version }}...HEAD {% endif -%} {% endfor %} """ # Remove leading and trailing whitespaces from the changelog's body. trim = true [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = true # Exclude commits that do not match the conventional commits specification. filter_unconventional = false # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [ # Remove issue numbers. { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, ] # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^[a|A]dd", group = "Added" }, { message = "^[s|S]upport", group = "Added" }, { message = "^[r|R]emove", group = "Removed" }, { message = "^.*: add", group = "Added" }, { message = "^.*: support", group = "Added" }, { message = "^.*: remove", group = "Removed" }, { message = "^.*: delete", group = "Removed" }, { message = "^test", group = "Fixed" }, { message = "^fix", group = "Fixed" }, { message = "^.*: fix", group = "Fixed" }, { message = "^.*", group = "Changed" }, ] # Exclude commits that are not matched by any commit parser. filter_commits = false # Order releases topologically instead of chronologically. topo_order = false # Order of commits in each group/release within the changelog. # Allowed values: newest, oldest sort_commits = "newest" ================================================ FILE: examples/github.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration # [remote.github] # owner = "orhun" # repo = "git-cliff" # token = "" [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ ## What's Changed {%- if version %} in {{ version | trim_start_matches(pat="v") }}{%- endif -%} {% for commit in commits %} {% if commit.remote.pr_title -%} {%- set commit_message = commit.remote.pr_title -%} {%- else -%} {%- set commit_message = commit.message -%} {%- endif -%} * {{ commit_message | split(pat="\n") | first | trim }}\ {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%} {% if commit.remote.pr_number %} in \ [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pull/{{ commit.remote.pr_number }}) \ {%- endif %} {%- endfor -%} {%- if github -%} {% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} {% raw %}\n{% endraw -%} ### New Contributors {%- endif %}\ {% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} * @{{ contributor.username }} made their first contribution {%- if contributor.pr_number %} in \ [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ {%- endif %} {%- endfor -%} {%- endif -%} {% if version %} {% if previous.version %} **Full Changelog**: {{ self::remote_url() }}/compare/{{ previous.version }}...{{ version }} {% endif %} {% else -%} {% raw %}\n{% endraw %} {% endif %} {%- macro remote_url() -%} https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} {%- endmacro -%} """ # Remove leading and trailing whitespaces from the changelog's body. trim = true # A Tera template to be rendered as the changelog's footer. # See https://keats.github.io/tera/docs/#introduction footer = """ """ # An array of regex based postprocessors to modify the changelog. # Replace the placeholder `` with a URL. postprocessors = [] [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = false # Exclude commits that do not match the conventional commits specification. filter_unconventional = true # Split commits on newlines, treating each line as an individual commit. split_commits = false # An array of regex based parsers to modify commit messages prior to further processing. commit_preprocessors = [{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }] # Exclude commits that are not matched by any commit parser. filter_commits = false # Order releases topologically instead of chronologically. topo_order = false # Order of commits in each group/release within the changelog. # Allowed values: newest, oldest sort_commits = "newest" ================================================ FILE: examples/keepachangelog.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version -%} ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else -%} ## [Unreleased] {% endif -%} {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | split(pat="\n") | first | upper_first | trim }}\ {% endfor %} {% endfor %}\n """ # A Tera template to be rendered as the changelog's footer. # See https://keats.github.io/tera/docs/#introduction footer = """ {% for release in releases -%} {% if release.version -%} {% if release.previous.version -%} [{{ release.version | trim_start_matches(pat="v") }}]: \ https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}\ /compare/{{ release.previous.version }}..{{ release.version }} {% else -%} [{{ release.version | trim_start_matches(pat="v") }}]: \ https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}\ /tree/{{ release.version }} {% endif -%} {% else -%} [unreleased]: https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}\ /compare/{{ release.previous.version }}..HEAD {% endif -%} {% endfor %} """ # Remove leading and trailing whitespaces from the changelog's body. trim = true [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = true # Exclude commits that do not match the conventional commits specification. filter_unconventional = false # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^[a|A]dd", group = "Added" }, { message = "^[s|S]upport", group = "Added" }, { message = "^[r|R]emove", group = "Removed" }, { message = "^.*: add", group = "Added" }, { message = "^.*: support", group = "Added" }, { message = "^.*: remove", group = "Removed" }, { message = "^.*: delete", group = "Removed" }, { message = "^test", group = "Fixed" }, { message = "^fix", group = "Fixed" }, { message = "^.*: fix", group = "Fixed" }, { message = "^.*", group = "Changed" }, ] # Prevent commits that are breaking from being excluded by commit parsers. filter_commits = false # Order releases topologically instead of chronologically. topo_order = false # Order of commits in each group/release within the changelog. # Allowed values: newest, oldest sort_commits = "oldest" ================================================ FILE: examples/minimal.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## {{ version | trim_start_matches(pat="v") }} - {{ timestamp | date(format="%Y-%m-%d") }}\ {% else %}\ ## Unreleased\ {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %}\ - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }} {% endfor %}\ {% endfor %}\n """ ================================================ FILE: examples/scoped.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file.\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## {{ version | trim_start_matches(pat="v") }} - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## Unreleased {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for group, commits in commits | group_by(attribute="scope") %} #### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | upper_first }}\ {% endfor %} {% endfor %}\ {% endfor %}\n """ # A Tera template to be rendered as the changelog's footer. # See https://keats.github.io/tera/docs/#introduction footer = """ """ # Remove leading and trailing whitespaces from the changelog's body. trim = true [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = true # Exclude commits that do not match the conventional commits specification. filter_unconventional = true # Split commits on newlines, treating each line as an individual commit. split_commits = false # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features" }, { message = "^fix", group = "Bug Fixes" }, { message = "^doc", group = "Documentation", default_scope = "unscoped" }, { message = "^perf", group = "Performance" }, { message = "^refactor", group = "Refactor" }, { message = "^style", group = "Styling" }, { message = "^test", group = "Testing" }, { message = "^chore\\(release\\): prepare for", skip = true }, { message = "^chore", group = "Miscellaneous Tasks" }, { body = ".*security", group = "Security" }, ] # Exclude commits that are not matched by any commit parser. filter_commits = false # Order releases topologically instead of chronologically. topo_order = false # Order of commits in each group/release within the changelog. # Allowed values: newest, oldest sort_commits = "oldest" ================================================ FILE: examples/scopesorted.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file.\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## {{ version | trim_start_matches(pat="v") }} - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## Unreleased {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits | filter(attribute="scope") | sort(attribute="scope") %} - *({{commit.scope}})* {{ commit.message | upper_first }} {%- if commit.breaking %} {% raw %} {% endraw %}- **BREAKING**: {{commit.breaking_description}} {%- endif -%} {%- endfor -%} {% raw %}\n{% endraw %}\ {%- for commit in commits %} {%- if commit.scope -%} {% else -%} - *(No Category)* {{ commit.message | upper_first }} {% if commit.breaking -%} {% raw %} {% endraw %}- **BREAKING**: {{commit.breaking_description}} {% endif -%} {% endif -%} {% endfor -%} {% raw %}\n{% endraw %}\ {% endfor %}\n """ # A Tera template to be rendered as the changelog's footer. # See https://keats.github.io/tera/docs/#introduction footer = """ """ # Remove leading and trailing whitespaces from the changelog's body. trim = true [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = true # Exclude commits that do not match the conventional commits specification. filter_unconventional = true # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features" }, { message = "^fix", group = "Bug Fixes" }, { message = "^doc", group = "Documentation" }, { message = "^perf", group = "Performance" }, { message = "^refactor", group = "Refactor" }, { message = "^style", group = "Styling" }, { message = "^test", group = "Testing" }, { message = "^chore\\(release\\): prepare for", skip = true }, { message = "^chore", group = "Miscellaneous Tasks" }, { body = ".*security", group = "Security" }, ] # Exclude commits that are not matched by any commit parser. filter_commits = false # Order releases topologically instead of chronologically. topo_order = false # Order of commits in each group/release within the changelog. # Allowed values: newest, oldest sort_commits = "oldest" ================================================ FILE: examples/statistics.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file.\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## {{ version | trim_start_matches(pat="v") }} - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## Unreleased {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | split(pat="\n") | first | upper_first | trim_end }}\ {% endfor %} {% endfor %} ### Commit Statistics\n - {{ statistics.commit_count }} commit(s) contributed to the release. - {{ statistics.commits_timespan | default(value=0) }} day(s) passed between the first and last commit. - {{ statistics.conventional_commit_count }} commit(s) parsed as conventional. - {{ statistics.links | length }} linked issue(s) detected in commits. {%- if statistics.links | length > 0 %} {%- for link in statistics.links %} {{ " " }}- [{{ link.text }}]({{ link.href }}) (referenced {{ link.count }} time(s)) {%- endfor %} {%- endif %} {%- if statistics.days_passed_since_last_release %} - {{ statistics.days_passed_since_last_release }} day(s) passed between releases. {%- endif %}\n\n """ # A Tera template to be rendered as the changelog's footer. # See https://keats.github.io/tera/docs/#introduction footer = """ """ # Remove leading and trailing whitespaces from the changelog's body. trim = true [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = true # Exclude commits that do not match the conventional commits specification. filter_unconventional = false # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features" }, { message = "^fix", group = "Bug Fixes" }, { message = "^doc", group = "Documentation" }, { message = "^perf", group = "Performance" }, { message = "^refactor", group = "Refactor" }, { message = "^style", group = "Styling" }, { message = "^test", group = "Testing" }, { message = "^chore\\(release\\): prepare for", skip = true }, { message = "^chore", group = "Miscellaneous Tasks" }, { body = ".*security", group = "Security" }, { body = ".*", group = "Other (unconventional)" }, ] # Exclude commits that are not matched by any commit parser. filter_commits = false # Order releases topologically instead of chronologically. topo_order = false # Order of commits in each group/release within the changelog. # Allowed values: newest, oldest sort_commits = "oldest" ================================================ FILE: examples/unconventional.toml ================================================ # git-cliff ~ configuration file # https://git-cliff.org/docs/configuration [changelog] # A Tera template to be rendered as the changelog's header. # See https://keats.github.io/tera/docs/#introduction header = """ # Changelog\n All notable changes to this project will be documented in this file.\n """ # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ ## {{ version | trim_start_matches(pat="v") }} - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## Unreleased {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {{ commit.message | split(pat="\n") | first | trim_end }}\ {% endfor %} {% endfor %}\n """ # A Tera template to be rendered as the changelog's footer. # See https://keats.github.io/tera/docs/#introduction footer = """ """ # Remove leading and trailing whitespaces from the changelog's body. trim = true [git] # Parse commits according to the conventional commits specification. # See https://www.conventionalcommits.org conventional_commits = false # Exclude commits that do not match the conventional commits specification. filter_unconventional = false # Split commits on newlines, treating each line as an individual commit. split_commits = false # An array of regex based parsers for extracting data from the commit message. # Assigns commits to groups. # Optionally sets the commit's scope and can decide to exclude commits from further processing. commit_parsers = [ { message = "^feat", group = "Features" }, { message = "^fix", group = "Bug Fixes" }, { message = "^doc", group = "Documentation" }, { message = "^perf", group = "Performance" }, { message = "^refactor", group = "Refactor" }, { message = "^style", group = "Styling" }, { message = "^test", group = "Testing" }, { message = "^chore\\(release\\): prepare for", skip = true }, { message = "^chore", group = "Miscellaneous Tasks" }, { body = ".*security", group = "Security" }, { body = ".*", group = "Other (unconventional)" }, ] # Exclude commits that are not matched by any commit parser. filter_commits = false # Order releases topologically instead of chronologically. topo_order = false # Order of commits in each group/release within the changelog. # Allowed values: newest, oldest sort_commits = "oldest" ================================================ FILE: flake.nix ================================================ { description = "git-cliff"; inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; # We want to use packages from the binary cache flake-utils.url = "github:numtide/flake-utils"; rust-overlay.url = "github:oxalica/rust-overlay"; }; outputs = inputs@{ self, nixpkgs, flake-utils, ... }: flake-utils.lib.eachSystem [ "x86_64-linux" ] (system: let pkgs = import nixpkgs { inherit system; overlays = [ inputs.rust-overlay.overlays.rust-overlay ]; }; base-git-cliff = { buildType }: pkgs.rustPlatform.buildRustPackage { name = "git-cliff"; src = ./.; cargoLock = { lockFile = ./Cargo.lock; }; checkType = "debug"; inherit buildType; checkFlags = [ "--skip=command" "--skip=repo" ]; meta = with pkgs.lib; { description = "A highly customizable Changelog Generator that follows Conventional Commit specifications"; homepage = "https://git-cliff.org/"; license = [ licenses.mit licenses.asl20 ]; }; }; in rec { packages = rec { git-cliff = base-git-cliff { buildType = "release"; }; git-cliff-debug = base-git-cliff { buildType = "debug"; }; default = git-cliff; }; devShell = pkgs.mkShell { CARGO_INSTALL_ROOT = "${toString ./.}/.cargo"; buildInputs = with pkgs; [ pkg-config openssl cargo-binutils cargo-watch lld (rust-bin.fromRustupToolchain { channel = "stable"; components = [ "rust-analyzer" "rust-src" "rustfmt" "rustc" "cargo" "clippy" ]; }) ]; }; checks.check = packages.git-cliff-debug; }); } ================================================ FILE: git-cliff/Cargo.toml ================================================ [package] name = "git-cliff" version = "2.12.0" # managed by release.sh description = "A highly customizable changelog generator ⛰️" authors = ["git-cliff contributors "] license = "MIT OR Apache-2.0" readme = "../README.md" homepage = "https://github.com/orhun/git-cliff" repository = "https://github.com/orhun/git-cliff" keywords = ["changelog", "generator", "conventional", "commit"] categories = ["command-line-utilities"] default-run = "git-cliff" edition = "2024" rust-version = "1.85.1" [[bin]] name = "git-cliff-completions" path = "src/bin/completions.rs" [[bin]] name = "git-cliff-mangen" path = "src/bin/mangen.rs" [features] # check for new versions default = ["update-informer", "integrations"] # enable all integrations integrations = ["github", "gitlab", "gitea", "bitbucket", "azure_devops"] # inform about new releases update-informer = ["dep:update-informer"] # enable remote repository integration remote = ["dep:indicatif", "dep:reqwest"] # enable GitHub integration github = ["remote", "git-cliff-core/github"] # enable GitLab integration gitlab = ["remote", "git-cliff-core/gitlab"] # enable Gitea integration gitea = ["remote", "git-cliff-core/gitea"] # enable Bitbucket integration bitbucket = ["remote", "git-cliff-core/bitbucket"] # enable Azure DevOps integration azure_devops = ["remote", "git-cliff-core/azure_devops"] # performance profiler profiler = ["dep:pprof", "dep:rand", "profiler-flamegraph"] profiler-flamegraph = ["pprof/flamegraph"] [dependencies] glob.workspace = true regex.workspace = true log.workspace = true secrecy.workspace = true lazy_static.workspace = true dirs.workspace = true clap = { version = "4.5.53", features = ["derive", "env", "wrap_help", "cargo"] } clap_complete = "4.5.61" clap_mangen = "0.2.31" shellexpand = "3.1.0" update-informer = { version = "1.3.0", optional = true } indicatif = { version = "0.18.3", optional = true } env_logger = "=0.10.2" pprof = { version = "0.15.0", optional = true } rand = { version = "0.9.2", optional = true } reqwest = { workspace = true, optional = true } url.workspace = true pathdiff = "0.2.3" [dependencies.git-cliff-core] version = "2.12.0" # managed by release.sh path = "../git-cliff-core" [dev-dependencies] pretty_assertions = "1.4.1" [lints] workspace = true # metadata for cargo-binstall to get the right artifacts [package.metadata.binstall] pkg-url = "{ repo }/releases/download/v{ version }/{ name }-{ version }-{ target }{ archive-suffix }" bin-dir = "{ name }-{ version }/{ bin }{ binary-ext }" pkg-fmt = "tgz" [package.metadata.generate-rpm] assets = [ { source = "target/release/git-cliff", dest = "/usr/bin/git-cliff", mode = "755" }, { source = "LICENSE-MIT", dest = "/usr/share/doc/git-cliff/LICENSE-MIT", mode = "644" }, { source = "README.md", dest = "/usr/share/doc/git-cliff/README.md", mode = "644" }, { source = "man/git-cliff.1", dest = "/usr/share/man/man1/git-cliff.1", mode = "644", doc = true }, { source = "completions/git-cliff.bash", dest = "/usr/share/bash-completion/completions/git-cliff", mode = "644" }, { source = "completions/git-cliff.fish", dest = "/usr/share/fish/vendor_completions.d/git-cliff.fish", mode = "644" }, { source = "completions/_git-cliff", dest = "/usr/share/zsh/vendor-completions/", mode = "644" }, ] [package.metadata.deb] assets = [ [ "target/release/git-cliff", "usr/bin/", "755", ], [ "../LICENSE-MIT", "/usr/share/doc/git-cliff/LICENSE-MIT", "644", ], [ "../README.md", "usr/share/doc/git-cliff/README", "644", ], [ "../man/git-cliff.1", "/usr/share/man/man1/git-cliff.1", "644", ], [ "../completions/git-cliff.bash", "/usr/share/bash-completion/completions/git-cliff", "644", ], [ "../completions/git-cliff.fish", "/usr/share/fish/vendor_completions.d/git-cliff.fish", "644", ], [ "../completions/_git-cliff", "/usr/share/zsh/vendor-completions/", "644", ], ] ================================================ FILE: git-cliff/examples/basic.rs ================================================ use clap::Parser; use git_cliff::args::Opt; use git_cliff_core::error::Result; fn main() -> Result<()> { let args = Opt::parse(); let changelog = git_cliff::run(args.clone())?; git_cliff::write_changelog(&args, changelog, std::io::stdout())?; Ok(()) } ================================================ FILE: git-cliff/src/args.rs ================================================ use std::path::PathBuf; use clap::builder::styling::{Ansi256Color, AnsiColor}; use clap::builder::{Styles, TypedValueParser, ValueParserFactory}; use clap::error::{ContextKind, ContextValue, ErrorKind}; use clap::{ArgAction, Parser, ValueEnum}; use git_cliff_core::config::{BumpType, Remote}; use git_cliff_core::{DEFAULT_CONFIG, DEFAULT_OUTPUT}; use glob::Pattern; use regex::Regex; use secrecy::SecretString; use url::Url; #[derive(Debug, Clone, Copy, ValueEnum)] pub enum Strip { Header, Footer, All, } #[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)] pub enum Sort { Oldest, Newest, } const STYLES: Styles = Styles::styled() .header(Ansi256Color(208).on_default().bold()) .usage(Ansi256Color(208).on_default().bold()) .literal(AnsiColor::White.on_default()) .placeholder(AnsiColor::Green.on_default()); /// Command-line arguments to parse. #[derive(Debug, Parser, Clone)] #[command( version, author = clap::crate_authors!("\n"), about, rename_all_env = "screaming-snake", help_template = "\ {before-help}{name} {version} {author-with-newline}{about-with-newline} {usage-heading} {usage} {all-args}{after-help} ", override_usage = "git-cliff [FLAGS] [OPTIONS] [--] [RANGE]", next_help_heading = Some("OPTIONS"), disable_help_flag = true, disable_version_flag = true, styles(STYLES), )] pub struct Opt { #[arg( short, long, action = ArgAction::Help, global = true, help = "Prints help information", help_heading = "FLAGS" )] pub help: Option, #[arg( short = 'V', long, action = ArgAction::Version, global = true, help = "Prints version information", help_heading = "FLAGS" )] pub version: Option, /// Increases the logging verbosity. #[arg(short, long, action = ArgAction::Count, alias = "debug", help_heading = Some("FLAGS"))] pub verbose: u8, /// Writes the default configuration file to cliff.toml #[arg( short, long, value_name = "CONFIG", num_args = 0..=1, required = false )] pub init: Option>, /// Sets the configuration file. #[arg( short, long, env = "GIT_CLIFF_CONFIG", value_name = "PATH", default_value = DEFAULT_CONFIG, value_parser = Opt::parse_dir )] pub config: PathBuf, /// Sets the URL for the configuration file. #[arg(long, env = "GIT_CLIFF_CONFIG_URL", value_name = "URL", hide = !cfg!(feature = "remote"))] pub config_url: Option, /// Sets the working directory. #[arg( short, long, env = "GIT_CLIFF_WORKDIR", value_name = "PATH", value_parser = Opt::parse_dir )] pub workdir: Option, /// Sets the git repository. #[arg( short, long, env = "GIT_CLIFF_REPOSITORY", value_name = "PATH", num_args(1..), value_parser = Opt::parse_dir )] pub repository: Option>, /// Sets the path to include related commits. #[arg( long, env = "GIT_CLIFF_INCLUDE_PATH", value_name = "PATTERN", num_args(1..) )] pub include_path: Option>, /// Sets the path to exclude related commits. #[arg( long, env = "GIT_CLIFF_EXCLUDE_PATH", value_name = "PATTERN", num_args(1..) )] pub exclude_path: Option>, /// Sets the regex for matching git tags. #[arg(long, env = "GIT_CLIFF_TAG_PATTERN", value_name = "PATTERN")] pub tag_pattern: Option, /// Sets custom commit messages to include in the changelog. #[arg( long, env = "GIT_CLIFF_WITH_COMMIT", value_name = "MSG", num_args(1..) )] pub with_commit: Option>, /// Sets custom message for the latest release. #[arg( long, env = "GIT_CLIFF_WITH_TAG_MESSAGE", value_name = "MSG", num_args = 0..=1, )] pub with_tag_message: Option, /// Sets the tags to skip in the changelog. #[arg(long, env = "GIT_CLIFF_SKIP_TAGS", value_name = "PATTERN")] pub skip_tags: Option, /// Sets the tags to ignore in the changelog. #[arg(long, env = "GIT_CLIFF_IGNORE_TAGS", value_name = "PATTERN")] pub ignore_tags: Option, /// Sets the tags to count in the changelog. #[arg(long, env = "GIT_CLIFF_COUNT_TAGS", value_name = "PATTERN")] pub count_tags: Option, /// Sets commits that will be skipped in the changelog. #[arg( long, env = "GIT_CLIFF_SKIP_COMMIT", value_name = "SHA1", num_args(1..) )] pub skip_commit: Option>, /// Prepends entries to the given changelog file. #[arg( short, long, env = "GIT_CLIFF_PREPEND", value_name = "PATH", value_parser = Opt::parse_dir )] pub prepend: Option, /// Writes output to the given file. #[arg( short, long, env = "GIT_CLIFF_OUTPUT", value_name = "PATH", value_parser = Opt::parse_dir, num_args = 0..=1, default_missing_value = DEFAULT_OUTPUT )] pub output: Option, /// Sets the tag for the latest version. #[arg( short, long, env = "GIT_CLIFF_TAG", value_name = "TAG", allow_hyphen_values = true )] pub tag: Option, /// Bumps the version for unreleased changes. Optionally with specified /// version. #[arg( long, value_name = "BUMP", value_enum, num_args = 0..=1, default_missing_value = "auto", value_parser = clap::value_parser!(BumpOption))] pub bump: Option, /// Prints bumped version for unreleased changes. #[arg(long, help_heading = Some("FLAGS"))] pub bumped_version: bool, /// Sets the template for the changelog body. #[arg( short, long, env = "GIT_CLIFF_TEMPLATE", value_name = "TEMPLATE", allow_hyphen_values = true )] pub body: Option, /// Processes the commits starting from the latest tag. #[arg(short, long, help_heading = Some("FLAGS"))] pub latest: bool, /// Processes the commits that belong to the current tag. #[arg(long, help_heading = Some("FLAGS"))] pub current: bool, /// Processes the commits that do not belong to a tag. #[arg(short, long, help_heading = Some("FLAGS"))] pub unreleased: bool, /// Sorts the tags topologically. #[arg(long, help_heading = Some("FLAGS"))] pub topo_order: bool, /// Include only the tags that belong to the current branch. #[arg(long, help_heading = Some("FLAGS"))] pub use_branch_tags: bool, /// Disables the external command execution. #[arg(long, help_heading = Some("FLAGS"))] pub no_exec: bool, /// Prints changelog context as JSON. #[arg(short = 'x', long, help_heading = Some("FLAGS"))] pub context: bool, /// Generates changelog from a JSON context. #[arg( long, value_name = "PATH", value_parser = Opt::parse_dir, env = "GIT_CLIFF_CONTEXT", )] pub from_context: Option, /// Strips the given parts from the changelog. #[arg(short, long, value_name = "PART", value_enum)] pub strip: Option, /// Sets sorting of the commits inside sections. #[arg( long, value_enum, default_value_t = Sort::Oldest )] pub sort: Sort, /// Sets the GitHub API token. #[arg( long, help_heading = "REMOTE OPTIONS", env = "GITHUB_TOKEN", value_name = "TOKEN", hide_env_values = true, hide = !cfg!(feature = "github"), )] pub github_token: Option, /// Sets the GitHub repository. #[arg( long, help_heading = "REMOTE OPTIONS", env = "GITHUB_REPO", value_parser = clap::value_parser!(RemoteValue), value_name = "OWNER/REPO", hide = !cfg!(feature = "github"), )] pub github_repo: Option, /// Sets the GitLab API token. #[arg( long, help_heading = "REMOTE OPTIONS", env = "GITLAB_TOKEN", value_name = "TOKEN", hide_env_values = true, hide = !cfg!(feature = "gitlab"), )] pub gitlab_token: Option, /// Sets the GitLab repository. #[arg( long, help_heading = "REMOTE OPTIONS", env = "GITLAB_REPO", value_parser = clap::value_parser!(RemoteValue), value_name = "OWNER/REPO", hide = !cfg!(feature = "gitlab"), )] pub gitlab_repo: Option, /// Sets the Gitea API token. #[arg( long, help_heading = "REMOTE OPTIONS", env = "GITEA_TOKEN", value_name = "TOKEN", hide_env_values = true, hide = !cfg!(feature = "gitea"), )] pub gitea_token: Option, /// Sets the Gitea repository. #[arg( long, help_heading = "REMOTE OPTIONS", env = "GITEA_REPO", value_parser = clap::value_parser!(RemoteValue), value_name = "OWNER/REPO", hide = !cfg!(feature = "gitea"), )] pub gitea_repo: Option, /// Sets the Bitbucket API token. #[arg( long, help_heading = "REMOTE OPTIONS", env = "BITBUCKET_TOKEN", value_name = "TOKEN", hide_env_values = true, hide = !cfg!(feature = "bitbucket"), )] pub bitbucket_token: Option, /// Sets the Bitbucket repository. #[arg( long, help_heading = "REMOTE OPTIONS", env = "BITBUCKET_REPO", value_parser = clap::value_parser!(RemoteValue), value_name = "OWNER/REPO", hide = !cfg!(feature = "bitbucket"), )] pub bitbucket_repo: Option, /// Sets the Azure DevOps API token. #[arg( long, help_heading = "REMOTE OPTIONS", env = "AZURE_DEVOPS_TOKEN", value_name = "TOKEN", hide_env_values = true, hide = !cfg!(feature = "azure_devops"), )] pub azure_devops_token: Option, /// Sets the Azure DevOps repository. #[arg( long, help_heading = "REMOTE OPTIONS", env = "AZURE_DEVOPS_REPO", value_parser = clap::value_parser!(RemoteValue), value_name = "OWNER/REPO", hide = !cfg!(feature = "azure_devops"), )] pub azure_devops_repo: Option, /// Sets the commit range to process. #[arg(value_name = "RANGE", help_heading = Some("ARGS"))] pub range: Option, /// Load TLS certificates from the native certificate store. #[arg(long, help_heading = Some("FLAGS"), hide = !cfg!(feature = "remote"))] pub use_native_tls: bool, /// Disable network access for remote repositories. #[arg(long, env = "GIT_CLIFF_OFFLINE", help_heading = Some("REMOTE OPTIONS"), hide = !cfg!(feature = "remote"))] pub offline: bool, } /// Custom type for the remote value. #[derive(Clone, Debug, PartialEq)] pub struct RemoteValue(pub Remote); impl ValueParserFactory for RemoteValue { type Parser = RemoteValueParser; fn value_parser() -> Self::Parser { RemoteValueParser } } /// Parser for the remote value. #[derive(Clone, Debug)] pub struct RemoteValueParser; impl TypedValueParser for RemoteValueParser { type Value = RemoteValue; fn parse_ref( &self, cmd: &clap::Command, arg: Option<&clap::Arg>, value: &std::ffi::OsStr, ) -> Result { let inner = clap::builder::StringValueParser::new(); let mut value = inner.parse_ref(cmd, arg, value)?; if let Ok(url) = Url::parse(&value) { value = url.path().trim_start_matches('/').to_string(); } let parts = value.rsplit_once('/'); if let Some((owner, repo)) = parts { Ok(RemoteValue(Remote::new( owner.to_string(), repo.to_string(), ))) } else { let mut err = clap::Error::new(ErrorKind::ValueValidation).with_cmd(cmd); if let Some(arg) = arg { err.insert( ContextKind::InvalidArg, ContextValue::String(arg.to_string()), ); } err.insert(ContextKind::InvalidValue, ContextValue::String(value)); Err(err) } } } #[derive(Debug, Clone, Eq, PartialEq)] pub enum BumpOption { Auto, Specific(BumpType), } impl ValueParserFactory for BumpOption { type Parser = BumpOptionParser; fn value_parser() -> Self::Parser { BumpOptionParser } } /// Parser for bump type. #[derive(Clone, Debug)] pub struct BumpOptionParser; impl TypedValueParser for BumpOptionParser { type Value = BumpOption; fn parse_ref( &self, cmd: &clap::Command, arg: Option<&clap::Arg>, value: &std::ffi::OsStr, ) -> Result { let inner = clap::builder::StringValueParser::new(); let value = inner.parse_ref(cmd, arg, value)?; match value.as_str() { "auto" => Ok(BumpOption::Auto), "major" => Ok(BumpOption::Specific(BumpType::Major)), "minor" => Ok(BumpOption::Specific(BumpType::Minor)), "patch" => Ok(BumpOption::Specific(BumpType::Patch)), _ => { let mut err = clap::Error::new(ErrorKind::ValueValidation).with_cmd(cmd); if let Some(arg) = arg { err.insert( ContextKind::InvalidArg, ContextValue::String(arg.to_string()), ); } err.insert(ContextKind::InvalidValue, ContextValue::String(value)); Err(err) } } } } impl Opt { /// Custom string parser for directories. /// /// Expands the tilde (`~`) character in the beginning of the /// input string into contents of the path returned by [`home_dir`]. /// /// [`home_dir`]: dirs::home_dir fn parse_dir(dir: &str) -> Result { Ok(PathBuf::from(shellexpand::tilde(dir).to_string())) } } #[cfg(test)] mod tests { use std::ffi::OsStr; use clap::CommandFactory; use super::*; #[test] fn verify_cli() { Opt::command().debug_assert(); } #[test] fn path_tilde_expansion() { let home_dir = dirs::home_dir().expect("cannot retrieve home directory"); let dir = Opt::parse_dir("~/").expect("cannot expand tilde"); assert_eq!(home_dir, dir); } #[test] fn remote_value_parser() -> Result<(), clap::Error> { let remote_value_parser = RemoteValueParser; assert_eq!( RemoteValue(Remote::new("test", "repo")), remote_value_parser.parse_ref(&Opt::command(), None, OsStr::new("test/repo"))? ); assert_eq!( RemoteValue(Remote::new("gitlab/group/test", "repo")), remote_value_parser.parse_ref( &Opt::command(), None, OsStr::new("gitlab/group/test/repo") )? ); assert_eq!( RemoteValue(Remote::new("test", "testrepo")), remote_value_parser.parse_ref( &Opt::command(), None, OsStr::new("https://github.com/test/testrepo") )? ); assert_eq!( RemoteValue(Remote::new( "archlinux/packaging/packages", "arch-repro-status" )), remote_value_parser.parse_ref( &Opt::command(), None, OsStr::new( "https://gitlab.archlinux.org/archlinux/packaging/packages/arch-repro-status" ) )? ); assert!( remote_value_parser .parse_ref(&Opt::command(), None, OsStr::new("test")) .is_err() ); assert!( remote_value_parser .parse_ref(&Opt::command(), None, OsStr::new("")) .is_err() ); Ok(()) } #[test] fn bump_option_parser() -> Result<(), clap::Error> { let bump_option_parser = BumpOptionParser; assert_eq!( BumpOption::Auto, bump_option_parser.parse_ref(&Opt::command(), None, OsStr::new("auto"))? ); assert!( bump_option_parser .parse_ref(&Opt::command(), None, OsStr::new("test")) .is_err() ); assert_eq!( BumpOption::Specific(BumpType::Major), bump_option_parser.parse_ref(&Opt::command(), None, OsStr::new("major"))? ); Ok(()) } } ================================================ FILE: git-cliff/src/bin/completions.rs ================================================ use std::env; use std::io::Result; use clap::{CommandFactory, ValueEnum}; use clap_complete::Shell; use git_cliff::args::Opt; /// Shell completions can be created with: /// `cargo run --bin git-cliff-completions` /// in a directory specified by the environment variable `OUT_DIR`. /// See fn main() -> Result<()> { let out_dir = env::var("OUT_DIR").expect("OUT_DIR is not set"); let mut app = Opt::command(); for &shell in Shell::value_variants() { clap_complete::generate_to(shell, &mut app, env!("CARGO_PKG_NAME"), &out_dir)?; } println!("Completion scripts are generated in {out_dir:?}"); Ok(()) } ================================================ FILE: git-cliff/src/bin/mangen.rs ================================================ use std::io::Result; use std::path::PathBuf; use std::{env, fs}; use clap::CommandFactory; use clap_mangen::Man; use git_cliff::args::Opt; /// Man page can be created with: /// `cargo run --bin git-cliff-mangen` /// in a directory specified by the environment variable `OUT_DIR`. /// See fn main() -> Result<()> { let out_dir = env::var("OUT_DIR").expect("OUT_DIR is not set"); let out_path = PathBuf::from(out_dir).join(format!("{}.1", env!("CARGO_PKG_NAME"))); let app = Opt::command(); let man = Man::new(app); let mut buffer = Vec::::new(); man.render(&mut buffer)?; fs::write(&out_path, buffer)?; #[allow(clippy::unnecessary_debug_formatting)] { println!("Man page is generated at {out_path:?}"); } Ok(()) } ================================================ FILE: git-cliff/src/lib.rs ================================================ //! A highly customizable changelog generator ⛰️ #![doc( html_logo_url = "https://raw.githubusercontent.com/orhun/git-cliff/main/website/static/img/git-cliff.png", html_favicon_url = "https://raw.githubusercontent.com/orhun/git-cliff/main/website/static/favicon/favicon.ico" )] /// Command-line argument parser. pub mod args; /// Custom logger implementation. pub mod logger; use std::env; use std::fs::{self, File}; use std::io::{self, Write}; use std::path::{Path, PathBuf}; use std::time::{SystemTime, UNIX_EPOCH}; use args::{BumpOption, Opt, Sort, Strip}; use clap::ValueEnum; use git_cliff_core::changelog::Changelog; use git_cliff_core::commit::{Commit, Range}; use git_cliff_core::config::{CommitParser, Config}; use git_cliff_core::embed::{BuiltinConfig, EmbeddedConfig}; use git_cliff_core::error::{Error, Result}; use git_cliff_core::release::Release; use git_cliff_core::repo::{Repository, SubmoduleRange}; use git_cliff_core::{DEFAULT_CONFIG, IGNORE_FILE}; use glob::Pattern; /// Checks for a new version on crates.io #[cfg(feature = "update-informer")] pub fn check_new_version() { use update_informer::Check; let pkg_name = env!("CARGO_PKG_NAME"); let pkg_version = env!("CARGO_PKG_VERSION"); let informer = update_informer::new(update_informer::registry::Crates, pkg_name, pkg_version); if let Some(new_version) = informer.check_version().ok().flatten() { if new_version.semver().pre.is_empty() { log::info!("A new version of {pkg_name} is available: v{pkg_version} -> {new_version}",); } } } /// Produces a commit range on the format `BASE..HEAD`, derived from the /// command line arguments and repository tags. /// /// If no commit range could be determined, `None` is returned. fn determine_commit_range( args: &Opt, config: &Config, repository: &Repository, ) -> Result> { let tags = repository.tags( &config.git.tag_pattern, args.topo_order, args.use_branch_tags, )?; let mut commit_range = args.range.clone(); if args.unreleased { if let Some(last_tag) = tags.last().map(|(k, _)| k) { commit_range = Some(format!("{last_tag}..HEAD")); } } else if args.latest || args.current { if tags.len() < 2 { let commits = repository.commits(None, None, None, config.git.topo_order_commits)?; if let (Some(tag1), Some(tag2)) = ( commits.last().map(|c| c.id().to_string()), tags.get_index(0).map(|(k, _)| k), ) { if tags.len() == 1 { commit_range = Some(tag2.to_owned()); } else { commit_range = Some(format!("{tag1}..{tag2}")); } } } else { let mut tag_index = tags.len() - 2; if args.current { if let Some(current_tag_index) = repository.current_tag().as_ref().and_then(|tag| { tags.iter() .enumerate() .find(|(_, (_, v))| v.name == tag.name) .map(|(i, _)| i) }) { match current_tag_index.checked_sub(1) { Some(i) => tag_index = i, None => { return Err(Error::ChangelogError(String::from( "No suitable tags found. Maybe run with '--topo-order'?", ))); } } } else { return Err(Error::ChangelogError(String::from( "No tag exists for the current commit", ))); } } if let (Some(tag1), Some(tag2)) = ( tags.get_index(tag_index).map(|(k, _)| k), tags.get_index(tag_index + 1).map(|(k, _)| k), ) { commit_range = Some(format!("{tag1}..{tag2}")); } } } Ok(commit_range) } /// Process submodules and add commits to release. fn process_submodules( repository: &'static Repository, release: &mut Release, topo_order_commits: bool, ) -> Result<()> { // Retrieve first and last commit of a release to create a commit range. let first_commit = release .previous .as_ref() .and_then(|previous_release| previous_release.commit_id.clone()) .and_then(|commit_id| repository.find_commit(&commit_id)); let last_commit = release .commit_id .clone() .and_then(|commit_id| repository.find_commit(&commit_id)); log::debug!("Processing submodule commits in {first_commit:?}..{last_commit:?}"); // Query repository for submodule changes. For each submodule a // SubmoduleRange is created, describing the range of commits in the context // of that submodule. if let Some(last_commit) = last_commit { let submodule_ranges = repository.submodules_range(first_commit, last_commit)?; let submodule_commits = submodule_ranges.iter().filter_map(|submodule_range| { // For each submodule, the commit range is exploded into a list of // commits. let SubmoduleRange { repository: sub_repo, range: range_str, } = submodule_range; let commits = sub_repo .commits(Some(range_str), None, None, topo_order_commits) .ok() .map(|commits| commits.iter().map(Commit::from).collect()); let submodule_path = sub_repo.path().to_string_lossy().into_owned(); Some(submodule_path).zip(commits) }); // Insert submodule commits into map. for (submodule_path, commits) in submodule_commits { release.submodule_commits.insert(submodule_path, commits); } } Ok(()) } /// Initializes the configuration file. pub fn init_config(name: Option<&str>, config_path: &Path) -> Result<()> { let contents = match name { Some(name) => BuiltinConfig::get_config(name.to_string())?, None => EmbeddedConfig::get_config()?, }; let config_path = if config_path == Path::new(DEFAULT_CONFIG) { PathBuf::from(DEFAULT_CONFIG) } else { config_path.to_path_buf() }; log::info!( "Saving the configuration file{} to {}", name.map(|v| format!(" ({v})")).unwrap_or_default(), config_path.display(), ); fs::write(config_path, contents)?; Ok(()) } /// Processes the tags and commits for creating release entries for the /// changelog. /// /// This function uses the configuration and arguments to process the given /// repository individually. fn process_repository<'a>( repository: &'static Repository, config: &mut Config, args: &Opt, ) -> Result>> { let mut tags = repository.tags( &config.git.tag_pattern, args.topo_order, args.use_branch_tags, )?; let skip_regex = config.git.skip_tags.as_ref(); let ignore_regex = config.git.ignore_tags.as_ref(); let count_tags = config.git.count_tags.as_ref(); let recurse_submodules = config.git.recurse_submodules.unwrap_or(false); tags.retain(|_, tag| { let name = &tag.name; // Keep skip tags to drop commits in the later stage. let skip = skip_regex.is_some_and(|r| r.is_match(name)); if skip { return true; } let count = count_tags.is_none_or(|r| { let count_tag = r.is_match(name); if count_tag { log::debug!("Counting release: {name}"); } count_tag }); let ignore = ignore_regex.is_some_and(|r| { if r.as_str().trim().is_empty() { return false; } let ignore_tag = r.is_match(name); if ignore_tag { log::debug!("Ignoring release: {name}"); } ignore_tag }); count && !ignore }); if !config.remote.is_any_set() { match repository.upstream_remote() { Ok(remote) => { if !config.remote.github.is_set() { log::debug!("No GitHub remote is set, using remote: {remote}"); config.remote.github.owner = remote.owner; config.remote.github.repo = remote.repo; config.remote.github.is_custom = remote.is_custom; } else if !config.remote.gitlab.is_set() { log::debug!("No GitLab remote is set, using remote: {remote}"); config.remote.gitlab.owner = remote.owner; config.remote.gitlab.repo = remote.repo; config.remote.gitlab.is_custom = remote.is_custom; } else if !config.remote.gitea.is_set() { log::debug!("No Gitea remote is set, using remote: {remote}"); config.remote.gitea.owner = remote.owner; config.remote.gitea.repo = remote.repo; config.remote.gitea.is_custom = remote.is_custom; } else if !config.remote.bitbucket.is_set() { log::debug!("No Bitbucket remote is set, using remote: {remote}"); config.remote.bitbucket.owner = remote.owner; config.remote.bitbucket.repo = remote.repo; config.remote.bitbucket.is_custom = remote.is_custom; } } Err(e) => { log::debug!("Failed to get remote from repository: {e:?}"); } } } if args.use_native_tls { config.remote.enable_native_tls(); } // Print debug information about configuration and arguments. log::trace!("Arguments: {args:#?}"); log::trace!("Config: {config:#?}"); // Parse commits. let commit_range = determine_commit_range(args, config, repository)?; // Include only the current directory if not running from the root repository. // // NOTE: // The conditions for including the current directory when not running from the root repository // have grown quite complex. This may warrant additional documentation to explain the behavior. // // Current logic triggers when all of the following are true: // - `cwd` is a child of the repository root but not the root itself // - `args.repository` is either None or empty // - `args.workdir` is None // - `include_path` is currently empty // // Additionally, if `include_path` is already explicitly set, it might be preferable to append. let cwd = env::current_dir()?; let mut include_path = config.git.include_paths.clone(); if let Ok(root) = repository.root_path() { if cwd.starts_with(&root) && cwd != root && args.repository.as_ref().is_none_or(Vec::is_empty) && args.workdir.is_none() && include_path.is_empty() { let path = cwd.join("**").join("*"); if let Ok(stripped) = path.strip_prefix(root) { log::info!( "Including changes from the current directory: {}", cwd.display() ); include_path = vec![Pattern::new(stripped.to_string_lossy().as_ref())?]; } } } let include_path = (!include_path.is_empty()).then_some(include_path); let exclude_path = (!config.git.exclude_paths.is_empty()).then_some(config.git.exclude_paths.clone()); let mut commits = repository.commits( commit_range.as_deref(), include_path, exclude_path, config.git.topo_order_commits, )?; if let Some(commit_limit_value) = config.git.limit_commits { commits.truncate(commit_limit_value); } // Update tags. let mut releases = vec![Release::default()]; let mut tag_timestamp = None; if let Some(ref tag) = args.tag { if let Some(commit_id) = commits.first().map(|c| c.id().to_string()) { match tags.get(&commit_id) { Some(tag) => { log::warn!("There is already a tag ({}) for {}", tag.name, commit_id); tag_timestamp = Some(commits[0].time().seconds()); } None => { tags.insert(commit_id, repository.resolve_tag(tag)); } } } else { releases[0].version = Some(tag.clone()); releases[0].timestamp = Some( SystemTime::now() .duration_since(UNIX_EPOCH)? .as_secs() .try_into()?, ); } } // Process releases. let mut previous_release = Release::default(); let mut first_processed_tag = None; let repository_path = repository.root_path()?.to_string_lossy().into_owned(); for git_commit in commits.iter().rev() { let release = releases.last_mut().unwrap(); let commit = Commit::from(git_commit); let commit_id = commit.id.clone(); release.commits.push(commit); release.repository = Some(repository_path.clone()); release.commit_id = Some(commit_id); if let Some(tag) = tags.get(release.commit_id.as_ref().unwrap()) { release.version = Some(tag.name.clone()); release.message.clone_from(&tag.message); release.timestamp = if args.tag.as_deref() == Some(tag.name.as_str()) { match tag_timestamp { Some(timestamp) => Some(timestamp), None => Some( SystemTime::now() .duration_since(UNIX_EPOCH)? .as_secs() .try_into()?, ), } } else { Some(git_commit.time().seconds()) }; if first_processed_tag.is_none() { first_processed_tag = Some(tag); } previous_release.previous = None; release.previous = Some(Box::new(previous_release)); previous_release = release.clone(); releases.push(Release::default()); } } debug_assert!(!releases.is_empty()); if releases.len() > 1 { previous_release.previous = None; releases.last_mut().unwrap().previous = Some(Box::new(previous_release)); } if args.sort == Sort::Newest { for release in &mut releases { release.commits.reverse(); } } // Add custom commit messages to the latest release. if let Some(custom_commits) = &args.with_commit { releases .last_mut() .unwrap() .commits .extend(custom_commits.iter().cloned().map(Commit::from)); } // Set the previous release if the first release does not have one set. if releases[0] .previous .as_ref() .and_then(|p| p.version.as_ref()) .is_none() { // Get the previous tag of the first processed tag in the release loop. let first_tag = first_processed_tag .map(|tag| { tags.iter() .enumerate() .find(|(_, (_, v))| v.name == tag.name) .and_then(|(i, _)| i.checked_sub(1)) .and_then(|i| tags.get_index(i)) }) .or_else(|| Some(tags.last())) .flatten(); // Set the previous release if the first tag is found. if let Some((commit_id, tag)) = first_tag { let previous_release = Release { commit_id: Some(commit_id.clone()), version: Some(tag.name.clone()), timestamp: Some( repository .find_commit(commit_id) .map(|v| v.time().seconds()) .unwrap_or_default(), ), ..Default::default() }; releases[0].previous = Some(Box::new(previous_release)); } } for release in &mut releases { // Set the commit ranges for all releases if !release.commits.is_empty() { release.commit_range = Some(match args.sort { Sort::Oldest => Range::new( release.commits.first().unwrap(), release.commits.last().unwrap(), ), Sort::Newest => Range::new( release.commits.last().unwrap(), release.commits.first().unwrap(), ), }); } if recurse_submodules { process_submodules(repository, release, config.git.topo_order_commits)?; } } // Set custom message for the latest release. if let Some(message) = &args.with_tag_message { if let Some(latest_release) = releases .iter_mut() .rfind(|release| !release.commits.is_empty()) { latest_release.message = Some(message.to_owned()); } } Ok(releases) } /// Runs `git-cliff`. /// /// # Example /// /// ```no_run /// use clap::Parser; /// use git_cliff::args::Opt; /// use git_cliff_core::error::Result; /// /// fn main() -> Result<()> { /// let args = Opt::parse(); /// git_cliff::run(args)?; /// Ok(()) /// } /// ``` pub fn run<'a>(args: Opt) -> Result> { run_with_changelog_modifier(args, |_| Ok(())) } /// Runs `git-cliff` with a changelog modifier. /// /// This is useful if you want to modify the [`Changelog`] before /// it's written or the context is printed (depending how git-cliff is started). /// /// # Example /// /// ```no_run /// use clap::Parser; /// use git_cliff::args::Opt; /// use git_cliff_core::error::Result; /// /// fn main() -> Result<()> { /// let args = Opt::parse(); /// /// git_cliff::run_with_changelog_modifier(args, |changelog| { /// println!("Releases: {:?}", changelog.releases); /// Ok(()) /// })?; /// /// Ok(()) /// } /// ``` pub fn run_with_changelog_modifier<'a>( mut args: Opt, changelog_modifier: impl FnOnce(&mut Changelog) -> Result<()>, ) -> Result> { // Retrieve the built-in configuration. let builtin_config = BuiltinConfig::parse(args.config.to_string_lossy().to_string()); // Set the working directory. if let Some(ref workdir) = args.workdir { args.config = workdir.join(args.config); match args.repository.as_mut() { Some(repository) => { repository .iter_mut() .for_each(|r| *r = workdir.join(r.clone())); } None => args.repository = Some(vec![workdir.clone()]), } if let Some(changelog) = args.prepend { args.prepend = Some(workdir.join(changelog)); } // pushing an empty component force-adds a trailing path separator // which is needed for correct glob expansion args.include_path = Some(vec![Pattern::new( workdir.join("").to_string_lossy().as_ref(), )?]); } // Set path for the configuration file. let mut path = args.config.clone(); if !path.exists() { if let Some(config_path) = Config::retrieve_config_path() { path = config_path; } } // Parse the configuration file. // Load the default configuration if necessary. let mut config = if let Some(url) = &args.config_url { log::debug!("Using configuration file from: {url}"); #[cfg(feature = "remote")] { reqwest::blocking::get(url.clone())? .error_for_status()? .text()? .parse()? } #[cfg(not(feature = "remote"))] unreachable!("This option is not available without the 'remote' build-time feature"); } else if let Ok((config, name)) = builtin_config { log::info!("Using built-in configuration file: {name}"); config } else if path.exists() { Config::load(&path)? } else if let Some(contents) = Config::read_from_manifest()? { contents.parse()? } else if let Some(discovered_path) = env::current_dir()?.ancestors().find_map(|dir| { let path = dir.join(DEFAULT_CONFIG); if path.is_file() { Some(path) } else { None } }) { log::info!( "Using configuration from parent directory: {}", discovered_path.display() ); Config::load(&discovered_path)? } else { #[allow(clippy::unnecessary_debug_formatting)] if !args.context { log::warn!( "{:?} is not found, using the default configuration", args.config ); } EmbeddedConfig::parse()? }; // Update the configuration based on command line arguments and vice versa. let output = args.output.clone().or(config.changelog.output.clone()); match args.strip { Some(Strip::Header) => { config.changelog.header = None; } Some(Strip::Footer) => { config.changelog.footer = None; } Some(Strip::All) => { config.changelog.header = None; config.changelog.footer = None; } None => {} } if args.prepend.is_some() { config.changelog.footer = None; if !(args.unreleased || args.latest || args.range.is_some()) { return Err(Error::ArgumentError(String::from( "'-u' or '-l' is not specified", ))); } } if output.is_some() && args.prepend.is_some() && output.as_ref() == args.prepend.as_ref() { return Err(Error::ArgumentError(String::from( "'-o' and '-p' can only be used together if they point to different files", ))); } if let Some(body) = args.body.clone() { config.changelog.body = body; } if args.sort == Sort::Oldest { args.sort = Sort::from_str(&config.git.sort_commits, true) .expect("Incorrect config value for 'sort_commits'"); } if !args.topo_order { args.topo_order = config.git.topo_order; } if !args.use_branch_tags { args.use_branch_tags = config.git.use_branch_tags; } if args.github_token.is_some() { config.remote.github.token.clone_from(&args.github_token); } if args.gitlab_token.is_some() { config.remote.gitlab.token.clone_from(&args.gitlab_token); } if args.gitea_token.is_some() { config.remote.gitea.token.clone_from(&args.gitea_token); } if args.bitbucket_token.is_some() { config .remote .bitbucket .token .clone_from(&args.bitbucket_token); } if args.azure_devops_token.is_some() { config .remote .azure_devops .token .clone_from(&args.azure_devops_token); } if args.offline { config.remote.offline = args.offline; } if let Some(ref remote) = args.github_repo { config.remote.github.owner.clone_from(&remote.0.owner); config.remote.github.repo.clone_from(&remote.0.repo); config.remote.github.is_custom = true; } if let Some(ref remote) = args.gitlab_repo { config.remote.gitlab.owner.clone_from(&remote.0.owner); config.remote.gitlab.repo.clone_from(&remote.0.repo); config.remote.gitlab.is_custom = true; } if let Some(ref remote) = args.bitbucket_repo { config.remote.bitbucket.owner.clone_from(&remote.0.owner); config.remote.bitbucket.repo.clone_from(&remote.0.repo); config.remote.bitbucket.is_custom = true; } if let Some(ref remote) = args.gitea_repo { config.remote.gitea.owner.clone_from(&remote.0.owner); config.remote.gitea.repo.clone_from(&remote.0.repo); config.remote.gitea.is_custom = true; } if let Some(ref remote) = args.azure_devops_repo { config.remote.azure_devops.owner.clone_from(&remote.0.owner); config.remote.azure_devops.repo.clone_from(&remote.0.repo); config.remote.azure_devops.is_custom = true; } if args.no_exec { config .git .commit_preprocessors .iter_mut() .for_each(|v| v.replace_command = None); config .changelog .postprocessors .iter_mut() .for_each(|v| v.replace_command = None); } if args.skip_tags.is_some() { config.git.skip_tags.clone_from(&args.skip_tags); } config.git.skip_tags = config.git.skip_tags.filter(|r| !r.as_str().is_empty()); if args.tag_pattern.is_some() { config.git.tag_pattern.clone_from(&args.tag_pattern); } if args.tag.is_some() { config.bump.initial_tag.clone_from(&args.tag); } if args.ignore_tags.is_some() { config.git.ignore_tags.clone_from(&args.ignore_tags); } if args.count_tags.is_some() { config.git.count_tags.clone_from(&args.count_tags); } if let Some(include_path) = &args.include_path { config .git .include_paths .extend(include_path.iter().cloned()); } if let Some(exclude_path) = &args.exclude_path { config .git .exclude_paths .extend(exclude_path.iter().cloned()); } // Process commits and releases for the changelog. if let Some(BumpOption::Specific(bump_type)) = args.bump { config.bump.bump_type = Some(bump_type); } // Generate changelog from context. let mut changelog: Changelog = if let Some(context_path) = args.from_context { let mut input: Box = if context_path == Path::new("-") { Box::new(io::stdin()) } else { Box::new(File::open(context_path)?) }; let mut changelog = Changelog::from_context(&mut input, config)?; changelog.add_remote_context()?; changelog } else { // Process the repositories. let repositories: Vec = if let Some(paths) = &args.repository { paths .iter() .map(|p| { let abs_path = fs::canonicalize(p)?; Repository::discover(abs_path) }) .collect::>>()? } else { let cwd = env::current_dir()?; vec![Repository::discover(cwd)?] }; let mut releases = Vec::::new(); let mut commit_range = None; for repository in repositories { // Skip commits let mut skip_list = Vec::new(); let ignore_file = repository.root_path()?.join(IGNORE_FILE); if ignore_file.exists() { let contents = fs::read_to_string(ignore_file)?; let commits = contents .lines() .filter(|v| !(v.starts_with('#') || v.trim().is_empty())) .map(|v| String::from(v.trim())) .collect::>(); skip_list.extend(commits); } if let Some(ref skip_commit) = args.skip_commit { skip_list.extend(skip_commit.clone()); } for sha1 in skip_list { config.git.commit_parsers.insert(0, CommitParser { sha: Some(sha1.clone()), skip: Some(true), ..Default::default() }); } // The commit range, used for determining the remote commits to include // in the changelog, doesn't make sense if multiple repositories are // specified. As such, pick the commit range from the last given // repository. commit_range = determine_commit_range(&args, &config, &repository)?; releases.extend(process_repository( Box::leak(Box::new(repository)), &mut config, &args, )?); } Changelog::new(releases, config, commit_range.as_deref())? }; changelog_modifier(&mut changelog)?; Ok(changelog) } /// Writes the changelog to a file. pub fn write_changelog( args: &Opt, mut changelog: Changelog<'_>, mut out: W, ) -> Result<()> { let output = args .output .clone() .or(changelog.config.changelog.output.clone()); if args.bump.is_some() || args.bumped_version { let next_version = if let Some(next_version) = changelog.bump_version()? { next_version } else if let Some(last_version) = changelog.releases.first().cloned().and_then(|v| v.version) { log::warn!("There is nothing to bump"); last_version } else if changelog.releases.is_empty() { changelog.config.bump.get_initial_tag() } else { return Ok(()); }; if let Some(tag_pattern) = &changelog.config.git.tag_pattern { if !tag_pattern.is_match(&next_version) { return Err(Error::ChangelogError(format!( "Next version ({next_version}) does not match the tag pattern: {tag_pattern}", ))); } } if args.bumped_version { if changelog.config.changelog.output.is_none() { writeln!(out, "{next_version}")?; } else { writeln!(io::stdout(), "{next_version}")?; } return Ok(()); } } if args.context { changelog.write_context(&mut out)?; return Ok(()); } if let Some(path) = &args.prepend { let changelog_before = fs::read_to_string(path)?; let mut out = io::BufWriter::new(File::create(path)?); changelog.prepend(changelog_before, &mut out)?; } if output.is_some() || args.prepend.is_none() { changelog.generate(&mut out)?; } Ok(()) } ================================================ FILE: git-cliff/src/logger.rs ================================================ use std::io::Write; use std::sync::atomic::{AtomicUsize, Ordering}; use std::{env, fmt}; use env_logger::Builder; use env_logger::fmt::{Color, Style, StyledValue}; use git_cliff_core::error::{Error, Result}; #[cfg(feature = "remote")] use indicatif::{ProgressBar, ProgressStyle}; use log::Level; /// Environment variable to use for the logger. const LOGGER_ENV: &str = "RUST_LOG"; /// Global variable for storing the maximum width of the modules. static MAX_MODULE_WIDTH: AtomicUsize = AtomicUsize::new(0); /// Wrapper for the padded values. struct Padded { value: T, width: usize, } impl fmt::Display for Padded { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{: usize { let max_width = MAX_MODULE_WIDTH.load(Ordering::Relaxed); if max_width < target.len() { MAX_MODULE_WIDTH.store(target.len(), Ordering::Relaxed); target.len() } else { max_width } } /// Adds colors to the given level and returns it. fn colored_level(style: &mut Style, level: Level) -> StyledValue<'_, &'static str> { match level { Level::Trace => style.set_color(Color::Magenta).value("TRACE"), Level::Debug => style.set_color(Color::Blue).value("DEBUG"), Level::Info => style.set_color(Color::Green).value("INFO "), Level::Warn => style.set_color(Color::Yellow).value("WARN "), Level::Error => style.set_color(Color::Red).value("ERROR"), } } #[cfg(feature = "remote")] lazy_static::lazy_static! { /// Lazily initialized progress bar. pub static ref PROGRESS_BAR: ProgressBar = { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_style( ProgressStyle::with_template("{spinner:.green} {msg}") .unwrap() .tick_strings(&[ "▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸", "▪▪▪▪▪", ]), ); progress_bar }; } /// Initializes the global logger. /// /// This method also creates a progress bar which is triggered /// by the network operations that are related to GitHub. #[allow(unreachable_code, clippy::needless_return)] pub fn init() -> Result<()> { let mut builder = Builder::new(); builder.format(move |f, record| { let target = record.target(); let max_width = max_target_width(target); let mut style = f.style(); let level = colored_level(&mut style, record.level()); let mut style = f.style(); let target = style.set_bold(true).value(Padded { value: target, width: max_width, }); #[cfg(feature = "github")] { let message = record.args().to_string(); if message.starts_with(git_cliff_core::remote::github::START_FETCHING_MSG) { PROGRESS_BAR.enable_steady_tick(std::time::Duration::from_millis(80)); PROGRESS_BAR.set_message(message); return Ok(()); } else if message.starts_with(git_cliff_core::remote::github::FINISHED_FETCHING_MSG) { PROGRESS_BAR.finish_and_clear(); return Ok(()); } } #[cfg(feature = "gitlab")] { let message = record.args().to_string(); if message.starts_with(git_cliff_core::remote::gitlab::START_FETCHING_MSG) { PROGRESS_BAR.enable_steady_tick(std::time::Duration::from_millis(80)); PROGRESS_BAR.set_message(message); return Ok(()); } else if message.starts_with(git_cliff_core::remote::gitlab::FINISHED_FETCHING_MSG) { PROGRESS_BAR.finish_and_clear(); return Ok(()); } } #[cfg(feature = "gitea")] { let message = record.args().to_string(); if message.starts_with(git_cliff_core::remote::gitea::START_FETCHING_MSG) { PROGRESS_BAR.enable_steady_tick(std::time::Duration::from_millis(80)); PROGRESS_BAR.set_message(message); return Ok(()); } else if message.starts_with(git_cliff_core::remote::gitea::FINISHED_FETCHING_MSG) { PROGRESS_BAR.finish_and_clear(); return Ok(()); } } #[cfg(feature = "bitbucket")] { let message = record.args().to_string(); if message.starts_with(git_cliff_core::remote::bitbucket::START_FETCHING_MSG) { PROGRESS_BAR.enable_steady_tick(std::time::Duration::from_millis(80)); PROGRESS_BAR.set_message(message); return Ok(()); } else if message.starts_with(git_cliff_core::remote::bitbucket::FINISHED_FETCHING_MSG) { PROGRESS_BAR.finish_and_clear(); return Ok(()); } } writeln!(f, " {} {} > {}", level, target, record.args()) }); if let Ok(var) = env::var(LOGGER_ENV) { builder.parse_filters(&var); } builder .try_init() .map_err(|e| Error::LoggerError(e.to_string())) } ================================================ FILE: git-cliff/src/main.rs ================================================ use std::fs::File; use std::path::Path; use std::{env, io, process}; use clap::Parser; use git_cliff::args::Opt; use git_cliff::{init_config, logger}; use git_cliff_core::error::Result; /// Profiler. #[cfg(feature = "profiler")] mod profiler; fn main() -> Result<()> { // Parse the command line arguments let args = Opt::parse(); if args.verbose == 1 { unsafe { env::set_var("RUST_LOG", "debug") }; } else if args.verbose > 1 { unsafe { env::set_var("RUST_LOG", "trace") }; } else if env::var_os("RUST_LOG").is_none() { unsafe { env::set_var("RUST_LOG", "info") }; } logger::init()?; // Initialize the profiler guard if the feature is enabled let mut _profiler_guard = None; #[cfg(feature = "profiler")] { _profiler_guard = profiler::start_profiling(); } #[cfg(not(feature = "profiler"))] { _profiler_guard = Some(()); } // Check if there is a new version available. #[cfg(feature = "update-informer")] if !args.offline { git_cliff::check_new_version(); } // Create the configuration file if init flag is given. if let Some(path) = &args.init { init_config(path.as_deref(), &args.config)?; return Ok(()); } // Generate a changelog. let changelog = git_cliff::run(args.clone())?; // Get output destination. let output = args .output .clone() .or(changelog.config.changelog.output.clone()); let out: Box = if let Some(path) = &output { if path == Path::new("-") { Box::new(io::stdout()) } else { Box::new(io::BufWriter::new(File::create(path)?)) } } else { Box::new(io::stdout()) }; // Write the changelog. let exit_code = match git_cliff::write_changelog(&args, changelog, out) { Ok(_) => 0, Err(e) => { log::error!("{e}"); 1 } }; // Report the profiler if the feature is enabled #[cfg(feature = "profiler")] { profiler::finish_profiling(_profiler_guard)?; } process::exit(exit_code); } ================================================ FILE: git-cliff/src/profiler.rs ================================================ use git_cliff_core::error::Result; /// Creates a profiler guard and returns it. pub(crate) fn start_profiling() -> Option> { match pprof::ProfilerGuardBuilder::default() .frequency(1000) .blocklist(&["libc", "libgcc", "pthread", "vdso"]) .build() { Ok(guard) => Some(guard), Err(e) => { log::error!("Failed to build profiler guard: {e}"); None } } } /// Reports the profiling results. pub(crate) fn finish_profiling(profiler_guard: Option) -> Result<()> { match profiler_guard .expect("failed to retrieve profiler guard") .report() .build() { Ok(report) => { #[cfg(feature = "profiler-flamegraph")] { use std::fs::File; let random = rand::random::(); let file = File::create(format!( "{}.{random}.flamegraph.svg", env!("CARGO_PKG_NAME"), ))?; if let Err(e) = report.flamegraph(file) { log::error!("Failed to create flamegraph file: {e}"); } } #[cfg(not(feature = "profiler-flamegraph"))] { log::info!("Report profiling: {:?}", &report); } } Err(e) => { log::error!("Failed to build profiler report: {e}"); } } Ok(()) } ================================================ FILE: git-cliff-core/Cargo.toml ================================================ [package] name = "git-cliff-core" version = "2.12.0" # managed by release.sh description = "Core library of git-cliff" authors = ["git-cliff contributors "] license = "MIT OR Apache-2.0" readme = "../README.md" homepage = "https://github.com/orhun/git-cliff" repository = "https://github.com/orhun/git-cliff" keywords = ["changelog", "generator", "conventional", "commit"] edition = "2024" rust-version = "1.85.1" [features] default = ["repo"] ## Enable parsing commits from a git repository. ## You can turn this off if you already have the commits to put in the ## changelog and you don't need `git-cliff` to parse them. repo = ["dep:git2"] # Enable integration with remote repositories. remote = [ "dep:reqwest", "dep:http-cache-reqwest", "dep:reqwest-middleware", "dep:tokio", "dep:futures", "dep:async-stream", ] ## Enable integration with GitHub. ## You can turn this off if you don't use GitHub and don't want ## to make network requests to the GitHub API. github = ["remote"] ## Enable integration with GitLab. ## You can turn this off if you don't use GitLab and don't want ## to make network requests to the GitLab API. gitlab = ["remote"] ## Enable integration with Bitbucket. ## You can turn this off if you don't use Bitbucket and don't want ## to make network requests to the Bitbucket API. bitbucket = ["remote"] ## Enable integration with Gitea. ## You can turn this off if you don't use Gitea and don't want ## to make network requests to the Gitea API. gitea = ["remote"] ## Enable integration with Azure DevOps. ## You can turn this off if you don't use Azure DevOps and don't want ## to make network requests to the Azure DevOps API. azure_devops = ["remote"] [dependencies] glob.workspace = true regex.workspace = true log.workspace = true secrecy.workspace = true dirs.workspace = true lazy_static.workspace = true thiserror = "2.0.17" serde = { version = "1.0.228", features = ["derive"] } serde_json = "1.0.145" bincode = "2.0.1" serde_regex = "1.1.0" tera = "1.20.1" indexmap = { version = "2.13.0", features = ["serde"] } toml = "0.9.8" lazy-regex = "3.6.0" next_version = "0.2.26" semver = "1.0.27" document-features = { version = "0.2.12", optional = true } reqwest = { workspace = true, optional = true } http-cache-reqwest = { version = "0.15.0", optional = true } reqwest-middleware = { version = "0.4.0", optional = true } tokio = { version = "1.49.0", features = [ "rt-multi-thread", "macros", ], optional = true } futures = { version = "0.3.31", optional = true } async-stream = { version = "0.3.6", optional = true } url.workspace = true dyn-clone = "1.0.17" urlencoding = "2.1.3" # `tokio-runtime` is already enabled transitively by the CLI. This just avoids runtime-less build failures. # See: https://github.com/zkat/cacache-rs/issues/92 cacache = { version = "13.1.0", features = ["mmap", "tokio-runtime"], default-features = false } time = "0.3.44" chrono = { version = "0.4.41", features = ["serde"] } [dependencies.git2] version = "0.20.3" default-features = false optional = true [dependencies.config] version = "0.15.19" default-features = false features = ["toml", "yaml"] [dependencies.git-conventional] version = "0.12.7" features = ["serde"] [dependencies.rust-embed] version = "8.11.0" features = ["debug-embed", "compression"] [dev-dependencies] pretty_assertions = "1.4.1" expect-test = "1.5.1" temp-dir = "0.1.16" [package.metadata.docs.rs] all-features = true rustdoc-args = ["--cfg", "docsrs"] [lints] workspace = true ================================================ FILE: git-cliff-core/src/changelog.rs ================================================ use std::collections::HashMap; use std::io::{Read, Write}; use std::time::{SystemTime, UNIX_EPOCH}; use crate::commit::Commit; use crate::config::{Config, GitConfig}; use crate::error::{Error, Result}; use crate::release::{Release, Releases}; #[cfg(feature = "azure_devops")] use crate::remote::azure_devops::AzureDevOpsClient; #[cfg(feature = "bitbucket")] use crate::remote::bitbucket::BitbucketClient; #[cfg(feature = "gitea")] use crate::remote::gitea::GiteaClient; #[cfg(feature = "github")] use crate::remote::github::GitHubClient; #[cfg(feature = "gitlab")] use crate::remote::gitlab::GitLabClient; use crate::summary::Summary; use crate::template::Template; /// Changelog generator. #[derive(Debug)] pub struct Changelog<'a> { /// Releases that the changelog will contain. pub releases: Vec>, /// Configuration used for generating the changelog. pub config: Config, header_template: Option