name: cygwin

on:
 push:
   # since master is a symbolic reference to main, don't run for both
   branches-ignore:
     - 'master'
   tags:
     - '*'

jobs:
  fedora-build:
    runs-on: ubuntu-latest
    container: fedora:latest
    strategy:
      fail-fast: false
      matrix:
        include:
        - target: x86_64-pc-cygwin
          pkgarch: 64
    name: Fedora cross ${{ matrix.target }}

    env:
      HAS_SSH_KEY: ${{ secrets.SSH_KEY != '' }}

    steps:
    - uses: actions/checkout@v3

    # install build tools
    - name: Install build tools
      run: |
        dnf install -y autoconf automake make patch perl mingw${{ matrix.pkgarch }}-gcc-c++ mingw${{ matrix.pkgarch }}-winpthreads-static mingw${{ matrix.pkgarch }}-zlib-static

    # enable 'dnf copr'
    - name: Enable 'dnf copr'
      run: |
        dnf install -y dnf-plugins-core

    # install cross-cygwin toolchain and libs from copr
    - name: Install cross-cygwin toolchain and libs and cocom from copr
      run: |
        dnf copr enable -y yselkowitz/cygwin
        dnf install -y cygwin${{ matrix.pkgarch }}-gcc-c++ cygwin${{ matrix.pkgarch }}-gettext cygwin${{ matrix.pkgarch }}-libbfd cygwin${{ matrix.pkgarch }}-libiconv cygwin${{ matrix.pkgarch }}-zlib cocom

    # install doc tools
    - name: Install doc tools
      run: |
        dnf install -y dblatex docbook2X docbook-xsl xmlto python3 python3-lxml python3-ply openssh-clients
        fmtutil-sys --byfmt pdflatex && texhash

    # build
    - name: Configure, build and install
      run: |
        mkdir build install
        (cd winsup && ./autogen.sh)
        (cd build && ../configure --target=${{ matrix.target }} --prefix=$(realpath $(pwd)/../install) )
        make -C build
        make -C build/*/newlib info man
        make -C build install
        make -C build/*/newlib install-info install-man

    # deploy documentation
    - name: Deploy documentation
      env:
        SSH_AUTH_SOCK: /tmp/ssh_agent.sock
      run: |
        # pushes to main are deployed as preview
        # pushes to cygwin-n.n.n (but not 'cygwin-n.n.n.dev') tags are deployed as stable
        # other references are ignored by this step
        case "${{ github.ref }}" in
          refs/heads/main)
            DEST='preview'
            ;;
          refs/tags/cygwin-[0-9.]*)
            DEST='stable'
            ;;
          *)
            exit 0
            ;;
        esac
        # unfuck github fuckery of HOME in a container
        unset HOME
        # add the hosts public key to known_hosts
        mkdir -p ~/.ssh/
        echo "cygwin.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKoejTnTCbXaIIMYfbX7t4tYUOQ2bTxZC3e/td3BageF" >> ~/.ssh/known_hosts
        # load the key (restricted to scp only) into ssh-agent
        ssh-agent -a $SSH_AUTH_SOCK > /dev/null
        ssh-add - <<< "${{ secrets.SSH_KEY }}"
        # 'make install' doesn't install faq, so instead just deploy from build directory
        scp -pr build/*/winsup/doc/{cygwin-api,cygwin-ug-net,faq} cygwin-admin@cygwin.com:/sourceware/www/sourceware/htdocs/cygwin/doc/${DEST}/
      if: env.HAS_SSH_KEY == 'true'

  windows-build:
    runs-on: windows-latest
    strategy:
      fail-fast: false
      matrix:
        include:
        - target: x86_64-pc-cygwin
          pkgarch: x86_64
    name: Windows native ${{ matrix.pkgarch }}

    steps:
    # checkout action uses the native git (we can avoid this messing up line
    # endings, but this could still be dangerous e.g if we need symlinks in the
    # repo)
    - run: git config --global core.autocrlf input
    - uses: actions/checkout@v3

    # install cygwin and build tools
    - name: Install Cygwin
      uses: cygwin/cygwin-install-action@master
      with:
        platform: ${{ matrix.pkgarch }}
        packages: >-
          autoconf,
          automake,
          busybox,
          cocom,
          cygutils-extra,
          dblatex,
          dejagnu,
          docbook-xml45,
          docbook-xsl,
          docbook2X,
          gcc-g++,
          gettext-devel,
          libiconv,
          libiconv-devel,
          libzstd-devel,
          make,
          mingw64-${{ matrix.pkgarch }}-gcc-g++,
          mingw64-${{ matrix.pkgarch }}-zlib,
          patch,
          perl,
          python39-lxml,
          python39-ply,
          texlive-collection-fontsrecommended,
          texlive-collection-latexrecommended,
          texlive-collection-pictures,
          xmlto,
          zlib-devel

    # build
    - name: Build Cygwin
      run: >-
        export PATH=/usr/bin:$(cygpath ${SYSTEMROOT})/system32 &&
        mkdir build install &&
        (cd winsup; ./autogen.sh) &&
        cd build &&
        ../configure --prefix=$(realpath $(pwd)/../install) -v &&
        export MAKEFLAGS=-j$(nproc) &&
        make &&
        make install &&
        (cd */newlib; make info man) &&
        (cd */newlib; make install-info install-man)
      shell: C:\cygwin\bin\bash.exe --noprofile --norc -eo pipefail '{0}'

    # test
    - name: Test Cygwin
      run: >-
        export PATH=/usr/bin:$(cygpath ${SYSTEMROOT})/system32 &&
        export MAKEFLAGS=-j$(nproc) &&
        cd build &&
        (export PATH=${{ matrix.target }}/winsup/testsuite/testinst/bin:${PATH} && cmd /c $(cygpath -wa ${{ matrix.target }}/winsup/cygserver/cygserver) &) &&
        (cd ${{ matrix.target }}/winsup; make check AM_COLOR_TESTS=always)
      shell: C:\cygwin\bin\bash.exe --noprofile --norc -eo pipefail '{0}'

    # upload test logs to facilitate investigation of problems
    - name: Upload test logs
      uses: actions/upload-artifact@v3
      with:
        name: testlogs
        path: |
          build/${{ matrix.target }}/winsup/testsuite/**/*.log
          build/${{ matrix.target }}/winsup/testsuite/**/*.trs
      if: ${{ !cancelled() }}

    # workaround problems with actions/checkout post-run step using cygwin git
    - name: Avoid actions/checkout post-run step using Cygwin git
      run: bash -c 'rm /usr/bin/git.exe'
