name: GitHub CI

on:
  push:
    branches:
      - '*'
  pull_request:

env:
  VCVARSALL: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat

  # Interfaces
  # Lua
  LUA_VER: 54
  LUA_VER_DOT: '5.4'
  LUA_RELEASE: 5.4.0
  LUA32_URL: https://downloads.sourceforge.net/luabinaries/lua-%LUA_RELEASE%_Win32_dllw6_lib.zip
  LUA64_URL: https://downloads.sourceforge.net/luabinaries/lua-%LUA_RELEASE%_Win64_dllw6_lib.zip
  LUA_DIR: D:\Lua
  # Python 2
  PYTHON_VER: 27
  PYTHON_VER_DOT: '2.7'
  # Python 3
  PYTHON3_VER: 38
  PYTHON3_VER_DOT: '3.8'

  # Other dependencies
  # winpty
  WINPTY_URL: https://github.com/rprichard/winpty/releases/download/0.4.3/winpty-0.4.3-msvc2015.zip

  # Escape sequences
  COL_RED: "\x1b[31m"
  COL_GREEN: "\x1b[32m"
  COL_YELLOW: "\x1b[33m"
  COL_RESET: "\x1b[m"

jobs:
  build:
    runs-on: windows-latest

    strategy:
      matrix:
        toolchain: [msvc, mingw]
        arch: [x64, x86]
        features: [HUGE, NORMAL]
        include:
          - arch: x64
            vcarch: amd64
            warch: x64
            bits: 64
            msystem: MINGW64
            cygreg: registry
            pyreg: ""
          - arch: x86
            vcarch: x86
            warch: ia32
            bits: 32
            msystem: MINGW32
            cygreg: registry32
            pyreg: "-32"
        exclude:
          - toolchain: msvc
            arch: x64
            features: NORMAL
          - toolchain: mingw
            arch: x86
            features: NORMAL

    steps:
    - name: Initalize
      id: init
      shell: bash
      run: |
        git config --global core.autocrlf input
        python_dir=$(cat "/proc/${{ matrix.cygreg }}/HKEY_LOCAL_MACHINE/SOFTWARE/Python/PythonCore/${PYTHON_VER_DOT}/InstallPath/@")
        python3_dir=$(cat "/proc/${{ matrix.cygreg }}/HKEY_LOCAL_MACHINE/SOFTWARE/Python/PythonCore/${PYTHON3_VER_DOT}${{ matrix.pyreg }}/InstallPath/@")
        echo "::set-env name=PYTHON_DIR::$python_dir"
        echo "::set-env name=PYTHON3_DIR::$python3_dir"

    - uses: msys2/setup-msys2@v2
      if: matrix.toolchain == 'mingw'
      with:
        msystem: ${{ matrix.msystem }}
        release: false

    - uses: actions/checkout@v2

    - name: Create a list of download URLs
      shell: cmd
      run: |
        type NUL > urls.txt
        echo %LUA_RELEASE%>> urls.txt
        echo %WINPTY_URL%>> urls.txt

    - name: Cache downloaded files
      uses: actions/cache@v2
      with:
        path: downloads
        key: ${{ runner.os }}-${{ matrix.bits }}-${{ hashFiles('urls.txt') }}

    - name: Download dependencies
      shell: cmd
      run: |
        path C:\Program Files\7-Zip;%path%
        if not exist downloads mkdir downloads

        echo %COL_GREEN%Download Lua%COL_RESET%
        call :downloadfile %LUA${{ matrix.bits }}_URL% downloads\lua.zip
        7z x downloads\lua.zip -o%LUA_DIR% > nul || exit 1

        echo %COL_GREEN%Download winpty%COL_RESET%
        call :downloadfile %WINPTY_URL% downloads\winpty.zip
        7z x -y downloads\winpty.zip -oD:\winpty > nul || exit 1
        copy /Y D:\winpty\${{ matrix.warch }}\bin\winpty.dll        src\winpty${{ matrix.bits }}.dll
        copy /Y D:\winpty\${{ matrix.warch }}\bin\winpty-agent.exe  src\

        goto :eof

        :downloadfile
        :: call :downloadfile <URL> <localfile>
        if not exist %2 (
          curl -f -L %1 -o %2
        )
        if ERRORLEVEL 1 (
          rem Retry once.
          curl -f -L %1 -o %2 || exit 1
        )
        goto :eof

    - name: Copy src directory to src2
      shell: cmd
      run: |
        xcopy src src2\ /E > nul

    - name: Build (MSVC)
      if: matrix.toolchain == 'msvc'
      shell: cmd
      run: |
        call "%VCVARSALL%" ${{ matrix.vcarch }}
        cd src
        :: Filter out the progress bar from the build log
        sed -e "s/@<<$/@<< | sed -e 's#.*\\\\r.*##'/" Make_mvc.mak > Make_mvc2.mak
        if "${{ matrix.features }}"=="HUGE" (
          nmake -nologo -f Make_mvc2.mak ^
            FEATURES=${{ matrix.features }} ^
            GUI=yes IME=yes ICONV=yes VIMDLL=yes ^
            DYNAMIC_LUA=yes LUA=%LUA_DIR% ^
            DYNAMIC_PYTHON=yes PYTHON=%PYTHON_DIR% ^
            DYNAMIC_PYTHON3=yes PYTHON3=%PYTHON3_DIR%
        ) else (
          nmake -nologo -f Make_mvc2.mak ^
            FEATURES=${{ matrix.features }} ^
            GUI=yes IME=yes ICONV=yes VIMDLL=yes
        )
        if not exist vim${{ matrix.bits }}.dll (
          echo %COL_RED%Build failure.%COL_RESET%
          exit 1
        )

    - name: Build (MinGW)
      if: matrix.toolchain == 'mingw'
      shell: msys2 {0}
      run: |
        cd src
        if [ "${{ matrix.features }}" = "HUGE" ]; then
          mingw32-make -f Make_ming.mak -j2 \
            FEATURES=${{ matrix.features }} \
            GUI=yes IME=yes ICONV=yes VIMDLL=yes \
            DYNAMIC_LUA=yes LUA=${LUA_DIR} \
            DYNAMIC_PYTHON=yes PYTHON=${PYTHON_DIR} \
            DYNAMIC_PYTHON3=yes PYTHON3=${PYTHON3_DIR} \
            STATIC_STDCPLUS=yes
        else
          mingw32-make -f Make_ming.mak -j2 \
            FEATURES=${{ matrix.features }} \
            GUI=yes IME=yes ICONV=yes VIMDLL=yes \
            STATIC_STDCPLUS=yes
        fi

