🔧 misc(release): update CHANGELOG format
Note: needs git-cliff > 1.4.0 - Use new `remote` options for git-cliff - List authors and co-authors per commit - Add new contributors list per release - release script: clean up Markdown to remove separate git-cliff templates
This commit is contained in:
parent
c4893d4fdd
commit
5b5d1fa592
1130
CHANGELOG.md
1130
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
34
cliff.toml
34
cliff.toml
@ -5,6 +5,10 @@
|
|||||||
# Configuration options are organized into tables and keys.
|
# Configuration options are organized into tables and keys.
|
||||||
# See documentation for more information on available options.
|
# See documentation for more information on available options.
|
||||||
|
|
||||||
|
[remote.github]
|
||||||
|
owner = "welpo"
|
||||||
|
repo = "tabi"
|
||||||
|
|
||||||
[changelog]
|
[changelog]
|
||||||
# changelog header
|
# changelog header
|
||||||
header = """
|
header = """
|
||||||
@ -17,9 +21,12 @@ We use Semantic Versioning (SemVer) for our version numbers, formatted as MAJOR.
|
|||||||
# template for the changelog body
|
# template for the changelog body
|
||||||
# https://keats.github.io/tera/docs/#introduction
|
# https://keats.github.io/tera/docs/#introduction
|
||||||
body = """
|
body = """
|
||||||
|
{%- macro remote_url() -%}
|
||||||
|
https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}
|
||||||
|
{%- endmacro -%}
|
||||||
{% if version %}\
|
{% if version %}\
|
||||||
{% if previous.version %}\
|
{% if previous.version %}\
|
||||||
## [{{ version | trim_start_matches(pat="v") }}](<REPO>/compare/{{ previous.version }}..{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
|
## [{{ version | trim_start_matches(pat="v") }}]({{ self::remote_url() }}/compare/{{ previous.version }}..{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
|
||||||
{% else %}\
|
{% else %}\
|
||||||
## {{ version | trim_start_matches(pat="v") }} - {{ timestamp | date(format="%Y-%m-%d") }}
|
## {{ version | trim_start_matches(pat="v") }} - {{ timestamp | date(format="%Y-%m-%d") }}
|
||||||
{% endif %}\
|
{% endif %}\
|
||||||
@ -29,7 +36,14 @@ body = """
|
|||||||
|
|
||||||
{% macro commit(commit, in_breaking_section=false) -%}
|
{% macro commit(commit, in_breaking_section=false) -%}
|
||||||
- {% if commit.scope %}*({{ commit.scope }})* {% endif %}{% if commit.breaking and not in_breaking_section %}[**‼️BREAKING‼️**] {% endif %}\
|
- {% if commit.scope %}*({{ commit.scope }})* {% endif %}{% if commit.breaking and not in_breaking_section %}[**‼️BREAKING‼️**] {% endif %}\
|
||||||
{{ commit.message | upper_first }} - ([{{ commit.id | truncate(length=7, end="") }}](<REPO>/commit/{{ commit.id }}))\
|
{{ commit.message | upper_first }}\
|
||||||
|
{% if not commit.github.pr_number %} ([{{ commit.id | truncate(length=7, end="") }}]({{ self::remote_url() }}/commit/{{ commit.id }})){%- endif -%}{% if commit.github.username %} by @{{ commit.github.username }} \
|
||||||
|
{%- set co_authors = commit.footers | filter(attribute="token", value="Co-authored-by") | map(attribute="value") -%}
|
||||||
|
{%- set number_of_co_authors = co_authors | length -%}
|
||||||
|
{%- for co_author in co_authors -%}
|
||||||
|
{%- if not loop.last %}, {% else %} and {% endif %}@{{ co_author | split(pat=" <") | first | trim }}
|
||||||
|
{%- endfor -%}
|
||||||
|
{%- endif -%}
|
||||||
{% endmacro -%}
|
{% endmacro -%}
|
||||||
|
|
||||||
{%- set breaking_header_shown = false -%}
|
{%- set breaking_header_shown = false -%}
|
||||||
@ -59,7 +73,19 @@ body = """
|
|||||||
{{ self::commit(commit=commit) }}
|
{{ self::commit(commit=commit) }}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
{% endfor -%}
|
{% endfor -%}
|
||||||
{% endfor %}\n
|
{% endfor %}
|
||||||
|
|
||||||
|
{%- if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 -%}
|
||||||
|
{% raw %}\n{% endraw %}### 👥 New contributors
|
||||||
|
{% raw -%}\n{% endraw -%}
|
||||||
|
{%- 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 %}
|
||||||
|
{% raw -%}\n{% endraw -%}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# remove the leading and trailing whitespace from the template
|
# remove the leading and trailing whitespace from the template
|
||||||
@ -70,7 +96,7 @@ footer = """
|
|||||||
"""
|
"""
|
||||||
# postprocessors
|
# postprocessors
|
||||||
postprocessors = [
|
postprocessors = [
|
||||||
{ pattern = '<REPO>', replace = "https://github.com/welpo/tabi" }, # replace repository URL
|
{ pattern = " @([a-zA-Z0-9](?:[a-zA-Z0-9]+-?)*[a-zA-Z0-9])", replace = " [@$1](https://github.com/$1)"}, # add link to GitHub usernames
|
||||||
]
|
]
|
||||||
|
|
||||||
[git]
|
[git]
|
||||||
|
76
release
76
release
@ -15,8 +15,7 @@ fi
|
|||||||
if [ "$#" -eq 1 ]; then
|
if [ "$#" -eq 1 ]; then
|
||||||
VERSION_TAG=$1
|
VERSION_TAG=$1
|
||||||
else
|
else
|
||||||
# After git-cliff version 1.4.0 it should be possible to run `git cliff --bumped-version`.
|
suggested_version=$(git cliff --bumped-version)
|
||||||
suggested_version=$(git cliff --unreleased --bump --context | jq -r .[0].version)
|
|
||||||
echo -n "No version tag provided. git-cliff suggests $suggested_version. Proceed? [Y/n] "
|
echo -n "No version tag provided. git-cliff suggests $suggested_version. Proceed? [Y/n] "
|
||||||
read user_input
|
read user_input
|
||||||
|
|
||||||
@ -46,74 +45,21 @@ git cliff --tag "$VERSION_TAG" -o CHANGELOG.md
|
|||||||
git add -A
|
git add -A
|
||||||
git commit -m "🔖 chore(release): prepare for $VERSION_TAG"
|
git commit -m "🔖 chore(release): prepare for $VERSION_TAG"
|
||||||
|
|
||||||
# Template for the tag description.
|
|
||||||
export GIT_CLIFF_TEMPLATE="\
|
|
||||||
{%- set breaking_header_shown = false -%}
|
|
||||||
{% for commit in commits -%}
|
|
||||||
{%- if commit.breaking and not breaking_header_shown %}
|
|
||||||
💥 BREAKING CHANGES 💥
|
|
||||||
{% set_global breaking_header_shown = true -%}
|
|
||||||
{%- endif %}
|
|
||||||
{%- if commit.breaking %}
|
|
||||||
- {{ commit.message | upper_first -}}
|
|
||||||
{% endif -%}
|
|
||||||
{% endfor %}
|
|
||||||
{% for group, group_commits in commits | group_by(attribute=\"group\") %}
|
|
||||||
{{ group | striptags | trim | upper_first }}
|
|
||||||
{% for commit in group_commits %}
|
|
||||||
- {% if commit.breaking %}[‼️BREAKING‼️] {% endif %}{{ commit.message | upper_first }}
|
|
||||||
{%- endfor %}
|
|
||||||
{% endfor %}"
|
|
||||||
|
|
||||||
# Cleaner template for the tag description.
|
|
||||||
export GIT_CLIFF__CHANGELOG__BODY=$(cat <<'EOF'
|
|
||||||
{% if version %}\
|
|
||||||
## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
|
|
||||||
{% else %}\
|
|
||||||
## unreleased
|
|
||||||
{% endif %}\
|
|
||||||
|
|
||||||
{% macro commit(commit, in_breaking_section=false) -%}
|
|
||||||
- {% if commit.scope %}*({{ commit.scope }})* {% endif %}{% if commit.breaking and not in_breaking_section %}[**‼️BREAKING‼️**] {% endif %}\
|
|
||||||
{{ commit.message | upper_first }} - ({{ commit.id | truncate(length=7, end="") }})\
|
|
||||||
{% endmacro -%}
|
|
||||||
|
|
||||||
{%- set breaking_header_shown = false -%}
|
|
||||||
{% for commit in commits -%}
|
|
||||||
{% if commit.breaking and not breaking_header_shown -%}
|
|
||||||
{% raw %}\n### 💥 BREAKING CHANGES 💥\n{% endraw %}
|
|
||||||
{% set_global breaking_header_shown = true %}
|
|
||||||
{%- endif -%}
|
|
||||||
{%- if commit.breaking -%}
|
|
||||||
{{ self::commit(commit=commit, in_breaking_section=true) -}}
|
|
||||||
{% endif -%}
|
|
||||||
{%- endfor -%}
|
|
||||||
{%- if breaking_header_shown == true -%}
|
|
||||||
{% raw %}\n{% endraw %}\
|
|
||||||
{%- 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::commit(commit=commit) }}
|
|
||||||
{%- endfor -%}
|
|
||||||
{% raw %}\n{% endraw %}\
|
|
||||||
{%- for commit in commits %}
|
|
||||||
{%- if not commit.scope -%}
|
|
||||||
{{ self::commit(commit=commit) }}
|
|
||||||
{% endif -%}
|
|
||||||
{% endfor -%}
|
|
||||||
{% endfor %}\n
|
|
||||||
EOF
|
|
||||||
)
|
|
||||||
|
|
||||||
# Generate the tag description.
|
# Generate the tag description.
|
||||||
changelog=$(git cliff --tag "$VERSION_TAG" --unreleased --strip all)
|
changelog=$(git cliff --tag "$VERSION_TAG" --unreleased --strip all)
|
||||||
|
|
||||||
# Undo the pre_processing that adds PR links.
|
# Clean up tag's changelog; tag descriptions don't support markdown.
|
||||||
|
# Remove PR links.
|
||||||
changelog=$(echo "$changelog" | sed -E 's/\[\#([0-9]+)\]\(https:\/\/github\.com\/welpo\/[^\/]+\/issues\/([0-9]+)\)/#\1/g')
|
changelog=$(echo "$changelog" | sed -E 's/\[\#([0-9]+)\]\(https:\/\/github\.com\/welpo\/[^\/]+\/issues\/([0-9]+)\)/#\1/g')
|
||||||
|
# Remove commit links.
|
||||||
|
changelog=$(echo "$changelog" | sed -E 's/\[([0-9a-f]+)\]\(https:\/\/github\.com\/welpo\/[^\/]+\/commit\/([0-9a-f]+)\)/\1/g')
|
||||||
|
# Remove scopes.
|
||||||
|
changelog=$(echo "$changelog" | sed -E 's/\*\(([^)]+)\)\* //g')
|
||||||
|
# Remove @author links, leaving just the username.
|
||||||
|
changelog=$(echo "$changelog" | sed -E 's/\[\@([a-zA-Z0-9_]+)\]\(https:\/\/github\.com\/[a-zA-Z0-9_]+\)/@\1/g')
|
||||||
|
# Remove markdown headers.
|
||||||
|
changelog=$(echo "$changelog" | sed -E 's/^#+ //g')
|
||||||
|
|
||||||
# Create a signed and annotated tag.
|
# Create a signed and annotated tag.
|
||||||
git tag -s -a "$VERSION_TAG" -m "Release $VERSION_TAG" -m "$changelog"
|
git tag -s -a "$VERSION_TAG" -m "Release $VERSION_TAG" -m "$changelog"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user