name: CI

on:
    push:
        branches: [master, develop]

env:
    UV_VERSION: "0.8.0"
    PYTHON_VERSION: "3.13"
    NOX_DEFAULT_VENV_BACKEND: "uv"

jobs:
    benchmark-regression:
        if: forgejo.event_name == 'pull_request'
        runs-on: docker-benchmark
        container:
            image: python:3.13-slim
        needs: [lint, typecheck, security, quality]
        steps:
            - name: Install system dependencies (nodejs for checkout, git for merge tests)
              run: |
                  apt-get update && apt-get install -y -qq nodejs git && rm -rf /var/lib/apt/lists/*

            - name: Checkout full history
              uses: actions/checkout@v4
              with:
                  fetch-depth: 0

            - name: Compute base commit
              id: hash
              run: |
                  git fetch origin "${{ forgejo.base_ref }}" --depth=200
                  BASE_SHA=$(git merge-base HEAD "origin/${{ forgejo.base_ref }}")
                  echo "ASV_BASE_SHA=${BASE_SHA}" >> $FORGEJO_OUTPUT

            - name: Install dependencies
              run: |
                  python -m pip install -U pip
                  python -m pip install asv virtualenv uv==${{ env.UV_VERSION }} nox

            - name: Restore prior ASV benchmarks
              env:
                  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
                  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
                  AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
                  ASV_S3_BUCKET: ${{ secrets.ASV_S3_BUCKET }}
              run: |
                  python -m pip install awscli
                  mkdir -p build/asv/results
                  aws s3 sync "s3://${ASV_S3_BUCKET}/asv/results" build/asv/results --delete || true

            - name: Run asv continuous via nox
              env:
                  ASV_BASE_SHA:  ${{ steps.hash.outputs.ASV_BASE_SHA }}
              run: |
                  nox -s benchmark_regression

            - name: Archive the results
              run: |
                  tar cf /tmp/asv-results.tar build/asv/results build/asv/html

            - name: Upload benchmark artifacts
              if: always()
              uses: actions/upload-artifact@v3
              with:
                  name: asv-results-pr
                  path: /tmp/asv-results.tar
                  rentention-days: 30

    benchmark-publish:
        if: forgejo.event_name == 'push' && ( forgejo.ref == 'refs/heads/master' || forgejo.ref == 'refs/heads/develop' )
        runs-on: docker-benchmark
        container: python:3.13-slim
        steps:
            - name: Install system dependencies (nodejs for checkout, git for merge tests)
              run: |
                  apt-get update && apt-get install -y -qq nodejs git && rm -rf /var/lib/apt/lists/*

            - name: Checkout full history
              uses: actions/checkout@v4
              with:
                  fetch-depth: 0

            - name: Install dependencies
              run: |
                  python -m pip install -U pip
                  python -m pip install asv virtualenv uv==${{ env.UV_VERSION }} nox

            - name: Restore prior ASV benchmarks
              env:
                  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
                  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
                  AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
                  ASV_S3_BUCKET: ${{ secrets.ASV_S3_BUCKET }}
              run: |
                  python -m pip install awscli
                  mkdir -p build/asv/results
                  aws s3 sync "s3://${ASV_S3_BUCKET}/asv/results" build/asv/results --delete || true

            - name: Run asv via nox
              run: |
                  nox -s benchmark

            - name: Upload updated benchmarks and website to S3
              env:
                  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
                  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
                  AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
                  ASV_S3_BUCKET: ${{ secrets.ASV_S3_BUCKET }}
              run: |
                  python -m pip install awscli
                  aws s3 sync build/asv/results "s3://${ASV_S3_BUCKET}/asv/results" --delete
                  aws s3 sync build/asv/html "s3://${ASV_S3_BUCKET}/asv/html" --delete

            - name: Archive the results
              run: |
                  tar cf /tmp/asv-results.tar build/asv/results build/asv/html

            - name: Upload benchmark artifacts
              if: always()
              uses: actions/upload-artifact@v3
              with:
                  name: asv-results-pr
                  path: /tmp/asv-results.tar
                  rentention-days: 30

