name: "[ruff] Release"

on:
  workflow_dispatch:
  release:
    types: [published]

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

env:
  PACKAGE_NAME: ruff
  PYTHON_VERSION: "3.7" # to build abi3 wheels
  CARGO_INCREMENTAL: 0
  CARGO_NET_RETRY: 10
  CARGO_TERM_COLOR: always
  RUSTUP_MAX_RETRIES: 10

jobs:
  macos-x86_64:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: ${{ env.PYTHON_VERSION }}
          architecture: x64
      - name: "Prep README.md"
        run: python scripts/transform_readme.py --target pypi
      - name: "Build wheels - x86_64"
        uses: PyO3/maturin-action@v1
        with:
          target: x86_64
          args: --release --out dist --sdist
      - name: "Install built wheel - x86_64"
        run: |
          pip install dist/${{ env.PACKAGE_NAME }}-*.whl --force-reinstall
      - name: "Upload wheels"
        uses: actions/upload-artifact@v3
        with:
          name: wheels
          path: dist
      - name: "Archive binary"
        run: |
            ARCHIVE_FILE=ruff-x86_64-apple-darwin.tar.gz
            tar czvf $ARCHIVE_FILE -C target/x86_64-apple-darwin/release ruff
            shasum -a 256 $ARCHIVE_FILE > $ARCHIVE_FILE.sha256
      - name: "Upload binary"
        uses: actions/upload-artifact@v3
        with:
          name: binaries
          path: |
            *.tar.gz
            *.sha256

  macos-universal:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: ${{ env.PYTHON_VERSION }}
          architecture: x64
      - name: "Prep README.md"
        run: python scripts/transform_readme.py --target pypi
      - name: "Build wheels - universal2"
        uses: PyO3/maturin-action@v1
        with:
          args: --release --universal2 --out dist
      - name: "Install built wheel - universal2"
        run: |
          pip install dist/${{ env.PACKAGE_NAME }}-*universal2.whl --force-reinstall
      - name: "Upload wheels"
        uses: actions/upload-artifact@v3
        with:
          name: wheels
          path: dist
      - name: "Archive binary"
        run: |
            ARCHIVE_FILE=ruff-aarch64-apple-darwin.tar.gz
            tar czvf $ARCHIVE_FILE -C target/aarch64-apple-darwin/release ruff
            shasum -a 256 $ARCHIVE_FILE > $ARCHIVE_FILE.sha256
      - name: "Upload binary"
        uses: actions/upload-artifact@v3
        with:
          name: binaries
          path: |
            *.tar.gz
            *.sha256

  windows:
    runs-on: windows-latest
    strategy:
      matrix:
        platform:
          - target: x86_64-pc-windows-msvc
            arch: x64
          - target: i686-pc-windows-msvc
            arch: x86
          - target: aarch64-pc-windows-msvc
            arch: x64
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: ${{ env.PYTHON_VERSION }}
          architecture: ${{ matrix.platform.arch }}
      - name: "Prep README.md"
        run: python scripts/transform_readme.py --target pypi
      - name: "Build wheels"
        uses: PyO3/maturin-action@v1
        with:
          target: ${{ matrix.platform.target }}
          args: --release --out dist
      - name: "Install built wheel"
        if: ${{ !startsWith(matrix.platform.target, 'aarch64') }}
        shell: bash
        run: |
          python -m pip install dist/${{ env.PACKAGE_NAME }}-*.whl --force-reinstall
      - name: "Upload wheels"
        uses: actions/upload-artifact@v3
        with:
          name: wheels
          path: dist
      - name: "Archive binary"
        shell: bash
        run: |
            ARCHIVE_FILE=ruff-${{ matrix.platform.target }}.zip
            7z a $ARCHIVE_FILE ./target/${{ matrix.platform.target }}/release/ruff.exe
            sha256sum $ARCHIVE_FILE > $ARCHIVE_FILE.sha256
      - name: "Upload binary"
        uses: actions/upload-artifact@v3
        with:
          name: binaries
          path: |
            *.zip
            *.sha256

  linux:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target:
          - x86_64-unknown-linux-gnu
          - i686-unknown-linux-gnu
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: ${{ env.PYTHON_VERSION }}
          architecture: x64
      - name: "Prep README.md"
        run: python scripts/transform_readme.py --target pypi
      - name: "Build wheels"
        uses: PyO3/maturin-action@v1
        with:
          target: ${{ matrix.target }}
          manylinux: auto
          args: --release --out dist
      - name: "Install built wheel"
        if: ${{ startsWith(matrix.target, 'x86_64') }}
        run: |
          pip install dist/${{ env.PACKAGE_NAME }}-*.whl --force-reinstall
      - name: "Upload wheels"
        uses: actions/upload-artifact@v3
        with:
          name: wheels
          path: dist
      - name: "Archive binary"
        run: |
            ARCHIVE_FILE=ruff-${{ matrix.target }}.tar.gz
            tar czvf $ARCHIVE_FILE -C target/${{ matrix.target }}/release ruff
            shasum -a 256 $ARCHIVE_FILE > $ARCHIVE_FILE.sha256
      - name: "Upload binary"
        uses: actions/upload-artifact@v3
        with:
          name: binaries
          path: |
            *.tar.gz
            *.sha256

  linux-cross:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        platform:
          - target: aarch64-unknown-linux-gnu
            arch: aarch64
          - target: armv7-unknown-linux-gnueabihf
            arch: armv7
          - target: s390x-unknown-linux-gnu
            arch: s390x
          - target: powerpc64le-unknown-linux-gnu
            arch: ppc64le
          - target: powerpc64-unknown-linux-gnu
            arch: ppc64
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: ${{ env.PYTHON_VERSION }}
      - name: "Prep README.md"
        run: python scripts/transform_readme.py --target pypi
      - name: "Build wheels"
        uses: PyO3/maturin-action@v1
        with:
          target: ${{ matrix.platform.target }}
          manylinux: auto
          args: --release --out dist
      - uses: uraimo/run-on-arch-action@v2
        if: matrix.platform.arch != 'ppc64'
        name: Install built wheel
        with:
          arch: ${{ matrix.platform.arch }}
          distro: ubuntu20.04
          githubToken: ${{ github.token }}
          install: |
            apt-get update
            apt-get install -y --no-install-recommends python3 python3-pip
            pip3 install -U pip
          run: |
            pip3 install ${{ env.PACKAGE_NAME }} --no-index --find-links dist/ --force-reinstall
      - name: "Upload wheels"
        uses: actions/upload-artifact@v3
        with:
          name: wheels
          path: dist
      - name: "Archive binary"
        run: |
            ARCHIVE_FILE=ruff-${{ matrix.platform.target }}.tar.gz
            tar czvf $ARCHIVE_FILE -C target/${{ matrix.platform.target }}/release ruff
            shasum -a 256 $ARCHIVE_FILE > $ARCHIVE_FILE.sha256
      - name: "Upload binary"
        uses: actions/upload-artifact@v3
        with:
          name: binaries
          path: |
            *.tar.gz
            *.sha256

  musllinux:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target:
          - x86_64-unknown-linux-musl
          - i686-unknown-linux-musl
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: ${{ env.PYTHON_VERSION }}
          architecture: x64
      - name: "Prep README.md"
        run: python scripts/transform_readme.py --target pypi
      - name: "Build wheels"
        uses: PyO3/maturin-action@v1
        with:
          target: ${{ matrix.target }}
          manylinux: musllinux_1_2
          args: --release --out dist
      - name: "Install built wheel"
        if: matrix.target == 'x86_64-unknown-linux-musl'
        uses: addnab/docker-run-action@v3
        with:
          image: alpine:latest
          options: -v ${{ github.workspace }}:/io -w /io
          run: |
            apk add py3-pip
            pip3 install ${{ env.PACKAGE_NAME }} --no-index --find-links /io/dist/ --force-reinstall
      - name: "Upload wheels"
        uses: actions/upload-artifact@v3
        with:
          name: wheels
          path: dist
      - name: "Archive binary"
        run: |
            ARCHIVE_FILE=ruff-${{ matrix.target }}.tar.gz
            tar czvf $ARCHIVE_FILE -C target/${{ matrix.target }}/release ruff
            shasum -a 256 $ARCHIVE_FILE > $ARCHIVE_FILE.sha256
      - name: "Upload binary"
        uses: actions/upload-artifact@v3
        with:
          name: binaries
          path: |
            *.tar.gz
            *.sha256

  musllinux-cross:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        platform:
          - target: aarch64-unknown-linux-musl
            arch: aarch64
          - target: armv7-unknown-linux-musleabihf
            arch: armv7
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: ${{ env.PYTHON_VERSION }}
      - name: "Prep README.md"
        run: python scripts/transform_readme.py --target pypi
      - name: "Build wheels"
        uses: PyO3/maturin-action@v1
        with:
          target: ${{ matrix.platform.target }}
          manylinux: musllinux_1_2
          args: --release --out dist
      - uses: uraimo/run-on-arch-action@v2
        name: Install built wheel
        with:
          arch: ${{ matrix.platform.arch }}
          distro: alpine_latest
          githubToken: ${{ github.token }}
          install: |
            apk add py3-pip
          run: |
            pip3 install ${{ env.PACKAGE_NAME }} --no-index --find-links dist/ --force-reinstall
      - name: "Upload wheels"
        uses: actions/upload-artifact@v3
        with:
          name: wheels
          path: dist
      - name: "Archive binary"
        run: |
            ARCHIVE_FILE=ruff-${{ matrix.platform.target }}.tar.gz
            tar czvf $ARCHIVE_FILE -C target/${{ matrix.platform.target }}/release ruff
            shasum -a 256 $ARCHIVE_FILE > $ARCHIVE_FILE.sha256
      - name: "Upload binary"
        uses: actions/upload-artifact@v3
        with:
          name: binaries
          path: |
            *.tar.gz
            *.sha256

  release:
    name: Release
    runs-on: ubuntu-latest
    needs:
      - macos-universal
      - macos-x86_64
      - windows
      - linux
      - linux-cross
      - musllinux
      - musllinux-cross
    if: "startsWith(github.ref, 'refs/tags/')"
    steps:
      - uses: actions/download-artifact@v3
        with:
          name: wheels
      - uses: actions/setup-python@v4
      - name: "Publish to PyPi"
        env:
          TWINE_USERNAME: __token__
          TWINE_PASSWORD: ${{ secrets.RUFF_TOKEN }}
        run: |
          pip install --upgrade twine
          twine upload --skip-existing *
      - name: "Update pre-commit mirror"
        run: |
          curl -X POST -H "Accept: application/vnd.github+json" -H "Authorization: Bearer ${{ secrets.RUFF_PRE_COMMIT_PAT }}" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/charliermarsh/ruff-pre-commit/dispatches --data '{"event_type": "pypi_release"}'
      - uses: actions/download-artifact@v3
        with:
          name: binaries
          path: binaries
      - name: Release
        uses: softprops/action-gh-release@v1
        with:
          files: binaries/*
