trigger:
- master

strategy:
  matrix:
    linux:
      imageName: ubuntu-18.04
      gorootDir: /usr/local
    mac:
      # Mojave
      imageName: macos-10.14
      gorootDir: /usr/local
    windows:
      imageName: windows-2019
      gorootDir: C:\

pool:
  vmImage: $(imageName)

variables:
  GOROOT: $(gorootDir)/go
  GOPATH: $(system.defaultWorkingDirectory)/gopath
  GOBIN:  $(GOPATH)/bin
  modulePath: '$(GOPATH)/src/github.com/$(build.repository.name)'
  # TODO: Enable modules after upstream dependency zstd supports them
  # TODO: modules should be the default in Go 1.13, so this won't be needed
  #GO111MODULE: on

steps:

- bash: git config --global core.autocrlf false
  displayName: "Disable line ending conversion for git to"

- checkout: self

- bash: |
    latestGo=$(curl "https://golang.org/VERSION?m=text")
    echo "##vso[task.setvariable variable=LATEST_GO]$latestGo"
    echo "Latest Go version: $latestGo"
  displayName: "Get latest Go version"

- bash: |
    sudo rm -f $(which go)
    echo '##vso[task.prependpath]$(GOBIN)'
    echo '##vso[task.prependpath]$(GOROOT)/bin'
    mkdir -p '$(modulePath)'
    shopt -s extglob
    shopt -s dotglob
    mv !(gopath) '$(modulePath)'
  displayName: Remove old Go, set GOBIN/GOROOT, and move project into GOPATH

# Install Go (this varies by platform)

- bash: |
    wget "https://dl.google.com/go/$(LATEST_GO).linux-amd64.tar.gz"
    sudo tar -C $(gorootDir) -xzf "$(LATEST_GO).linux-amd64.tar.gz"
  condition: eq( variables['Agent.OS'], 'Linux' )
  displayName: Install Go on Linux

- bash: |
    wget "https://dl.google.com/go/$(LATEST_GO).darwin-amd64.tar.gz"
    sudo tar -C $(gorootDir) -xzf "$(LATEST_GO).darwin-amd64.tar.gz"
  condition: eq( variables['Agent.OS'], 'Darwin' )
  displayName: Install Go on macOS

- powershell: |
    echo "Downloading Go..."
    # Windows comes with BSD curl, which is MUCH faster than the native Windows HTTP
    curl.exe -fsSL -o "$(LATEST_GO).windows-amd64.zip" "https://dl.google.com/go/$(LATEST_GO).windows-amd64.zip"
    echo "Extracting Go..."
    # Yes, Windows tar (BSD tar) handles zip files. Who knew!?
    # (and it's MUCH, MUCH, MUCH faster than the native Windows expander)
    tar.exe xf "$(LATEST_GO).windows-amd64.zip" -C "$(gorootDir)"
  condition: eq( variables['Agent.OS'], 'Windows_NT' )
  displayName: Install Go on Windows

- bash: |
    printf "Using go at: $(which go)\n"
    printf "Go version: $(go version)\n"
    printf "\n\nGo environment:\n\n"
    go env
    printf "\n\nSystem environment:\n\n"
    env
  displayName: Print Go version and environment

- script: |
    curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s v1.31.0
    ./bin/golangci-lint run -E gofmt -E goimports -E misspell ./...
  workingDirectory: '$(modulePath)'
  condition: eq( variables['Agent.OS'], 'Linux' )
  displayName: Run Lint

- bash: |
    go mod tidy
    if [ ! -z "$(git status --porcelain go.mod)" ]; then
      printf "go.mod has modifications\n"
      git diff go.mod
      exit 1
    fi
    if [ ! -z "$(git status --porcelain go.sum)" ]; then
      printf "go.sum has modifications\n"
      git diff go.sum
      exit 1
    fi
  workingDirectory: '$(modulePath)'
  displayName: Ensure that module definition and checksums are correct

- script: |
    go test -race ./...
  workingDirectory: '$(modulePath)'
  displayName: Run tests