include:
  - remote: 'https://gitlab.gnome.org/GNOME/citemplates/raw/HEAD/flatpak/flatpak_ci_initiative.yml'
  - remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/057b052e682d8e5a20c1eb2dd60d5b87d2b56856/templates/fedora.yml'
  - remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/bc70242ffb8402243e934659ecc1a2d1c89eca2b/templates/ci-fairy.yml'
  - project: 'Infrastructure/openshift-images/gnome-release-service'
    file: '/ci-templates/release-module.yml'

stages:
  - pre_review
  - prep
  - review
  - build
  - test
  - analyze
  - docs
  - deploy

default:
  image: $MUTTER_CI_IMAGE
  # 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'

variables:
  MUTTER_CI_IMAGE: registry.gitlab.gnome.org/gnome/mutter/fedora/40:x86_64-2024-06-11.0
  FDO_UPSTREAM_REPO: GNOME/gnome-shell
  BUNDLE: "extensions-git.flatpak"
  LINT_LOG: "eslint-report.xml"
  LINT_MR_LOG: "eslint-mr-report.xml"

workflow:
  rules:
    - if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"'
      when: never
    - if: '$CI_MERGE_REQUEST_IID'
    - if: '$CI_COMMIT_TAG'
    - if: '$CI_COMMIT_BRANCH'

.pipeline-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'

.gnome-shell.fedora:
  variables:
    FDO_DISTRIBUTION_VERSION: 40
    FDO_DISTRIBUTION_TAG: '2024-02-23.0'
    FDO_DISTRIBUTION_PACKAGES:
      gjs
      nodejs
      npm
      meson
      git
      'pkgconfig(gobject-introspection-1.0)'
      'pkgconfig(gio-2.0)'
      'pkgconfig(gio-unix-2.0)'
      'pkgconfig(gnome-autoar-0)'
      'pkgconfig(json-glib-1.0)'
    FDO_DISTRIBUTION_EXEC: |
      # For static analysis with eslint
      npm install -g eslint@^8.0.0 eslint-plugin-jsdoc@^46.0.0 &&

      ./.gitlab-ci/install-meson-project.sh \
        https://gitlab.gnome.org/fmuellner/gjs-ci-tools.git \
        main &&

      ./.gitlab-ci/install-meson-project.sh \
        --subdir subprojects/extensions-tool/ \
        --prepare ./generate-translations.sh \
        -Dman=false \
        https://gitlab.gnome.org/GNOME/gnome-shell.git \
        main

check_commit_log:
  extends:
    - .fdo.ci-fairy
  stage: pre_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
  rules:
    - !reference [.pipeline-guard, rules]
  artifacts:
    expire_in: 1 week
    paths:
      - commit-message-junit-report.xml
    reports:
      junit: commit-message-junit-report.xml

check-merge-request:
  extends:
    - .fdo.ci-fairy
  stage: pre_review
  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
  rules:
    - !reference [.pipeline-guard, rules]
  artifacts:
    expire_in: 1 week
    paths:
      - check-merge-request-report.xml
    reports:
      junit: check-merge-request-report.xml

build-fedora-container:
  extends:
    - .fdo.container-build@fedora@x86_64
    - .gnome-shell.fedora
  stage: prep

js_check:
  extends:
      - .fdo.distribution-image@fedora
      - .gnome-shell.fedora
  stage: review
  script:
      - gjs-check-syntax
  artifacts:
    reports:
      junit: gjs-check-syntax.junit.xml

eslint:
  extends:
    - .fdo.distribution-image@fedora
    - .gnome-shell.fedora
  stage: review
  script:
    - export NODE_PATH=$(npm root -g)
    - ./.gitlab-ci/run-eslint --output-file ${LINT_LOG} --format junit --stdout
  artifacts:
    reports:
      junit: ${LINT_LOG}
    when: always

