---
# SPDX-License-Identifier: GPL-2.0-or-later
#
# This file is part of nvme.
# Copyright (c) 2026 SUSE LLC
#
# Authors: Daniel Wagner <dwagner@suse.de>

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:latest
    steps:
      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0

      - 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@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
        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@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
        with:
          fetch-depth: 0  # Required for `git describe`

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

      - name: Configure git identity for CI
        run: |
          git config --global user.name "github-actions[bot]"
          git config --global user.email "github-actions[bot]@users.noreply.github.com"

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

      - name: Patch project version in meson.build
        env:
          DEV_VERSION: ${{ steps.version.outputs.dev_version }}
        run: |
          sed -i -e "/^project(/,/)/ s/^\(\s*\)version:\s*.*/\1version: '${DEV_VERSION}',/" meson.build

      - name: Commit CI version bump
        env:
          DEV_VERSION: ${{ steps.version.outputs.dev_version }}
        run: |
          git add meson.build
          git commit -m "ci: set project version to ${DEV_VERSION}"

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

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

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

  upload_test_pypi:
    needs: [build_test_sdist]
    runs-on: ubuntu-latest
    environment: pypi
    permissions:
      id-token: write
    if: github.repository == 'linux-nvme/nvme-cli' && github.ref_type == 'branch'
    steps:
      - uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
        with:
          name: test_pypi
          path: dist

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

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

      - name: Download artifact
        uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
        if: steps.check-tag.outputs.match == 'true'
        with:
          name: artifact
          path: dist

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