include:
  - project: "freedesktop/ci-templates" # the project to include from
    ref: "34f4ade99434043f88e164933f570301fd18b125" # git ref of that project
    file: "/templates/fedora.yml" # the actual file to include
  - local: "ci/images_template.yml"

stages:
  - prepare
  - lint
  - test
  - release
  - deploy

variables:
  FDO_UPSTREAM_REPO: "dabrain34/GstPipelineStudio"
  GNOME_RUNTIME_IMAGE: "quay.io/gnome_infrastructure/gnome-runtime-images:gnome-master"
  WINDOWS_RUST_STABLE_IMAGE: "$CI_REGISTRY_IMAGE/windows:$GST_RS_WIN_IMG_TAG"
  WINDOWS_RUST_STABLE_UPSTREAM_IMAGE: "$CI_REGISTRY/$FDO_UPSTREAM_REPO/windows:$GST_RS_WIN_IMG_TAG"

# Version and tag for our current container
.fedora:
  variables:
    FDO_DISTRIBUTION_VERSION: "38"
    # Update this to trigger a container rebuild
    FDO_DISTRIBUTION_TAG: "2023-08-25.1"
  before_script:
    - source ./ci/env.sh
    - mkdir .cargo && echo -e "[net]\ngit-fetch-with-cli = true" > .cargo/config
    # If cargo exists assume we probably will want to update
    # the lockfile
    #- |
    #  if command -v cargo; then
    #    cargo generate-lockfile --color=always
    #    cargo update --color=always
    #  fi

build-fedora-container:
  extends:
    - .fedora # our template job above
    - .fdo.container-build@fedora@x86_64 # the CI template
  stage: prepare
  variables:
    # clang-devel: required by rust bindgen
    FDO_DISTRIBUTION_PACKAGES: >-
      gtk4-devel
      clang-devel
      gstreamer1-devel
      gstreamer1-plugins-base-devel
      gstreamer1-plugins-bad-free-devel
      ninja-build
      pkg-config
      python3-devel
      python3-pip
      python3-setuptools
      util-linux
      xorg-x11-server-Xvfb
      wget
      git
      flex
      bison
    FDO_DISTRIBUTION_EXEC: >-
      ci/install-rust.sh stable &&
      pip3 install meson

.windows rust docker build:
  stage: prepare
  variables:
    # Unlike the buildah/linux jobs, this file
    # needs to be relative to windows-docker/ subdir
    # as it makes life easier in the powershell script
    #
    # We also don't need a CONTEXT_DIR var as its also
    # hardcoded to be windows-docker/
    DOCKERFILE: "ci/windows-docker/Dockerfile"
    GST_UPSTREAM_BRANCH: "1.22"
  tags:
    - "windows"
    - "shell"
    - "2022"
  script:
    # We need to pass an array and to resolve the env vars, so we can't use a variable:
    - $DOCKER_BUILD_ARGS = @("--build-arg", "DEFAULT_GST_BRANCH=$GST_UPSTREAM_BRANCH", "--build-arg", "RUST_VERSION=$RUST_VERSION")
    - "& ci/windows-docker/container.ps1 $CI_REGISTRY $CI_REGISTRY_USER $CI_REGISTRY_PASSWORD $RUST_IMAGE $RUST_UPSTREAM_IMAGE $DOCKERFILE"
    - |
      if (!($?)) {
        echo "Failed to build the image"
        Exit 1
      }

windows rust docker stable:
  extends: ".windows rust docker build"
  variables:
    RUST_IMAGE: !reference [variables, "WINDOWS_RUST_STABLE_IMAGE"]
    RUST_UPSTREAM_IMAGE:
      !reference [variables, "WINDOWS_RUST_STABLE_UPSTREAM_IMAGE"]
    RUST_VERSION: !reference [variables, "GST_RS_STABLE"]

.msvc2019 build:
  stage: test
  tags:
    - "docker"
    - "windows"
    - "2022"

