name: Flatpak CI

on:
  push:
    branches:
    - master
    - flatpak-1.0.x
    - flatpak-1.2.x
    - flatpak-1.4.x
    - flatpak-1.6.x
    - flatpak-1.8.x
    - flatpak-1.10.x
  pull_request:
    paths-ignore:
    - README.md
    - NEWS
    - INSTALL
    - COPYING
    - CODE_OF_CONDUCT.md
    - uncrustify.cfg
    - uncrustify.sh
    branches:
    - master
    - flatpak-1.0.x
    - flatpak-1.2.x
    - flatpak-1.4.x
    - flatpak-1.6.x
    - flatpak-1.8.x
    - flatpak-1.10.x

jobs:
  check:
    name: Build with gcc and test
    runs-on: ubuntu-18.04
    steps:
    - name: Install Dependencies
      run: |
        sudo add-apt-repository ppa:alexlarsson/flatpak
        sudo add-apt-repository ppa:alexlarsson/glib260
        sudo add-apt-repository 'deb https://download.mono-project.com/repo/ubuntu stable-bionic main' # Needed for updates to work
        sudo apt-get update
        sudo apt-get install -y libglib2.0 attr automake gettext autopoint bison  dbus gtk-doc-tools \
        libfuse-dev ostree libostree-dev libarchive-dev libzstd-dev libcap-dev libattr1-dev libdw-dev libelf-dev python3-pyparsing \
        libjson-glib-dev shared-mime-info desktop-file-utils libpolkit-agent-1-dev libpolkit-gobject-1-dev \
        libseccomp-dev libsoup2.4-dev libsystemd-dev libxml2-utils libgpgme11-dev gobject-introspection \
        libgirepository1.0-dev libappstream-glib-dev libdconf-dev clang socat meson libdbus-1-dev e2fslibs-dev
    - name: Check out flatpak
      uses: actions/checkout@v1
      with:
        submodules: true
    - name: Build malcontent dependency
      run: |
        git clone --branch 0.4.0 --depth 1 --no-tags https://gitlab.freedesktop.org/pwithnall/malcontent.git ./malcontent
        pushd ./malcontent
        meson setup --prefix=/usr _build
        ninja -C _build
        sudo ninja -C _build install
        popd
    - name: Create logs dir
      run: mkdir test-logs
    - name: autogen.sh
      run: NOCONFIGURE=1 ./autogen.sh
    - name: configure
      # TODO: Enable gtk-doc builds
      run: |
        mkdir _build
        pushd _build
        ../configure  --enable-internal-checks --enable-asan
        popd
      env:
        CFLAGS: -O2 -Wp,-D_FORTIFY_SOURCE=2
    - name: Build flatpak
      run: make -C _build -j $(getconf _NPROCESSORS_ONLN)
    - name: Run tests
      # TODO: Build with -j (currently ends up with hangs in the tests)
      run: make -C _build check
      env:
        ASAN_OPTIONS: detect_leaks=0 # Right now we're not fully clean, but this gets us use-after-free etc
    - name: Collect overall test logs on failure
      if: failure()
      run: mv _build/test-suite.log test-logs/ || true
    - name: Collect individual test logs on cancel
      if: failure() || cancelled()
      run: mv _build/tests/*.log test-logs/ || true
    - name: Upload test logs
      uses: actions/upload-artifact@v1
      if: failure() || cancelled()
      with:
        name: test logs
        path: test-logs

  clang:
    name: Build with clang and analyze
    runs-on: ubuntu-18.04
    strategy:
      fail-fast: false
      matrix:
        language: [ 'cpp', 'python' ]
        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
        # Learn more:
        # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
    steps:
    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v1
      with:
        languages: ${{ matrix.language }}
        # If you wish to specify custom queries, you can do so here or in a config file.
        # By default, queries listed here will override any specified in a config file.
        # Prefix the list here with "+" to use these queries and those in the config file.
        # queries: ./path/to/local/query, your-org/your-repo/queries@main
    - name: Install Dependencies
      run: |
        sudo add-apt-repository ppa:alexlarsson/flatpak
        sudo add-apt-repository ppa:alexlarsson/glib260
        sudo add-apt-repository 'deb https://download.mono-project.com/repo/ubuntu stable-bionic main' # Needed for updates to work
        sudo apt-get update
        sudo apt-get install -y libglib2.0 attr automake gettext autopoint bison  dbus gtk-doc-tools \
        libfuse-dev ostree libostree-dev libarchive-dev libzstd-dev libcap-dev libattr1-dev libdw-dev libelf-dev python3-pyparsing \
        libjson-glib-dev shared-mime-info desktop-file-utils libpolkit-agent-1-dev libpolkit-gobject-1-dev \
        libseccomp-dev libsoup2.4-dev libsystemd-dev libxml2-utils libgpgme11-dev gobject-introspection \
        libgirepository1.0-dev libappstream-glib-dev libdconf-dev clang e2fslibs-dev
    - name: Check out flatpak
      uses: actions/checkout@v1
      with:
        submodules: true
    - name: configure
      run: ./autogen.sh  --enable-gtk-doc --enable-gtk-doc-html
      env:
        CC: clang
        CFLAGS: -Werror=unused-variable
    - name: Build flatpak
      run: make -j $(getconf _NPROCESSORS_ONLN)
    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v1

  xenial:
    name: Build with old glib
    runs-on: ubuntu-16.04
    steps:
    - name: Install Dependencies
      run: |
        sudo add-apt-repository ppa:alexlarsson/flatpak
        sudo add-apt-repository 'deb https://download.mono-project.com/repo/ubuntu stable-xenial main' # Needed for updates to work
        sudo apt-get update
        sudo apt-get install -y libglib2.0 attr automake gettext autopoint bison  dbus gtk-doc-tools \
        libfuse-dev ostree libostree-dev libarchive-dev libzstd-dev libcap-dev libattr1-dev libdw-dev libelf-dev python3-pyparsing \
        libjson-glib-dev shared-mime-info desktop-file-utils libpolkit-agent-1-dev libpolkit-gobject-1-dev \
        libseccomp-dev libsoup2.4-dev libsystemd-dev libxml2-utils libgpgme11-dev gobject-introspection \
        libgirepository1.0-dev libappstream-glib-dev libdconf-dev clang e2fslibs-dev
    - name: Check out flatpak
      uses: actions/checkout@v1
      with:
        submodules: true
    - name: configure
      run: ./autogen.sh
      env:
        CC: clang
        CFLAGS: -Werror=unused-variable
    - name: Build flatpak
      run: make -j $(getconf _NPROCESSORS_ONLN)

  valgrind:
    name: Run tests in valgrind
    needs: check # Don't run expensive test if main check fails
    runs-on: ubuntu-20.04 # Might as well test with a different one too
    steps:
    - name: Install Dependencies
      run: |
        sudo apt-get update
        sudo add-apt-repository 'deb https://download.mono-project.com/repo/ubuntu stable-focal main' # Needed for updates to work
        sudo apt-get install -y libglib2.0 attr automake gettext autopoint bison  dbus gtk-doc-tools \
        libfuse-dev ostree libostree-dev libarchive-dev libzstd-dev libcap-dev libattr1-dev libdw-dev libelf-dev python3-pyparsing \
        libjson-glib-dev shared-mime-info desktop-file-utils libpolkit-agent-1-dev libpolkit-gobject-1-dev \
        libseccomp-dev libsoup2.4-dev libsystemd-dev libxml2-utils libgpgme11-dev gobject-introspection \
        libgirepository1.0-dev libappstream-glib-dev libdconf-dev clang socat meson libdbus-1-dev \
        valgrind e2fslibs-dev
    - name: Check out flatpak
      uses: actions/checkout@v1
      with:
        submodules: true
    - name: Build ostree dependency
      run: |
        git clone --branch v2020.8 --depth 1 --no-tags https://github.com/ostreedev/ostree.git ./ostree
        pushd ./ostree
        ./autogen.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu --sysconfdir=/etc --localstatedir=/var
        make -j $(getconf _NPROCESSORS_ONLN)
        sudo make install
        popd
    - name: Create logs dir
      run: mkdir test-logs
    - name: autogen.sh
      run: NOCONFIGURE=1 ./autogen.sh
    - name: configure
      # TODO: Enable gtk-doc builds
      run: |
        mkdir _build
        pushd _build
        ../configure
        popd
      env:
        CFLAGS: -O2
    - name: Build flatpak
      run: make -C _build -j $(getconf _NPROCESSORS_ONLN)
    - name: Run tests
      run: make -C _build check
      env:
        FLATPAK_TESTS_VALGRIND: true
    - name: Collect overall test logs on failure
      if: failure()
      run: mv _build/test-suite.log test-logs/ || true
    - name: Collect individual test logs on cancel
      if: failure() || cancelled()
      run: mv _build/tests/*.log test-logs/ || true
    - name: Upload test logs
      uses: actions/upload-artifact@v1
      if: failure() || cancelled()
      with:
        name: test logs
        path: test-logs
