include:
  - remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/34f4ade99434043f88e164933f570301fd18b125/templates/fedora.yml'
  - remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/34f4ade99434043f88e164933f570301fd18b125/templates/ci-fairy.yml'

stages:
 - review
 - prepare
 - code-review
 - build
 - test
 - analyze
 - deploy

variables:
  FDO_UPSTREAM_REPO: GNOME/mutter

.mutter.fedora:35@common:
  variables:
    FDO_DISTRIBUTION_VERSION: 35
    BASE_TAG: '2022-03-05.0'
    FDO_DISTRIBUTION_PACKAGES:
      asciidoc
      clang
      gcovr
      gdm
      gnome-shell
      mozjs91-devel
      python3-dbusmock
      sassc
      uncrustify
      xorg-x11-server-Xvfb
      mesa-dri-drivers
      xorg-x11-proto-devel
      qemu-system-x86-core
      busybox

    FDO_DISTRIBUTION_EXEC: |
      dnf install -y 'dnf-command(builddep)' &&

      dnf builddep -y gsettings-desktop-schemas --setopt=install_weak_deps=False &&
      dnf builddep -y mutter --setopt=install_weak_deps=False &&
      dnf builddep -y gnome-shell --setopt=install_weak_deps=False &&
      dnf builddep -y libinput --setopt=install_weak_deps=False &&
      dnf builddep -y wayland --setopt=install_weak_deps=False &&
      dnf builddep -y wayland-protocols --setopt=install_weak_deps=False &&
      dnf builddep -y kernel --setopt=install_weak_deps=False &&

      # For Xwayland
      dnf builddep -y xorg-x11-server-Xwayland --setopt=install_weak_deps=False &&
      dnf install -y 'pkgconfig(fontutil)' &&
      dnf install -y 'pkgconfig(libxcvt)' &&

      ./.gitlab-ci/install-meson-project.sh \
        -Dxwayland=true \
        -Dxwayland_eglstream=true \
        -D{xorg,xnest,xvfb}=false \
        -Dvendor_name="Mutter CI" \
        -D{xdmcp,udev,udev_kms}=false \
        -Dxcsecurity=true \
        -Dglamor=true \
        -D{dri1,dri2}=false \
        -Ddri3=true \
        https://gitlab.freedesktop.org/xorg/xserver.git \
        xwayland-22.1.0 \
        . &&

      ./.gitlab-ci/install-meson-project.sh \
        https://gitlab.gnome.org/GNOME/gjs.git \
        1.71.1 . &&

      ./.gitlab-ci/install-meson-project.sh \
        https://gitlab.gnome.org/GNOME/gsettings-desktop-schemas.git \
        42.beta . &&

      ./.gitlab-ci/install-meson-project.sh \
        https://gitlab.freedesktop.org/wayland/wayland.git \
        1.20.0 . &&

      ./.gitlab-ci/install-meson-project.sh \
        https://gitlab.freedesktop.org/wayland/wayland-protocols.git \
        1.25 . &&

      ./.gitlab-ci/install-meson-project.sh \
        -Dgtk_doc=false \
        https://gitlab.gnome.org/GNOME/libgweather.git \
        main . 1f687f6375a3f3f006600119f7eee7df7348ade5 &&

      rpm -e --nodeps gnome-bluetooth-libs-devel \
                      mutter mutter-devel \
                      gnome-shell &&

      dnf clean all &&

      if [[ x"$(uname -m )" = "xx86_64" ]] ; then
        meson build -Dkvm_tests=true &&
        ninja -C build src/tests/kvm/bzImage &&
        mkdir -p /opt/mutter &&
        cp build/src/tests/kvm/bzImage /opt/mutter/bzImage &&

        git clone https://github.com/jadahl/virtme.git &&
        cd virtme &&
        git checkout e7ee481efa10098ed0d62c9e033d61b2379b9b95 &&
        ./setup.py install --prefix=/usr &&
        cd .. &&
        rm -rf virtme
      fi

default:
  # Cancel jobs if newer commits are pushed to the branch
  interruptible: true
  # Auto-retry jobs in case of infra failures
  retry:
    max: 1
    when:
      - 'runner_system_failure'
      - 'stuck_or_timeout_failure'
      - 'scheduler_failure'
      - 'api_failure'

.mutter.fedora:35@x86_64:
  extends: .mutter.fedora:35@common
  variables:
    FDO_DISTRIBUTION_TAG: "x86_64-${BASE_TAG}"

.mutter.fedora:35@aarch64:
  extends: .mutter.fedora:35@common
  variables:
    FDO_DISTRIBUTION_TAG: "aarch64-${BASE_TAG}"
  tags:
    - aarch64

workflow:
  rules:
    - if: '$CI_MERGE_REQUEST_IID'
    - if: '$CI_COMMIT_TAG'
    - if: '$CI_COMMIT_BRANCH'

.pipline-guard: &pipline-guard
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
    - if: '$CI_COMMIT_TAG'
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
    - if: '$CI_COMMIT_BRANCH =~ /^gnome-[0-9-]+$/'
    - when: 'manual'

