stages:
  - pre-check
  - build
  - test
  - deploy

# These stanzas do some common management tasks before and after the
# job-specific before_script and after_script stanzas are run.
# before_script_start configures any default global state.  The
# job-specific before_script can override this state, if required.
# before_script_end prints out information about the environment to
# improve debugging; it does not modify the environment.
# after_script_end does some common management tasks after the
# job-specific after_script is run.  It prints information about the
# environment, and does some clean up.
#
# Add this to your stanza as follows:
#
#   before_script:
#     - *before_script_start
#     - *** YOUR CODE HERE ***
#     - *before_script_end
#   after_script:
#     - *** YOUR CODE HERE ***
#     - *after_script_end

.before_script_start: &before_script_start
  - 'if test "x${RUSTFLAGS+SET}" = xSET; then echo "\$RUSTFLAGS is set ($RUSTFLAGS)"; exit 1; fi'

.before_script_end: &before_script_end
  - 'if test "x${RUSTFLAGS+SET}" = xSET; then echo "WARNING: before_script set \$RUSTFLAGS ($RUSTFLAGS)"; fi'
  - rustc --version --verbose
  - cargo --version
  - clang -v
  - if [ -d $CARGO_TARGET_DIR ]; then find $CARGO_TARGET_DIR | wc --lines; du -sh $CARGO_TARGET_DIR; fi
  - if [ -d $CARGO_HOME ]; then find $CARGO_HOME | wc --lines; du -sh $CARGO_HOME; fi

.after_script_end: &after_script_end
  - if [ -d $CARGO_TARGET_DIR ]; then find $CARGO_TARGET_DIR -type f -atime +7 -delete; fi
  - if [ -d $CARGO_TARGET_DIR ]; then du -sh $CARGO_TARGET_DIR; fi
  - if [ -d $CARGO_HOME ]; then du -sh $CARGO_HOME; fi

before_script:
  - *before_script_start
  - *before_script_end

after_script:
  - *after_script_end

trixie:
  tags:
    - linux
  stage: build
  interruptible: true
  image: 192.168.122.1:5000/sequoia-pgp/build-docker-image/trixie:latest
  script:
    - cargo test --features=subplot
    - if ! git diff --quiet Cargo.lock ; then echo "Cargo.lock changed.  Please add the change to the corresponding commit." ; git diff ; false ; fi
    - if ! git diff --quiet ; then echo "The build changed the source.  Please investigate." ; git diff ; fi
  variables:
    CARGO_TARGET_DIR: /target
    CARGO_HOME: /cargo

sq-features:
  tags:
    - linux
  stage: build
  interruptible: true
  image: 192.168.122.1:5000/sequoia-pgp/build-docker-image/trixie:latest
  only:
    refs:
      - tags
      - web
      - schedules
  parallel:
    matrix:
      - FEATURES:
        - ""
        - "autocrypt"
        - "autocrypt,compression-bzip2"
        - "compression-bzip2"
  script:
    - cargo test --no-default-features --features crypto-nettle --features $FEATURES
  variables:
    CARGO_TARGET_DIR: /target
    CARGO_HOME: /cargo

trixie-crypto-openssl:
  tags:
    - linux
  stage: build
  interruptible: true
  image: 192.168.122.1:5000/sequoia-pgp/build-docker-image/trixie:latest
  dependencies:
    - codespell
  script:
    - cargo test --no-default-features --features crypto-openssl,compression-bzip2
  variables:
    CARGO_TARGET_DIR: /target
    CARGO_HOME: /cargo

all_commits:
  # Test each commit up to main, to facilitate bisecting.
  stage: test
  interruptible: true
  image: 192.168.122.1:5000/sequoia-pgp/build-docker-image/rust-stable:latest
  needs: ["rust-stable"]
  script:
    - .ci/all_commits.sh
  variables:
    CARGO_TARGET_DIR: /target
    CARGO_HOME: /cargo
    GIT_STRATEGY: clone

codespell:
  tags:
    - linux
  stage: pre-check
  interruptible: true
  image: 192.168.122.1:5000/sequoia-pgp/build-docker-image/trixie:latest

  before_script:
    - *before_script_start
    - codespell --version
    - *before_script_end
  script:
    - codespell --summary -L "crate,ede,iff,mut,nd,te,uint,KeyServer,keyserver,Keyserver,keyservers,Keyservers,keypair,keypairs,KeyPair,fpr,dedup,deriver,certi,certp,certo" -S "*.bin,*.gpg,*.pgp,./.git,*/target,Cargo.lock"