eslint-doc:
  extends:
    - .fdo.distribution-image@fedora
    - .gnome-shell.fedora
  stage: review
  script:
    - export NODE_PATH=$(npm root -g)
    - ./.gitlab-ci/eslint-coding-style.sh
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      changes:
        - HACKING.md
        - .eslintrc.yml
        - lint/*

potfile_c_check:
  extends:
    - .fdo.distribution-image@fedora
    - .gnome-shell.fedora
  stage: review
  script:
    - ./.gitlab-ci/check-potfiles.sh

potfile_js_check:
  extends:
    - .fdo.distribution-image@fedora
    - .gnome-shell.fedora
  stage: review
  script:
    - gjs-check-potfiles
  artifacts:
    reports:
      junit: gjs-check-potfiles.junit.xml

build:
  stage: build
  needs: ["check_commit_log"]
  before_script:
    - .gitlab-ci/checkout-mutter.sh
    - meson mutter mutter/build --prefix=/usr
    - sudo meson install -C mutter/build
  script:
    - meson setup . build -Dbuildtype=debugoptimized -Dman=false -Dgtk_doc=true --werror --fatal-meson-warnings
    - meson compile -C build
    - sudo meson install -C build
  artifacts:
    expire_in: 1 day
    paths:
      - mutter
      - build
      - subprojects/gvc
      - subprojects/jasmine-gjs

test:
  stage: test
  needs: ["build"]
  variables:
    XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir"
    NO_AT_BRIDGE: "1"
  before_script:
    - sudo meson install -C mutter/build
    - mkdir -m 700 $XDG_RUNTIME_DIR
  script:
    - dbus-run-session -- xvfb-run meson test -C build --no-rebuild --timeout-multiplier 5
  artifacts:
    expire_in: 1 day
    paths:
      - build/meson-logs/testlog.txt
    reports:
      junit: build/meson-logs/testlog.junit.xml
    when: on_failure

test-coverity:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule" && $GNOME_SHELL_SCHEDULED_JOB == "coverity"'
      when: always
    - when: manual
  needs: ["build"]
  stage: analyze
  allow_failure: true
  before_script:
    - sudo meson install -C mutter/build
  script:
    - .gitlab-ci/download-coverity-tarball.sh
    - CC=clang meson coverity-build -Dman=false
    - ./coverity/cov-analysis-linux64-*/bin/cov-build --fs-capture-search js --dir cov-int meson compile -C coverity-build
    - tar czf cov-int.tar.gz cov-int
    - curl https://scan.coverity.com/builds?project=GNOME+Shell
      --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

flatpak:
  stage: build
  needs: ["check_commit_log"]
  variables:
    SUBPROJECT: "subprojects/extensions-app"
    # Your manifest path
    MANIFEST_PATH: "$SUBPROJECT/build-aux/flatpak/org.gnome.Extensions.json"
    RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo"
    FLATPAK_MODULE: "gnome-extensions-app"
    APP_ID: "org.gnome.Extensions.Devel"
  extends: .flatpak

nightly:
  extends: '.publish_nightly'
  needs:
    - flatpak

distinfo:
  stage: deploy
  needs:
    - build
  script:
    - .gitlab-ci/export-artifact-path build > dist.env
  artifacts:
    reports:
      dotenv: dist.env
    paths:
      - dist.env
  rules:
    - if: '$CI_COMMIT_TAG'

dist:
  variables:
    XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir"
    NO_AT_BRIDGE: "1"
  stage: deploy
  needs: ["build"]
  before_script:
    - sudo meson install -C mutter/build
    - mkdir -m 700 $XDG_RUNTIME_DIR
  script:
    - dbus-run-session xvfb-run meson dist -C build --include-subprojects
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      changes:
        - "**/meson.build"
        - meson/*

dist-tarball:
  extends: dist
  needs:
    - build
    - distinfo
  artifacts:
    expose_as: 'Get tarball here'
    paths:
      - $TARBALL_ARTIFACT_PATH
    reports:
      dotenv: dist.env
  rules:
    - if: '$CI_COMMIT_TAG'

release-module:
  stage: deploy
  needs:
    - dist-tarball
  extends: .release-module
  rules:
    - if: '$CI_COMMIT_TAG'

reference:
  stage: docs
  needs: ["build"]
  script:
    - mkdir -p reference/
    - mv build/docs/reference/{shell/shell,st/st} reference/
  artifacts:
    paths:
      - reference

pages:
  stage: deploy
  needs: ['reference']
  script:
    - mv reference/ public/
  artifacts:
    paths:
      - public
  rules:
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PROJECT_NAMESPACE == "GNOME"'

build-toolbox:
  image: quay.io/freedesktop.org/ci-templates:container-build-base-2021-07-29.0
  stage: deploy
  needs: []
  script:
    - .gitlab-ci/build-toolbox-image.sh $MUTTER_CI_IMAGE
  rules:
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PROJECT_NAMESPACE == "GNOME"'
    - if: '$CI_COMMIT_BRANCH =~ /^gnome-[0-9-]+$/ && $CI_PROJECT_NAMESPACE == "GNOME"'
