pr-bro 0.5.1

Know which PR to review next. Ranks pull requests by weighted scoring.
Documentation
name: Release

on:
  push:
    tags:
      - 'v*'

env:
  CARGO_TERM_COLOR: always

permissions:
  contents: write

jobs:
  build:
    name: Build ${{ matrix.target }}
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: true
      matrix:
        include:
          - target: aarch64-apple-darwin
            os: macos-15
            use-cross: false
          - target: x86_64-apple-darwin
            os: macos-15-intel
            use-cross: false
          - target: x86_64-unknown-linux-gnu
            os: ubuntu-latest
            use-cross: false
          - target: aarch64-unknown-linux-gnu
            os: ubuntu-latest
            use-cross: true

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}

      - name: Install cross
        if: matrix.use-cross
        run: cargo install cross --git https://github.com/cross-rs/cross --tag v0.2.5

      - name: Build release binary
        run: |
          if [ "${{ matrix.use-cross }}" = "true" ]; then
            cross build --release --target ${{ matrix.target }}
          else
            cargo build --release --target ${{ matrix.target }}
          fi

      - name: Code sign macOS binary
        if: runner.os == 'macOS'
        run: codesign --force -s - target/${{ matrix.target }}/release/pr-bro

      - name: Create archive directory
        run: mkdir -p dist

      - name: Package release archive
        run: |
          mkdir -p staging
          cp target/${{ matrix.target }}/release/pr-bro staging/
          cp LICENSE README.md staging/
          cd staging && tar -czf ../dist/pr-bro-${{ github.ref_name }}-${{ matrix.target }}.tar.gz *

      - name: Generate checksum
        run: |
          cd dist
          if [ "$RUNNER_OS" = "macOS" ]; then
            shasum -a 256 pr-bro-${{ github.ref_name }}-${{ matrix.target }}.tar.gz > pr-bro-${{ github.ref_name }}-${{ matrix.target }}.tar.gz.sha256
          else
            sha256sum pr-bro-${{ github.ref_name }}-${{ matrix.target }}.tar.gz > pr-bro-${{ github.ref_name }}-${{ matrix.target }}.tar.gz.sha256
          fi

      - name: Upload release artifacts
        uses: actions/upload-artifact@v7
        with:
          name: release-${{ matrix.target }}
          path: dist/*

  release:
    name: Create GitHub Release
    needs: build
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Download all artifacts
        uses: actions/download-artifact@v8
        with:
          path: dist
          merge-multiple: true

      - name: Generate combined SHA256SUMS
        run: |
          cd dist
          cat *.sha256 | sort > SHA256SUMS

      - name: Create GitHub Release
        uses: softprops/action-gh-release@v3
        with:
          generate_release_notes: false
          prerelease: ${{ contains(github.ref_name, '-rc') || contains(github.ref_name, '-beta') || contains(github.ref_name, '-alpha') }}
          files: dist/*
          fail_on_unmatched_files: true

      - name: Update Homebrew tap
        id: update-tap
        continue-on-error: true
        env:
          HOMEBREW_TAP_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
        run: |
          # Extract version without 'v' prefix
          VERSION="${GITHUB_REF_NAME#v}"
          TAG="${GITHUB_REF_NAME}"

          # Calculate SHA256 for macOS archives from downloaded artifacts
          INTEL_SHA256=$(sha256sum dist/pr-bro-${TAG}-x86_64-apple-darwin.tar.gz | cut -d ' ' -f1)
          ARM_SHA256=$(sha256sum dist/pr-bro-${TAG}-aarch64-apple-darwin.tar.gz | cut -d ' ' -f1)

          echo "Version: ${VERSION}"
          echo "Intel SHA256: ${INTEL_SHA256}"
          echo "ARM SHA256: ${ARM_SHA256}"

          # Clone tap repo
          git clone "https://x-access-token:${HOMEBREW_TAP_TOKEN}@github.com/toniperic/homebrew-tap.git" tap-repo

          # Generate formula from template
          sed -e "s/HOMEBREW_VERSION/${VERSION}/g" \
              -e "s/INTEL_SHA256/${INTEL_SHA256}/g" \
              -e "s/ARM_SHA256/${ARM_SHA256}/g" \
              homebrew/pr-bro.rb.template > tap-repo/Formula/pr-bro.rb

          # Commit and push
          cd tap-repo
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git add Formula/pr-bro.rb
          git diff --cached --quiet && echo "No changes to formula" && exit 0
          git commit -m "pr-bro ${TAG}"
          git push

      - name: Create issue if tap update failed
        if: steps.update-tap.outcome == 'failure'
        uses: actions/github-script@v9
        with:
          github-token: ${{ secrets.HOMEBREW_TAP_TOKEN }}
          script: |
            const tag = context.ref.replace('refs/tags/', '');
            await github.rest.issues.create({
              owner: 'toniperic',
              repo: 'homebrew-tap',
              title: `Formula update failed for ${tag}`,
              body: [
                `## Formula Update Failure`,
                ``,
                `The automated Homebrew formula update failed for release **${tag}**.`,
                ``,
                `**Release:** https://github.com/${context.repo.owner}/${context.repo.repo}/releases/tag/${tag}`,
                `**Workflow run:** https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`,
                ``,
                `### Manual Update Steps`,
                `1. Download the macOS release archives`,
                `2. Calculate SHA256: \`shasum -a 256 pr-bro-${tag}-*.tar.gz\``,
                `3. Update \`Formula/pr-bro.rb\` with new version and checksums`,
                `4. Push to main branch`,
              ].join('\n')
            });