windows installer stable:
  needs:
    - job: "windows rust docker stable"
      artifacts: false
  image: "$WINDOWS_RUST_STABLE_IMAGE"
  extends: ".msvc2019 build"
  script:
    - rustc --version
    - git fetch --tags
    - "& ./ci/build_gps.ps1"
    - "& ./installer/wix/prepare_gstreamer.ps1"
    - "& ./installer/wix/build_installer.ps1"
  artifacts:
    paths:
      - installer/wix/*.msi
    expire_in: 10 days
  when: "manual"

rustfmt-clippy:
  extends:
    - .fedora
    - .fdo.distribution-image@fedora
  stage: lint
  script:
    - meson build
    - cargo fmt --version
    - cargo fmt -- --color=always --check
    - cargo clippy --version
    - cargo clippy --color=always --all-targets -- -D warnings

windows installer release:
  extends: "windows installer stable"
  stage: release
  only:
    - flatpak
    - tags
  artifacts:
    paths:
      - installer/wix/*.msi
  when: "always"

linux release:
  extends:
    - .fedora
    - .fdo.distribution-image@fedora
  stage: release
  only:
    - flatpak
    - tags
  script:
    - meson builddir -Dbuildtype=release
    - ninja -C builddir/ dist
  artifacts:
    paths:
      - builddir/meson-dist/*
  when: "always"

test-stable:
  extends:
    - .fedora
    - .fdo.distribution-image@fedora
  stage: test
  script:
    - meson build
    - rustc --version
    - cargo build --color=always --all-targets
    - >
      xvfb-run -a -s "-screen 0 1024x768x24"
      cargo test --color=always

rustdoc:
  extends:
    - .fedora
    - .fdo.distribution-image@fedora
  stage: release
  only:
    - flatpak
    - tags
  variables:
    RUSTDOCFLAGS: "-Dwarnings"
  script:
    - meson build
    - rustdoc --version
    - cargo doc --no-deps

dist-package:
  extends:
    - .fedora
    - .fdo.distribution-image@fedora
  stage: release
  only:
    - flatpak
  script:
    - meson build
    - ninja -C build dist

flatpak:
  image: $GNOME_RUNTIME_IMAGE
  stage: test
  variables:
    MANIFEST_PATH: "build-aux/org.freedesktop.dabrain34.GstPipelineStudio.Devel.json"
    APP_ID: "org.freedesktop.dabrain34.GstPipelineStudio.Devel"
    BUNDLE: "gst-pipeline-studio-nightly.flatpak"
  script:
    - flatpak-builder app ${MANIFEST_PATH}
    - flatpak build-export repo app
    - flatpak build-bundle repo ${BUNDLE} ${APP_ID}
  artifacts:
    name: "Flatpak artifacts"
    expose_as: "Get Flatpak bundle here"
    when: "always"
    paths:
      - "${BUNDLE}"
    expire_in: 14 days
  cache:
    key: "flatpak"
    paths:
      - .flatpak-builder/downloads/
      - .flatpak-builder/git/
      - target/
      - target_test/
  when: "manual"

macos installer stable:
  stage: test
  needs:
    - job: "windows rust docker stable"
      artifacts: false
  tags:
    - gst-macos-11.1
  before_script:
    - pip3 install --upgrade pip
    # Make sure meson is up to date
    - pip3 install -U meson
    # Need to install certificates for python
    - pip3 install --upgrade certifi
    # Another way to install certificates
    - open /Applications/Python\ 3.8/Install\ Certificates.command
    # Get ninja
    - pip3 install -U ninja
  script:
    # rust toolchain
    - curl https://sh.rustup.rs -sSf | sh -s -- -y
    - source $HOME/.cargo/env
    # brew install
    - /bin/bash -c "./installer/macos/package_setup.sh"
    - /bin/bash -c "./installer/macos/deploy_macos.sh"
  artifacts:
    name: "MacOS installer"
    paths:
      - installer/**/GstPipelineStudio*.dmg
      - installer/**/GstPipelineStudio*.tar.gz
    expire_in: 14 days
  when: "manual"

macos installer release:
  extends: "macos installer stable"
  stage: release
  only:
    - flatpak
    - tags
  artifacts:
    name: "MacOS installer"
    paths:
      - installer/**/GstPipelineStudio*.dmg
      - installer/**/GstPipelineStudio*.tar.gz
  when: "always"

pages:
  image: ruby:2.7
  stage: deploy
  script:
    - gem install bundler
    - bundle install
    - bundle exec jekyll build -d public
  artifacts:
    paths:
      # The folder that contains the files to be exposed at the Page URL
      - public
  rules:
    # This ensures that only pushes to the default branch will trigger
    # a pages deploy
    - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
