include:
  - local: '.gitlab-ci/libfprint-image-variables.yaml'
  - local: '.gitlab-ci/libfprint-templates.yaml'
  - project: 'freedesktop/ci-templates'
    ref: master
    file: '/templates/fedora.yml'
  - remote: 'https://gitlab.gnome.org/GNOME/citemplates/-/raw/master/flatpak/flatpak_ci_initiative.yml'

variables:
  extends: .libfprint_common_variables
  FDO_DISTRIBUTION_TAG: $LIBFPRINT_IMAGE_TAG
  FDO_DISTRIBUTION_VERSION: rawhide
  FDO_UPSTREAM_REPO: "libfprint/$CI_PROJECT_NAME"
  FEDORA_IMAGE: "$CI_REGISTRY/libfprint/$CI_PROJECT_NAME/fedora/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG"
  BUNDLE: "org.freedesktop.libfprint.Demo.flatpak"
  LAST_ABI_BREAK: "056ea541ddc97f5806cffbd99a12dc87e4da3546"

workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
    - if: $CI_PIPELINE_SOURCE == 'push'

stages:
  - image-build
  - check-source
  - build
  - test
  - flatpak

image: $FEDORA_IMAGE

.build_one_driver_template: &build_one_driver
  script:
    # Build with a driver that doesn't need imaging, or nss
    - meson --werror -Ddrivers=$driver . _build
    - ninja -C _build
    - rm -rf _build/

.build_template: &build
  script:
    # And build with everything
    - meson --werror -Ddrivers=all . _build
    - ninja -C _build
    - ninja -C _build install

.build_template: &check_abi
  script:
    - ./.ci/check-abi ${LAST_ABI_BREAK} $(git rev-parse HEAD)

build:
  stage: build
  except:
    variables:
      - $CI_PIPELINE_SOURCE == "schedule"
  variables:
    driver: virtual_image
  <<: *build_one_driver
  <<: *build
#  <<: *check_abi
  artifacts:
    expose_as: "HTML Documentation"
    paths:
    - _build/doc/html
    - _build/doc/html/index.html
    expire_in: 1 week

test:
  stage: test
  except:
    variables:
      - $CI_PIPELINE_SOURCE == "schedule"
  script:
    - meson --werror -Ddrivers=all -Db_coverage=true . _build
    - ninja -C _build
    - meson test -C _build --print-errorlogs --no-stdsplit --timeout-multiplier 3
    - ninja -C _build coverage || true # FIXME: always enable this once meson is fixed
    - cat _build/meson-logs/coverage.txt || true
  artifacts:
    reports:
      junit: "_build/meson-logs/testlog.junit.xml"
      coverage_report:
        coverage_format: cobertura
        path: _build/meson-logs/coverage.xml
    expose_as: 'Coverage Report'
    when: always
    paths:
      - _build/meson-logs
      - _build/meson-logs/coveragereport/index.html
    expire_in: 1 week
  coverage: '/^TOTAL.*\s+(\d+\%)$/'

test_valgrind:
  stage: test
  except:
    variables:
      - $CI_PIPELINE_SOURCE == "schedule"
  script:
    - meson -Ddrivers=all . _build
    - ninja -C _build
    - meson test -C _build --print-errorlogs --no-stdsplit --setup=valgrind
  artifacts:
    reports:
      junit: "_build/meson-logs/testlog-valgrind.junit.xml"
    expose_as: 'Valgrind test logs'
    when: always
    paths:
      - _build/meson-logs
      - _build/meson-logs/testlog-valgrind.txt
    expire_in: 1 week


test_scan_build:
  stage: test
  except:
    variables:
      - $CI_PIPELINE_SOURCE == "schedule"
  allow_failure: true
  script:
    - meson -Ddrivers=all . _build
    # Wrapper to add --status-bugs and disable malloc checker
    - SCANBUILD=$CI_PROJECT_DIR/.gitlab-ci/scan-build ninja -C _build scan-build
  artifacts:
    paths:
      - _build/meson-logs
    expire_in: 1 week

test_indent:
  stage: check-source
  except:
    variables:
      - $CI_PIPELINE_SOURCE == "schedule"
  script:
    - scripts/uncrustify.sh
    - git diff
    - git diff-index --name-only --exit-code HEAD

test_unsupported_list:
  stage: check-source
  except:
    variables:
      - $CI_PIPELINE_SOURCE == "schedule"
  allow_failure: true
  script:
    - tests/hwdb-check-unsupported.py

flatpak:
  stage: flatpak
  extends: .flatpak
  # From https://gitlab.gnome.org/GNOME/gnome-runtime-images/container_registry
  image: registry.gitlab.gnome.org/gnome/gnome-runtime-images/gnome:42
  variables:
    MANIFEST_PATH: "demo/org.freedesktop.libfprint.Demo.json"
    FLATPAK_MODULE: "libfprint"
    APP_ID: "org.freedesktop.libfprint.Demo"
  rules:
    - if: '$CI_PROJECT_PATH != "libfprint/libfprint"'
      when: never
    - if: '$CI_PIPELINE_SOURCE == "schedule"'
      when: never
    - if: '$CI_COMMIT_BRANCH == "master"'
      when: always
    - if: '$CI_COMMIT_TAG'
      when: always
    # For any other (commit), allow manual run.
    # This excludes MRs which would create a duplicate pipeline
    - if: '$CI_COMMIT_BRANCH'
      when: manual
      allow_failure: true

# CONTAINERS creation stage
.container_fedora_build_base:
  extends: .fdo.container-build@fedora
  stage: image-build
  only:
    variables:
      - $CI_PIPELINE_SOURCE == "never"
  variables:
    GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image
    FDO_FORCE_REBUILD: 1
    # a list of packages to install
    FDO_DISTRIBUTION_PACKAGES:
      $LIBFPRINT_DEPENDENCIES
      vala
      libpcap-devel
      libudev-devel
    FDO_DISTRIBUTION_EXEC: |
      $LIBFPRINT_EXEC

container_fedora_build_schedule:
  extends: .container_fedora_build_base
  only:
    variables:
      - $CI_PIPELINE_SOURCE == "schedule" && $CRON_TASK == "BUILD_CI_IMAGES"

container_fedora_build_manual:
  extends: .container_fedora_build_base
  only:
    variables:
      - $LIBFPRINT_CI_ACTION == "build-image"

container_fedora_build_on_deps_changed:
  extends: .container_fedora_build_base
  only:
    variables:
      - $CI_PROJECT_NAMESPACE == "libfprint" && $CI_PIPELINE_SOURCE != "schedule"
    refs:
      - branches
      - merge_requests
    changes:
      - .gitlab-ci/libfprint-image-variables.yaml
