busd 0.5.0

A D-Bus bus (broker) implementation
Documentation
# release-plz configuration
# https://release-plz.dev/docs/config

[workspace]
# Use the existing tag naming convention without 'v' prefix.
git_tag_name = "{{ version }}"
git_release_name = "{{ version }}"

# Enable all release features.
git_release_enable = true
git_tag_enable = true
publish = true
# We're not a library.
semver_check = false

# PR configuration.
pr_name = "๐Ÿ”– Release {{ version }}"

# Changelog configuration for gimoji-based commits.
# See: https://zeenix.github.io/gimoji/
[changelog]

# Changelog header without the default [Unreleased] section.
header = """# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
"""

# Changelog body template.
# Issue refs are separated by "||" delimiter so we can insert period before them.
body = """

## {{ version | trim_start_matches(pat="v") }} - {{ timestamp | date(format="%Y-%m-%d") }}
{% for group, commits in commits | group_by(attribute="group") %}
### {{ group | upper_first }}
{% for commit in commits %}\
{% set first_line = commit.message | split(pat="\n") | first %}\
{% set parts = first_line | split(pat="||") %}\
- {{ parts | first | upper_first | trim | trim_end_matches(pat=".") }}\
{% if commit.breaking %} (**BREAKING**){% endif %}.\
{% if parts | length > 1 %} {{ parts | last }}{% endif %}
{% endfor %}\
{% endfor %}\
"""

# Protect breaking change commits from being filtered out.
protect_breaking_commits = true

# Commit message preprocessors (applied in order).
commit_preprocessors = [
    # Filter out non-latest dependency updates (keep only most recent bump per dependency).
    # Pattern: "โฌ†๏ธ *Update <dep> to <version>" - if newer commit updates same dep, skip this.
    # Non-latest commits are prefixed with "๐Ÿ”–" to trigger the release-commit skip rule.
    { pattern = "^โฌ†๏ธ +Update [^ ]+ to ", replace_command = """sh -c '
        msg=$(cat)
        dep=$(echo "$msg" | sed -E "s/^[^ ]+ +Update ([^ ]+) to.*/\\1/")
        latest=$(git log --oneline --all -E --grep="Update $dep to" --format=%H 2>/dev/null \
            | head -1)
        if [ "$COMMIT_SHA" != "$latest" ]; then printf "๐Ÿ”–"; else printf "%s" "$msg"; fi
    '""" },
    # Remove optional package prefix (e.g., "busd: ") but keep gimoji emojis.
    # Matches emoji(s) at start, then "word(s): " prefix pattern.
    { pattern = "^([^\\p{L}\\p{N}\\s]+) [\\w, -]+: ", replace = "$1 " },
    # Extract issue refs from commit body using $COMMIT_SHA.
    # Matches: "Fixes #123", "Closes issue #123", "Resolves bug #123", etc.
    # Appends issue ref with "||" delimiter so template can insert period before it.
    { pattern = ".*", replace_command = """sh -c '
        title=$(cat)
        ref=$(git log -1 --format=%b $COMMIT_SHA 2>/dev/null \
            | grep -oE "(Fixes|Closes|Resolves).*#[0-9]+" | grep -oE "#[0-9]+" | head -1)
        if [ -n "$ref" ]; then printf "%s||%s\\n" "$title" "$ref"
        else printf "%s\\n" "$title"; fi
    '""" },
]

# Categorize commits based on gimoji emojis.
# See: https://zeenix.github.io/gimoji/
commit_parsers = [
    # Skip merge commits, release commits, and empty commits (just emojis).
    { message = "^[Mm]erge", skip = true },
    { message = "^๐Ÿ”–", skip = true },
    { message = "^[\\p{Emoji}\\p{Emoji_Presentation}\\p{Extended_Pictographic}]+$", skip = true },

    # Features.
    { message = "^โœจ", group = "Added" },
    { message = "^๐ŸŽ‰", group = "Added" },
    { message = "^๐Ÿ‘ท", group = "Added" },

    # Bug fixes.
    { message = "^๐Ÿ›", group = "Fixed" },
    { message = "^๐Ÿš‘", group = "Fixed" },
    { message = "^๐Ÿฉน", group = "Fixed" },
    { message = "^๐Ÿฅ…", group = "Fixed" },

    # Performance.
    { message = "^โšก", group = "Performance" },

    # Documentation.
    { message = "^๐Ÿ“", group = "Documentation" },
    { message = "^๐Ÿ’ก", group = "Documentation" },

    # Refactoring/changes.
    { message = "^โ™ป๏ธ", group = "Changed" },
    { message = "^๐ŸŽจ", group = "Changed" },
    { message = "^๐Ÿšš", group = "Changed" },
    { message = "^๐Ÿ”ง", group = "Changed" },
    { message = "^๐Ÿ—๏ธ", group = "Changed" },
    { message = "^๐Ÿ’„", group = "Changed" },

    # Breaking changes/removals.
    { message = "^๐Ÿ’ฅ", group = "Breaking" },
    { message = "^๐Ÿ”ฅ", group = "Removed" },
    { message = "^๐Ÿ—‘๏ธ", group = "Deprecated" },

    # Dependencies.
    { message = "^โž•", group = "Dependencies" },
    { message = "^โž–", group = "Dependencies" },
    { message = "^๐Ÿ“Œ", group = "Dependencies" },
    { message = "^โฌ†๏ธ", group = "Dependencies" },
    { message = "^โฌ‡๏ธ", group = "Dependencies" },

    # Security.
    { message = "^๐Ÿ”’", group = "Security" },

    # Testing.
    { message = "^โœ…", group = "Testing" },
    { message = "^๐Ÿงช", group = "Testing" },

    # CI/Build.
    { message = "^๐Ÿ‘ท", group = "CI" },
    { message = "^๐Ÿ’š", group = "CI" },

    # Everything else.
    { message = ".*", group = "Other" },
]