name: test-cygwin

on: [push, pull_request, workflow_dispatch]

permissions:
  contents: read

jobs:
  test:
    strategy:
      matrix:
        selection: [fast, perf]
        include:
        - selection: fast
          additional-pytest-args: --ignore=test/performance
        - selection: perf
          additional-pytest-args: test/performance

      fail-fast: false

    runs-on: windows-latest

    env:
      CHERE_INVOKING: "1"
      CYGWIN_NOWINPATH: "1"

    defaults:
      run:
        shell: C:\cygwin\bin\bash.exe --login --norc -eo pipefail -o igncr "{0}"

    steps:
    - name: Force LF line endings
      run: |
        git config --global core.autocrlf false  # Affects the non-Cygwin git.
      shell: pwsh  # Do this outside Cygwin, to affect actions/checkout.

    - uses: actions/checkout@v6
      with:
        fetch-depth: 0

    - name: Install Cygwin
      uses: cygwin/cygwin-install-action@v6
      with:
        packages: git python39 python-pip-wheel python-setuptools-wheel python-wheel-wheel
        add-to-path: false  # No need to change $PATH outside the Cygwin environment.

    - name: Arrange for verbose output
      run: |
        # Arrange for verbose output but without shell environment setup details.
        echo 'set -x' >~/.bash_profile

    - name: Special configuration for Cygwin git
      run: |
        git config --global --add safe.directory "$(pwd)"
        git config --global --add safe.directory "$(pwd)/.git"
        git config --global core.autocrlf false

    - name: Prepare this repo for tests
      run: |
        ./init-tests-after-clone.sh

    - name: Set git user identity and command aliases for the tests
      run: |
        git config --global user.email "travis@ci.com"
        git config --global user.name "Travis Runner"
        # If we rewrite the user's config by accident, we will mess it up
        # and cause subsequent tests to fail
        cat test/fixtures/.gitconfig >> ~/.gitconfig

    - name: Set up virtual environment
      run: |
        python3.9 -m venv .venv
        echo 'BASH_ENV=.venv/bin/activate' >>"$GITHUB_ENV"

    - name: Update PyPA packages
      run: |
        python -m pip install -U pip 'setuptools; python_version<"3.12"' wheel

    - name: Install project and test dependencies
      run: |
        pip install '.[test]'

    - name: Show version and platform information
      run: |
        uname -a
        command -v git python
        git version
        python --version
        python -c 'import os, sys; print(f"sys.platform={sys.platform!r}, os.name={os.name!r}")'

    - name: Test with pytest (${{ matrix.additional-pytest-args }})
      run: |
        pytest --color=yes -p no:sugar --instafail -vv ${{ matrix.additional-pytest-args }}
