diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 4748552be..f02b18c4d 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -86,7 +86,7 @@ jobs: fi # Generate the changelog using the explicit range - git-cliff $RANGE --tag "${{ inputs.tag }}" --strip all --output CHANGELOG.md + git-cliff $RANGE --strip all --output CHANGELOG.md # Get unique contributors from the same commit range CONTRIBUTORS=$(git log --format='%aN' $CONTRIB_RANGE 2>/dev/null | sort -u | sed 's/^/- /' || echo "") @@ -168,7 +168,7 @@ jobs: body: | We are pleased to offer EdgeTX "${{ steps.version.outputs.codename }}" ${{ steps.version.outputs.version }}. - ${{ (contains(needs.check-tag.outputs.tag_name, '-rc') || contains(needs.check-tag.outputs.tag_name, '-beta') || contains(needs.check-tag.outputs.tag_name, '-alpha')) && '> [!WARNING] + ${{ (contains(inputs.tag, '-rc') || contains(inputs.tag, '-beta') || contains(inputs.tag, '-alpha')) && '> [!WARNING] > As this is a pre-release, it is virtually guaranteed there will still be some minor issues that need resolving before final release - some may be documented already under "known issues" section of these release notes or the associated tracking issue. During pre-releases, the matching SD card pack and voice pack versions to use are those marked/tagged ''Latest''. > > We **need** _your_ help in testing this release to ensure there are no major bugs or faults that will cause problems during flight. Please ensure you back up your model and radio settings before updating, fully bench-test your models after updating, and report any issues you encounter. It is only with your feedback and testing by you, our community (and the assistance provided by partner manufacturers) which will allow us to identify and squash both new and old bugs, and progress onto a stable release version!! We simply cannot do this without you! :hugs: :beers:' || '' }} @@ -189,6 +189,10 @@ jobs: > > See the [EdgeTX Manual](https://manual.edgetx.org/installing-and-updating-edgetx) for more information. + ## Changes + + ${{ steps.changelog.outputs.changelog }} + ## Supported radios The full list of supported radios and their support status can be viewed [here on the EdgeTX website](https://edgetx.org/supportedradios). @@ -202,11 +206,9 @@ jobs: [CloudBuild option in EdgeTX Buddy](https://buddy.edgetx.org/) will allow you build your own (supported) language firmware, with just a few clicks. Additionally, EdgeTX Companion also has some support for CloudBuild, and will automatically fetch firmware for a supported language when you use the "Update components" option. But you can also build your own firmware online [following this guide](https://github.com/EdgeTX/edgetx/wiki/Building-radio-firmware-in-a-web-browser-with-GitHub-CodeSpaces), request a specific build at TODO or ask on Discord for someone to build one for you. ## Known Limitations and Issues + ${{ (contains(inputs.tag, '-rc') || contains(inputs.tag, '-beta') || contains(inputs.tag, '-alpha')) && '> [!WARNING] + - Please check TODO during the release candidate phase for any other release candidate-specific issues and status of fixes.' || '' }} ## UI/UX behavioral changes and/or new capabilities: - - ## Changes - - ${{ steps.build_changelog.outputs.changelog }} files: release-assets/*.zip fail_on_unmatched_files: true diff --git a/cliff.toml b/cliff.toml index d176df485..d2de98975 100644 --- a/cliff.toml +++ b/cliff.toml @@ -4,11 +4,196 @@ [changelog] header = "" body = """ -{% for group, commits in commits | group_by(attribute="group") %} +{% for group, commits in commits | group_by(attribute="group") -%} +{% if group == "🚀 Features" -%} ### {{ group }} -{% for commit in commits -%} +{% set commits_by_scope = commits | group_by(attribute="scope") -%} +{% if commits_by_scope.firmware is defined or commits_by_scope.fw is defined -%} +#### 🎮 Firmware +{% if commits_by_scope.firmware is defined -%}{% for commit in commits_by_scope.firmware -%} - {{ commit.message | split(pat="\\n") | first | trim }} -{% endfor %} +{% endfor -%}{% endif -%} +{% if commits_by_scope.fw is defined -%}{% for commit in commits_by_scope.fw -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% endif -%} +{% if commits_by_scope.bw is defined -%} +#### 🖥️ Black & White Radio +{% for commit in commits_by_scope.bw -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%} +{% endif -%} +{% if commits_by_scope.color is defined or commits_by_scope.colour is defined -%} +#### 🎨 Color LCD Radio +{% if commits_by_scope.color is defined -%}{% for commit in commits_by_scope.color -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% if commits_by_scope.colour is defined -%}{% for commit in commits_by_scope.colour -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% endif -%} +{% if commits_by_scope.cpn is defined or commits_by_scope.companion is defined -%} +#### 💻 Companion +{% if commits_by_scope.cpn is defined -%}{% for commit in commits_by_scope.cpn -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% if commits_by_scope.companion is defined -%}{% for commit in commits_by_scope.companion -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% endif -%} +{% set_global has_other = false -%} +{% for commit in commits -%}{% if commit.scope != "firmware" and commit.scope != "fw" and commit.scope != "bw" and commit.scope != "color" and commit.scope != "colour" and commit.scope != "cpn" and commit.scope != "companion" -%}{% set_global has_other = true -%}{% endif -%}{% endfor -%} +{% if has_other -%} +#### 📦 Other +{% for commit in commits -%}{% if commit.scope != "firmware" and commit.scope != "fw" and commit.scope != "bw" and commit.scope != "color" and commit.scope != "colour" and commit.scope != "cpn" and commit.scope != "companion" -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endif -%}{% endfor -%} +{% endif -%} +{% endif -%} +{% endfor -%} + +{% for group, commits in commits | group_by(attribute="group") -%} +{% if group == "🐛 Bug Fixes" -%} +### {{ group }} +{% set commits_by_scope = commits | group_by(attribute="scope") -%} +{% if commits_by_scope.firmware is defined or commits_by_scope.fw is defined -%} +#### 🎮 Firmware +{% if commits_by_scope.firmware is defined -%}{% for commit in commits_by_scope.firmware -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% if commits_by_scope.fw is defined -%}{% for commit in commits_by_scope.fw -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% endif -%} +{% if commits_by_scope.bw is defined -%} +#### 🖥️ Black & White Radio +{% for commit in commits_by_scope.bw -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%} +{% endif -%} +{% if commits_by_scope.color is defined or commits_by_scope.colour is defined -%} +#### 🎨 Color LCD Radio +{% if commits_by_scope.color is defined -%}{% for commit in commits_by_scope.color -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% if commits_by_scope.colour is defined -%}{% for commit in commits_by_scope.colour -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% endif -%} +{% if commits_by_scope.cpn is defined or commits_by_scope.companion is defined -%} +#### 💻 Companion +{% if commits_by_scope.cpn is defined -%}{% for commit in commits_by_scope.cpn -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% if commits_by_scope.companion is defined -%}{% for commit in commits_by_scope.companion -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% endif -%} +{% set_global has_other = false -%} +{% for commit in commits -%}{% if commit.scope != "firmware" and commit.scope != "fw" and commit.scope != "bw" and commit.scope != "color" and commit.scope != "colour" and commit.scope != "cpn" and commit.scope != "companion" -%}{% set_global has_other = true -%}{% endif -%}{% endfor -%} +{% if has_other -%} +#### 📦 Other +{% for commit in commits -%}{% if commit.scope != "firmware" and commit.scope != "fw" and commit.scope != "bw" and commit.scope != "color" and commit.scope != "colour" and commit.scope != "cpn" and commit.scope != "companion" -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endif -%}{% endfor -%} +{% endif -%} +{% endif -%} +{% endfor -%} + +{% for group, commits in commits | group_by(attribute="group") -%} +{% if group != "🚀 Features" and group != "🐛 Bug Fixes" and group != "📦 Other" -%} +### {{ group }} +{% set commits_by_scope = commits | group_by(attribute="scope") -%} +{% if commits_by_scope.firmware is defined or commits_by_scope.fw is defined -%} +#### 🎮 Firmware +{% if commits_by_scope.firmware is defined -%}{% for commit in commits_by_scope.firmware -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% if commits_by_scope.fw is defined -%}{% for commit in commits_by_scope.fw -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% endif -%} +{% if commits_by_scope.bw is defined -%} +#### 🖥️ Black & White Radio +{% for commit in commits_by_scope.bw -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%} +{% endif -%} +{% if commits_by_scope.color is defined or commits_by_scope.colour is defined -%} +#### 🎨 Color LCD Radio +{% if commits_by_scope.color is defined -%}{% for commit in commits_by_scope.color -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% if commits_by_scope.colour is defined -%}{% for commit in commits_by_scope.colour -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% endif -%} +{% if commits_by_scope.cpn is defined or commits_by_scope.companion is defined -%} +#### 💻 Companion +{% if commits_by_scope.cpn is defined -%}{% for commit in commits_by_scope.cpn -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% if commits_by_scope.companion is defined -%}{% for commit in commits_by_scope.companion -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% endif -%} +{% set_global has_other = false -%} +{% for commit in commits -%}{% if commit.scope != "firmware" and commit.scope != "fw" and commit.scope != "bw" and commit.scope != "color" and commit.scope != "colour" and commit.scope != "cpn" and commit.scope != "companion" -%}{% set_global has_other = true -%}{% endif -%}{% endfor -%} +{% if has_other -%} +#### 📦 Other +{% for commit in commits -%}{% if commit.scope != "firmware" and commit.scope != "fw" and commit.scope != "bw" and commit.scope != "color" and commit.scope != "colour" and commit.scope != "cpn" and commit.scope != "companion" -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endif -%}{% endfor -%} +{% endif -%} +{% endif -%} +{% endfor -%} + +{% for group, commits in commits | group_by(attribute="group") -%} +{% if group == "📦 Other" -%} +### {{ group }} +{% set commits_by_scope = commits | group_by(attribute="scope") -%} +{% if commits_by_scope.firmware is defined or commits_by_scope.fw is defined -%} +#### 🎮 Firmware +{% if commits_by_scope.firmware is defined -%}{% for commit in commits_by_scope.firmware -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% if commits_by_scope.fw is defined -%}{% for commit in commits_by_scope.fw -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% endif -%} +{% if commits_by_scope.bw is defined -%} +#### 🖥️ Black & White Radio +{% for commit in commits_by_scope.bw -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%} +{% endif -%} +{% if commits_by_scope.color is defined or commits_by_scope.colour is defined -%} +#### 🎨 Color LCD Radio +{% if commits_by_scope.color is defined -%}{% for commit in commits_by_scope.color -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% if commits_by_scope.colour is defined -%}{% for commit in commits_by_scope.colour -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% endif -%} +{% if commits_by_scope.cpn is defined or commits_by_scope.companion is defined -%} +#### 💻 Companion +{% if commits_by_scope.cpn is defined -%}{% for commit in commits_by_scope.cpn -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% if commits_by_scope.companion is defined -%}{% for commit in commits_by_scope.companion -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endfor -%}{% endif -%} +{% endif -%} +{% set_global has_other = false -%} +{% for commit in commits -%}{% if commit.scope != "firmware" and commit.scope != "fw" and commit.scope != "bw" and commit.scope != "color" and commit.scope != "colour" and commit.scope != "cpn" and commit.scope != "companion" -%}{% set_global has_other = true -%}{% endif -%}{% endfor -%} +{% if has_other -%} +#### 📦 Other +{% for commit in commits -%}{% if commit.scope != "firmware" and commit.scope != "fw" and commit.scope != "bw" and commit.scope != "color" and commit.scope != "colour" and commit.scope != "cpn" and commit.scope != "companion" -%} +- {{ commit.message | split(pat="\\n") | first | trim }} +{% endif -%}{% endfor -%} +{% endif -%} +{% endif -%} {% endfor -%} """ trim = true @@ -31,19 +216,9 @@ sort_commits = "oldest" # Commit parsers - order matters! More specific patterns first commit_parsers = [ - # Scope-based categorization (highest priority) - { message = "^feat\\(bw\\)", group = "🖥️ Black & White Radio Changes" }, - { message = "^fix\\(bw\\)", group = "🖥️ Black & White Radio Changes" }, - { message = "^feat\\(color\\)", group = "🎨 Color Radio Changes" }, - { message = "^fix\\(color\\)", group = "🎨 Color Radio Changes" }, - { message = "^feat\\((firmware|fw)\\)", group = "🎮 Firmware (All Radios Generally)" }, - { message = "^fix\\((firmware|fw)\\)", group = "🎮 Firmware (All Radios Generally)" }, - { message = "^feat\\(cpn\\)", group = "💻 Companion Software Changes" }, - { message = "^fix\\(cpn\\)", group = "💻 Companion Software Changes" }, - - # Type-based categorization (fallback) + # Type-based categorization (top-level headings) { message = "^feat", group = "🚀 Features" }, - { message = "^fix", group = "🐛 Fixes" }, + { message = "^fix", group = "🐛 Bug Fixes" }, { message = "^docs?", group = "📝 Documentation" }, { message = "^perf", group = "⚡ Performance" }, { message = "^refactor", group = "🔨 Refactoring" },