---
# Github Actions build for rclone
# -*- compile-command: "yamllint -f parsable build.yml" -*-

name: build

# Trigger the workflow on push or pull request
on:
  push:
    branches:
      - '*'
    tags:
      - '*'
  pull_request:

jobs:
  build:
    timeout-minutes: 60
    strategy:
      fail-fast: false
      matrix:
        job_name: ['linux', 'mac', 'windows_amd64', 'windows_386', 'other_os', 'go1.13', 'go1.14', 'go1.15']

        include:
          - job_name: linux
            os: ubuntu-latest
            go: '1.16.0-rc1'
            gotags: cmount
            build_flags: '-include "^linux/"'
            check: true
            quicktest: true
            racequicktest: true
            deploy: true

          - job_name: mac
            os: macOS-latest
            go: '1.16.0-rc1'
            gotags: 'cmount'
            build_flags: '-include "^darwin/amd64" -cgo'
            quicktest: true
            racequicktest: true
            deploy: true

          - job_name: windows_amd64
            os: windows-latest
            go: '1.16.0-rc1'
            gotags: cmount
            build_flags: '-include "^windows/amd64" -cgo'
            build_args: '-buildmode exe'
            quicktest: true
            racequicktest: true
            deploy: true

          - job_name: windows_386
            os: windows-latest
            go: '1.16.0-rc1'
            gotags: cmount
            goarch: '386'
            cgo: '1'
            build_flags: '-include "^windows/386" -cgo'
            build_args: '-buildmode exe'
            quicktest: true
            deploy: true

          - job_name: other_os
            os: ubuntu-latest
            go: '1.16.0-rc1'
            build_flags: '-exclude "^(windows/|darwin/amd64|linux/)"'
            compile_all: true
            deploy: true

          - job_name: go1.13
            os: ubuntu-latest
            go: '1.13.x'
            quicktest: true

          - job_name: go1.14
            os: ubuntu-latest
            go: '1.14.x'
            quicktest: true
            racequicktest: true

          - job_name: go1.15
            os: ubuntu-latest
            go: '1.15.x'
            quicktest: true
            racequicktest: true

    name: ${{ matrix.job_name }}

    runs-on: ${{ matrix.os }}

    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Install Go
        uses: actions/setup-go@v2
        with:
          stable: 'false'
          go-version: ${{ matrix.go }}

      - name: Set environment variables
        shell: bash
        run: |
          echo 'GOTAGS=${{ matrix.gotags }}' >> $GITHUB_ENV
          echo 'BUILD_FLAGS=${{ matrix.build_flags }}' >> $GITHUB_ENV
          echo 'BUILD_ARGS=${{ matrix.build_args }}' >> $GITHUB_ENV
          if [[ "${{ matrix.goarch }}" != "" ]]; then echo 'GOARCH=${{ matrix.goarch }}' >> $GITHUB_ENV ; fi
          if [[ "${{ matrix.cgo }}" != "" ]]; then echo 'CGO_ENABLED=${{ matrix.cgo }}' >> $GITHUB_ENV ; fi

      - name: Install Libraries on Linux
        shell: bash
        run: |
          sudo modprobe fuse
          sudo chmod 666 /dev/fuse
          sudo chown root:$USER /etc/fuse.conf
          sudo apt-get install fuse libfuse-dev rpm pkg-config
        if: matrix.os == 'ubuntu-latest'

      - name: Install Libraries on macOS
        shell: bash
        run: |
          brew update
          brew install --cask osxfuse
        if: matrix.os == 'macOS-latest'

      - name: Install Libraries on Windows
        shell: powershell
        run: |
          $ProgressPreference = 'SilentlyContinue'
          choco install -y winfsp zip
          echo "CPATH=C:\Program Files\WinFsp\inc\fuse;C:\Program Files (x86)\WinFsp\inc\fuse" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
          if ($env:GOARCH -eq "386") {
            choco install -y mingw --forcex86 --force
            echo "C:\\ProgramData\\chocolatey\\lib\\mingw\\tools\\install\\mingw32\\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
          }
          # Copy mingw32-make.exe to make.exe so the same command line
          # can be used on Windows as on macOS and Linux
          $path = (get-command mingw32-make.exe).Path
          Copy-Item -Path $path -Destination (Join-Path (Split-Path -Path $path) 'make.exe')
        if: matrix.os == 'windows-latest'

      - name: Print Go version and environment
        shell: bash
        run: |
          printf "Using go at: $(which go)\n"
          printf "Go version: $(go version)\n"
          printf "\n\nGo environment:\n\n"
          go env
          printf "\n\nRclone environment:\n\n"
          make vars
          printf "\n\nSystem environment:\n\n"
          env

      - name: Go module cache
        uses: actions/cache@v2
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-

      - name: Build rclone
        shell: bash
        run: |
          make

      - name: Run tests
        shell: bash
        run: |
          make quicktest
        if: matrix.quicktest

      - name: Race test
        shell: bash
        run: |
          make racequicktest
        if: matrix.racequicktest

      - name: Code quality test
        shell: bash
        run: |
          make build_dep
          make check
        if: matrix.check

      - name: Compile all architectures test
        shell: bash
        run: |
          make
          make compile_all
        if: matrix.compile_all

      - name: Deploy built binaries
        shell: bash
        run: |
          if [[ "${{ matrix.os }}" == "ubuntu-latest" ]]; then make release_dep_linux ; fi
          if [[ "${{ matrix.os }}" == "windows-latest" ]]; then make release_dep_windows ; fi
          make ci_beta
        env:
          RCLONE_CONFIG_PASS: ${{ secrets.RCLONE_CONFIG_PASS }}
        # working-directory: '$(modulePath)'
        # Deploy binaries if enabled in config && not a PR && not a fork
        if: matrix.deploy && github.head_ref == '' && github.repository == 'rclone/rclone'

  xgo:
    timeout-minutes: 60
    name: "xgo cross compile"
    runs-on: ubuntu-latest

    steps:

      - name: Checkout
        uses: actions/checkout@v1
        with:
          # Checkout into a fixed path to avoid import path problems on go < 1.11
          path: ./src/github.com/rclone/rclone

      - name: Set environment variables
        shell: bash
        run: |
          echo 'GOPATH=${{ runner.workspace }}' >> $GITHUB_ENV
          echo '${{ runner.workspace }}/bin' >> $GITHUB_PATH

      - name: Cross-compile rclone
        run: |
          docker pull billziss/xgo-cgofuse
          GO111MODULE=off go get -v github.com/karalabe/xgo # don't add to go.mod
          # xgo \
          #     -image=billziss/xgo-cgofuse \
          #     -targets=darwin/amd64,linux/386,linux/amd64,windows/386,windows/amd64 \
          #     -tags cmount \
          #     -dest build \
          #     .
          xgo \
              -image=billziss/xgo-cgofuse \
              -targets=android/*,ios/* \
              -dest build \
              .

      - name: Build rclone
        shell: bash
        run: |
          make

      - name: Upload artifacts
        run: |
          make ci_upload
        env:
          RCLONE_CONFIG_PASS: ${{ secrets.RCLONE_CONFIG_PASS }}
        # Upload artifacts if not a PR && not a fork
        if: github.head_ref == '' && github.repository == 'rclone/rclone'
