# NOTE: This workflow was ported from Travis.
# Travis was using Ubuntu 14.04. Ubuntu 14.04 is not supportted by GitHub workflows. Ubuntu 20.04 is recommended.
# Travis was using Clang 3.6. The earliest version support by Ubuntu 20.04 is Clang 6.0.
# Travis was caching the clang package. APT package caching is not natively supported by GitHub actions/cache.
# Travis was using Mac OS X 10.13.6 / Xcode 9.4.1 / LLVM 9.1.0

# NOTE: The following documentation may be useful to maintainers of this workflow.
# Github actions: https://docs.github.com/en/actions
# Github github-script action: https://github.com/actions/github-script
# GitHub REST API: https://docs.github.com/en/rest
# Octokit front-end to the GitHub REST API: https://octokit.github.io/rest.js/v18
# Octokit endpoint methods: https://github.com/octokit/plugin-rest-endpoint-methods.js/tree/master/docs/repos

# TODO: Use actions/upload-artifact and actions/download-artifact to simplify deployment.
# TODO: Use composite actions to refactor redundant code.

name: Continuous Deployment

on:
    workflow_dispatch:
    push:
        branches:
            - main
        paths-ignore:
            - 'README.md'
            - 'README-spirv-remap.txt'
            - 'LICENSE.txt'
            - 'CODE_OF_CONDUCT.md'
            - 'BUILD.*'
            - 'WORKSPACE'
            - 'kokoro/*'
            - 'make-revision'
            - 'Android.mk'
            - '_config.yml'

permissions: read-all

