The motivation behind this is that GitHub mentions in PR descriptions trigger notifications for every contributor for every release because their username is part of the changelog.
173 lines
7.2 KiB
TOML
173 lines
7.2 KiB
TOML
# git-cliff ~ configuration file
|
|
# https://git-cliff.org/docs/configuration
|
|
|
|
[remote.github]
|
|
owner = "ratatui"
|
|
repo = "ratatui"
|
|
|
|
[changelog]
|
|
# changelog header
|
|
header = """
|
|
# Changelog
|
|
|
|
All notable changes to this project will be documented in this file.
|
|
<!-- ignore lint rules that are often triggered by content generated from commits / git-cliff -->
|
|
<!-- markdownlint-disable line-length no-bare-urls ul-style emphasis-style -->
|
|
"""
|
|
# template for the changelog body
|
|
# https://keats.github.io/tera/docs/#introduction
|
|
# note that the - before / after the % controls whether whitespace is rendered between each line.
|
|
# Getting this right so that the markdown renders with the correct number of lines between headings
|
|
# code fences and list items is pretty finicky. Note also that the 4 backticks in the commit macro
|
|
# is intentional as this escapes any backticks in the commit body.
|
|
body = """
|
|
{%- if not version %}
|
|
## [unreleased]
|
|
{% else -%}
|
|
{%- if package -%} {# release-plz specific variable #}
|
|
## {{ package }} - [{{ version }}]({{ release_link }}) - {{ timestamp | date(format="%Y-%m-%d") }}
|
|
{%- else -%}
|
|
## [{{ version }}]({{ self::remote_url() }}/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
|
|
{%- endif %}
|
|
{% endif -%}
|
|
|
|
{% macro commit(commit) -%}
|
|
- [{{ commit.id | truncate(length=7, end="") }}]({{ "https://github.com/ratatui/ratatui/commit/" ~ commit.id }}) \
|
|
*({{commit.scope | default(value = "uncategorized") | lower }})* {{ commit.message | 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 %}\
|
|
{%- if commit.breaking %} [**breaking**]{% endif %}
|
|
{%- if commit.body %}\n\n{{ commit.body | indent(prefix=" > ", first=true, blank=true) }}
|
|
{%- endif %}
|
|
{%- for footer in commit.footers %}\n
|
|
{%- if footer.token != "Signed-off-by" and footer.token != "Co-authored-by" %}
|
|
>
|
|
{{ footer.token | indent(prefix=" > ", first=true, blank=true) }}
|
|
{{- footer.separator }}
|
|
{{- footer.value| indent(prefix=" > ", first=false, blank=true) }}
|
|
{%- endif %}
|
|
{%- endfor %}
|
|
{% endmacro -%}
|
|
|
|
{% 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::commit(commit=commit) }}
|
|
{%- endfor -%}
|
|
{% for commit in commits %}
|
|
{%- if not commit.scope %}
|
|
{{ self::commit(commit=commit) }}
|
|
{%- endif -%}
|
|
{%- endfor -%}
|
|
{%- endfor %}
|
|
|
|
{%- if not release_link -%}
|
|
{% 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 -%}
|
|
|
|
{% if version %}
|
|
{% if previous.version %}
|
|
{%- if release_link -%}
|
|
**Full Changelog**: {{ release_link }} {# release-plz specific variable #}
|
|
{%- else -%}
|
|
**Full Changelog**: {{ self::remote_url() }}/compare/{{ previous.version }}...{{ version }}
|
|
{% endif %}
|
|
{% endif %}
|
|
{% else -%}
|
|
{% raw %}\n{% endraw %}
|
|
{% endif %}
|
|
|
|
{%- macro remote_url() -%}
|
|
{%- if remote.owner -%} {# release-plz specific variable #}
|
|
https://github.com/{{ remote.owner }}/{{ remote.repo }}\
|
|
{%- else -%}
|
|
https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}\
|
|
{%- endif -%}
|
|
{% endmacro %}
|
|
"""
|
|
# remove the leading and trailing whitespace from the template
|
|
trim = false
|
|
# postprocessors for the changelog body
|
|
postprocessors = [
|
|
{ pattern = '<!-- Please read CONTRIBUTING.md before submitting any pull request. -->', replace = "" },
|
|
{ pattern = '>---+\n', replace = '' },
|
|
{ pattern = ' +\n', replace = "\n" },
|
|
]
|
|
|
|
[git]
|
|
# parse the commits based on https://www.conventionalcommits.org
|
|
conventional_commits = true
|
|
# filter out the commits that are not conventional
|
|
filter_unconventional = true
|
|
# process each line of a commit as an individual commit
|
|
split_commits = false
|
|
# regex for preprocessing the commit messages
|
|
commit_preprocessors = [
|
|
{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" },
|
|
{ pattern = '(better safe shared layout cache)', replace = "perf(layout): ${1}" },
|
|
{ pattern = '(Clarify README.md)', replace = "docs(readme): ${1}" },
|
|
{ pattern = '(Update README.md)', replace = "docs(readme): ${1}" },
|
|
{ pattern = '(fix typos|Fix typos)', replace = "fix: ${1}" },
|
|
# Typos that squeaked through and which would otherwise trigger the typos linter.
|
|
# Regex obsfucation is to avoid triggering the linter in this file until there's a per file config
|
|
# See https://github.com/crate-ci/typos/issues/724
|
|
{ pattern = '\<[d]eatil\>', replace = "detail" },
|
|
{ pattern = '\<[f]eatuers\>', replace = "features" },
|
|
{ pattern = '\<[s]pecically\>', replace = "specially" },
|
|
{ pattern = '\<[g]ague\>', replace = "gauge" },
|
|
{ pattern = '\<[a]rithmentic\>', replace = "arithmetic" },
|
|
{ pattern = '\<[i]ntructions\>', replace = "instructions" },
|
|
{ pattern = '\<[i]mplementated\>', replace = "implemented" },
|
|
]
|
|
# regex for parsing and grouping commits
|
|
commit_parsers = [
|
|
# release-plz adds 000000 as a placeholder for release commits
|
|
{ field = "id", pattern = "0000000", skip = true },
|
|
{ message = "^feat", group = "<!-- 00 -->Features" },
|
|
{ message = "^[fF]ix", group = "<!-- 01 -->Bug Fixes" },
|
|
{ message = "^refactor", group = "<!-- 02 -->Refactor" },
|
|
{ message = "^doc", group = "<!-- 03 -->Documentation" },
|
|
{ message = "^perf", group = "<!-- 04 -->Performance" },
|
|
{ message = "^style", group = "<!-- 05 -->Styling" },
|
|
{ message = "^test", group = "<!-- 06 -->Testing" },
|
|
{ message = "^chore\\(release\\): prepare for", skip = true },
|
|
{ message = "^chore: release", skip = true },
|
|
{ message = "^chore\\(pr\\)", skip = true },
|
|
{ message = "^chore\\(pull\\)", skip = true },
|
|
{ message = "^chore\\(deps\\)", skip = true },
|
|
{ message = "^chore\\(changelog\\)", skip = true },
|
|
{ message = "^[cC]hore", group = "<!-- 07 -->Miscellaneous Tasks" },
|
|
{ message = "^build\\(deps\\)", skip = true },
|
|
{ message = "^build\\(release\\)", skip = true },
|
|
{ message = "^build", group = "<!-- 08 -->Build" },
|
|
{ body = ".*security", group = "<!-- 09 -->Security" },
|
|
{ message = "^ci", group = "<!-- 10 -->Continuous Integration" },
|
|
{ message = "^revert", group = "<!-- 11 -->Reverted Commits" },
|
|
# handle some old commits styles from pre 0.4
|
|
{ message = "^(Buffer|buffer|Frame|frame|Gauge|gauge|Paragraph|paragraph):", group = "<!-- 07 -->Miscellaneous Tasks" },
|
|
{ message = "^\\[", group = "<!-- 07 -->Miscellaneous Tasks" },
|
|
]
|
|
|
|
# protect breaking changes from being skipped due to matching a skipping commit_parser
|
|
protect_breaking_commits = false
|
|
# filter out the commits that are not matched by commit parsers
|
|
filter_commits = false
|
|
# glob pattern for matching git tags
|
|
tag_pattern = "v[0-9]*"
|
|
# regex for skipping tags
|
|
skip_tags = "beta|alpha|v0.1.0-rc.1"
|
|
# regex for ignoring tags
|
|
ignore_tags = "rc"
|
|
# sort the tags topologically
|
|
topo_order = false
|
|
# sort the commits inside sections by oldest/newest order
|
|
sort_commits = "newest"
|