From 8d5d6bccd05a5423a0402910a97f1b0af75f8e64 Mon Sep 17 00:00:00 2001 From: welpo Date: Fri, 19 Jan 2024 01:19:26 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=91=B7=20chore(release):=20refactor=20cli?= =?UTF-8?q?ff-tag=20into=20release=20script?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cliff-tag.toml | 105 ------------------------------------------------- release | 78 +++++++++++++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 106 deletions(-) delete mode 100644 cliff-tag.toml diff --git a/cliff-tag.toml b/cliff-tag.toml deleted file mode 100644 index 66feb3d..0000000 --- a/cliff-tag.toml +++ /dev/null @@ -1,105 +0,0 @@ -# git-cliff ~ default configuration file -# https://git-cliff.org/docs/configuration -# -# Lines starting with "#" are comments. -# Configuration options are organized into tables and keys. -# See documentation for more information on available options. - -[changelog] -# template for the changelog body -# 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 %}\ - -{% 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 -""" - -# remove the leading and trailing whitespace from the template -trim = true -# changelog footer -footer = """ - -""" - -[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 = [ - # Remove trailing whitespace. - { pattern = ' +$', replace = "" }, - # Replace multiple spaces with a single space. - { pattern = ' +', replace = " " }, - # Remove gitmoji, both actual UTF emoji and :emoji: - { pattern = ' *(:\w+:|[\p{Emoji_Presentation}\p{Extended_Pictographic}\u{200D}]) *', replace = "" }, -] -# regex for parsing and grouping commits -commit_parsers = [ - { message = "^feat", group = "✨ Features" }, - { message = "^fix", group = "🐛 Bug Fixes" }, - { message = "^style", group = "💄 Styling" }, - { message = "^perf", group = "⚡️ Performance" }, - { message = "^doc", group = "📝 Documentation" }, - { message = "^refactor", group = "♻️ Refactor" }, - { message = "^revert", group = "⏪️ Revert" }, - { message = "^deprecate", group = "🗑️ Deprecations" }, - { message = "^test", group = "✅ Testing" }, - { message = "^chore", skip = true }, -] -# protect breaking changes from being skipped due to matching a skipping commit_parser -protect_breaking_commits = true -# filter out the commits that are not matched by commit parsers -filter_commits = true -# regex for matching git tags -tag_pattern = "v[0-9].*" - -# regex for skipping tags -skip_tags = "v0.1.0-beta.1" -# regex for ignoring tags -ignore_tags = "" -# sort the tags topologically -topo_order = false -# sort the commits inside sections by oldest/newest order -sort_commits = "newest" -# limit the number of commits included in the changelog. -# limit_commits = 42 diff --git a/release b/release index a1dcf85..cd5ea1d 100644 --- a/release +++ b/release @@ -47,8 +47,84 @@ export GIT_CLIFF_TEMPLATE="\ {%- endfor %} {% endfor %}" +# Create a temporary file for the git-cliff configuration. +# It's the same as the one in cliff.toml, except less Markdown. +temp_cliff_config=$(mktemp) +# Set a trap to remove the temporary file on exit. +trap "rm -f '$temp_cliff_config'" EXIT + +cat > "$temp_cliff_config" << 'EOF' +[changelog] +body = """ +{% 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 +""" + +trim = true +footer = """ + +""" + +[git] +conventional_commits = true +filter_unconventional = true +split_commits = false +commit_preprocessors = [ + { pattern = ' +$', replace = "" }, + { pattern = ' +', replace = " " }, + { pattern = ' *(:\w+:|[\p{Emoji_Presentation}\p{Extended_Pictographic}\u{200D}]) *', replace = "" }, +] +commit_parsers = [ + { message = "^feat", group = "✨ Features" }, + { message = "^fix", group = "🐛 Bug Fixes" }, + [truncated for brevity]... +] +protect_breaking_commits = true +filter_commits = true +tag_pattern = "v[0-9].*" +topo_order = false +sort_commits = "newest" +EOF + # Generate the tag description. -changelog=$(git cliff --config cliff-tag.toml --tag "$VERSION_TAG" --unreleased --strip all) +changelog=$(git cliff --config "$temp_cliff_config" --tag "$VERSION_TAG" --unreleased --strip all) # Create a signed and annotated tag. git tag -s -a "$VERSION_TAG" -m "Release $VERSION_TAG" -m "$changelog"