---
name: release python

on:
  push:
    branches: [master]
    tags:
      - '**'
  workflow_dispatch:
    inputs:
      tag:
        description: 'Tag to check out'
        required: false

jobs:
  build_sdist:
    name: Build source distribution
    runs-on: ubuntu-latest
    env:
      PYTHON_VERSION: "3.10"
    container:
      image: ghcr.io/linux-nvme/debian.python:latest
    steps:
      - uses: actions/checkout@v5

      - name: Allow workspace
        run: |
          git config --global --add safe.directory "$GITHUB_WORKSPACE"

      - name: Build sdist
        run: |
          pipx run build --sdist

      - name: Validate sdist
        run: |
          pipx run twine check dist/*.tar.gz

      - uses: actions/upload-artifact@v5
        with:
          path: dist/*.tar.gz
          retention-days: 5

  build_test_sdist:
    name: Build test source distribution
    runs-on: ubuntu-latest
    env:
      PYTHON_VERSION: "3.10"
    container:
      image: ghcr.io/linux-nvme/debian.python:latest
    steps:
      - name: Check out repository (with tags)
        uses: actions/checkout@v5
        with:
          fetch-depth: 0  # Required for `git describe`

      - name: Allow workspace
        run: |
          git config --global --add safe.directory "$GITHUB_WORKSPACE"

      - name: Compute dev version from git
        id: version
        run: |
          TAG=$(git describe --tags --abbrev=0)
          REV=$(git rev-list "$TAG"..HEAD --count)
          BASE_VERSION="${TAG#v}"
          VERSION="${BASE_VERSION}.dev${REV}"
          echo "dev_version=$VERSION" >> $GITHUB_OUTPUT
          echo "Computed dev version: $VERSION"

      - name: Patch version in meson.build
        run: |
          sed -i -e "0,/[ \t]version: /s/\([ \t]version: \).*/\1\'${{ steps.version.outputs.dev_version }}\',/" meson.build

      - name: Build sdist
        run: |
          pipx run build --sdist

      - name: Validate sdist
        run: |
          pipx run twine check dist/*.tar.gz

      - uses: actions/upload-artifact@v5
        with:
          name: test_pypi
          path: dist/*.tar.gz
          retention-days: 5

  upload_test_pypi:
    needs: [build_test_sdist]
    runs-on: ubuntu-latest
    env:
      PYTHON_VERSION: "3.10"
    environment: pypi
    permissions:
      id-token: write
    if: github.repository == 'linux-nvme/libnvme'
    steps:
      - uses: actions/download-artifact@v6
        with:
          name: test_pypi
          path: dist

      - name: Publish package to TestPyPI
        uses: pypa/gh-action-pypi-publish@v1.13.0
        with:
          repository-url: https://test.pypi.org/legacy/

  upload_pypi:
    needs: [build_sdist]
    runs-on: ubuntu-latest
    env:
      PYTHON_VERSION: "3.10"
    environment: pypi
    permissions:
      id-token: write
    if: startsWith(github.ref, 'refs/tags/v') && github.repository == 'linux-nvme/libnvme'
    steps:
      - name: Check if it is a release tag
        id: check-tag
        run: |
           if [[ ${{ github.event.ref }} =~ ^refs/tags/v([0-9]+\.[0-9]+)(\.[0-9]+)?(-rc[0-9]+)?$ ]]; then
               echo ::set-output name=match::true
           fi

      - name: Download artifiact
        uses: actions/download-artifact@v6
        if: steps.check-tag.outputs.match == 'true'
        with:
          name: artifact
          path: dist

      - name: Publish package to PyPI
        uses: pypa/gh-action-pypi-publish@v1.13.0
        if: steps.check-tag.outputs.match == 'true'
