# We use https://gitlab.freedesktop.org/freedesktop/ci-templates
# to build the images used by the ci.
#
# Here is how to properly update thoses images:
# - new Rust stable version: update GST_RS_IMG_TAG
# - add dependencies: update FDO_DISTRIBUTION_PACKAGES and update GST_RS_IMG_TAG
# - update GStreamer version: update the tag in ci/install-gst.sh and update GST_RS_IMG_TAG
#
# GST_RS_IMG_TAG is defined in ci/images_template.yml and should be updated
# either by:
# - setting it to the current date and the version suffix to 0
# - incrementing the version suffix
#
# After each update commit your changes and push to your personnal repo.
# After review and ci approval merge the branch as usual.
#
# Updating the nightly image should be done by simply running a scheduled ci
# pipeline on the upstream repo with the $UPDATE_NIGHTLY variable defined.

.templates_sha: &templates_sha 322bf2b8f29b6491caeb13861201e96969ddc169

include:
  - project: 'freedesktop/ci-templates'
    ref: *templates_sha
    file: '/templates/debian.yml'

  - local: "ci/images_template.yml"

variables:
  FDO_UPSTREAM_REPO: gstreamer/gstreamer-rs

stages:
  - "container-base"
  - "container-final"
  - "lint"
  - "test"
  - "extras"
  - "deploy"

.debian:10:
  variables:
    FDO_DISTRIBUTION_VERSION: 10
    FDO_DISTRIBUTION_TAG: '$RUST_VERSION-$GST_RS_IMG_TAG'
    # Only stuff inside the repo directory can be cached
    # Override the CARGO_HOME variable to force its location
    CARGO_HOME: "${CI_PROJECT_DIR}/.cargo_home"
  before_script:
    - source ./ci/env.sh
    - mkdir .cargo && echo -e "[net]\ngit-fetch-with-cli = true" > .cargo/config

.debian:10-base:
  extends: .debian:10
  variables:
    FDO_DISTRIBUTION_TAG: 'base-$GST_RS_IMG_TAG'

.debian:10-stable:
  extends: .debian:10
  variables:
    RUST_VERSION: "stable"

.debian:10-1-40:
  extends: .debian:10
  variables:
    RUST_VERSION: "1.40.0"

.debian:10-nightly:
  extends: .debian:10
  variables:
    RUST_VERSION: "nightly"

.build-base-image:
  extends:
  - .fdo.container-build@debian
  stage: container-base
  variables:
    FDO_DISTRIBUTION_PACKAGES: "build-essential curl python3-setuptools liborc-0.4-dev libglib2.0-dev libxml2-dev libgtk-3-dev libegl1-mesa libgles2-mesa libgl1-mesa-dri libgl1-mesa-glx libwayland-egl1-mesa xz-utils libssl-dev git wget ca-certificates ninja-build python3-pip flex bison libglib2.0-dev"
    FDO_DISTRIBUTION_EXEC: 'bash ci/install-gst.sh && pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates'

.build-final-image:
  extends:
  - .fdo.container-build@debian
  stage: container-final
  variables:
    FDO_BASE_IMAGE: '$CI_REGISTRY_IMAGE/debian/10:base-$GST_RS_IMG_TAG'
    FDO_DISTRIBUTION_EXEC: 'bash ci/install-rust.sh $RUST_VERSION'

build-base:
  extends:
    - .build-base-image
    - .debian:10-base

build-stable:
  extends:
    - .build-final-image
    - .debian:10-stable

build-1-40:
  extends:
    - .build-final-image
    - .debian:10-1-40

build-nightly:
  extends:
    - .build-final-image
    - .debian:10-nightly

update-nightly:
  extends: build-nightly
  only:
    variables:
      - $UPDATE_NIGHTLY == "1"
  variables:
      FDO_FORCE_REBUILD: 1

.dist-debian-container:
  extends:
  - .fdo.distribution-image@debian
  cache:
    key: "gst"
    paths:
      - "${CARGO_HOME}"
  after_script:
    - rm -rf target

.img-stable:
  extends:
    - .dist-debian-container
    - .debian:10-stable