jobs:
    linux:
        runs-on: ${{matrix.os.genus}}
        permissions:
            contents: write
        strategy:
            fail-fast: false
            matrix:
                os: [{genus: ubuntu-20.04, family: linux}]
                compiler: [{cc: clang, cxx: clang++}, {cc: gcc, cxx: g++}]
                cmake_build_type: [Debug, Release]
        steps:
            - uses: actions/checkout@v3
            - uses: lukka/get-cmake@latest
            - uses: actions/setup-python@v4
              with:
                  python-version: '3.7'
            - name: Install Ubuntu Package Dependencies
              run: |
                  sudo apt-get -qq update
                  sudo apt-get install -y clang-6.0
            - name: Install GoogleTest
              run: |
                  # check out pre-breakage version of googletest; can be deleted when
                  # issue 3128 is fixed
                  # git clone --depth=1 https://github.com/google/googletest.git External/googletest
                  mkdir -p External/googletest
                  cd External/googletest
                  git init
                  git remote add origin https://github.com/google/googletest.git
                  git fetch --depth 1 origin 0c400f67fcf305869c5fb113dd296eca266c9725
                  git reset --hard FETCH_HEAD
                  cd ../..
            - name: Update Glslang Sources
              run: |
                  ./update_glslang_sources.py
            - name: Build
              env:
                  CC: ${{matrix.compiler.cc}}
                  CXX: ${{matrix.compiler.cxx}}
              run: |
                  mkdir build && cd build
                  cmake -DCMAKE_BUILD_TYPE=${{matrix.cmake_build_type}} -DCMAKE_INSTALL_PREFIX=`pwd`/install ..
                  make -j4 install
            - name: Test
              run: |
                  cd build
                  ctest --output-on-failure &&
                  cd ../Test && ./runtests
            - name: Zip
              if: ${{ matrix.compiler.cc == 'clang' }}
              env:
                  ARCHIVE: glslang-main-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip
              run: |
                  cd build/install
                  zip ${ARCHIVE} \
                      bin/glslang \
                      bin/glslangValidator \
                      include/glslang/* \
                      include/glslang/**/* \
                      lib/libGenericCodeGen.a \
                      lib/libglslang.a \
                      lib/libglslang-default-resource-limits.a \
                      lib/libHLSL.a \
                      lib/libMachineIndependent.a \
                      lib/libOGLCompiler.a \
                      lib/libOSDependent.a \
                      lib/libSPIRV.a \
                      lib/libSPVRemapper.a \
                      lib/libSPIRV-Tools.a \
                      lib/libSPIRV-Tools-opt.a
            - name: Deploy
              if: ${{ matrix.compiler.cc == 'clang' }}
              env:
                  ARCHIVE: glslang-main-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip
              uses: actions/github-script@v6
              with:
                  script: |
                      const script = require('.github/workflows/deploy.js')
                      await script({github, context, core})

    macos:
        runs-on: ${{matrix.os.genus}}
        permissions:
            contents: write
        strategy:
            fail-fast: false
            matrix:
                os: [{genus: macos-11, family: osx}]
                compiler: [{cc: clang, cxx: clang++}]
                cmake_build_type: [Debug, Release]
        steps:
            - uses: actions/checkout@v3
            - uses: lukka/get-cmake@latest
            - uses: actions/setup-python@v4
              with:
                  python-version: '3.7'
            - name: Install GoogleTest
              run: |
                  # check out pre-breakage version of googletest; can be deleted when
                  # issue 3128 is fixed
                  # git clone --depth=1 https://github.com/google/googletest.git External/googletest
                  mkdir -p External/googletest
                  cd External/googletest
                  git init
                  git remote add origin https://github.com/google/googletest.git
                  git fetch --depth 1 origin 0c400f67fcf305869c5fb113dd296eca266c9725
                  git reset --hard FETCH_HEAD
                  cd ../..
            - name: Update Glslang Sources
              run: |
                  ./update_glslang_sources.py
            - name: Build
              env:
                  CC: ${{matrix.compiler.cc}}
                  CXX: ${{matrix.compiler.cxx}}
              run: |
                  mkdir build && cd build
                  cmake -DCMAKE_BUILD_TYPE=${{matrix.cmake_build_type}} -DCMAKE_INSTALL_PREFIX=`pwd`/install ..
                  make -j4 install
            - name: Test
              run: |
                  cd build
                  ctest --output-on-failure &&
                  cd ../Test && ./runtests
            - name: Zip
              env:
                  ARCHIVE: glslang-main-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip
              run: |
                  cd build/install
                  zip ${ARCHIVE} \
                      bin/glslang \
                      bin/glslangValidator \
                      include/glslang/* \
                      include/glslang/**/* \
                      lib/libGenericCodeGen.a \
                      lib/libglslang.a \
                      lib/libglslang-default-resource-limits.a \
                      lib/libHLSL.a \
                      lib/libMachineIndependent.a \
                      lib/libOGLCompiler.a \
                      lib/libOSDependent.a \
                      lib/libSPIRV.a \
                      lib/libSPVRemapper.a \
                      lib/libSPIRV-Tools.a \
                      lib/libSPIRV-Tools-opt.a
            - name: Deploy
              env:
                  ARCHIVE: glslang-main-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip
              uses: actions/github-script@v6
              with:
                  script: |
                      const script = require('.github/workflows/deploy.js')
                      await script({github, context, core})

    windows:
        runs-on: ${{matrix.os.genus}}
        permissions:
            contents: write
        strategy:
            fail-fast: false
            matrix:
                os: [{genus: windows-2019, family: windows}]
                cmake_build_type: [Debug, Release]
        steps:
            - uses: actions/checkout@v3
            - uses: lukka/get-cmake@latest
            - uses: actions/setup-python@v4
              with:
                  python-version: '3.7'
            - name: Install GoogleTest
              run: |
                  # check out pre-breakage version of googletest; can be deleted when
                  # issue 3128 is fixed
                  # git clone --depth=1 https://github.com/google/googletest.git External/googletest
                  mkdir -p External/googletest
                  cd External/googletest
                  git init
                  git remote add origin https://github.com/google/googletest.git
                  git fetch --depth 1 origin 0c400f67fcf305869c5fb113dd296eca266c9725
                  git reset --hard FETCH_HEAD
                  cd ../..
            - name: Update Glslang Sources
              run: |
                  python update_glslang_sources.py
            - name: Build
              run: |
                  cmake -S. -Bbuild -G "Visual Studio 16 2019" -A x64 -DCMAKE_INSTALL_PREFIX="$PWD/build/install"
                  cmake --build build --config ${{matrix.cmake_build_type}} --target install
            - name: Test
              run: |
                  cd build
                  ctest -C ${{matrix.cmake_build_type}} --output-on-failure
                  cd ../Test && bash runtests
            - name: Zip
              if: ${{ matrix.cmake_build_type == 'Debug' }}
              env:
                  ARCHIVE: glslang-master-${{matrix.os.family}}-Debug.zip
              run: |
                  cd build/install
                  7z a ${{env.ARCHIVE}} `
                      bin/glslang.exe `
                      bin/glslangValidator.exe `
                      bin/spirv-remap.exe `
                      include/glslang/* `
                      lib/GenericCodeGend.lib `
                      lib/glslangd.lib `
                      lib/glslang-default-resource-limitsd.lib `
                      lib/HLSLd.lib `
                      lib/MachineIndependentd.lib `
                      lib/OGLCompilerd.lib `
                      lib/OSDependentd.lib `
                      lib/SPIRVd.lib `
                      lib/SPVRemapperd.lib `
                      lib/SPIRV-Toolsd.lib `
                      lib/SPIRV-Tools-optd.lib
            - name: Zip
              if: ${{ matrix.cmake_build_type == 'Release' }}
              env:
                  ARCHIVE: glslang-master-${{matrix.os.family}}-Release.zip
              run: |
                  cd build/install
                  7z a ${{env.ARCHIVE}} `
                      bin/glslang.exe `
                      bin/glslangValidator.exe `
                      bin/spirv-remap.exe `
                      include/glslang/* `
                      lib/GenericCodeGen.lib `
                      lib/glslang.lib `
                      lib/glslang-default-resource-limits.lib `
                      lib/HLSL.lib `
                      lib/MachineIndependent.lib `
                      lib/OGLCompiler.lib `
                      lib/OSDependent.lib `
                      lib/SPIRV.lib `
                      lib/SPVRemapper.lib `
                      lib/SPIRV-Tools.lib `
                      lib/SPIRV-Tools-opt.lib
            - name: Deploy
              env:
                  ARCHIVE: glslang-master-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip
              uses: actions/github-script@v6
              with:
                  script: |
                      const script = require('.github/workflows/deploy.js')
                      await script({github, context, core})
