diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f3bc6d25..6c562350 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,10 +25,6 @@ jobs: env: repo_url: ${{ github.server_url }}/${{ github.repository }} - changelog: CHANGELOG.md - release_changelog: RELEASE_CHANGELOG.md - start_regex: "^## \\[Unreleased\\]" - end_regex: "^## " steps: - name: Checkout repo @@ -100,4 +96,4 @@ jobs: env: LOGIN_NAME: Polyhedral-Bot LOGIN_EMAIL: polybot@protonmail.com - ACCESS_TOKEN: ${{ secrets.POLYBOT }} + ACCESS_TOKEN: ${{ secrets.POLYBOT }} \ No newline at end of file diff --git a/.scripts/check-version-bump.sh b/.scripts/check-version-bump.sh index 657aee7d..89204033 100755 --- a/.scripts/check-version-bump.sh +++ b/.scripts/check-version-bump.sh @@ -1,7 +1,8 @@ #!/bin/bash +source .scripts/vars.sh + # Search HEAD diff for a change in the pack version -PACK_MANIFEST=pack.yml version_diff=$(git diff HEAD^ HEAD "$PACK_MANIFEST" | grep '^+version: ') previous_version_diff=$(git diff HEAD^ HEAD "$PACK_MANIFEST" | grep '^-version: ') @@ -18,4 +19,4 @@ else echo "version-bumped=true" >> "$GITHUB_ENV" echo "previous_version=$previous_version" >> "$GITHUB_ENV" echo "version=$version" >> "$GITHUB_ENV" -fi +fi \ No newline at end of file diff --git a/.scripts/grab-release-changelog.sh b/.scripts/grab-release-changelog.sh index e4307bbb..403cfe04 100755 --- a/.scripts/grab-release-changelog.sh +++ b/.scripts/grab-release-changelog.sh @@ -2,15 +2,19 @@ # Grabs the unreleased section from the changelog, and cleans it up for publication +source .scripts/lib.sh +source .scripts/vars.sh +ensure_file "$CHANGELOG" + # Copy unreleased changelog to temporary file echo '- Extracting unreleased changelog' -sed "0,/$start_regex/ d; /$end_regex/,$ d" $changelog > $release_changelog +sed "0,/$UNRELEASED_SECTION_START_REGEX/ d; /$UNRELEASED_SECTION_END_REGEX/,$ d" $CHANGELOG > $RELEASE_CHANGELOG # Remove unused subheadings from new changelog echo '- Stripping empty titles from changelog' echo "$(awk '/^$/ {if (i) {b=b $0 "\n"} else {print $0 }; next} \ - /^###/ {i=1; b=$0; next} {if (i) {print b}; i=0; print $0; next}' $release_changelog)" > $release_changelog + /^###/ {i=1; b=$0; next} {if (i) {print b}; i=0; print $0; next}' $RELEASE_CHANGELOG)" > $RELEASE_CHANGELOG -if ! grep -q '[^[:space:]]' "$release_changelog"; then +if ! grep -q '[^[:space:]]' "$RELEASE_CHANGELOG"; then echo '- WARNING: Unreleased changelog is empty!' fi diff --git a/.scripts/lib.sh b/.scripts/lib.sh new file mode 100644 index 00000000..10156bf0 --- /dev/null +++ b/.scripts/lib.sh @@ -0,0 +1,37 @@ +ensure_env() { + local var_name="$1" + if [ -z "${!var_name}" ]; then + echo "Environment variable '$var_name' is not defined, aborting..." + exit 1 + fi +} + +ensure_file() { + if [ ! -f "$1" ]; then + echo "No file found $1" + exit 1 + fi +} + +delete_between() { + local file="$1" + local start_regex="$2" + local end_regex="$3" + sed -i "/$start_regex/,/$end_regex/{//!d}" "$file" +} + +append_after() { + local file="$1" + local regex="$2" + local text="${3//$'\n'/\\$'\n'}" # Escape newlines in text + sed -i "/$regex/a $text" "$file" +} + +replace_in_file() { + local file="$1" + local start_regex="$2" + local end_regex="$3" + local text="$4" + delete_between "$file" "$start_regex" "$end_regex" + append_after "$file" "$start_regex" "$text" +} \ No newline at end of file diff --git a/.scripts/update-changelog.sh b/.scripts/update-changelog.sh index 6b8c2507..12be53a1 100755 --- a/.scripts/update-changelog.sh +++ b/.scripts/update-changelog.sh @@ -2,35 +2,44 @@ # Moves unreleased section to a new version release section, and updates anchors at the bottom of the changelog -echo "Updating $changelog for v$version:" - -echo '- Inserting release changelog' -sed -i "/$start_regex/,/$end_regex/{//!d}" $changelog -sed -i "/$start_regex/ { - a ### Added - a - a - a ### Changed - a - a - a ### Removed - a - a - a ### Fixed - a - a - a ## [v$version] - r $release_changelog - a - }" $changelog +source .scripts/lib.sh +source .scripts/vars.sh +ensure_env "version" +ensure_env "previous_version" +ensure_env "repo_url" +ensure_file "$CHANGELOG" +ensure_file "$RELEASE_CHANGELOG" + +echo "Updating $CHANGELOG for v$version:" + +echo '- Clearing unreleased section' +replace_in_file "$CHANGELOG" "$UNRELEASED_SECTION_START_REGEX" "$UNRELEASED_SECTION_END_REGEX" "\ +### Added + + +### Changed + + +### Removed + + +### Fixed + +" + +echo "- Inserting new version section" +append_after "$CHANGELOG" "$VERSIONS_SECTION_START_REGEX" " + +## [v$version] +$(cat $RELEASE_CHANGELOG)" echo '- Adding new version anchor' -sed -i "/^\[Unreleased]/a [v$version]: $repo_url/compare/v$previous_version...v$version" $changelog +sed -i "/^\[Unreleased]/a [v$version]: $repo_url/compare/v$previous_version...v$version" $CHANGELOG echo '- Updating unreleased anchor' -sed -i "s|^\[Unreleased\]: .*|[Unreleased]: $repo_url/compare/v$version...HEAD|" $changelog +sed -i "s|^\[Unreleased\]: .*|[Unreleased]: $repo_url/compare/v$version...HEAD|" $CHANGELOG echo "v$version changelog:" echo '---' -cat $release_changelog -echo '---' +cat $RELEASE_CHANGELOG +echo '---' \ No newline at end of file diff --git a/.scripts/vars.sh b/.scripts/vars.sh new file mode 100644 index 00000000..c5dde14d --- /dev/null +++ b/.scripts/vars.sh @@ -0,0 +1,6 @@ +CHANGELOG="CHANGELOG.md" +RELEASE_CHANGELOG="RELEASE_CHANGELOG.md" +PACK_MANIFEST="pack.yml" +UNRELEASED_SECTION_START_REGEX="^## \\[Unreleased\\]" +UNRELEASED_SECTION_END_REGEX="^"