name: Automated release

on:
  workflow_dispatch:
  schedule:
    # First day of every month
    - cron: '0 0 1 * *'

jobs:
  setup:
    runs-on: ubuntu-latest
    outputs:
      latest_branch: ${{steps.latest_branch.outputs.latest_branch}}
      branches_json: ${{steps.release_branches.outputs.branches_json}}
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
            fetch-depth: 0
      - name: Get latest llvm_release branch
        id: latest_branch
        run: |
          git branch -r \
          | grep 'llvm_release_' \
          | sed -E 's/.*\/llvm_release_([0-9]+)/\1/' \
          | sort -n -r \
          | head -1 \
          | xargs printf "latest_branch=llvm_release_%s" \
          >> $GITHUB_OUTPUT
      - name: Get branch list
        id: release_branches
        run: |
          git branch -r \
          | grep "origin/llvm_release_" \
          | sed -E 's/\ *origin\/([^\ ]*)/\"\1\"/' \
          | paste -sd',' \
          | xargs -0 -d"\n" printf 'branches_json={"branch":[%s]}' \
          >> $GITHUB_OUTPUT
  release:
    runs-on: ubuntu-latest
    needs: setup
    strategy:
      matrix: ${{fromJson(needs.setup.outputs.branches_json)}}
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
            ref: ${{ matrix.branch }}
            fetch-depth: 0
      - name: Get commits info
        id: versions
        run: |
            export LATEST_VERSION=\
            "$(git describe --tags --abbrev=0 --match 'v*')"
            export LLVM_VERSION=$(echo $LATEST_VERSION \
            | sed -E 's/(v[0-9]+\.[0-9]+)\.([0-9]+).*/\1/')
            export PATCH=$(echo $LATEST_VERSION \
            | sed -E 's/(v[0-9]+\.[0-9]+)\.([0-9]+).*/\2/')

            echo "llvm_version=$LLVM_VERSION" >> $GITHUB_OUTPUT
            echo "patch=$PATCH" >> $GITHUB_OUTPUT
            echo "latest_version=${LATEST_VERSION}" >> $GITHUB_OUTPUT
            echo "release_version=${LLVM_VERSION}.$((${PATCH}+1))" \
            >> $GITHUB_OUTPUT

            git rev-list ${LATEST_VERSION}..HEAD --count \
            | xargs printf "commits_since_last_release=%d\n" >> $GITHUB_OUTPUT
            git rev-parse HEAD | xargs printf "last_commit=%s\n" >> $GITHUB_OUTPUT
      - name: Release
        uses: softprops/action-gh-release@v2
        if: ${{ steps.versions.outputs.commits_since_last_release != 0 }}
        with:
            # Setting tag to have format:
            # %latest llvm version%.%latest patch + 1%
            tag_name: ${{ steps.versions.outputs.release_version }}
            # We have to set this so tag is set on the branch we are releasing
            target_commitish: ${{ steps.versions.outputs.last_commit }}
            # We don't want to mark patch releases latest unless it is latest
            # major version
            make_latest: >-
              ${{ needs.setup.outputs.latest_branch == matrix.branch }}
            name: >
              SPIR-V LLVM translator based on LLVM
              ${{ steps.versions.outputs.llvm_version }}
            body: "Full Changelog: ${{ github.server_url }}/\
              ${{ github.repository }}/compare/\
              ${{ steps.versions.outputs.latest_version }}...\
              ${{ steps.versions.outputs.release_version }}"
