# https://www.oddbird.net/2022/06/01/dependabot-single-pull-request/
name: upgrade dependencies

on:
  workflow_dispatch: # Allow running on-demand

jobs:
  upgrade:
    name: ${{ matrix.os }}/py${{ matrix.python-version }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: ["ubuntu-latest"]
        python-version: ["3.11", "3.12"]
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}
          cache: "pip"
      - name: Upgrade Python dependencies
        shell: bash
        run: |
          python${{ matrix.python-version }} -m pip install --upgrade pip pip-tools wheel cython setuptools
          python${{ matrix.python-version }} -m pip install `grep numpy== requirements/${{ matrix.os }}_py${{ matrix.python-version }}_extras.txt`
          python${{ matrix.python-version }} -m piptools compile -q --upgrade --resolver=backtracking -o requirements/${{ matrix.os }}_py${{ matrix.python-version }}.txt pyproject.toml
          python${{ matrix.python-version }} -m piptools compile -q --upgrade --resolver=backtracking --all-extras -o requirements/${{ matrix.os }}_py${{ matrix.python-version }}_extras.txt pyproject.toml
      - name: Detect changes
        id: changes
        shell: bash
        run: |
          echo "count=$(git diff-index HEAD | wc -l | xargs)" >> $GITHUB_OUTPUT
          echo "files=$(git ls-files --exclude-standard --others | wc -l | xargs)" >> $GITHUB_OUTPUT
      - name: commit & push changes
        if: steps.changes.outputs.count > 0 || steps.changes.outputs.files > 0
        shell: bash
        run: |
          git config user.name github-actions
          git config user.email github-actions@github.com
          git add requirements
          git commit --allow-empty -m "update dependencies for ${{ matrix.os }}/py${{ matrix.python-version }}"
          git push -f origin ${{ github.ref_name }}:auto-dependency-upgrades-${{ matrix.os }}-py${{ matrix.python-version }}

  pull_request:
    name: Merge all branches and open PR
    runs-on: ubuntu-latest
    needs: upgrade
    strategy:
      matrix:
        python-version: ["3.11"]
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}
      - name: detect auto-upgrade-dependency branches
        id: changes
        run: echo "count=$(git branch -r | grep auto-dependency-upgrades- | wc -l | xargs)" >> $GITHUB_OUTPUT
      - name: merge all auto-dependency-upgrades branches
        if: steps.changes.outputs.count > 0
        run: |
          git config user.name github-actions
          git config user.email github-actions@github.com
          git checkout -b auto-dependency-upgrades
          git branch -r | grep auto-dependency-upgrades- | xargs -I {} git merge {}
          git rebase ${GITHUB_REF##*/}
          git reset $(git merge-base ${GITHUB_REF##*/} HEAD)
          git commit -a -m "auto dependency upgrades"
          git push -f origin auto-dependency-upgrades
          git branch -r | grep auto-dependency-upgrades- | cut -d/ -f2 | xargs -I {} git push origin :{}
      - name: Open pull request if needed
        if: steps.changes.outputs.count > 0
        env:
          GITHUB_TOKEN: ${{ secrets.PAT }}
        # Only open a PR if the branch is not attached to an existing one
        run: |
          PR=$(gh pr list --head auto-dependency-upgrades --json number -q '.[0].number')
          if [ -z $PR ]; then
            gh pr create \
            --head auto-dependency-upgrades \
            --title "Automated dependency upgrades" \
            --body "Full log: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
          else
            echo "Pull request already exists, won't create a new one."
          fi
