#!/usr/bin/env bash
# Copyright 2021 The Go Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.

RED=; GREEN=; YELLOW=; BLUE=; BOLD=; RESET=;

case $TERM in
  '' | xterm) ;;
  # If xterm is not xterm-16color, xterm-88color, or xterm-256color, tput will
  # return the error:
  #   tput: No value for $TERM and no -T specified
  *)
      RED=`tput setaf 1`
      GREEN=`tput setaf 2`
      YELLOW=`tput setaf 3`
      NORMAL=`tput sgr0`
esac

EXIT_CODE=0

info() { echo -e "${GREEN}$@${NORMAL}" 1>&2; }
err() { echo -e "${RED}$@${NORMAL}" 1>&2; EXIT_CODE=1; }

# runcud prints an info log describing the command that is about to be run, and
# then runs it. It sets EXIT_CODE to non-zero if the command fails, but does not exit
# the script.
runcmd() {
  # Truncate command logging for narrow terminals.
  # Account for the 2 characters of '$ '.
  maxwidth=$(( $(tput cols) - 2 ))
  if [[ ${#msg} -gt $maxwidth ]]; then
    msg="${msg::$(( maxwidth - 3 ))}..."
  fi

  echo -e "$@\n" 1>&2;
  $@ || err "command failed"
}

# ensure_go_binary verifies that a binary exists in $PATH corresponding to the
# given go-gettable URI. If no such binary exists, it is fetched via `go get`.
ensure_go_binary() {
  local binary=$(basename $1)
  if ! [ -x "$(command -v $binary)" ]; then
    info "Installing: $1"
    # Run in a subshell for convenience, so that we don't have to worry about
    # our PWD.
    (set -x; cd && env GO111MODULE=on go get -u $1)
  fi
}

# verify_header checks that all given files contain the standard header for Go
# projects.
verify_header() {
  if [[ "$@" != "" ]]; then
    for FILE in $@
    do
        line="$(head -1 $FILE)"
        if [[ ! $line == *"The Go Authors. All rights reserved."* ]] &&
         [[ ! $line == "// DO NOT EDIT. This file was copied from" ]]; then
              err "missing license header: $FILE"
        fi
    done
  fi
}

# Support ** in globs for findcode.
shopt -s globstar

# findcode finds source files in the repo.
findcode() {
  find **/*.go
}

# check_headers checks that all source files that have been staged in this
# commit, and all other non-third-party files in the repo, have a license
# header.
check_headers() {
  if [[ $# -gt 0 ]]; then
    info "Checking listed files for license header"
    verify_header $*
  else
    info "Checking staged files for license header"
    # Check code files that have been modified or added.
    verify_header $(git diff --cached --name-status | grep -vE "^D" | cut -f 2- | grep -E ".go$|.sh$")
    info "Checking go files for license header"
    verify_header $(findcode)
  fi
}

# check_unparam runs unparam on source files.
check_unparam() {
  ensure_go_binary mvdan.cc/unparam
  runcmd unparam ./...
}

# check_vet runs go vet on source files.
check_vet() {
  runcmd go vet -all ./...
}

# check_staticcheck runs staticcheck on source files.
check_staticcheck() {
  ensure_go_binary honnef.co/go/tools/cmd/staticcheck
  runcmd staticcheck $(go list ./... | grep -v third_party | grep -v internal/doc | grep -v internal/render)
}

# check_misspell runs misspell on source files.
check_misspell() {
  ensure_go_binary github.com/client9/misspell/cmd/misspell
  runcmd misspell cmd/**/*.{go,sh} internal/**/* README.md
}

go_linters() {
  check_vet
  check_staticcheck
  check_misspell
  check_unparam
}

go_modtidy() {
  runcmd go mod tidy
}

go_test() {
  runcmd go test ./...
}

runchecks() {
  check_headers
  go_linters
  go_modtidy
  go_test
}

usage() {
  cat <<EOUSAGE
Usage: $0 [subcommand]
Available subcommands:
  (empty)        - run all standard checks and tests:
     * headers: check source files for the license disclaimer
     * vet: run go vet on source files
     * staticcheck: run staticcheck on source files
     * misspell: run misspell on source files
     * unparam: run unparam on source files
     * tidy: run go mod tidy
     * tests: run all Go tests
  help           - display this help message
EOUSAGE
}

main() {
  case "$1" in
    "-h" | "--help" | "help")
      usage
      exit 0
      ;;
    "")
      runchecks
      ;;
    *)
      usage
      exit 1
  esac
}

main $@
