Skip to main content

12 posts tagged with "release"

View All Tags

What's new in 1.2.0?

Β· 6 min read
Orhun ParmaksΔ±z
Author of git-cliff

In this post, I'm giving a brief introduction to the new features in the 1.2.0 release while giving insight into the future of git-cliff.

git-cliff is a command-line tool (written in Rust) that provides a highly customizable way to generate changelogs from git history. It supports using custom regular expressions to alter changelogs which are mostly based on conventional commits. With a single configuration file, a wide variety of formats can be applied for a changelog, thanks to the Jinja2/Django-inspired template engine. More information and examples can be found in the GitHub repository.

Today, the new version of git-cliff (1.2.0) is released. There are a couple of major cool features that I believe are interesting and also there were some internal library changes. Let's have a look!

What's new?​

The full changelog can be found here.

Improved documentation​

git-cliff documentation is moved to https://git-cliff.org.

It is surely better than cluttering up the README.md with all the information.

The source for the website can be found here.

Python Integration​

For Python projects, you can now place the git-cliff configuration inside pyproject.toml as follows:

name = "..."

[project]
dependencies = []

[tool.git-cliff.changelog]
header = "All notable changes to this project will be documented in this file."
body = "..."
footer = "<!-- generated by git-cliff -->"
# see [changelog] section for more keys

[tool.git-cliff.git]
conventional_commits = true
commit_parsers = []
filter_commits = false
# see [git] section for more keys

See the documentation for more information.

Thanks to @radusuciu for the implementation!

Better commit grouping​

You can now use regex values while grouping the commits via commit_parsers.

Let's say we have this commit history for example:

* fix(args): rename help argument due to conflict
* feat(parser): add ability to parse arrays

For this configuration:

# regex for parsing and grouping commits
commit_parsers = [
{ message = '^fix\((.*)\)', group = 'Fix (${1})' },
{ message = '^feat\((.*)\)', group = 'Feat (${1})' },
]

We get:

## [1.0.0] - 2021-07-18

### Feat (parser)

- Add ability to parse arrays

### Fix (args)

- Rename help argument due to conflict

Thanks to @erwinc1 for reporting the issue!

Overriding configuration with environment variables​

It was reported by @mackness on Discord that overriding the nested configuration values with environment variables was not working as expected. So we made some changes:

  • The prefix for environment variables is changed to GIT_CLIFF (from CLIFF).
  • "__" can be used as the separator for nested fields.

For example:

  • GIT_CLIFF__CHANGELOG__FOOTER overrides changelog.footer
  • GIT_CLIFF__GIT__IGNORE_TAGS overrides git.ignore_tags

See the documentation for more information.

Thanks to @mackness for the implementation!

New configuration file​

For my own projects such as halp and linuxwave, I started to use a fancier git-cliff configuration so I thought it would be nice to use it for the git-cliff repository as well.

Just to avoid confusion: the default (basic) template has not changed. I'm just maintaining another cliff.toml at the root of the repository now.

The changelog looks something like this now:

## [unreleased]

### ⛰️ Features

- _(cache)_ Use cache while fetching pages
- _(config)_ Support multiple file formats

## [1.0.1] - 2021-07-18

### 🚜 Refactor

- _(parser)_ Expose string functions

### βš™οΈ Miscellaneous Tasks

- _(release)_ Add release script

See the other template examples in the documentation.

New GitHub Action​

A new GitHub Action for git-cliff has been created by @jackton1!

tj-actions/git-cliff is another GitHub Action that you can use to generate changelogs for your project.

It uses a generic cliff-template.toml without the need to maintain multiple configuration files for each project or you can optionally provide a customized template as a path or URL which falls back to project's cliff.toml if it exist.

- name: Check out repository
uses: actions/checkout@v3
with:
fetch-depth: 0

- name: Run git-cliff
uses: tj-actions/git-cliff@v1

See the documentation for more information.

Internal changes​

Here is a list of changes that are worth mentioning if you use git-cliff/git-cliff-core in your Rust project as a library:

  • Move changelog module to git-cliff-core (2ab2c8f)
    • This reduces the number of dependencies since you will only depend on git-cliff-core for changelog generation.
  • Make the fields of Signature public (104aac9)
    • Useful if you want to construct this struct manually.

Console interview​

The Console newsletter interview came out where I talk about the story behind git-cliff, my motivation, and the technical challenges that I faced during development.

