name: Test Cygwin

on:
  push:
    branches:
      - "**"
    paths-ignore:
      - ".github/workflows/docs.yml"
      - ".github/workflows/wheels*"
      - ".gitmodules"
      - "docs/**"
      - "wheels/**"
  pull_request:
    paths-ignore:
      - ".github/workflows/docs.yml"
      - ".github/workflows/wheels*"
      - ".gitmodules"
      - "docs/**"
      - "wheels/**"
  workflow_dispatch:

permissions:
  contents: read

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

env:
  COVERAGE_CORE: sysmon

jobs:
  build:
    runs-on: windows-latest
    strategy:
      fail-fast: false
      matrix:
        python-minor-version: [9]

    timeout-minutes: 40

    name: Python 3.${{ matrix.python-minor-version }}

    steps:
      - name: Fix line endings
        run: |
          git config --global core.autocrlf input

      - name: Checkout Pillow
        uses: actions/checkout@v4
        with:
          persist-credentials: false

      - name: Install Cygwin
        uses: cygwin/cygwin-install-action@v5
        with:
          packages: >
            gcc-g++
            ghostscript
            git
            ImageMagick
            jpeg
            libfreetype-devel
            libimagequant-devel
            libjpeg-devel
            liblapack-devel
            liblcms2-devel
            libopenjp2-devel
            libraqm-devel
            libtiff-devel
            libwebp-devel
            libxcb-devel
            libxcb-xinerama0
            make
            netpbm
            perl
            python3${{ matrix.python-minor-version }}-cython
            python3${{ matrix.python-minor-version }}-devel
            python3${{ matrix.python-minor-version }}-ipython
            python3${{ matrix.python-minor-version }}-numpy
            python3${{ matrix.python-minor-version }}-sip
            python3${{ matrix.python-minor-version }}-tkinter
            wget
            xorg-server-extra
            zlib-devel

      - name: Add Lapack to PATH
        uses: egor-tensin/cleanup-path@v4
        with:
          dirs: 'C:\cygwin\bin;C:\cygwin\lib\lapack'

      - name: Select Python version
        run: |
          ln -sf c:/cygwin/bin/python3.${{ matrix.python-minor-version }} c:/cygwin/bin/python3

      - name: pip cache
        uses: actions/cache@v4
        with:
          path: 'C:\cygwin\home\runneradmin\.cache\pip'
          key: ${{ runner.os }}-cygwin-pip3.${{ matrix.python-minor-version }}-${{ hashFiles('.ci/install.sh') }}
          restore-keys: |
            ${{ runner.os }}-cygwin-pip3.${{ matrix.python-minor-version }}-

      - name: Build system information
        run: |
          dash.exe -c "python3 .github/workflows/system-info.py"

      - name: Install dependencies
        run: |
          bash.exe .ci/install.sh

      - name: Build
        shell: bash.exe -eo pipefail -o igncr "{0}"
        run: |
          .ci/build.sh

      - name: Test
        run: |
          bash.exe xvfb-run -s '-screen 0 1024x768x24' .ci/test.sh

      - name: Prepare to upload errors
        if: failure()
        run: |
          dash.exe -c "mkdir -p Tests/errors"

      - name: Upload errors
        uses: actions/upload-artifact@v4
        if: failure()
        with:
          name: errors
          path: Tests/errors

      - name: After success
        run: |
          bash.exe .ci/after_success.sh
          rm C:\cygwin\bin\bash.EXE

      - name: Upload coverage
        uses: codecov/codecov-action@v5
        with:
          files: ./coverage.xml
          flags: GHA_Cygwin
          name: Cygwin Python 3.${{ matrix.python-minor-version }}
          token: ${{ secrets.CODECOV_ORG_TOKEN }}

  success:
    permissions:
      contents: none
    needs: build
    runs-on: ubuntu-latest
    name: Cygwin Test Successful
    steps:
      - name: Success
        run: echo Cygwin Test Successful