# vim: set expandtab shiftwidth=2 tabstop=8 textwidth=0 filetype=yaml:
#
# This CI uses the freedesktop.org ci-templates.
# Please see the ci-templates documentation for details:
# https://freedesktop.pages.freedesktop.org/ci-templates/

.templates_sha: &template_sha c5626190ec14b475271288dda7a7dae8dbe0cd76 # see https://docs.gitlab.com/ee/ci/yaml/#includefile

# FDO_DISTRIBUTION_TAG is the tag of the docker image used for the build jobs.
# If the image doesn't exist yet, the docker-image stage generates it.
#
# In order to generate a new image, one should generally change the tag.
# While removing the image from the registry would also work, that's not
# recommended except for ephemeral images during development: Replacing an
# image after a significant amount of time might pull in newer versions of
# gcc/clang or other packages, which might break the build with older commits
# using the same tag.
variables:
    FDO_UPSTREAM_REPO: xorg/xserver
    FDO_DISTRIBUTION_VERSION: bullseye-slim
    FDO_DISTRIBUTION_EXEC: 'env FDO_CI_CONCURRENT=${FDO_CI_CONCURRENT} bash .gitlab-ci/debian-install.sh'
    FDO_DISTRIBUTION_TAG: "2024-08-23-fix-cross"
    MESON_BUILDDIR: "build"

include:
  - project: 'freedesktop/ci-templates'
    ref: *template_sha
    file:
      - '/templates/debian.yml'
      - '/templates/ci-fairy.yml'
  - template: Security/SAST.gitlab-ci.yml

stages:
    - docker-image
    - build-and-test
    - drivers
    - test

.ci-run-policy:
  # Retry jobs after runner system failures
  retry:
    max: 2
    when:
      - runner_system_failure
  # Cancel CI run if a newer commit is pushed to the same branch
  interruptible: true

# This is everything but the DDXen
.dix_paths: &dix_paths
  # Directories
  - .gitlab-ci/**/*
  - composite/**/*
  - config/**/*
  - damageext/**/*
  - dbe/**/*
  - dix/**/*
  - doc/**/*
  - dri3/**/*
  - exa/**/*
  - fb/**/*
  - glamor/**/*
  - glx/**/*
  - include/**/*
  - m4/**/*
  - man/**/*
  - mi/**/*
  - miext/**/*
  - os/**/*
  - present/**/*
  - pseudoramiX/**/*
  - randr/**/*
  - record/**/*
  - render/**/*
  - test/**/*
  - Xext/**/*
  - xfixes/**/*
  - Xi/**/*
  - xkb/**/*
  # Files
  - hw/meson.build
  - .gitlab-ci.yml
  - meson*
  - xorg-server.m4
  - xorg-server.pc.in
  - xserver.ent.in

.xorg_paths: &xorg_paths
  - hw/xfree86/**/*

.xwayland_paths: &xwayland_paths
  - hw/xwayland/**/*

.all_ddx_paths:
  - hw/**/*

debian-bullseye:
  extends:
    - .fdo.container-build@debian
    - .ci-run-policy
  stage: docker-image
  variables:
    GIT_STRATEGY: none

.common-build-and-test:
    extends:
        - .fdo.distribution-image@debian
        - .ci-run-policy
    stage: build-and-test
    artifacts:
        when: always
        paths:
            - $MESON_BUILDDIR/meson-logs/
            - $MESON_BUILDDIR/test/piglit-results/
    variables:
        MESON_ARGS: -Dc_args="-fno-common" -Dprefix=/usr -Dxephyr=true -Dwerror=true -Dxcsecurity=true
        CCACHE_COMPILERCHECK: content
        CCACHE_DIR: /cache/xserver/cache
        LC_ALL: C.UTF-8
    before_script:
        - export CCACHE_BASEDIR="$PWD"
        - export PATH="/usr/lib/ccache:$PATH"
        - ccache --show-stats
    after_script:
        - ccache --show-stats

meson:
    extends: .common-build-and-test
    script:
        - .gitlab-ci/meson-build.sh --run-test
        - .gitlab-ci/check-piglit-results.sh
        - .gitlab-ci/manpages-check
    variables:
      XTEST_DIR: /root/xts
      PIGLIT_DIR: /root/piglit
      LP_NUM_THREADS: 0

