gitcraft 0.1.123

A template project for GitHub-related utilities.
name: Build Binaries and Wheels

on:
  workflow_call:
  workflow_dispatch:

jobs:
  build-binaries:
    name: Build ${{ matrix.build.NAME }}
    runs-on: ${{ matrix.build.OS }}
    strategy:
      fail-fast: false
      matrix:
        build:
          # Linux glibc (64-bit only)
          - { NAME: linux-x64-glibc,    OS: ubuntu-22.04, TARGET: x86_64-unknown-linux-gnu, BUILD_WHEEL: true }
          - { NAME: linux-arm64-glibc,  OS: ubuntu-22.04, TARGET: aarch64-unknown-linux-gnu, BUILD_WHEEL: false }

          # Linux musl (64-bit only) → no wheels
          - { NAME: linux-x64-musl,     OS: ubuntu-22.04, TARGET: x86_64-unknown-linux-musl, BUILD_WHEEL: false }
          - { NAME: linux-arm64-musl,   OS: ubuntu-22.04, TARGET: aarch64-unknown-linux-musl, BUILD_WHEEL: false }

          # Windows (64-bit only)
          - { NAME: windows-x64-msvc,   OS: windows-latest, TARGET: x86_64-pc-windows-msvc,   BUILD_WHEEL: true }
          # Skip Windows ARM64 wheels (maturin limitation)
          - { NAME: windows-arm64-msvc, OS: windows-latest, TARGET: aarch64-pc-windows-msvc, BUILD_WHEEL: false }

          # macOS
          - { NAME: darwin-x64,         OS: macos-15, TARGET: x86_64-apple-darwin,   BUILD_WHEEL: true }
          - { NAME: darwin-arm64,       OS: macos-15, TARGET: aarch64-apple-darwin,  BUILD_WHEEL: true }

    steps:
      - uses: actions/checkout@v4

      - name: Setup Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.build.TARGET }}

      # === HANDLE WHEEL TARGETS (maturin-controlled build) ===
      - name: Setup for maturin build (wheel targets)
        if: matrix.build.BUILD_WHEEL == true
        run: |
          # Install maturin and cross (maturin will use cross internally)
          pip install maturin
          cargo install cross --locked

      - name: Build with maturin (for wheel targets)
        if: matrix.build.BUILD_WHEEL == true
        run: maturin build --release --target ${{ matrix.build.TARGET }}

      - name: Extract raw binary (from maturin build)
        if: matrix.build.BUILD_WHEEL == true
        shell: bash
        run: |
          BINARY_NAME="gitcraft"
          if [[ "${{ matrix.build.TARGET }}" == *"windows"* ]]; then
            BINARY_NAME="${BINARY_NAME}.exe"
            cp "target/${{ matrix.build.TARGET }}/release/gitcraft.exe" "./gitcraft-${{ matrix.build.NAME }}.exe"
            echo "BINARY_ARTIFACT=gitcraft-${{ matrix.build.NAME }}.exe" >> $GITHUB_ENV
          else
            cp "target/${{ matrix.build.TARGET }}/release/gitcraft" "./gitcraft-${{ matrix.build.NAME }}"
            chmod +x "./gitcraft-${{ matrix.build.NAME }}"
            echo "BINARY_ARTIFACT=gitcraft-${{ matrix.build.NAME }}" >> $GITHUB_ENV
          fi

      - name: Upload raw binary (wheel targets)
        if: matrix.build.BUILD_WHEEL == true
        uses: actions/upload-artifact@v4
        with:
          name: binary-${{ matrix.build.NAME }}
          path: ${{ env.BINARY_ARTIFACT }}
          if-no-files-found: error

      - name: Upload Python wheel
        if: matrix.build.BUILD_WHEEL == true
        uses: actions/upload-artifact@v4
        with:
          name: wheels-${{ matrix.build.NAME }}
          path: target/wheels/*.whl
          if-no-files-found: error

      # === HANDLE NON-WHEEL TARGETS (musl) ===
      - name: Install cross (for non-wheel Linux targets)
        if: matrix.build.BUILD_WHEEL == false && runner.os == 'Linux'
        run: cargo install cross --locked

      - name: Build binary (non-wheel targets)
        if: matrix.build.BUILD_WHEEL == false
        shell: bash
        run: |
          if [[ "${{ runner.os }}" == "Linux" ]]; then
            cross build --release --target ${{ matrix.build.TARGET }}
          else
            cargo build --release --target ${{ matrix.build.TARGET }}
          fi

      - name: Prepare raw binary artifact (non-wheel)
        if: matrix.build.BUILD_WHEEL == false
        shell: bash
        run: |
          BINARY_NAME="gitcraft"
          if [[ "${{ matrix.build.TARGET }}" == *"windows"* ]]; then
            BINARY_NAME="${BINARY_NAME}.exe"
            cp "target/${{ matrix.build.TARGET }}/release/gitcraft.exe" "./gitcraft-${{ matrix.build.NAME }}.exe"
            echo "BINARY_ARTIFACT=gitcraft-${{ matrix.build.NAME }}.exe" >> $GITHUB_ENV
          else
            cp "target/${{ matrix.build.TARGET }}/release/gitcraft" "./gitcraft-${{ matrix.build.NAME }}"
            chmod +x "./gitcraft-${{ matrix.build.NAME }}"
            echo "BINARY_ARTIFACT=gitcraft-${{ matrix.build.NAME }}" >> $GITHUB_ENV
          fi

      - name: Upload raw binary artifact (non-wheel)
        if: matrix.build.BUILD_WHEEL == false
        uses: actions/upload-artifact@v4
        with:
          name: binary-${{ matrix.build.NAME }}
          path: ${{ env.BINARY_ARTIFACT }}
          if-no-files-found: error