#
# https://docs.github.com/en/actions
# https://github.com/actions
#
# mac: https://brew.sh/
# win: https://www.msys2.org/docs/package-management/
# win: https://www.archlinux.org/pacman/pacman.8.html
#

name: CI

on:
  pull_request: {}
  push: {}

jobs:

  unix:
    name: ${{matrix.test.os}}, pg-${{matrix.test.pgver}}
    runs-on: ${{matrix.test.os}}
    strategy:
      matrix:
        test:
          - {pgver: "9.4", os: "ubuntu-22.04", "repo": "pgdg"}
          - {pgver: "9.5", os: "ubuntu-22.04", "repo": "pgdg"}
          - {pgver: "9.6", os: "ubuntu-22.04", "repo": "pgdg"}
          - {pgver: "10", os: "ubuntu-20.04", "repo": "pgdg"}
          - {pgver: "11", os: "ubuntu-20.04", "repo": "pgdg"}
          - {pgver: "12", os: "ubuntu-20.04", "repo": "pgdg"}
          - {pgver: "13", os: "ubuntu-22.04", "repo": "pgdg"}
          - {pgver: "14", os: "ubuntu-22.04", "repo": "pgdg"}
          - {pgver: "15", os: "ubuntu-22.04", "repo": "pgdg"}
          - {pgver: "16", os: "ubuntu-22.04", "repo": "pgdg"}
          - {pgver: "14", os: "macos-latest"}
    steps:
      - name: "Checkout"
        uses: actions/checkout@v3

      - name: "InstallDB / Linux"
        if: ${{runner.os == 'Linux'}}
        run: |
          echo "::group::apt-get-update"
          sudo -nH apt-get -q update
          sudo -nH apt-get -q install curl ca-certificates gnupg
          curl https://www.postgresql.org/media/keys/ACCC4CF8.asc \
          | gpg --dearmor \
          | sudo -nH tee /etc/apt/trusted.gpg.d/apt.postgresql.org.gpg
          repo="$(lsb_release -cs)-${{matrix.test.repo}}"
          echo "deb https://apt.postgresql.org/pub/repos/apt/ ${repo} main ${{matrix.test.pgver}}" \
          | sudo tee /etc/apt/sources.list.d/pgdg.list
          sudo -nH apt-get -q update
          echo "::endgroup::"

          echo "::group::apt-get-install"

          # disable new cluster creation
          sudo -nH mkdir -p /etc/postgresql-common/createcluster.d
          echo "create_main_cluster = false" | sudo -nH tee /etc/postgresql-common/createcluster.d/no-main.conf

          sudo -nH apt-get -qyu install \
            postgresql-${{matrix.test.pgver}} \
            postgresql-server-dev-${{matrix.test.pgver}} \
            libpq-dev patchutils
          echo "::endgroup::"

          # tune environment
          echo "/usr/lib/postgresql/${{matrix.test.pgver}}/bin" >> $GITHUB_PATH
          echo "PGHOST=/tmp" >> $GITHUB_ENV
          echo "SED=sed" >> $GITHUB_ENV

      - name: "InstallDB / MacOS"
        if: ${{runner.os == 'macOS'}}
        run: |
          brew install gnu-sed postgresql@${{matrix.test.pgver}}
          echo "/usr/local/opt/postgresql@${{matrix.test.pgver}}/bin" >> $GITHUB_PATH
          echo "SED=gsed" >> $GITHUB_ENV

      - name: "Build"
        run: make

      - name: "Install"
        run: sudo -nH bash -c "PATH='${PATH}' make install"

      - name: "StartDB"
        run: |
          rm -rf data log
          mkdir -p log
          LANG=C initdb data
          ${SED} -r -i -e "s,^[# ]*(unix_socket_directories).*,\\1='/tmp'," data/postgresql.conf
          pg_ctl -D data -l log/pg.log start || { cat log/pg.log ; exit 1; }
          sleep 2

      - name: "Test"
        run: make citest

      - name: "StopDB"
        run: |
          pg_ctl -D data stop
          rm -rf data log /tmp/.s.PGSQL*

  mingw:
    name: ${{matrix.test.os}}, ${{matrix.test.mingw}}
    runs-on: ${{matrix.test.os}}
    strategy:
      matrix:
        test:
          #- {os: "windows-latest", arch: "i686", mingw: "mingw32", bits: "32"}
          - {os: "windows-latest", arch: "x86_64", mingw: "mingw64", bits: "64"}
    steps:
      - name: "Checkout"
        uses: actions/checkout@v3

      - name: "Setup MSYS"
        shell: cmd
        run: |
          echo C:\msys64\usr\bin>> %GITHUB_PATH%
          echo C:\msys64\${{matrix.test.mingw}}\bin>> %GITHUB_PATH%

      - name: "InstallDB / mingw / ${{matrix.test.arch}}"
        shell: bash
        run: |
          # install
          pacman -S --noconfirm --needed \
            mingw-w64-${{matrix.test.arch}}-gettext \
            mingw-w64-${{matrix.test.arch}}-postgresql
          INCDIR=$(pg_config --includedir)
          PG_CPPFLAGS="-I${INCDIR}"
          PG_CPPFLAGS="${PG_CPPFLAGS} -fstack-check=no -fno-stack-protector"  # enabled by default but broken
          #case ${{matrix.test.arch}} in
          #i686) PG_CFLAGS="-m32";;
          #x86_64) PG_CFLAGS="-m64";;
          #esac
          #echo "PG_CFLAGS=${PG_CFLAGS}" >> $GITHUB_ENV
          #echo "PG_CFLAGS=${PG_CFLAGS}"
          echo "PG_CPPFLAGS=${PG_CPPFLAGS}" >> $GITHUB_ENV
          echo "PG_CPPFLAGS=${PG_CPPFLAGS}"
          echo "PATH=$PATH"

      - name: "Build"
        shell: bash
        run: |
          make

      - name: "Install"
        shell: bash
        run: |
          make install

      - name: "StartDB"
        shell: bash
        run: |
          mkdir log
          initdb.exe --no-locale -U postgres -D data
          pg_ctl -D data -l log/pg.log start || { cat log/pg.log ; exit 1; }
          sleep 3

      - name: "Test"
        shell: bash
        run: make citest

      - name: "StopDB"
        shell: bash
        run: |
          pg_ctl -D data stop