meson-noglamor:
    extends: meson
    variables:
        MESON_EXTRA_ARGS: >
          -Dglamor=false

meson-nolibdecor:
    extends: meson
    variables:
        MESON_EXTRA_ARGS: >
          -Dlibdecor=false

mingw-cross-build:
    extends: .common-build-and-test
    script:
        - .gitlab-ci/meson-build.sh --run-install
    variables:
      MESON_ARGS: --cross-file=.gitlab-ci/cross-i686-w64-mingw32.txt -Dglx=false -Dlisten_tcp=true

meson-dist:
    extends: .common-build-and-test
    artifacts:
        when: always
        paths:
            - $MESON_BUILDDIR/meson-logs/
            - $MESON_BUILDDIR/xserver-*/$MESON_BUILDDIR/meson-logs/
    script:
        - .gitlab-ci/meson-build.sh --run-dist
        - mkdir xserver-tarball
        - tar xf $MESON_BUILDDIR/meson-dist/xserver-*.tar.xz -C xserver-tarball --strip-components=1
        - .gitlab-ci/meson-build.sh -C xserver-tarball --skip-test --skip-dist --run-install
    variables:
      MESON_DIST_ARGS: --no-tests
      DESTDIR: xserver-tarball/install/

xf86-driver-build-test:
    extends:
        - .fdo.distribution-image@debian
        - .ci-run-policy
    stage: drivers
    parallel:
        matrix:
            - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-evdev
              SHA: xf86-input-evdev-2.10.6
            - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-libinput
              SHA: xf86-input-libinput-1.4.0
            - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-mouse
              SHA: xf86-input-mouse-1.9.5
            - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-synaptics
              SHA: xf86-input-synaptics-1.9.2
            - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu
              SHA: xf86-video-amdgpu-23.0.0
            - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-ati
              SHA: xf86-video-ati-22.0.0
            - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-qxl
              SHA: xf86-video-qxl-0.1.6
            - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-vesa
              SHA: xf86-video-vesa-2.6.0
            - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-vmware
              SHA: xf86-video-vmware-13.4.0
    script:
        # Install the server first
        - .gitlab-ci/meson-build.sh --skip-test --run-install
        - unset MESON_EXTRA_ARGS
        - DRIVER=$(basename $REPO)
        - git clone "$REPO" "$DRIVER"
        - git -C "$DRIVER" checkout "$SHA"
        - |
          if [[ -e "$DRIVER/meson.build" ]]; then
            .gitlab-ci/meson-build.sh -C "$DRIVER" --skip-test
          else
             pushd "$DRIVER" || exit 1
             ./autogen.sh && make
          fi
    needs:
        - "meson"
    variables:
        GIT_DEPTH: 1
        MESON_ARGS: -Dprefix=/usr/
        MESON_EXTRA_ARGS: -Dxwayland=false -Dxnest=false -Dxvfb=false -Dxquartz=false -Ddocs=false
    rules:
      - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
        changes:
          *dix_paths
      - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
        changes:
          *xorg_paths

#
# Verify that commit messages are as expected
#
check-commits:
  extends:
    - .fdo.ci-fairy
  needs: []
  stage: test
  script:
    - ci-fairy check-commits --junit-xml=results.xml
  except:
    - master@xorg/xserver
  variables:
    GIT_DEPTH: 100
  artifacts:
    reports:
      junit: results.xml
  allow_failure: true

#
# Verify that the merge request has the allow-collaboration checkbox ticked
#
check-merge-request:
  extends:
    - .fdo.ci-fairy
  needs: []
  stage: test
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
  script:
    - ci-fairy check-merge-request --require-allow-collaboration --junit-xml=results.xml
  artifacts:
    when: on_failure
    reports:
      junit: results.xml
  allow_failure: true

#
# Workflow rules needed due to:
# https://gitlab.freedesktop.org/freedesktop/freedesktop/-/issues/438
#
workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
    - if: $CI_OPEN_MERGE_REQUESTS
      when: never
    - if: $CI_PIPELINE_SOURCE == 'push'