check-commit-log:
  extends:
    - .fdo.ci-fairy
  stage: review
  variables:
    GIT_DEPTH: "100"
  script:
    - if [[ x"$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" != "x" ]] ;
      then
        ci-fairy check-commits --junit-xml=commit-message-junit-report.xml ;
      else
        echo "Not a merge request" ;
      fi
  artifacts:
    expire_in: 1 week
    paths:
      - commit-message-junit-report.xml
    reports:
      junit: commit-message-junit-report.xml
  <<: *pipline-guard

check-merge-request:
  extends:
    - .fdo.ci-fairy
  stage: review
  variables:
    GIT_STRATEGY: none
  script:
    - if [[ x"$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" != "x" ]] ;
      then
        ci-fairy check-merge-request --require-allow-collaboration --junit-xml=check-merge-request-report.xml ;
      else
        echo "Not a merge request" ;
      fi
  artifacts:
    expire_in: 1 week
    paths:
      - check-merge-request-report.xml
    reports:
      junit: check-merge-request-report.xml
  <<: *pipline-guard

build-fedora-container@x86_64:
  extends:
    - .fdo.container-build@fedora@x86_64
    - .mutter.fedora:35@x86_64
  stage: prepare
  needs:
    - check-commit-log
    - check-merge-request
  variables:
    GIT_STRATEGY: none

build-fedora-container@aarch64:
  extends:
    - .fdo.container-build@fedora@aarch64
    - .mutter.fedora:35@aarch64
  stage: prepare
  needs:
    - check-commit-log
    - check-merge-request
  variables:
    GIT_STRATEGY: none

check-code-style:
  extends:
    - .fdo.distribution-image@fedora
    - .mutter.fedora:35@x86_64
  stage: code-review
  needs:
    - build-fedora-container@x86_64
  script:
    - if [[ x"$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" != "x" ]] ;
      then
        git remote add target $CI_MERGE_REQUEST_PROJECT_URL.git ;
        git fetch target $CI_MERGE_REQUEST_TARGET_BRANCH_NAME ;
        export common_parent_sha=$(diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "target/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME") <(git rev-list --first-parent HEAD) | head -1) ;
        python3 -u ./check-style.py --dry-run --sha $common_parent_sha ;
      else
        echo "Not a merge request" ;
      fi
  allow_failure: true

.build-mutter-base:
  variables:
    BASE_MESON_OPTIONS:
      -Degl_device=true
      -Dwayland_eglstream=true

.build-mutter:
  extends:
    - .fdo.distribution-image@fedora
    - .build-mutter-base
  stage: build
  script:
    - meson . build
        --prefix /usr
        --werror
        --fatal-meson-warnings
        --warnlevel 2
        -Dbuildtype=debugoptimized
        -Db_coverage=true
        $BASE_MESON_OPTIONS
        $EXTRA_MESON_OPTIONS
    - meson compile -C build
    - meson install -C build
  artifacts:
    expire_in: 1 day
    paths:
      - build

build-mutter@x86_64:
  variables:
    EXTRA_MESON_OPTIONS:
      -Dkvm_tests=true
      -Dkvm_kernel_image=/opt/mutter/bzImage
  extends:
    - .build-mutter
    - .mutter.fedora:35@x86_64
  needs:
    - build-fedora-container@x86_64

build-mutter@aarch64:
  extends:
    - .build-mutter
    - .mutter.fedora:35@aarch64
  needs:
    - build-fedora-container@aarch64

build-without-opengl-and-glx@x86_64:
  extends:
    - .fdo.distribution-image@fedora
    - .mutter.fedora:35@x86_64
  stage: build
  needs:
    - build-fedora-container@x86_64
  script:
    - meson . build --werror --prefix /usr
        -Dbuildtype=debugoptimized
        -Dopengl=false
        -Dglx=false
        -Degl_device=true
        -Dwayland_eglstream=true
    - meson compile -C build
    - meson install -C build
  artifacts:
    paths:
      - build/meson-logs

build-without-native-backend-and-wayland@x86_64:
  extends:
    - .fdo.distribution-image@fedora
    - .mutter.fedora:35@x86_64
  stage: build
  needs:
    - build-fedora-container@x86_64
  script:
    - meson . build --werror --prefix /usr
        -Dbuildtype=debugoptimized
        -Dnative_backend=false
        -Dudev=false
        -Dwayland=false
        -Dcore_tests=false
        -Dnative_tests=false
    - meson compile -C build
    - meson install -C build
  artifacts:
    paths:
      - build/meson-logs

.test-setup: &test-setup
  variables:
    XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir"
    GSETTINGS_SCHEMA_DIR: "$CI_PROJECT_DIR/build/data"
    MUTTER_DEBUG_DUMMY_MODE_SPECS: "800x600@10.0"
    PIPEWIRE_DEBUG: 2
    PIPEWIRE_LOG: "$CI_PROJECT_DIR/build/meson-logs/pipewire.log"
    XVFB_SERVER_ARGS: "+iglx -noreset"
    G_SLICE: "always-malloc"
    MALLOC_CHECK_: "3"
    NO_AT_BRIDGE: "1"
  before_script:
    # Disable e.g. audio support to not dead lock screen cast tests
    - mkdir -m 700 $XDG_RUNTIME_DIR
    - pipewire & sleep 2