deny:
  tags:
    - linux
  stage: test
  interruptible: true
  image: 192.168.122.1:5000/sequoia-pgp/build-docker-image/rust-stable:latest

  before_script:
    - *before_script_start
    - cargo install --locked cargo-deny
    - *before_script_end
  script:
    - cargo deny check

rust-stable:
  tags:
    - linux
  stage: build
  interruptible: true
  image: 192.168.122.1:5000/sequoia-pgp/build-docker-image/rust-stable:latest
  before_script:
    - *before_script_start
    - rustup override set stable
    - *before_script_end
  script:
    - cargo test --features=subplot
  variables:
    CARGO_TARGET_DIR: /target
    CARGO_HOME: /cargo

clippy:
  tags:
    - linux
  stage: build
  interruptible: true
  image: 192.168.122.1:5000/sequoia-pgp/build-docker-image/rust-stable:latest
  before_script:
    - *before_script_start
    - apt-get -y install libssl-dev capnproto libsqlite3-dev
    - rustup default 1.70.0
    - rustup component add clippy
    - cargo clippy --version
    - *before_script_end
  script:
    - cargo clippy
  variables:
    CARGO_TARGET_DIR: /target
    CARGO_HOME: /cargo

windows-gnu-cng:
  tags:
    - win
    - win2019
  stage: build
  interruptible: true
  image: 192.168.122.1:5000/sequoia-pgp/build-docker-image/windows-gnu
  only:
    variables:
      # Forks of this project most likely use gitlab's shared windows runners, which
      # do not use the docker executor, so disable the windows jobs for forks.
      - $CI_PROJECT_NAMESPACE == "sequoia-pgp"
  before_script:
    # We don't call *before_script_start or *before_script_end as we
    # don't have bash, clang, etc.
    - rustup default "1.70.0"
    - rustc --version --verbose
    - cargo --version
  script:
    # https://github.com/rust-lang/cargo/issues/5015
    - pacman --noconfirm --needed -S mingw-w64-x86_64-openssl
    - cargo test --tests --no-default-features --features crypto-cng,compression-bzip2,subplot
  after_script: [] # scriptlet doesn't work on Powershell
  variables:
    CFLAGS: "" # Silence some C warnings when compiling under Windows

docker-build-push:
  # Official docker image.
  image: docker:stable
  stage: build
  services:
    - docker:dind
  tags:
    - docker
    - self-hosted
  before_script:
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
  script:
    - >
      docker build
      --no-cache
      --target sq
      --tag "$IMAGE":latest
      .
    # smoke test
    - docker run "$IMAGE":latest --help
    - docker push "$IMAGE":latest
  after_script: []
  only:
    refs:
      - /docker/i # refs containing 'docker' keyword
      - tags
      - web
      - schedules
  variables:
    CI_REGISTRY: "registry.gitlab.com"
    IMAGE: "$CI_REGISTRY/sequoia-pgp/sequoia-sq"
    DOCKER_HOST: tcp://docker:2376

pages:
  stage: deploy
  image: 192.168.122.1:5000/sequoia-pgp/build-docker-image/trixie-pandoc:latest
  script:
    - ASSET_OUT_DIR=/tmp/assets cargo doc --no-deps -p sequoia-sq
    - mkdir public
    - mv -v target/doc public/impl

    - for M in /tmp/assets/man-pages/*; do pandoc -s $M -L src/man-pandoc.lua -H src/man-pandoc.inc.html -o $M.html ; done
    - mkdir public/man
    - mv -v /tmp/assets/man-pages/*.html public/man

    - mkdir public/subplot
    - pandoc -s -o public/subplot/sq-subplot.html sq-subplot.md
    - pandoc -s -o public/subplot/sq-subplot.pdf sq-subplot.md

    - echo "/sequoia-sq/ /sequoia-sq/man/sq.1.html 302" > public/_redirects
    - echo "/sequoia-sq/impl /sequoia-sq/impl/sq/index.html 302" >> public/_redirects
    - echo "/sequoia-sq/man /sequoia-sq/man/sq.1.html 302" >> public/_redirects
    - echo "/sequoia-sq/subplot /sequoia-sq/subplot/sq-subplot.html 302" >> public/_redirects
  artifacts:
    paths:
      - public
  only:
    - main

variables:
  DEBIAN_FRONTEND: noninteractive
  CARGO_HOME: $CI_PROJECT_DIR/../cargo
  CARGO_FLAGS: --color always
  CARGO_INCREMENTAL: 0
  RUST_BACKTRACE: full
  CFLAGS: -Werror
  QUICKCHECK_GENERATOR_SIZE: 500 # https://github.com/BurntSushi/quickcheck/pull/240