#    - name: Prepare Artifact
#      shell: cmd
#      run: |
#        mkdir artifacts
#        copy src\*vim.exe artifacts
#        copy src\vim*.dll artifacts
#
#    - name: Upload Artifact
#      uses: actions/upload-artifact@v1
#      with:
#        name: vim${{ matrix.bits }}-${{ matrix.toolchain }}
#        path: ./artifacts

    - name: Test
      shell: cmd
      timeout-minutes: 20
      run: |
        PATH %LUA_DIR%;C:\msys64\${{ matrix.msystem }}\bin;%PATH%;%PYTHON3_DIR%
        call "%VCVARSALL%" ${{ matrix.vcarch }}
        cd src
        echo.
        echo %COL_GREEN%vim version:%COL_RESET%
        .\vim --version || exit 1

        echo %COL_GREEN%Start testing vim in background.%COL_RESET%
        start cmd /c "cd ..\src2\testdir & nmake -nologo -f Make_dos.mak VIMPROG=..\..\src\vim > nul & echo done>done.txt"

        echo %COL_GREEN%Test gvim:%COL_RESET%
        cd testdir
        nmake -nologo -f Make_dos.mak VIMPROG=..\gvim || exit 1
        cd ..

        echo %COL_GREEN%Wait for vim tests to finish.%COL_RESET%
        cd ..\src2\testdir
        :: Wait about 10 minutes.
        for /L %%i in (1,1,60) do (
          if exist done.txt goto exitloop
          timeout 10
        )
        set timeout=1
        :exitloop

        echo %COL_GREEN%Test results of vim:%COL_RESET%
        if exist messages type messages
        nmake -nologo -f Make_dos.mak report VIMPROG=..\..\src\vim || exit 1
        if "%timeout%"=="1" (
          echo %COL_RED%Timed out.%COL_RESET%
          exit 1
        )
