name: release
on:
  schedule:
  - cron: '0 0 * * *' # midnight UTC

  push:
    branches:
    - release
    - trigger-nightly

env:
  CARGO_INCREMENTAL: 0
  CARGO_NET_RETRY: 10
  RUSTFLAGS: "-D warnings -W unreachable-pub"
  RUSTUP_MAX_RETRIES: 10

jobs:
  dist-x86_64-pc-windows-msvc:
    name: dist (x86_64-pc-windows-msvc)
    runs-on: windows-latest
    env:
      RA_TARGET: x86_64-pc-windows-msvc

    steps:
    - name: Checkout repository
      uses: actions/checkout@v2

    # We need to disable the existing toolchain to avoid updating rust-docs
    # which takes a long time. The fastest way to do this is to rename the
    # existing folder, as deleting it takes about as much time as not doing
    # anything and just updating rust-docs.
    - name: Rename existing rust toolchain
      run: Rename-Item C:\Users\runneradmin\.rustup\toolchains\stable-x86_64-pc-windows-msvc C:\Users\runneradmin\.rustup\toolchains\stable-x86_64-pc-windows-msvc.old

    - name: Install Rust toolchain
      uses: actions-rs/toolchain@v1
      with:
        toolchain: stable
        profile: minimal
        override: true

    - name: Dist
      run: cargo xtask dist

    - name: Upload artifacts
      uses: actions/upload-artifact@v1
      with:
        name: dist-x86_64-pc-windows-msvc
        path: ./dist

  dist-aarch64-pc-windows-msvc:
    name: dist (aarch64-pc-windows-msvc)
    runs-on: windows-latest
    env:
      RA_TARGET: aarch64-pc-windows-msvc

    steps:
    - name: Checkout repository
      uses: actions/checkout@v2

    - name: Rename existing rust toolchain
      run: Rename-Item C:\Users\runneradmin\.rustup\toolchains\stable-x86_64-pc-windows-msvc C:\Users\runneradmin\.rustup\toolchains\stable-x86_64-pc-windows-msvc.old

    - name: Install Rust toolchain
      uses: actions-rs/toolchain@v1
      with:
        toolchain: stable
        target: aarch64-pc-windows-msvc
        profile: minimal
        override: true

    - name: Dist
      run: cargo xtask dist

    - name: Upload artifacts
      uses: actions/upload-artifact@v1
      with:
        name: dist-aarch64-pc-windows-msvc
        path: ./dist

  dist-x86_64-unknown-linux-gnu:
    name: dist (x86_64-unknown-linux-gnu)
    runs-on: ubuntu-16.04
    env:
      RA_TARGET: x86_64-unknown-linux-gnu

    steps:
    - name: Checkout repository
      uses: actions/checkout@v2

    - name: Install Rust toolchain
      uses: actions-rs/toolchain@v1
      with:
        toolchain: stable
        profile: minimal
        override: true
        components: rust-src

    - name: Install Nodejs
      uses: actions/setup-node@v1
      with:
        node-version: 12.x

    - name: Dist
      if: github.ref == 'refs/heads/release'
      run: cargo xtask dist --client 0.2.$GITHUB_RUN_NUMBER

    - name: Dist
      if: github.ref != 'refs/heads/release'
      run: cargo xtask dist --nightly --client 0.3.$GITHUB_RUN_NUMBER-nightly

    - name: Run analysis-stats on rust-analyzer
      run: target/${{ env.RA_TARGET }}/release/rust-analyzer analysis-stats .

    - name: Run analysis-stats on rust std library
      run: target/${{ env.RA_TARGET }}/release/rust-analyzer analysis-stats --with-deps $(rustc --print sysroot)/lib/rustlib/src/rust/library/std

    - name: Upload artifacts
      uses: actions/upload-artifact@v1
      with:
        name: dist-x86_64-unknown-linux-gnu
        path: ./dist

  dist-x86_64-unknown-linux-musl:
    name: dist (x86_64-unknown-linux-musl)
    runs-on: ubuntu-20.04
    env:
      RA_TARGET: x86_64-unknown-linux-musl
      # For some reason `-crt-static` is not working for clang without lld
      RUSTFLAGS: "-C link-arg=-fuse-ld=lld -C target-feature=-crt-static"
    container:
      image: rust:alpine
      volumes:
      - /usr/local/cargo/registry

    steps:
    - name: Install dependencies
      run: apk add --no-cache git clang lld musl-dev

    - name: Checkout repository
      uses: actions/checkout@v2

    - name: Dist
      run: cargo xtask dist

    - name: Upload artifacts
      uses: actions/upload-artifact@v1
      with:
        name: dist-x86_64-unknown-linux-musl
        path: ./dist

  dist-aarch64-unknown-linux-gnu:
    name: dist (aarch64-unknown-linux-gnu)
    runs-on: ubuntu-16.04
    env:
      RA_TARGET: aarch64-unknown-linux-gnu
      CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc

    steps:
    - name: Checkout repository
      uses: actions/checkout@v2

    - name: Install Rust toolchain
      uses: actions-rs/toolchain@v1
      with:
        toolchain: stable
        target: aarch64-unknown-linux-gnu
        profile: minimal
        override: true

    - name: Install target toolchain
      run: sudo apt-get install gcc-aarch64-linux-gnu

    - name: Dist
      run: cargo xtask dist

    - name: Upload artifacts
      uses: actions/upload-artifact@v1
      with:
        name: dist-aarch64-unknown-linux-gnu
        path: ./dist

  dist-x86_64-apple-darwin:
    name: dist (x86_64-apple-darwin)
    runs-on: macos-latest
    env:
      RA_TARGET: x86_64-apple-darwin
      SELECT_XCODE: /Applications/Xcode_12.2.app

    steps:
    - name: Select XCode version
      run: sudo xcode-select -s "${SELECT_XCODE}"

    - name: Checkout repository
      uses: actions/checkout@v2

    - name: Install Rust toolchain
      uses: actions-rs/toolchain@v1
      with:
        toolchain: stable
        profile: minimal
        override: true

    - name: Dist
      run: cargo xtask dist

    - name: Upload artifacts
      uses: actions/upload-artifact@v1
      with:
        name: dist-x86_64-apple-darwin
        path: ./dist

  dist-aarch64-apple-darwin:
    name: dist (aarch64-apple-darwin)
    runs-on: macos-latest
    env:
      RA_TARGET: aarch64-apple-darwin
      SELECT_XCODE: /Applications/Xcode_12.2.app

    steps:
    - name: Select XCode version
      run: sudo xcode-select -s "${SELECT_XCODE}"

    - name: Checkout repository
      uses: actions/checkout@v2

    - name: Install Rust toolchain
      uses: actions-rs/toolchain@v1
      with:
        toolchain: stable
        target: aarch64-apple-darwin
        profile: minimal
        override: true

    - name: Dist
      run: SDKROOT=$(xcrun -sdk macosx11.0 --show-sdk-path) MACOSX_DEPLOYMENT_TARGET=$(xcrun -sdk macosx11.0 --show-sdk-platform-version) cargo xtask dist

    - name: Upload artifacts
      uses: actions/upload-artifact@v1
      with:
        name: dist-aarch64-apple-darwin
        path: ./dist

  publish:
    name: publish
    runs-on: ubuntu-16.04
    needs: ['dist-x86_64-pc-windows-msvc', 'dist-aarch64-pc-windows-msvc', 'dist-x86_64-unknown-linux-gnu', 'dist-x86_64-unknown-linux-musl', 'dist-aarch64-unknown-linux-gnu', 'dist-x86_64-apple-darwin', 'dist-aarch64-apple-darwin']
    steps:
    - name: Install Nodejs
      uses: actions/setup-node@v1
      with:
        node-version: 12.x

    - run: echo "TAG=$(date --iso --utc)" >> $GITHUB_ENV
      if: github.ref == 'refs/heads/release'
    - run: echo "TAG=nightly" >> $GITHUB_ENV
      if: github.ref != 'refs/heads/release'
    - run: 'echo "TAG: $TAG"'

    - name: Checkout repository
      uses: actions/checkout@v2

    - run: echo "HEAD_SHA=$(git rev-parse HEAD)" >> $GITHUB_ENV
    - run: 'echo "HEAD_SHA: $HEAD_SHA"'

    - uses: actions/download-artifact@v1
      with:
        name: dist-aarch64-apple-darwin
        path: dist
    - uses: actions/download-artifact@v1
      with:
        name: dist-x86_64-apple-darwin
        path: dist
    - uses: actions/download-artifact@v1
      with:
        name: dist-x86_64-unknown-linux-gnu
        path: dist
    - uses: actions/download-artifact@v1
      with:
        name: dist-x86_64-unknown-linux-musl
        path: dist
    - uses: actions/download-artifact@v1
      with:
        name: dist-aarch64-unknown-linux-gnu
        path: dist
    - uses: actions/download-artifact@v1
      with:
        name: dist-x86_64-pc-windows-msvc
        path: dist
    - uses: actions/download-artifact@v1
      with:
        name: dist-aarch64-pc-windows-msvc
        path: dist
    - run: ls -al ./dist

    - name: Publish Release
      uses: ./.github/actions/github-release
      with:
        files: "dist/*"
        name: ${{ env.TAG }}
        token: ${{ secrets.GITHUB_TOKEN }}

    - run: npm ci
      working-directory: ./editors/code

    - name: Publish Extension
      if: github.ref == 'refs/heads/release'
      working-directory: ./editors/code
      # token from https://dev.azure.com/rust-analyzer/
      run: npx vsce publish --pat ${{ secrets.MARKETPLACE_TOKEN }} --packagePath ../../dist/rust-analyzer.vsix