weedforge 0.1.2

Rust-first, Python-friendly SDK for SeaweedFS
Documentation
name: Release

on:
  release:
      types: [published]

permissions:
  contents: read

jobs:
  publish-crates:
    name: Publish to crates.io
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Install cargo-set-version
        run: cargo install cargo-set-version

      - name: Bump patch version and publish
        run: |
          NEW_VERSION=$(cargo pkgid | sed 's/.*#//' | awk -F. -v OFS=. '{$NF++; print}')
          # Check if this version already exists on crates.io, keep incrementing if so
          while cargo search weedforge --limit 1 | grep -q "\"$NEW_VERSION\""; do
            echo "Version $NEW_VERSION already exists on crates.io, incrementing..."
            NEW_VERSION=$(echo $NEW_VERSION | awk -F. -v OFS=. '{$NF++; print}')
          done
          echo "Publishing version $NEW_VERSION"
          cargo set-version $NEW_VERSION
          cargo publish --allow-dirty
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}


  # Build wheels for Linux (manylinux)
  build-linux:
    name: Build Linux wheels
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target: [x86_64, aarch64]
    steps:
      - uses: actions/checkout@v4

      - name: Install aarch64 cross toolchain
        if: matrix.target == 'aarch64'
        run: sudo apt-get update && sudo apt-get install -y gcc-aarch64-linux-gnu

      - name: Build wheels
        uses: PyO3/maturin-action@v1
        with:
          target: ${{ matrix.target }}
          args: --release --strip --out dist
          manylinux: auto
          sccache: 'true'
          rust-toolchain: stable
          # Use zig for cross-compilation - handles ring's ARM assembly correctly
          zig: true
        env:
          # Use generic ARMv8 architecture and define __ARM_ARCH for aws-lc-sys assembly
          CFLAGS_aarch64_unknown_linux_gnu: "-march=armv8-a -D__ARM_ARCH=8"

      - name: Upload wheels
        uses: actions/upload-artifact@v4
        with:
          name: wheels-linux-${{ matrix.target }}
          path: dist/*.whl

  # Build wheels for macOS
  build-macos:
    name: Build macOS wheels
    runs-on: macos-latest
    strategy:
      matrix:
        target: [x86_64, aarch64]
    steps:
      - uses: actions/checkout@v4

      - name: Build wheels
        uses: PyO3/maturin-action@v1
        with:
          target: ${{ matrix.target }}-apple-darwin
          args: --release --strip --out dist

      - name: Upload wheels
        uses: actions/upload-artifact@v4
        with:
          name: wheels-macos-${{ matrix.target }}
          path: dist/*.whl

  # Build wheels for Windows
  build-windows:
    name: Build Windows wheels
    runs-on: windows-latest
    strategy:
      matrix:
        target: [x64]
    steps:
      - uses: actions/checkout@v4

      - name: Build wheels
        uses: PyO3/maturin-action@v1
        with:
          args: --release --strip --out dist

      - name: Upload wheels
        uses: actions/upload-artifact@v4
        with:
          name: wheels-windows-${{ matrix.target }}
          path: dist/*.whl

  # Build source distribution
  build-sdist:
    name: Build source distribution
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Build sdist
        uses: PyO3/maturin-action@v1
        with:
          command: sdist
          args: --out dist

      - name: Upload sdist
        uses: actions/upload-artifact@v4
        with:
          name: wheels-sdist
          path: dist/*.tar.gz

  # Publish to PyPI
  publish-pypi:
    name: Publish to PyPI
    needs: [build-linux, build-macos, build-windows, build-sdist]
    runs-on: ubuntu-latest
    steps:
      - name: Download wheels
        uses: actions/download-artifact@v4
        with:
          pattern: wheels-*
          path: dist
          merge-multiple: true

      - name: Publish to PyPI
        uses: PyO3/maturin-action@v1
        with:
          command: upload
          args: --non-interactive --skip-existing dist/*
        env:
          MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_PASSWORD }}