#!/usr/bin/env bash # updates changelog version indicated by release-plz set -eEuo pipefail ### START HELPERS function bump_changelog_version() { local package_dir="$1" local version="$2" local cargo_manifest="${package_dir}/Cargo.toml" local current_version="$(sed -nE 's/^version ?= ?"([^"]+)"$/\1/ p' "$cargo_manifest" | head -n 1)" local changelog_file="${package_dir}/CHANGELOG.md" local change_chunk_file="$(mktemp)" local readme_file="${package_dir}/README.md" echo "${package_dir}/CHANGELOG.md | $current_version -> $version" # get changelog chunk and save to temp file cat "$changelog_file" | # skip up to unreleased heading sed '1,/Unreleased/ d' | # take up to previous version heading sed "/$current_version/ q" | # drop last line sed '$d' \ >"$change_chunk_file" # if word count of changelog chunk is 0 then insert filler changelog chunk if [[ "$(wc -w "$change_chunk_file" | awk '{ print $1 }')" == "0" ]]; then echo >"$change_chunk_file" echo "- No significant changes since \`$current_version\`." >>"$change_chunk_file" echo >>"$change_chunk_file" fi ( sed '/Unreleased/ q' "$changelog_file" # up to unreleased heading echo # blank line echo "## $version" # new version heading cat "$change_chunk_file" # previously unreleased changes sed "/$current_version/ q" "$changelog_file" | tail -n 1 # the previous version heading sed "1,/$current_version/ d" "$changelog_file" # everything after previous version heading ) >"$changelog_file.bak" mv "$changelog_file.bak" "$changelog_file" # update readme links if [ -f "$readme_file" ]; then sed -i.bak -E "s#([=/])$current_version([/)])#\1$version\2#g" "$readme_file" rm -f "${readme_file}.bak" fi } ### END HELPERS RELEASE_PLZ_PR_JSON="$1" specs="$(echo "$RELEASE_PLZ_PR_JSON" | jq -r '.releases[] | "\(.package_name):\(.version)"')" for spec in $specs; do name="$(echo "$spec" | cut -d: -f1)" version="$(echo "$spec" | cut -d: -f2)" bump_changelog_version "." "$version" done PR_NUMBER="$(echo "$RELEASE_PLZ_PR_JSON" | jq -r '.number')" # update release PR if one was created if [[ -n "$PR_NUMBER" ]]; then gh pr checkout "$PR_NUMBER" git add --all git commit -m "docs: update changelog versions" git push fi