.img-1-40:
  extends:
    - .dist-debian-container
    - .debian:10-1-40

.img-nightly:
  extends:
    - .dist-debian-container
    - .debian:10-nightly

# GST_PLUGINS_RS_TOKEN is a variable of type 'Var' defined in gstreamer-rs CI
# settings and containing a gst-plugins-rs pipeline trigger token
.plugins-update:
  stage: deploy
  script:
    - |
    # FDO_DISTRIBUTION_IMAGE still has indirections
    - echo $FDO_DISTRIBUTION_IMAGE
    - DISTRO_IMAGE=$(eval echo ${FDO_DISTRIBUTION_IMAGE})
    - echo $DISTRO_IMAGE
    # retrieve the infos from the registry
    - JSON_IMAGE=$(skopeo inspect docker://$DISTRO_IMAGE)
    - IMAGE_PIPELINE_ID=$(echo $JSON_IMAGE | jq -r '.Labels["fdo.pipeline_id"]')
    - echo $IMAGE_PIPELINE_ID
    - echo $CI_PIPELINE_ID
    - |
      if [[ x"$IMAGE_PIPELINE_ID" == x"$CI_PIPELINE_ID" ]]; then
        echo "Image has been updated, notify gst-plugins-rs"
        curl -X POST -F "token=$GST_PLUGINS_RS_TOKEN" -F "ref=master" -F "variables[UPDATE_IMG]=$UPDATE_IMG" https://gitlab.freedesktop.org/api/v4/projects/1400/trigger/pipeline
      else
        echo "Image has not been updated, ignore"
      fi
  rules:
    - if: '$CI_COMMIT_REF_NAME == "master" && $CI_PROJECT_PATH == "gstreamer/gstreamer-rs"'

# Those jobs need to use another image as ours doesn't have 'skopeo'
# and it's not easily installable in Debian stable for now.
plugins-update-stable:
  extends:
    - .plugins-update
    - .img-stable
  image: registry.freedesktop.org/freedesktop/ci-templates/buildah:2020-03-04
  variables:
    UPDATE_IMG: "stable"

plugins-update-1-40:
  extends:
    - .plugins-update
    - .img-1-40
  image: registry.freedesktop.org/freedesktop/ci-templates/buildah:2020-03-04
  variables:
    UPDATE_IMG: "1-40"

plugins-update-nightly:
  extends:
    - .plugins-update
    - .img-nightly
  image: registry.freedesktop.org/freedesktop/ci-templates/buildah:2020-03-04
  variables:
    UPDATE_IMG: "nightly"

.cargo test:
  stage: "test"
  script:
    - rustc --version
      # First build and test all the crates with their relevant features
      # Keep features in sync with below
    - |
      for crate in gstreamer*; do
        if [ -n "$ALL_FEATURES" ]; then
          if [ $crate = "gstreamer" ]; then
            FEATURES=ser_de,v1_18
          elif [ $crate = "gstreamer-gl" ]; then
            FEATURES=egl,x11,wayland,v1_18
          else
            FEATURES=v1_18
          fi

          cargo build --color=always --manifest-path $crate/Cargo.toml --features=$FEATURES
          G_DEBUG=fatal_warnings cargo test --color=always --manifest-path $crate/Cargo.toml --features=$FEATURES
        else
          cargo build --color=always --manifest-path $crate/Cargo.toml
          G_DEBUG=fatal_warnings cargo test --color=always --manifest-path $crate/Cargo.toml
        fi
      done

      # If we do a build with all features then also build the
      # tutorials/examples with all features
    - |
      if [ -n "$ALL_FEATURES" ]; then
        cargo build --color=always --manifest-path examples/Cargo.toml --bins --examples --all-features
        cargo build --color=always --manifest-path tutorials/Cargo.toml --bins --examples --all-features
      fi

test 1.40:
  extends:
    - '.cargo test'
    - .img-1-40

test stable:
  extends:
    - '.cargo test'
    - .img-stable

test stable all-features:
  variables:
    ALL_FEATURES: 'yes'
  extends:
    - '.cargo test'
    - .img-stable

test nightly:
  allow_failure: true
  extends:
    - '.cargo test'
    - .img-nightly

test nightly all-features:
  allow_failure: true
  variables:
    ALL_FEATURES: 'yes'
  extends:
    - '.cargo test'
    - .img-nightly

rustfmt:
  extends: .img-stable
  stage: "lint"
  script:
    - cargo fmt --version
    - cargo fmt -- --color=always --check

check commits:
  extends: .img-stable
  stage: "lint"
  script:
    - ci-fairy check-commits --textwidth 0 --no-signed-off-by

clippy:
  extends: .img-stable
  stage: 'extras'
  script:
    - cargo clippy --version
      # Keep features in sync with above
    - |
      for crate in gstreamer*; do
        if [ $crate = "gstreamer" ]; then
          FEATURES=ser_de,v1_18
        elif [ $crate = "gstreamer-gl" ]; then
          FEATURES=egl,x11,wayland,v1_18
        else
          FEATURES=v1_18
        fi

        cargo clippy --color=always --manifest-path $crate/Cargo.toml --features=$FEATURES --all-targets -- -A clippy::redundant_pattern_matching -A clippy::single_match -A clippy::cast_lossless -A clippy::missing_safety_doc -D warnings
      done
    # And also run over all the examples/tutorials
    - |
      cargo clippy --color=always --manifest-path examples/Cargo.toml --all-targets --all-features -- -A clippy::redundant_pattern_matching -A clippy::single_match -A clippy::cast_lossless -A clippy::missing_safety_doc -D warnings
      cargo clippy --color=always --manifest-path tutorials/Cargo.toml --all-targets --all-features -- -A clippy::redundant_pattern_matching -A clippy::single_match -A clippy::cast_lossless -A clippy::missing_safety_doc -D warnings

deny:
  extends: .img-stable
  stage: 'extras'
  only:
    - schedules
  script:
    - cargo deny check

gir-checks:
  extends: .img-stable
  stage: 'extras'
  script:
    - git clone --depth 1 https://github.com/gtk-rs/checker
    - cd checker && echo '[workspace]' >> Cargo.toml
    - cargo build --release
    - |
      cargo run --release -- \
        --gir-file ../Gir_GstApp.toml ../gstreamer-app \
        --gir-file ../Gir_GstAudio.toml ../gstreamer-audio/ \
        --gir-file ../Gir_GstBase.toml ../gstreamer-base \
        --gir-file ../Gir_GstCheck.toml ../gstreamer-check/ \
        --gir-file ../Gir_GstEditingServices.toml ../gstreamer-editing-services/ \
        --gir-file ../Gir_GstGL.toml ../gstreamer-gl/ \
        --gir-file ../Gir_GstNet.toml ../gstreamer-net/ \
        --gir-file ../Gir_GstPbutils.toml ../gstreamer-pbutils/ \
        --gir-file ../Gir_GstPlayer.toml ../gstreamer-player/ \
        --gir-file ../Gir_GstRtp.toml ../gstreamer-rtp/ \
        --gir-file ../Gir_GstRtspServer.toml ../gstreamer-rtsp-server/ \
        --gir-file ../Gir_GstRtsp.toml ../gstreamer-rtsp/ \
        --gir-file ../Gir_GstSdp.toml ../gstreamer-sdp/ \
        --gir-file ../Gir_Gst.toml ../gstreamer/ \
        --gir-file ../Gir_GstVideo.toml ../gstreamer-video/ \
        --gir-file ../Gir_GstWebRTC.toml ../gstreamer-webrtc/
    - cd ..
    - |
      for crate in gstreamer*; do
        echo '-->' $crate
        (cd $crate && ../checker/check_init_asserts)
      done

outdated:
  extends: .img-stable
  allow_failure: true
  stage: 'extras'
  only:
    - schedules
  script:
    - cargo outdated --root-deps-only --exit-code 1 -v

pages:
  extends: .img-stable
  stage: 'deploy'
  script:
    - |
      for crate in gstreamer*; do
        cd $crate
        cargo doc --features --features=dox,embed-lgpl-docs
        cd ..
      done
    - mv target/doc public/
  when: 'manual'
  artifacts:
    paths:
      - 'public'
