|  | # 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. | 
|  |  | 
|  | # Library of useful bash functions and variables for presubmit checks. | 
|  |  | 
|  | RED=; GREEN=; YELLOW=; NORMAL=; | 
|  | MAXWIDTH=0 | 
|  |  | 
|  | if tput setaf 1 >& /dev/null; then | 
|  | RED=`tput setaf 1` | 
|  | GREEN=`tput setaf 2` | 
|  | YELLOW=`tput setaf 3` | 
|  | NORMAL=`tput sgr0` | 
|  | MAXWIDTH=$(( $(tput cols) - 2 )) | 
|  | fi | 
|  |  | 
|  | EXIT_CODE=0 | 
|  |  | 
|  | info() { echo -e "${GREEN}$@${NORMAL}" 1>&2; } | 
|  | warn() { echo -e "${YELLOW}$@${NORMAL}" 1>&2; } | 
|  | err() { echo -e "${RED}$@${NORMAL}" 1>&2; EXIT_CODE=1; } | 
|  |  | 
|  | die() { | 
|  | err $@ | 
|  | exit 1 | 
|  | } | 
|  |  | 
|  | dryrun=false | 
|  |  | 
|  | # runcmd 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() { | 
|  | msg="$@" | 
|  | if $dryrun; then | 
|  | echo -e "${YELLOW}dryrun${GREEN}\$ $msg${NORMAL}" | 
|  | return 0 | 
|  | fi | 
|  | # Truncate command logging for narrow terminals. | 
|  | # Account for the 2 characters of '$ '. | 
|  | if [[ $MAXWIDTH -gt 0 && ${#msg} -gt $MAXWIDTH ]]; then | 
|  | msg="${msg::$(( MAXWIDTH - 3 ))}..." | 
|  | fi | 
|  |  | 
|  | echo -e "$@\n" 1>&2; | 
|  | $@ || err "command failed" | 
|  | } | 
|  |  | 
|  | # check_header checks that all given files contain the standard header for Go | 
|  | # projects. | 
|  | check_header() { | 
|  | if [[ "$@" != "" ]]; then | 
|  | for FILE in $@ | 
|  | do | 
|  | line="$(head -4 $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 | 
|  | } | 
|  |  | 
|  | # 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 install`. | 
|  | ensure_go_binary() { | 
|  | local binary=$(basename $1) | 
|  | if ! [ -x "$(command -v $binary)" ]; then | 
|  | info "Installing: $1" | 
|  | go install $1 | 
|  | fi | 
|  | } |