name: Test Cygwin

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

permissions:
  contents: read

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

jobs:
  build:
    runs-on: windows-latest
    strategy:
      fail-fast: false
      matrix:
        python-minor-version: [8, 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

      - name: Install Cygwin
        uses: cygwin/cygwin-install-action@v4
        with:
          platform: x86_64
          packages: >
            gcc-g++
            ghostscript
            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 }}-cffi
            python3${{ matrix.python-minor-version }}-cython
            python3${{ matrix.python-minor-version }}-devel
            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@v3
        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: Get latest NumPy version
        id: latest-numpy
        shell: bash.exe -eo pipefail -o igncr "{0}"
        run: |
          python3 -m pip list --outdated | grep numpy | sed -r 's/ +/ /g' | cut -d ' ' -f 3 | sed 's/^/version=/' >> $GITHUB_OUTPUT

      - name: pip cache
        uses: actions/cache@v3
        with:
          path: 'C:\cygwin\home\runneradmin\.cache\pip'
          key: ${{ runner.os }}-cygwin-pip3.${{ matrix.python-minor-version }}-numpy${{ steps.latest-numpy.outputs.version }}-${{ hashFiles('.ci/install.sh') }}
          restore-keys: |
            ${{ runner.os }}-cygwin-pip3.${{ matrix.python-minor-version }}-numpy${{ steps.latest-numpy.outputs.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: Upgrade NumPy
        shell: dash.exe -l "{0}"
        run: |
          python3 -m pip install -U "numpy<1.26"

      - 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

      - name: Upload coverage
        uses: codecov/codecov-action@v3
        with:
          file: ./coverage.xml
          flags: GHA_Cygwin
          name: Cygwin Python 3.${{ matrix.python-minor-version }}

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