Read: Console #141 - The Open Source Newsletter

Discord server​

If you are having a problem with git-cliff or want to contribute to the project or you just want to chit-chat, feel free to join our Discord server!

Looking forward​

Upcoming features​

Here is the list of open pull requests that I'm planning to focus on for the next releases:

Also, see the project issues.

Apart from those, I'm planning really big updates for the future that will revolutionize the changelog generation. Stay tuned! πŸš€

New organization​

I created an organization on GitHub: https://github.com/git-cliff

The following repositories will be moved there:

  • orhun/git-cliff -> git-cliff/git-cliff
  • orhun/git-cliff-action -> git-cliff/action

Just a heads-up :3

If you have a git-cliff-related repository that you're possibly interested in maintaining as a part of this organization, hit me up!

Contributions​

Any contribution is highly appreciated! There are contribution guidelines for getting started.

Feel free to submit issues and throw in ideas!

If you liked git-cliff and/or my other projects on GitHub, consider donating to support my open source endeavors.

πŸ’– https://donate.orhun.dev

Have a wonderful day! ⛰️

What's new in 0.5.0?

Β· 7 min read
Orhun ParmaksΔ±z
Author of git-cliff

In this post, I'm explaining the new features in the 0.5.0 release while giving insight into the different use-cases.

git-cliff is a command-line tool (written in Rust) that provides a highly customizable way to generate changelogs from git history. It supports using custom regular expressions to alter changelogs which are mostly based on conventional commits. With a single configuration file, a wide variety of formats can be applied for a changelog, thanks to the Jinja2/Django-inspired template engine. More information and examples can be found in the GitHub repository.

Today I released the new version (0.5.0) of git-cliff. There are a couple of major features that I believe are interesting and they can potentially help with different use cases. Must be exciting, let's have a look!

What's new?​

--topo-order​

--topo-order : Sorts the tags topologically

Imagine you are working on parallel code lines and you have the following git history:

* 0000025 (tag: v0.1.1, fix_v1) fix: patch on v0.1.x
| * 0000050 (HEAD -> master) feat: fifth commit on master
| * 0000040 (tag: v0.2.0) feat: fourth commit on master
| * 0000030 chore: third commit on master
|/
* 0000020 (tag: v0.1.0) fix: second commit on master
* 0000010 feat: first commit on master

In this scenario, we can pretend that after your fifth commit on master you had to fix something about v0.1.0 and check out a new branch (fix_v1). After that, you committed a patch and created a new tag. (v0.1.1)

Now let's say you decided to generate a changelog for the unreleased commits. Since previous versions of git-cliff sort the tags chronologically as default, you would get something like this:

$ git cliff --unreleased

# Changelog
## [unreleased]
### Features
- Fifth commit on master

## [0.2.0] - 2021-10-22
### Features
- Fourth commit on master

### Miscellaneous Tasks
- Third commit on master

This is because --unreleased flag implicitly uses a commit range such as 0000025..HEAD, since it sorts the tags chronologically, as previously stated. This situation can now be prevented by using the --topo-order flag, which disables the automatic sorting and processes the tags as they appear in the git history:

$ git cliff --topo-order --unreleased

# Changelog
## [unreleased]
### Features
- Fifth commit on master

Now, the correct range of commits (0000040..HEAD) is processed. In other words, v0.2.0 is accepted as the latest tag in the master branch.

Tracking issue: #29

--include-path && --exclude-path​

--include-path <PATTERN>... : Sets the path to include related commits --exclude-path <PATTERN>... : Sets the path to exclude related commits

Let's say you have a monorepo and you want to generate a changelog that includes or excludes some commits that concern certain files/directories in the working directory. To explain it further, let's think that you have the following directory structure:

Cargo.toml
apps/
└── application-related files
libs/
└── library files
other/
└── miscellaneous files

In the previous versions of git-cliff, it was possible to only include commits in the changelog if the changes are against a path under e.g. "apps". This could be done by using the --commit-path argument. But now, functionality is extended much further and you can specify multiple paths, use glob patterns and even exclude files/directories by using the brand new --include-path and --exclude-path arguments.

# include commits related to any TOML file and also application directory
$ git cliff --include-path "**/*.toml" --include-path "apps/*"

# exclude commits that are related to miscellaneous files
$ git cliff --exclude-path "other/*"

With this change, --commit-path argument is removed replaced with --include-path which supports glob patterns.

