name: Project release on Github

on:
  workflow_dispatch:  # this is useful to re-generate the release page without a new tag being pushed
  push:
    tags:
      - "v2.[0-9]+.[0-9]+*"
      # Ignore release versions tagged with -rc0 suffix
      - "!v2.[0-9]+.[0-9]-rc0"
jobs:
  generate-notes:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          fetch-tags: true
          fetch-depth: 0  # slow but needed by reno

      - name: Parse version
        id: version
        run: |
          echo "current_release=$(awk -F \\- '{print $1}' < VERSION.txt)" >> "$GITHUB_OUTPUT"
          echo "current_pre_release=$(awk -F \\- '{print $2}' < VERSION.txt)" >> "$GITHUB_OUTPUT"

      - name: Install reno
        run: |
          python -m pip install --upgrade pip
          pip install "reno<5"

      # Remove next version rc0 tag in the CI environment to prevent reno from assigning notes to future releases.
      # This ensures release notes are correctly aggregated for the current version.
      # This is a workaround. Can be removed if the release process is fully aligned with reno.
      - name: Delete next version rc0 tag in the CI environment
        run: |
          # Parse version X.Y.Z and increment Y for next minor version
          IFS='.' read -r MAJOR MINOR _ <<< "${{ steps.version.outputs.current_release }}"
          NEXT_MINOR=$((MINOR + 1))
          NEXT_TAG="v${MAJOR}.${NEXT_MINOR}.0-rc0"

          if git rev-parse --verify "$NEXT_TAG" >/dev/null 2>&1; then
            git tag -d "$NEXT_TAG"
            echo "Deleted local tag $NEXT_TAG"
          else
            echo "Tag $NEXT_TAG does not exist locally"
          fi

      - name: Generate release notes
        env:

          EARLIEST_VERSION: v${{ steps.version.outputs.current_release }}-rc1
        run: |
          reno report --no-show-source --ignore-cache --earliest-version "$EARLIEST_VERSION" -o relnotes.rst

      - name: Convert to Markdown
        uses: docker://pandoc/core:3.8
        with:
          args: "--from rst --to gfm --syntax-highlighting=none --wrap=none relnotes.rst -o relnotes.md"

      # We copy the relnotes file since the original one cannot be modified due to permissions
      - name: Copy relnotes file
        run: |
          cat relnotes.md > enhanced_relnotes.md

      - name: Add contributor list
          # only for minor releases and minor release candidates (not bugfix releases)
        if: endsWith(steps.version.outputs.current_release, '.0')
        env:
          GH_TOKEN: ${{ github.token }}
          START: v${{ steps.version.outputs.current_release }}-rc0
          END: ${{ github.ref_name }}
        run: |
          JQ_EXPR='[.commits[].author.login]
            | map(select(. != null and . != "HaystackBot" and . != "dependabot[bot]" and . != "github-actions[bot]"))
            | unique
            | sort_by(ascii_downcase)
            | map("@\(.)")
            | join(", ")'
          CONTRIBUTORS=$(gh api "repos/deepset-ai/haystack/compare/$START...$END" \
            --jq "$JQ_EXPR") || { echo "Unable to fetch contributors"; exit 1; }

          {
            echo ""
            echo "## 💙 Big thank you to everyone who contributed to this release!"
            echo ""
            echo "$CONTRIBUTORS"
          } >> enhanced_relnotes.md

      - name: Debug
        run: |
          cat enhanced_relnotes.md

      - uses: ncipollo/release-action@v1
        with:
          bodyFile: "enhanced_relnotes.md"
          prerelease: ${{ steps.version.outputs.current_pre_release != '' }}
          allowUpdates: true
