From b920c1ce455a858256149e8ee3a26e40f7863a32 Mon Sep 17 00:00:00 2001 From: Josh Peterson Date: Fri, 19 Jul 2024 20:25:26 -0600 Subject: [PATCH] fix: Fix Update CHANGELOG script --- .github/workflows/release.yml | 79 +++++---------------------- .github/workflows/update_changelog.sh | 73 +++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 66 deletions(-) create mode 100644 .github/workflows/update_changelog.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c0aacca..306ba40 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -122,76 +122,23 @@ jobs: echo "EOF" >> $GITHUB_OUTPUT - name: Update CHANGELOG.md + shell: bash run: | - NEW_VERSION='${{ steps.determine_version.outputs.NEW_VERSION }}' - CHANGELOG='${{ steps.get_changelog.outputs.CHANGELOG }}' - CURRENT_DATE=$(TZ='America/Denver' date +%Y-%m-%d) - REPO_URL="https://github.com/joshuadanpeterson/typewriter.nvim" - - format_entry() { - local version=$1 - local date=$2 - local content=$3 - local prev_version=$4 - echo "## [$version]($REPO_URL/tree/$version) ($date)" - echo "$content" - echo - echo "[Full Changelog]($REPO_URL/compare/$prev_version...$version)" - echo - } - - remove_duplicates() { - echo "$1" | awk '!seen[$0]++' - } - - echo "# Changelog" > temp_changelog.md - echo >> temp_changelog.md - - # Add new version - NEW_CHANGELOG=$(remove_duplicates "$CHANGELOG") - format_entry "$NEW_VERSION" "$CURRENT_DATE" "$NEW_CHANGELOG" "${{ steps.determine_version.outputs.LATEST_TAG }}" >> temp_changelog.md + # Set execute permissions + chmod +x $GITHUB_WORKSPACE/.github/scripts/update_changelog.sh - prev_version="$NEW_VERSION" - declare -A processed_versions + # Convert line endings + sed -i 's/\r$//' $GITHUB_WORKSPACE/.github/scripts/update_changelog.sh - while IFS= read -r line; do - if [[ $line =~ ^##[[:space:]]+(\[v[0-9]+\.[0-9]+\.[0-9]+\])(.*)$ ]]; then - version="${BASH_REMATCH[1]}" - version="${version:1:-1}" - if [[ -n "${processed_versions[$version]}" ]] || [[ "$version" == "$NEW_VERSION" ]]; then - continue - fi - processed_versions[$version]=1 - - date_part="${BASH_REMATCH[2]}" - date=$(echo "$date_part" | grep -oP '\(\K[0-9]{4}-[0-9]{2}-[0-9]{2}(?=\))' || echo "Unknown Date") - - if [ "$date" != "Unknown Date" ]; then - date=$(TZ='America/Denver' date -d "$date" +%Y-%m-%d) - fi - - content=$(sed -n "/^## \[$version\]/,/^## \[v[0-9]/{ /^## \[v[0-9]/d; p; }" CHANGELOG.md) - content=$(echo "$content" | sed '/^\[Full Changelog\]/d' | sed '/^$/N;/^\n$/D') - content=$(remove_duplicates "$content") - - format_entry "$version" "$date" "$content" "$prev_version" >> temp_changelog.md - - prev_version="$version" - fi - done < CHANGELOG.md - - mv temp_changelog.md CHANGELOG.md - - if ! grep -q "^# Changelog" CHANGELOG.md || ! grep -q "^## \[v[0-9]\+\.[0-9]\+\.[0-9]\+\]" CHANGELOG.md; then - echo "Error: CHANGELOG.md formatting verification failed" - exit 1 - fi + # Set variables + NEW_VERSION='${{ steps.determine_version.outputs.NEW_VERSION }}' + CHANGELOG=$(cat << 'EOF' + ${{ steps.get_changelog.outputs.CHANGELOG }} + EOF + ) - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - git add CHANGELOG.md - git commit -m "docs: update CHANGELOG.md for ${NEW_VERSION} and remove duplicate entries" - git push + # Run the update changelog script + $GITHUB_WORKSPACE/.github/scripts/update_changelog.sh "$NEW_VERSION" "$CHANGELOG" - name: Check if release exists id: check_release diff --git a/.github/workflows/update_changelog.sh b/.github/workflows/update_changelog.sh new file mode 100644 index 0000000..7e38544 --- /dev/null +++ b/.github/workflows/update_changelog.sh @@ -0,0 +1,73 @@ +#!/bin/bash + +NEW_VERSION="$1" +CHANGELOG="$2" + + + CURRENT_DATE=$(TZ='America/Denver' date +%Y-%m-%d) + REPO_URL="https://github.com/joshuadanpeterson/typewriter.nvim" + + format_entry() { + local version=$1 + local date=$2 + local content=$3 + local prev_version=$4 + echo "## [$version]($REPO_URL/tree/$version) ($date)" + echo "$content" + echo + echo "[Full Changelog]($REPO_URL/compare/$prev_version...$version)" + echo + } + + remove_duplicates() { + echo "$1" | awk '!seen[$0]++' + } + + echo "# Changelog" > temp_changelog.md + echo >> temp_changelog.md + + # Add new version + NEW_CHANGELOG=$(remove_duplicates "$CHANGELOG") + format_entry "$NEW_VERSION" "$CURRENT_DATE" "$NEW_CHANGELOG" "${{ steps.determine_version.outputs.LATEST_TAG }}" >> temp_changelog.md + + prev_version="$NEW_VERSION" + declare -A processed_versions + + while IFS= read -r line; do + if [[ $line =~ ^##[[:space:]]+(\[v[0-9]+\.[0-9]+\.[0-9]+\])(.*)$ ]]; then + version="${BASH_REMATCH[1]}" + version="${version:1:-1}" + if [[ -n "${processed_versions[$version]}" ]] || [[ "$version" == "$NEW_VERSION" ]]; then + continue + fi + processed_versions[$version]=1 + + date_part="${BASH_REMATCH[2]}" + date=$(echo "$date_part" | grep -oP '\(\K[0-9]{4}-[0-9]{2}-[0-9]{2}(?=\))' || echo "Unknown Date") + + if [ "$date" != "Unknown Date" ]; then + date=$(TZ='America/Denver' date -d "$date" +%Y-%m-%d) + fi + + content=$(sed -n "/^## \[$version\]/,/^## \[v[0-9]/{ /^## \[v[0-9]/d; p; }" CHANGELOG.md) + content=$(echo "$content" | sed '/^\[Full Changelog\]/d' | sed '/^$/N;/^\n$/D') + content=$(remove_duplicates "$content") + + format_entry "$version" "$date" "$content" "$prev_version" >> temp_changelog.md + + prev_version="$version" + fi + done < CHANGELOG.md + + mv temp_changelog.md CHANGELOG.md + + if ! grep -q "^# Changelog" CHANGELOG.md || ! grep -q "^## \[v[0-9]\+\.[0-9]\+\.[0-9]\+\]" CHANGELOG.md; then + echo "Error: CHANGELOG.md formatting verification failed" + exit 1 + fi + + git config --local user.email "action@github.com" + git config --local user.name "GitHub Action" + git add CHANGELOG.md + git commit -m "docs: update CHANGELOG.md for ${NEW_VERSION} and remove duplicate entries" + git push