---

stages:
  - lint
  - test
  - bot

variables:
  DOCS_BASEURL: "https://docs.xmpp.rs"
  FEATURES: ""
  RUST_BACKTRACE: "full"
  RUSTFLAGS: " -D warnings"
  RUSTDOCFLAGS: " -D warnings"
  CARGO_TERM_COLOR: "always"

.show-version:
  before_script:
    - apt-get update; apt-get install -y --no-install-recommends pkg-config libssl-dev
    - rustc --version
    - cargo --version

.stable:
  image: rust:slim
  extends:
    - .show-version

.nightly:
  image: rustlang/rust:nightly-slim
  extends:
    - .show-version

.test:
  stage: test
  script:
    - cargo test --verbose
    - cargo test --verbose --no-default-features
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
    - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_REF_NAME == 'main'

.docs:
  stage: test
  script:
    - echo "Building docs to CI_DOC_TARGET=$CI_DOC_TARGET"
    - RUSTDOCFLAGS="--cfg docsrs -D warnings" RUSTFLAGS="--cfg xmpprs_doc_build" cargo +nightly doc --no-deps -Zrustdoc-map --all-features
    - apt install -y rsync openssh-client
    - mkdir -p $HOME/.ssh
    - echo -e "Host docs\n\tHostname ssh.docsxmpprs-2025.sotecware.net\n\tPort 1312\n\tUser docs\n\tStrictHostKeyChecking no" > $HOME/.ssh/config
    - echo "$SECRET_DOCS_SSH_PRIVATE" > $HOME/.ssh/id_ed25519
    - chmod 400 $HOME/.ssh/id_ed25519
    - rsync -av --rsh=ssh target/doc/ docs::www/$CI_DOC_TARGET
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
      variables:
        CI_DOC_TARGET: "$CI_MERGE_REQUEST_IID"
    - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_REF_NAME == 'main'
      variables:
        CI_DOC_TARGET: "main"
  extends:
    - .show-version

rustfmt:
  stage: lint
  script:
    - rustup component add rustfmt
    - cargo fmt --version
    - cargo fmt --check
  extends:
    - .stable
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
    - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_REF_NAME == 'main'

typos:
  stage: lint
  script:
    - cargo install typos-cli
    - typos
  extends:
    - .stable
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
    - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_REF_NAME == 'main'

changelog-update:
  stage: lint
  image: alpine:latest
  # Check in the commit message for "skip.?changelog", if not present
  # then check for changes in changelogs.
  # XXX: It looks like $CI_COMMIT_MESSAGE mangles newlines so it's not
  # possible to require the "skip.?changelog" string to be on its own line,
  # that means it would also trigger within a wall of text. Not so obvious.
  # TODO: Check the whole MR for updates in changelogs, not just the last
  # commit.
  script:
    - apk add --no-cache python3 git
    - python3 --version
    - git version
    - git fetch --depth 16 origin main
    - |
      if ! git log --oneline "${CI_MERGE_REQUEST_DIFF_BASE_SHA}.." --; then
        echo "Failed to find revision ${CI_MERGE_REQUEST_DIFF_BASE_SHA}.." >&2
        echo "This likely means that you need to rebase your branch." >&2
        exit 1
      fi
    - python3 .forgejo/workflows/check-changelog.py
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
    - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_REF_NAME == 'main'

stable-test:
  extends:
    - .test
    - .stable

nightly-test:
  # It's not often, but it happens nightly breaks, surprisingly.
  allow_failure: true
  extends:
    - .test
    - .nightly

docs:
  extends:
    - .docs
    - .nightly

#bot-comment:
#  stage: bot
#  image: alpine:latest
#  script:
#    - apk add --no-cache glab
#    - glab mr --repo "$CI_MERGE_REQUEST_PROJECT_PATH" comment $CI_MERGE_REQUEST_IID --unique --message "Thanks for your MR! You can preview the docs [here]($DOCS_BASEURL/$CI_MERGE_REQUEST_IID/)."
#  rules:
#    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
#      variables:
#        GITLAB_TOKEN: $MR_AUTOMATION_TOKEN
