blockwatch 0.5.4

Language agnostic linter that keeps your code and documentation in sync and valid
Documentation
# Configuration for `cargo release`
# (https://github.com/crate-ci/cargo-release/blob/master/docs/reference.md)

allow-branch = ["main"]

# `cargo release` only *warns* when the local branch is behind its upstream and
# then proceeds: it publishes to crates.io (irreversible) and only afterwards
# fails to push the release commit and tag (this happened with v0.3.4). A
# pre-release hook aborts the release before publishing, so fail hard here if
# the branch is stale.
pre-release-hook = [
    "sh",
    "-c",
    "git fetch origin && test \"$(git rev-list --count 'HEAD..@{upstream}')\" -eq 0 || { echo 'error: branch is behind its upstream; run git pull first' >&2; exit 1; }",
]

# cargo `dist` builds the GitHub release body from the CHANGELOG.md section whose
# heading names the version being released. There is no fallback to an
# "Unreleased" heading: a release whose version is missing from the changelog is
# published with no release notes at all. Rewriting the heading here puts it in
# the release commit that gets tagged, which is the commit `dist` reads in CI.
# The first replacement closes the section written during the cycle, the second
# reopens an empty one for the next; `exactly = 1` aborts the release before
# publishing to crates.io if the changelog ever stops matching these patterns.
[[pre-release-replacements]]
file = "CHANGELOG.md"
search = "## \\[Unreleased\\] - ReleaseDate"
replace = "## [{{version}}] - {{date}}"
exactly = 1

[[pre-release-replacements]]
file = "CHANGELOG.md"
search = "<!-- next-header -->"
replace = "<!-- next-header -->\n\n## [Unreleased] - ReleaseDate"
exactly = 1

# The version is spelled out in the docs as well: the `rev:` of the pre-commit
# snippets, and the `blockwatch` version and `helpUri` of the SARIF sample
# output. The `crate-version` block in Cargo.toml lists them all and fails
# a run once any of them goes stale, so they are rewritten here to keep that
# check green. `exactly` aborts the release before publishing to crates.io if a
# snippet is ever reworded past these patterns.
[[pre-release-replacements]]
file = "README.md"
search = "rev: v[0-9]+\\.[0-9]+\\.[0-9]+"
replace = "rev: v{{version}}"
exactly = 1

[[pre-release-replacements]]
file = "docs/ci.md"
search = "rev: v[0-9]+\\.[0-9]+\\.[0-9]+"
replace = "rev: v{{version}}"
exactly = 2

# Both keys carry the same number and sit on consecutive lines. They are matched
# together because the driver's `"version"` is otherwise indistinguishable from
# the SARIF format's own `"version": "2.1.0"` earlier in the same sample.
[[pre-release-replacements]]
file = "docs/cli.md"
search = "\"version\": \"[0-9]+\\.[0-9]+\\.[0-9]+\",\\s+\"semanticVersion\": \"[0-9]+\\.[0-9]+\\.[0-9]+\""
replace = "\"version\": \"{{version}}\",\n          \"semanticVersion\": \"{{version}}\""
exactly = 1

[[pre-release-replacements]]
file = "docs/cli.md"
search = "blockwatch/blob/v[0-9]+\\.[0-9]+\\.[0-9]+/"
replace = "blockwatch/blob/v{{version}}/"
exactly = 1