Tracking issue: #34

--current​

--current: Processes the commits that belong to the current tag

Let's suppose this situation:

  1. First, v0.10.0 is released.
  2. After that, v0.11.0 is released.
  3. After that, a bug was found and v0.10.1 is released.

The problem is was, when you check out to a tag and try to generate a changelog for the latest tag, it always points out to the most recent tag (which is v0.10.1 in our example). So how do you generate changelog for the currently checked out tag? Well, simple:

$ git checkout v0.11.0

# changelog is generated for v0.11.0
$ git cliff --current

# changelog is generated for v0.10.1
$ git cliff --latest

--current flag behaves the same as running the following git command:

$ git describe --tags $(git rev-parse HEAD)

So it is expected to always use the current tag if it exists.

Tracking issue: #37

ignore_tags​

A new configuration file entry makes an appearance in the [git] section!

[git]
ignore_tags = "v.*-beta.*"

The simplest explanation would be: while skip_tags drop commits from the changelog, ignore_tags include ignored commits into the next tag.

So for example if you have the following git history:

* 2d77bc3 (HEAD -> master, tag: v0.2.0) feat: add feature 3
* 072eba9 (tag: v0.2.0-beta.1) feat: add feature 2
* 656564c (tag: v0.1.0) feat: fix feature 1
* 9d98e6b feat: add feature 1
* 6807c82 (tag: v0.1.0-beta.1) feat: add skip feature
* 93d62ef Initial commit

Setting ignore_tags = "v.*-beta.*" in the configuration will result in a changelog like this:

# Changelog
## [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

Thanks to @kenji-miyake for reporting/implementing this!

Tracking issue: #36

Sorting configuration​

Following values can be specified in the configuration file now (in [git] section):

For example:

[git]
topo_order = false
sort_commits = "newest"

Tracking issue: #31

filter_unconventional​

With this new configuration file entry, it is now possible to have both conventional and unconventional commits in the changelog.

[git]
# parse conventional commits
conventional_commits = true

# do not skip unconventional commits
filter_unconventional = false

# instead, override the group and scope of unconventional commits as "Other".
commit_parsers = [
{ message = ".*", group = "Other", default_scope = "other"},
]

Other use cases of filter_unconventional are the following:

# allow only conventional commits (default)
[git]
conventional_commits = true
filter_unconventional = true

# allow any type of commit in the changelog without parsing
[git]
conventional_commits = false
filter_unconventional = false

There is also a new field called conventional added to the template context. It can be used like this in the templates:

{% if commit.conventional %} βœ… {% else %} ❌ {% endif %}

--with-commit​

--with-commit <MSG>... : Sets custom commit messages to include in the changelog

In some cases, you might want to include commit messages in the changelog that yet don't exist. One example would be having "the commit message that updates the changelog" in the changelog. (πŸ€”)

git cliff -o CHANGELOG.md
git add CHANGELOG.md
git commit -m "chore(release): update CHANGELOG.md for 1.0.0"

In the example above, CHANGELOG.md will not have the latest commit message since the commit is created afterward. So if you want to include custom commit messages like that in the changelog, you can use the --with-commit argument as follows:

# define the commit message
commit_msg="chore(release): update CHANGELOG.md for 1.0.0"

# generate changelog and pretend a commit exists as "$commit_msg"
git cliff --with-commit "$commit_msg" -o CHANGELOG.md

# create the actual commit
git add CHANGELOG.md
git commit -m "$commit_msg"

Better error messages​

git-cliff now outputs more explanatory error messages about templates, instead of just saying "Failed to parse template":

$ git cliff

ERROR git_cliff > Template parse error:
--> 3:12
|
3 | {% endif %}{% forx group, commits in commits | group_by(attribute="group") %}␊
| ^---
|
= expected end of input or some content

Looking forward​

For the future versions of git-cliff,

  • I'm planning to improve performance by parallelizing the computations using rayon. There is not a tracking issue yet, but feel free to create one and share your thoughts!
  • Benchmarking would be cool to reveal the performance as well as performance-related issues.
  • Why not add a manpage?

Contributions​

Any contribution is highly appreciated! There are contribution guidelines for getting started. Feel free to submit issues and throw ideas! 🧠

Support​

If you liked git-cliff and/or my other projects on GitHub, consider supporting me on GitHub Sponsors or Patreon β˜•

Have a wonderful day! ⛰️