Files
lazysecrets/cliff.toml
T
keb 56d3d25c9c feat: link each changelog entry to its PR and commit (#11)
Like Immich's and RomM's release notes: every changelog entry now links to its pull request and its commit, in `CHANGELOG.md` and in the release notes on Gitea:

```
- Search with fzf's scoring and query syntax ([#11](…/pulls/11)) ([65dc2d7](…/commit/65dc2d7…))
```

- `cliff.toml`: the entry template adds the short commit hash as a link; a postprocessor turns the squash commit's `(#N)` into a link to the PR.
- The app shows release notes as text (`U`, and the status pane's changelog to come), so `Release.Notes()` turns Markdown links back into their text: `Search (#11) (65dc2d7)`.

Checked with `git cliff --unreleased` on main: every entry since v0.1.0 gets both links. Test for the link stripping.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Karl-Einar Bergstrøm <karl-einarb@outlook.com>
Reviewed-on: #11
2026-10-11 11:20:19 +02:00

66 lines
2.6 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# git-cliff (https://git-cliff.org) builds CHANGELOG.md and the release
# notes from the commits on main. Pull requests are squash-merged, so each
# one is a single commit whose message is the PR title: a conventional one
# (feat: …, fix: …, perf: …) puts it in the changelog, anything else
# (chore, ci, docs, refactor, test, …) leaves it out.
#
# git cliff --unreleased # what the next release would say
[changelog]
header = """
# Changelog
Every release of lazysecrets, newest first.\n
"""
body = """
{% if version -%}
## {{ version }} – {{ timestamp | date(format="%Y-%m-%d") }}
{% else -%}
## Unreleased
{% endif -%}
{% if commits | length == 0 %}
Hello world 👋
{% endif -%}
{% for group, commits in commits | group_by(attribute="group") %}
### {{ group | striptags | trim }}
{% for commit in commits %}
- {% if commit.breaking %}**Breaking:** {% endif %}{{ commit.message | split(pat="\n") | first | upper_first | trim }} \
([{{ commit.id | truncate(length=7, end="") }}](https://git.kebcloud.no/keb/lazysecrets/commit/{{ commit.id }}))\
{% endfor %}
{% endfor %}\n
"""
footer = "<!-- generated by git-cliff (cliff.toml) -->"
trim = true
# Runs on each part (header, every release) separately.
postprocessors = [
{ pattern = "\n{3,}", replace = "\n\n" },
# Squash commits end in the PR's number: link it.
{ pattern = "\\(#([0-9]+)\\)", replace = "([#${1}](https://git.kebcloud.no/keb/lazysecrets/pulls/${1}))" },
]
[git]
conventional_commits = true
filter_unconventional = false
split_commits = false
protect_breaking_commits = true
tag_pattern = "v[0-9]+\\.[0-9]+\\.[0-9]+$"
sort_commits = "oldest"
commit_preprocessors = [
# A merge commit (not a squash) says "Merge pull request 'feat: …' (#4)
# from branch into main": keep the title and number.
{ pattern = "^Merge pull request '(.+)' \\((#[0-9]+)\\) from .*", replace = "${1} (${2})" },
# Titles may be written "[feat] x", "[feat]: x" or "feat:x" (see
# pr-title.yml); all become "feat: x".
{ pattern = "^\\[(feat|fix|perf|refactor|docs|test|ci|chore|build|style|revert)(\\([^)]*\\))?(!?)\\](!?):?\\s*", replace = "${1}${2}${3}${4}: " },
{ pattern = "^(feat|fix|perf|refactor|docs|test|ci|chore|build|style|revert)(\\([^)]*\\))?(!?):(\\S)", replace = "${1}${2}${3}: ${4}" },
]
commit_parsers = [
{ body = "\\[skip changelog\\]", skip = true },
{ message = "^[a-z]+(\\(.*\\))?!:", group = "<!-- 0 -->Added" },
{ message = "^feat", group = "<!-- 0 -->Added" },
{ message = "^perf", group = "<!-- 1 -->Changed" },
{ message = "^fix", group = "<!-- 2 -->Fixed" },
{ message = ".*", skip = true },
]