Twenty-one breaking changes in one release, with a live consumer. The
changelog lists them; `MIGRATING.md` says what to do about them, leading
with the three that change what an existing, *compiling* call returns —
unknown keys, predictions from a broken fit, and `Gaussian`'s operators
— since those are the ones the compiler will not find for you.
Every "after" snippet was compiled, not written from memory, and doing
so caught three errors in my own guide:
- `log_evidence_for(&[&"alice"])` does not compile at `K = String`. The
right spelling is `&["alice"]`, which works at *both* key types —
checked, because a guide that is right for half its readers is worse
than no guide.
- the same for `filtered_log_evidence_for`
- the `Analysis<'h> { joint: Joint<'h> }` example needs a history at the
default key type; pairing it with a `History<String>` does not compile
git-cliff skips merge commits now. Every branch lands with `--no-ff`, so
a release's merges outnumber its real commits and say nothing the merged
ones do not — 0.9.0's changelog had fourteen lines of them under "Other
(unconventional)". `ci:` commits get a group instead of falling through
to that catch-all.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011hcFjNDmHXZF8URGLku5zZ
76 lines
3.1 KiB
TOML
76 lines
3.1 KiB
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 = """
|
|
<!-- generated by git-cliff -->
|
|
"""
|
|
# 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 = [
|
|
# Must precede the type parsers below: a `feat!`/`fix!`/`refactor!` subject
|
|
# matches those too, and the first match wins. Without this a breaking
|
|
# change renders as an ordinary line of its own type.
|
|
{ message = "^[a-z]+(\\(.+\\))?!:", group = "Breaking Changes" },
|
|
{ body = "BREAKING CHANGE", group = "Breaking Changes" },
|
|
{ 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" },
|
|
{ message = "^ci", group = "CI" },
|
|
# Every branch lands with `--no-ff`, so a release's merge commits outnumber
|
|
# its real ones and say nothing the merged commits do not. They were
|
|
# filling an "Other (unconventional)" section with 14 lines of noise.
|
|
{ message = "^Merge ", skip = true },
|
|
{ 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"
|