unittests:
  extends: .recompile-branch
  stage: build
  image: registry.gitlab.com/veloren/veloren-docker-ci/cache/quality:${CACHE_IMAGE_TAG}
  variables:
    GIT_DEPTH: 9999999999999
  script:
    - ln -s /dockercache/target target
    - rm -r target/debug/incremental/veloren_* || echo "all good" # TMP FIX FOR 2021-03-22-nightly
    - cargo test --package veloren-i18n --lib test_all_localizations -- --nocapture --ignored
    - rm -r target/debug/incremental* || echo "all good" # TMP FIX FOR 2021-03-22-nightly
    - cargo test --features asset_tweak
  retry:
    max: 2

benchmarks:
  extends: .post-merge
  stage: build
  image: registry.gitlab.com/veloren/veloren-docker-ci/cache/bench:${CACHE_IMAGE_TAG}
  tags:
    - veloren-benchmark
  script:
    - unset DISABLE_GIT_LFS_CHECK
    - ln -s /dockercache/target target
    - ls -la target/*
    - rm -r target/debug/incremental/veloren_* || echo "all good" # TMP FIX FOR 2021-03-22-nightly
    - rm -r target/release/incremental/veloren_* || echo "all good" # TMP FIX FOR 2021-03-22-nightly
    - rm -r target/debug/incremental/* || echo "all good" # TMP FIX FOR 2021-03-22-nightly
    - rm -r target/release/incremental/* || echo "all good" # TMP FIX FOR 2021-03-22-nightly
    - cargo bench || exit 0 #temp fix
    - TAGUUID="Z$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 1)" || echo "ignore this returncode, dont ask me why, it works"
    - echo $TAGUUID
    - echo 'SET veloren.timestamp = "'"$(git show --no-patch --no-notes --pretty='%cd' HEAD)"'";' > upload.sql
    - echo "SET veloren.branch = \$${TAGUUID}\$${CI_COMMIT_REF_NAME}\$${TAGUUID}\$;" >> upload.sql
    - echo "SET veloren.sha = \$${TAGUUID}\$${CI_COMMIT_SHA}\$${TAGUUID}\$;" >> upload.sql
    - find target/criterion -wholename "*new/*.csv" -exec echo '\copy benchmarks ("group", "function", "value", throughput_num, throughput_type, sample_measured_value, unit, iteration_count) from '"'{}' csv header" >> upload.sql \;
    - cat upload.sql
    - PGPASSWORD="${CIDBPASSWORD}" PGSSLROOTCERT="./.gitlab/ci-db.crt" psql "sslmode=verify-ca host=grafana.veloren.net port=15432 dbname=benchmarks" -U hgseehzjtsrghtjdcqw -f upload.sql;
  retry:
    max: 2

# Coverage is needed on master for the README.md badge to work
# tmp remove simd as it doesnt work with tarpaulin: https://github.com/rust-lang/rust/issues/77529
coverage:
  extends: .post-merge
  stage: build
  image: registry.gitlab.com/veloren/veloren-docker-ci/cache/tarpaulin:${CACHE_IMAGE_TAG}
  script:
    - ln -s /dockercache/target target
    - rm -r target/debug/incremental/veloren_* || echo "all good" # TMP FIX FOR 2021-03-22-nightly
    - find ./* -name "Cargo.toml" -exec sed -i 's/, "simd"]/]/g' {} \;
    - find ./* -name "Cargo.toml" -exec sed -i 's/"simd"]/]/g' {} \;
    - sed -i 's/vek /#vek /g' ./Cargo.toml;
    - cargo tarpaulin -v -- --test-threads=2
  retry:
    max: 2

#linux, windows, macos builds here as template
.tlinux:
  image: registry.gitlab.com/veloren/veloren-docker-ci/cache/release-linux:${CACHE_IMAGE_TAG}
  script:
    - ln -s /dockercache/target target
    - rm -r target/release/incremental/veloren_* || echo "all good" # TMP FIX FOR 2021-03-22-nightly
    - VELOREN_USERDATA_STRATEGY=executable cargo build --release
    - cp -r target/release/veloren-server-cli $CI_PROJECT_DIR
    - cp -r target/release/veloren-voxygen $CI_PROJECT_DIR
  artifacts:
    paths:
      - veloren-server-cli
      - veloren-voxygen
      - assets/
      - LICENSE
    expire_in: 1 week

.twindows:
  image: registry.gitlab.com/veloren/veloren-docker-ci/cache/release-windows:${CACHE_IMAGE_TAG}
  script:
    - update-alternatives --set x86_64-w64-mingw32-gcc /usr/bin/x86_64-w64-mingw32-gcc-posix
    - update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix
    - ln -s /dockercache/target target
    - rm -r target/release/incremental/veloren_* || echo "all good" # TMP FIX FOR 2021-03-22-nightly
    - VELOREN_USERDATA_STRATEGY=executable cargo build --target=x86_64-pc-windows-gnu --release
    - cp -r target/x86_64-pc-windows-gnu/release/veloren-server-cli.exe $CI_PROJECT_DIR
    - cp -r target/x86_64-pc-windows-gnu/release/veloren-voxygen.exe $CI_PROJECT_DIR
    - cp /usr/lib/gcc/x86_64-w64-mingw32/7.3-posix/libgcc_s_seh-1.dll $CI_PROJECT_DIR
    - cp /usr/lib/gcc/x86_64-w64-mingw32/7.3-posix/libstdc++-6.dll $CI_PROJECT_DIR
    - cp /usr/x86_64-w64-mingw32/lib/libwinpthread-1.dll $CI_PROJECT_DIR
  artifacts:
    paths:
      - veloren-server-cli.exe
      - veloren-voxygen.exe
      - assets/
      - LICENSE
      - libgcc_s_seh-1.dll
      - libstdc++-6.dll
      - libwinpthread-1.dll
    expire_in: 1 week

.tmacos:
  tags: ["veloren-macos"]
  before_script:
    - source $HOME/.cargo/env
    - cargo --version
    - export DISABLE_GIT_LFS_CHECK=true
    - export VELOREN_ASSETS="$(pwd)/assets"
    - echo "VELOREN_ASSETS=$VELOREN_ASSETS"
    - export RUSTFLAGS="-D warnings"
  script:
    - export MACOSX_DEPLOYMENT_TARGET="10.13"
    - VELOREN_USERDATA_STRATEGY=executable cargo build --release
    - cp -r target/release/veloren-server-cli $CI_PROJECT_DIR
    - cp -r target/release/veloren-voxygen $CI_PROJECT_DIR
  artifacts:
    paths:
      - veloren-server-cli
      - veloren-voxygen
      - assets/
      - LICENSE
    expire_in: 1 week

# e.g. post merge and scheduled builds
.tmacos-master-cache:
    cache:
      key: "macos-master-cache"
      paths:
        - target/

# e.g. optional builds from MRs
.tmacos-mr-cache:
    cache:
      key: "macos-mr-cache"
      paths:
        - target/

# build on release or master
linux:
  extends:
    - .tlinux
    - .release

windows:
  extends:
    - .twindows
    - .release

macos:
  extends:
    - .tmacos
    - .release
    - .tmacos-master-cache

# build on schedule quickfix till airshipper 0.5
air-linux:
  extends:
    - .tlinux
    - .release-nightly-tmp-fix-airshipper

air-windows:
  extends:
    - .twindows
    - .release-nightly-tmp-fix-airshipper

air-macos:
  extends:
    - .tmacos
    - .release-nightly-tmp-fix-airshipper
    - .tmacos-master-cache

# if NOT release or master, allow optional builds
opt-linux:
  extends:
    - .tlinux
    - .optional-release

opt-windows:
  extends:
    - .twindows
    - .optional-release

opt-macos:
  extends:
    - .tmacos
    - .optional-release
    - .tmacos-mr-cache