.test-mutter-base:
  extends:
    - .fdo.distribution-image@fedora
  <<: *test-setup
  stage: test
  after_script:
    - pushd build
    - gcovr --root=..
        --filter='\.\./src/' --filter='\.\./clutter/' --filter='\.\./cogl/'
        --exclude='\.\./build/.*\.[ch]$' --exclude='.*/tests/.*\.[ch]$'
        --json --output=../coverage-${CI_JOB_NAME}.json
    - popd
  artifacts:
    expire_in: 1 day
    name: "mutter-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
    when: always
    paths:
      - build
      - coverage-*.json

.test-mutter:
  extends:
    - .fdo.distribution-image@fedora
    - .test-mutter-base
  script:
    - glib-compile-schemas $GSETTINGS_SCHEMA_DIR
    - dbus-run-session -- xvfb-run -a -s "$XVFB_SERVER_ARGS"
        ./.gitlab-ci/run-meson.sh test -C build
          --no-suite 'mutter/kvm'
          --no-rebuild
          --timeout-multiplier 10
  artifacts:
    reports:
      junit: "build/meson-logs/testlog.junit.xml"

test-mutter@x86_64:
  extends:
    - .test-mutter
    - .mutter.fedora:35@x86_64
  needs:
    - build-mutter@x86_64

test-mutter-kvm@x86_64:
  extends:
    - .test-mutter-base
    - .mutter.fedora:35@x86_64
  tags:
    - kvm
  script:
      meson test -C build
        --no-rebuild
        --timeout-multiplier 10
        --setup plain
        --suite 'mutter/kvm'
  needs:
    - build-mutter@x86_64
  artifacts:
    reports:
      junit: "build/meson-logs/testlog-plain.junit.xml"

test-mutter@aarch64:
  extends:
    - .test-mutter
    - .mutter.fedora:35@aarch64
  needs:
    - build-mutter@aarch64

coverage:
  extends:
    - .fdo.distribution-image@fedora
    - .mutter.fedora:35@x86_64
  stage: analyze
  script:
    - mkdir coveragereport
    - gcovr --add-tracefile 'coverage-*.json'
        --html-details --print-summary --output coveragereport/index.html
  artifacts:
    paths:
      - coveragereport
  coverage: '/^lines: (\d+\.\d+\%)/'
  needs:
    - test-mutter@x86_64
    - test-mutter@aarch64
    - test-mutter-kvm@x86_64

can-build-gnome-shell@x86_64:
  extends:
    - .fdo.distribution-image@fedora
    - .mutter.fedora:35@x86_64
  stage: test
  needs:
    - build-mutter@x86_64
  before_script:
    - meson install --no-rebuild -C build
  script:
    - .gitlab-ci/checkout-gnome-shell.sh
    - meson gnome-shell gnome-shell/build --prefix /usr -Dman=false
    - meson install -C gnome-shell/build

test-mutter-coverity:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule" && $MUTTER_SCHEDULED_JOB == "coverity"'
      when: always
    - when: manual
  extends:
    - .fdo.distribution-image@fedora
    - .mutter.fedora:35@x86_64
  needs:
    - build-fedora-container@x86_64
  stage: analyze
  allow_failure: true
  script:
    - .gitlab-ci/download-coverity-tarball.sh
    - CC=clang meson coverity-build -Dprofiler=false
    - ./coverity/cov-analysis-linux64-*/bin/cov-build --dir cov-int meson compile -C coverity-build
    - tar czf cov-int.tar.gz cov-int
    - curl https://scan.coverity.com/builds?project=mutter
      --form token=$COVERITY_TOKEN --form email=carlosg@gnome.org
      --form file=@cov-int.tar.gz --form version="`git describe --tags`"
      --form description="GitLab CI build"
  cache:
    key: coverity-tarball
    paths:
      - coverity

dist-mutter:
  extends:
    - .fdo.distribution-image@fedora
    - .mutter.fedora:35@x86_64
    - .build-mutter-base
  <<: *test-setup
  stage: deploy
  needs:
    - build-fedora-container@x86_64
  script:
    - meson . build --werror --prefix /usr
        -Dbuildtype=debugoptimized
        $BASE_MESON_OPTIONS
        -Dkvm_tests=false
    - glib-compile-schemas $GSETTINGS_SCHEMA_DIR
    - dbus-run-session -- xvfb-run -a -s "$XVFB_SERVER_ARGS"
        ./.gitlab-ci/run-meson.sh dist -C build
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      changes:
        - "**/meson.build"
        - meson/*

dist-mutter-tarball:
  extends: dist-mutter
  artifacts:
    expose_as: 'Get tarball here'
    paths:
      - build/meson-dist/$CI_PROJECT_NAME-$CI_COMMIT_TAG.tar.xz
  rules:
    - if: '$CI_COMMIT_TAG'
