diff --git a/cliff.toml b/cliff.toml new file mode 100644 index 00000000000..e428eda6145 --- /dev/null +++ b/cliff.toml @@ -0,0 +1,122 @@ +# Configuration file for [`git-cliff`](https://github.com/orhun/git-cliff) +# See https://git-cliff.org/docs/configuration + +[remote.github] +owner = "alloy-rs" +repo = "alloy" + +[changelog] +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.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n +""" +# https://keats.github.io/tera/docs/#introduction +body = """\ +{% set gh_link = "https://github.com/" ~ remote.github.owner ~ "/" ~ remote.github.repo %}\ +{% if version %}\ + ## [{{ version | trim_start_matches(pat="v") }}]({{ gh_link }}/releases/tag/v{{ version | trim_start_matches(pat="v") }}) - {{ timestamp | date(format="%Y-%m-%d") }} +{% else %}\ + ## [Unreleased]({{ gh_link }}/compare/{{ previous.version }}...HEAD) +{% endif %}\ +{% for group, commits in commits | group_by(attribute="group") %} + ### {{ group | title }} + {% for commit in commits %} + - {% if commit.scope %}[{{ commit.scope }}] {% endif %}{{ commit.message | upper_first | split(pat="\\n") | first }}\ + {% endfor %} +{% endfor %}\n +""" +trim = true +footer = """ +[`alloy`]: https://crates.io/crates/alloy +[alloy]: https://crates.io/crates/alloy +[`alloy-core`]: https://crates.io/crates/alloy-core +[alloy-core]: https://crates.io/crates/alloy-core +[`alloy-consensus`]: https://crates.io/crates/alloy-consensus +[alloy-consensus]: https://crates.io/crates/alloy-consensus +[`alloy-contract`]: https://crates.io/crates/alloy-contract +[alloy-contract]: https://crates.io/crates/alloy-contract +[`alloy-eips`]: https://crates.io/crates/alloy-eips +[alloy-eips]: https://crates.io/crates/alloy-eips +[`alloy-genesis`]: https://crates.io/crates/alloy-genesis +[alloy-genesis]: https://crates.io/crates/alloy-genesis +[`alloy-json-rpc`]: https://crates.io/crates/alloy-json-rpc +[alloy-json-rpc]: https://crates.io/crates/alloy-json-rpc +[`alloy-network`]: https://crates.io/crates/alloy-network +[alloy-network]: https://crates.io/crates/alloy-network +[`alloy-node-bindings`]: https://crates.io/crates/alloy-node-bindings +[alloy-node-bindings]: https://crates.io/crates/alloy-node-bindings +[`alloy-provider`]: https://crates.io/crates/alloy-provider +[alloy-provider]: https://crates.io/crates/alloy-provider +[`alloy-pubsub`]: https://crates.io/crates/alloy-pubsub +[alloy-pubsub]: https://crates.io/crates/alloy-pubsub +[`alloy-rpc-client`]: https://crates.io/crates/alloy-rpc-client +[alloy-rpc-client]: https://crates.io/crates/alloy-rpc-client +[`alloy-rpc-types`]: https://crates.io/crates/alloy-rpc-types +[alloy-rpc-types]: https://crates.io/crates/alloy-rpc-types +[`alloy-rpc-types-anvil`]: https://crates.io/crates/alloy-rpc-types-anvil +[alloy-rpc-types-anvil]: https://crates.io/crates/alloy-rpc-types-anvil +[`alloy-rpc-types-beacon`]: https://crates.io/crates/alloy-rpc-types-beacon +[alloy-rpc-types-beacon]: https://crates.io/crates/alloy-rpc-types-beacon +[`alloy-rpc-types-engine`]: https://crates.io/crates/alloy-rpc-types-engine +[alloy-rpc-types-engine]: https://crates.io/crates/alloy-rpc-types-engine +[`alloy-rpc-types-eth`]: https://crates.io/crates/alloy-rpc-types-eth +[alloy-rpc-types-eth]: https://crates.io/crates/alloy-rpc-types-eth +[`alloy-rpc-types-trace`]: https://crates.io/crates/alloy-rpc-types-trace +[alloy-rpc-types-trace]: https://crates.io/crates/alloy-rpc-types-trace +[`alloy-serde`]: https://crates.io/crates/alloy-serde +[alloy-serde]: https://crates.io/crates/alloy-serde +[`alloy-signer`]: https://crates.io/crates/alloy-signer +[alloy-signer]: https://crates.io/crates/alloy-signer +[`alloy-signer-aws`]: https://crates.io/crates/alloy-signer-aws +[alloy-signer-aws]: https://crates.io/crates/alloy-signer-aws +[`alloy-signer-gcp`]: https://crates.io/crates/alloy-signer-gcp +[alloy-signer-gcp]: https://crates.io/crates/alloy-signer-gcp +[`alloy-signer-ledger`]: https://crates.io/crates/alloy-signer-ledger +[alloy-signer-ledger]: https://crates.io/crates/alloy-signer-ledger +[`alloy-signer-local`]: https://crates.io/crates/alloy-signer-local +[alloy-signer-local]: https://crates.io/crates/alloy-signer-local +[`alloy-signer-trezor`]: https://crates.io/crates/alloy-signer-trezor +[alloy-signer-trezor]: https://crates.io/crates/alloy-signer-trezor +[`alloy-signer-wallet`]: https://crates.io/crates/alloy-signer-wallet +[alloy-signer-wallet]: https://crates.io/crates/alloy-signer-wallet +[`alloy-transport`]: https://crates.io/crates/alloy-transport +[alloy-transport]: https://crates.io/crates/alloy-transport +[`alloy-transport-http`]: https://crates.io/crates/alloy-transport-http +[alloy-transport-http]: https://crates.io/crates/alloy-transport-http +[`alloy-transport-ipc`]: https://crates.io/crates/alloy-transport-ipc +[alloy-transport-ipc]: https://crates.io/crates/alloy-transport-ipc +[`alloy-transport-ws`]: https://crates.io/crates/alloy-transport-ws +[alloy-transport-ws]: https://crates.io/crates/alloy-transport-ws + + +""" + +[git] +conventional_commits = true +filter_unconventional = false +commit_preprocessors = [ + { pattern = '#(\d+)', replace = "[#$1](https://github.com/alloy-rs/alloy/issues/$1)" }, +] +commit_parsers = [ + { message = "^[Ff]eat", group = "Features" }, + { message = "^[Ff]ix", group = "Bug Fixes" }, + { message = "^[Dd]oc", group = "Documentation" }, + { message = ".*\\b([Dd]eps|[Dd]ependencies|[Bb]ump)\\b", group = "Dependencies" }, + { message = "^[Pp]erf", group = "Performance" }, + { message = "^[Rr]efactor", group = "Refactor" }, + { message = ".*\\b([Ss]tyle|[Ff]mt|[Ff]ormat)\\b", group = "Styling" }, + { message = "^[Tt]est", group = "Testing" }, + { message = "^[Cc]hore", group = "Miscellaneous Tasks" }, + + { message = ".*", group = "Other" }, +] +protect_breaking_commits = false +filter_commits = false +tag_pattern = "v[0-9]*" +skip_tags = "beta|alpha" +ignore_tags = "rc" +sort_commits = "newest" diff --git a/release.toml b/release.toml new file mode 100644 index 00000000000..04d7bdf5974 --- /dev/null +++ b/release.toml @@ -0,0 +1,14 @@ +# Configuration file for [`cargo-release`](https://github.com/crate-ci/cargo-release) +# See: https://github.com/crate-ci/cargo-release/blob/master/docs/reference.md + +allow-branch = ["main"] +sign-commit = true +sign-tag = true +shared-version = true +pre-release-commit-message = "chore: release {{version}}" +tag-prefix = "" # tag only once instead of per every crate +pre-release-hook = [ + "bash", + "-c", + "$WORKSPACE_ROOT/scripts/changelog.sh --tag {{version}}", +] diff --git a/scripts/changelog.sh b/scripts/changelog.sh new file mode 100755 index 00000000000..15d88184cb5 --- /dev/null +++ b/scripts/changelog.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +set -eo pipefail + +run_unless_dry_run() { + if [ "$DRY_RUN" = "true" ]; then + echo "skipping due to dry run: $*" >&2 + else + "$@" + fi +} + +root=$WORKSPACE_ROOT +crate=$CRATE_ROOT +# crate_glob="${crate#"$root/"}/**/*" + +if [[ "$crate" = */tests/* || "$crate" = *test-utils* ]]; then + exit 0 +fi + +command=(git cliff --workdir "$root" --config "$root/cliff.toml" "${@}") +run_unless_dry_run "${command[@]}" --output "$root/CHANGELOG.md" +# TODO: https://github.com/orhun/git-cliff/issues/208 +# if [ -n "$crate" ] && [ "$root" != "$crate" ]; then +# run_unless_dry_run "${command[@]}" --include-path "$crate_glob" --output "$crate/CHANGELOG.md" +# fi