name: CI
on:
  push:
    branches-ignore: [master]
  pull_request:
    branches: ['*']

defaults:
  run:
    shell: bash

jobs:
  # Check Code style quickly by running `rustfmt` over all code
  rustfmt:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - run: rustup update stable && rustup default stable
    - run: rustup component add rustfmt
    - run: cargo fmt --all -- --check
    - run: |
        for manifest in `find crates -name Cargo.toml`
        do
          echo check fmt for $manifest
          cargo fmt --all --manifest-path $manifest -- --check
        done

  test:
    runs-on: ${{ matrix.os }}
    env:
      CARGO_PROFILE_DEV_DEBUG: 1
      CARGO_PROFILE_TEST_DEBUG: 1
      CARGO_INCREMENTAL: 0
    strategy:
      matrix:
        include:
        - os: ubuntu-latest
          rust: stable
          other: i686-unknown-linux-gnu
        - os: ubuntu-latest
          rust: beta
          other: i686-unknown-linux-gnu
        - os: ubuntu-latest
          rust: nightly
          other: i686-unknown-linux-gnu
        - os: macos-latest
          rust: stable
          other: x86_64-apple-ios
        - os: windows-latest
          rust: stable-msvc
          other: i686-pc-windows-msvc
        - os: windows-latest
          rust: nightly-gnu
          other: i686-pc-windows-gnu
    steps:
    - uses: actions/checkout@v2
    - run: rustup update --no-self-update ${{ matrix.rust }} && rustup default ${{ matrix.rust }}
    - run: rustup target add ${{ matrix.other }}
    - run: rustup component add rustc-dev llvm-tools-preview rust-docs
      if: startsWith(matrix.rust, 'nightly')
    - run: sudo apt update -y && sudo apt install gcc-multilib libsecret-1-0 libsecret-1-dev -y
      if: matrix.os == 'ubuntu-latest'
    - run: rustup component add rustfmt || echo "rustfmt not available"

    # Deny warnings on CI to avoid warnings getting into the codebase.
    - run: cargo test --features 'deny-warnings'
    - run: cargo test --features 'deny-warnings' -p cargo-test-support
    - run: cargo test -p cargo-platform
    - run: cargo test -p cargo-util
    - run: cargo test --manifest-path crates/mdman/Cargo.toml
    - run: cargo build --manifest-path crates/credential/cargo-credential-1password/Cargo.toml
    - run: cargo build --manifest-path crates/credential/cargo-credential-gnome-secret/Cargo.toml
      if: matrix.os == 'ubuntu-latest'
    - run: cargo build --manifest-path crates/credential/cargo-credential-macos-keychain/Cargo.toml
      if: matrix.os == 'macos-latest'
    - run: cargo build --manifest-path crates/credential/cargo-credential-wincred/Cargo.toml
      if: matrix.os == 'windows-latest'

  resolver:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - run: rustup update stable && rustup default stable
    - run: cargo test --manifest-path crates/resolver-tests/Cargo.toml

  build_std:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - run: rustup update nightly && rustup default nightly
    - run: rustup component add rust-src
    - run: cargo build
    - run: cargo test --test build-std
      env:
        CARGO_RUN_BUILD_STD_TESTS: 1
  docs:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - run: rustup update nightly && rustup default nightly
    - run: rustup component add rust-docs
    - run: ci/validate-man.sh
    # This requires rustfmt, use stable.
    - run: cd src/doc/semver-check && cargo +stable run
    - run: |
        mkdir mdbook
        curl -Lf https://github.com/rust-lang/mdBook/releases/download/v0.4.5/mdbook-v0.4.5-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=./mdbook
        echo `pwd`/mdbook >> $GITHUB_PATH
    - run: cargo doc --no-deps
    - run: cd src/doc && mdbook build --dest-dir ../../target/doc
    - run: |
        cd src/doc
        curl -sSLo linkcheck.sh \
          https://raw.githubusercontent.com/rust-lang/rust/master/src/tools/linkchecker/linkcheck.sh
        sh linkcheck.sh --all cargo

  success:
    name: bors build finished
    needs: [docs, rustfmt, test, resolver, build_std]
    runs-on: ubuntu-latest
    if: "success() && github.event_name == 'push' && github.ref == 'refs/heads/auto-cargo'"
    steps:
    - run: echo ok
  failure:
    name: bors build finished
    needs: [docs, rustfmt, test, resolver, build_std]
    runs-on: ubuntu-latest
    if: "!success() && github.event_name == 'push' && github.ref == 'refs/heads/auto-cargo'"
    steps:
    - run: exit 1
