name: compile and test

on: [push, pull_request, workflow_dispatch]

jobs:
  pre_job:
    runs-on: ubuntu-latest
    outputs:
      should_skip: ${{ steps.skip_check.outputs.should_skip }}
    steps:
    - id: skip_check
      uses: fkirc/skip-duplicate-actions@v5
      with:
        # All of these options are optional, so you can remove them if you are happy with the defaults
        concurrent_skipping: 'same_content'
        do_not_skip: '["pull_request", "workflow_dispatch", "schedule"]'

  ubuntu-2004:
    needs: pre_job
    if: ${{ needs.pre_job.outputs.should_skip != 'true' }}

    runs-on: ubuntu-latest
    container: ghcr.io/kdab/hotspot-ubuntu20.04-dependencies

    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        submodules: recursive

    - name: Configure
      run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -G Ninja
          -DCMAKE_CXX_FLAGS_INIT="-g -fsanitize=address,undefined -Werror"
          -DCMAKE_C_FLAGS_INIT="-g -fsanitize=address,undefined -Werror"

    - name: Build
      run: cmake --build build

    - name: Test
      run: cd build && ctest --output-on-failure -E tst_perfdata

  ubuntu-2204:
    needs: pre_job
    if: ${{ needs.pre_job.outputs.should_skip != 'true' }}

    runs-on: ubuntu-latest
    container: ghcr.io/kdab/hotspot-ubuntu22.04-dependencies

    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        submodules: recursive

    - name: Configure
      run: cmake --preset dev-asan -DCMAKE_CXX_FLAGS_INIT=-Werror -DCMAKE_C_FLAGS_INIT=-Werror

    - name: Build
      run: cmake --build build-dev-asan

    - name: Test
      run: ctest --preset dev-asan

  archlinux-gcc:
    needs: pre_job
    if: ${{ needs.pre_job.outputs.should_skip != 'true' }}

    runs-on: ubuntu-latest
    container: ghcr.io/kdab/hotspot-archlinuxqt6-dependencies

    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        submodules: recursive

    - name: Configure
      run: cmake --preset dev-asan-qt6
           -DCMAKE_CXX_FLAGS_INIT=-Werror -DCMAKE_C_FLAGS_INIT=-Werror

    - name: Build
      run: cmake --build --preset dev-asan-qt6

    - name: Test
      run: ctest --preset dev-asan-qt6

  archlinux-clang-clazy:
    needs: pre_job
    if: ${{ needs.pre_job.outputs.should_skip != 'true' }}

    runs-on: ubuntu-latest
    container: ghcr.io/kdab/hotspot-archlinuxqt6-dependencies

    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        submodules: recursive

    - name: Configure
      run: cmake --preset dev-clazy-qt6

    - name: Build
      run: cmake --build --preset dev-clazy-qt6

    - name: Test
      run: ctest --preset dev-clazy-qt6

  archlinux-clang-tidy:
    needs: pre_job
    if: ${{ needs.pre_job.outputs.should_skip != 'true' }}

    runs-on: ubuntu-latest
    container: ghcr.io/kdab/hotspot-archlinuxqt6-dependencies

    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        submodules: recursive

    - name: Configure
      run: cmake --preset dev-clazy-qt6

    - name: Analyze
      # the first lines ensures all moc generated headers are available
      run: cd build-dev-clazy-qt6 &&
           ninja -t targets all | grep "mocs_compilation.cpp:" | cut -f1 -d':' | xargs ninja &&
           cd .. &&
           ./scripts/run_clang_tidy.sh build-dev-clazy-qt6 &&
           [ ! -s scripts/fixits/fixits.yaml ]

    - name: Upload Fixits
      if: always()
      uses: actions/upload-artifact@v4
      with:
        name: clang-tidy-fixits
        path: scripts/fixits/fixits.yaml

  archlinux-without-optional:
    needs: pre_job
    if: ${{ needs.pre_job.outputs.should_skip != 'true' }}

    runs-on: ubuntu-latest
    container: ghcr.io/kdab/hotspot-archlinuxwithoutoptionalqt6-dependencies

    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        submodules: recursive

    - name: Configure
      run: cmake --preset dev-asan-qt6 -DCMAKE_CXX_FLAGS_INIT=-Werror -DCMAKE_C_FLAGS_INIT=-Werror

    - name: Build
      run: cmake --build --preset dev-asan-qt6

    - name: Test
      run: ctest --preset dev-asan-qt6

  fedora42:
    needs: pre_job
    if: ${{ needs.pre_job.outputs.should_skip != 'true' }}

    runs-on: ubuntu-latest
    container: ghcr.io/kdab/hotspot-fedora42qt6-dependencies

    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        submodules: recursive

    - name: Configure
      run: cmake --preset dev-asan-qt6 -DCMAKE_CXX_FLAGS_INIT=-Werror -DCMAKE_C_FLAGS_INIT=-Werror

    - name: Build
      run: cmake --build --preset dev-asan-qt6

    - name: Test
      run: ctest --preset dev-asan-qt6

  opensuse-tumbleweed:
    needs: pre_job
    if: ${{ needs.pre_job.outputs.should_skip != 'true' }}

    runs-on: ubuntu-latest
    container: ghcr.io/kdab/hotspot-opensusetumbleweedqt6-dependencies

    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        submodules: recursive

    - name: Configure
      run: cmake --preset dev-asan-qt6 -DCMAKE_CXX_FLAGS_INIT=-Werror -DCMAKE_C_FLAGS_INIT=-Werror

    - name: Build
      run: cmake --build --preset dev-asan-qt6

    - name: Test
      run: ctest --preset dev-asan-qt6

  neon-qt6:
    needs: pre_job
    if: ${{ needs.pre_job.outputs.should_skip != 'true' }}

    runs-on: ubuntu-latest
    container: ghcr.io/kdab/hotspot-neonqt6-dependencies

    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        submodules: recursive

    - name: Configure
      run: cmake --preset dev-asan-qt6 -DCMAKE_CXX_FLAGS_INIT=-Werror -DCMAKE_C_FLAGS_INIT=-Werror

    - name: Build
      run: cmake --build --preset dev-asan-qt6

    - name: Test
      run: ctest --preset dev-asan-qt6
