diff --git a/.goreleaser.yml b/.goreleaser.yml index 07dce6d6..02602049 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -185,7 +185,7 @@ archive: name_template: '{{ .Binary }}-{{ .Version }}-{{ .Os }}-{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}' files: - COPYING - - README* + - README.md snapshot: name_template: SNAPSHOT-{{ .Commit }} diff --git a/.travis.yml b/.travis.yml index d25e8d09..a7ed0d6f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,6 @@ install: - go get -t -v . ./regressiontests - gometalinter --install go: -- 1.8.x - 1.9.x - 1.10.x script: go test -v . ./regressiontests diff --git a/README.md b/README.md index 8305e3de..351ec8d5 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ - [What's the best way to use `gometalinter` in CI?](#whats-the-best-way-to-use-gometalinter-in-ci) - [How do I make `gometalinter` work with Go 1.5 vendoring?](#how-do-i-make-gometalinter-work-with-go-15-vendoring) - [Why does `gometalinter --install` install a fork of gocyclo?](#why-does-gometalinter---install-install-a-fork-of-gocyclo) + - [Many unexpected errors are being reported](#many-unexpected-errors-are-being-reported) - [Gometalinter is not working](#gometalinter-is-not-working) - [1. Update to the latest build of gometalinter and all linters](#1-update-to-the-latest-build-of-gometalinter-and-all-linters) - [2. Analyse the debug output](#2-analyse-the-debug-output) @@ -315,6 +316,13 @@ unusably slow when vendoring. The recursive behaviour can be achieved with gometalinter by explicitly specifying `/...`. There is a [pull request](https://github.com/fzipp/gocyclo/pull/1) open. +### Many unexpected errors are being reported + +If you see a whole bunch of errors being reported that you wouldn't expect, +such as compile errors, this typically means that something is wrong with your +Go environment. Try `go install` and fix any issues with your go installation, +then try gometalinter again. + ### Gometalinter is not working That's more of a statement than a question, but okay. diff --git a/scripts/install.sh b/scripts/install.sh new file mode 100755 index 00000000..d585eb89 --- /dev/null +++ b/scripts/install.sh @@ -0,0 +1,388 @@ +#!/bin/sh +set -e +# Code generated by godownloader on 2018-05-08T08:53:30Z. DO NOT EDIT. +# + +usage() { + this=$1 + cat </dev/null +} +echoerr() { + echo "$@" 1>&2 +} +log_prefix() { + echo "$0" +} +_logp=6 +log_set_priority() { + _logp="$1" +} +log_priority() { + if test -z "$1"; then + echo "$_logp" + return + fi + [ "$1" -le "$_logp" ] +} +log_tag() { + case $1 in + 0) echo "emerg" ;; + 1) echo "alert" ;; + 2) echo "crit" ;; + 3) echo "err" ;; + 4) echo "warning" ;; + 5) echo "notice" ;; + 6) echo "info" ;; + 7) echo "debug" ;; + *) echo "$1" ;; + esac +} +log_debug() { + log_priority 7 || return 0 + echoerr "$(log_prefix)" "$(log_tag 7)" "$@" +} +log_info() { + log_priority 6 || return 0 + echoerr "$(log_prefix)" "$(log_tag 6)" "$@" +} +log_err() { + log_priority 3 || return 0 + echoerr "$(log_prefix)" "$(log_tag 3)" "$@" +} +log_crit() { + log_priority 2 || return 0 + echoerr "$(log_prefix)" "$(log_tag 2)" "$@" +} +uname_os() { + os=$(uname -s | tr '[:upper:]' '[:lower:]') + case "$os" in + msys_nt) os="windows" ;; + esac + echo "$os" +} +uname_arch() { + arch=$(uname -m) + case $arch in + x86_64) arch="amd64" ;; + x86) arch="386" ;; + i686) arch="386" ;; + i386) arch="386" ;; + aarch64) arch="arm64" ;; + armv5*) arch="armv5" ;; + armv6*) arch="armv6" ;; + armv7*) arch="armv7" ;; + esac + echo ${arch} +} +uname_os_check() { + os=$(uname_os) + case "$os" in + darwin) return 0 ;; + dragonfly) return 0 ;; + freebsd) return 0 ;; + linux) return 0 ;; + android) return 0 ;; + nacl) return 0 ;; + netbsd) return 0 ;; + openbsd) return 0 ;; + plan9) return 0 ;; + solaris) return 0 ;; + windows) return 0 ;; + esac + log_crit "uname_os_check '$(uname -s)' got converted to '$os' which is not a GOOS value. Please file bug at https://github.com/client9/shlib" + return 1 +} +uname_arch_check() { + arch=$(uname_arch) + case "$arch" in + 386) return 0 ;; + amd64) return 0 ;; + arm64) return 0 ;; + armv5) return 0 ;; + armv6) return 0 ;; + armv7) return 0 ;; + ppc64) return 0 ;; + ppc64le) return 0 ;; + mips) return 0 ;; + mipsle) return 0 ;; + mips64) return 0 ;; + mips64le) return 0 ;; + s390x) return 0 ;; + amd64p32) return 0 ;; + esac + log_crit "uname_arch_check '$(uname -m)' got converted to '$arch' which is not a GOARCH value. Please file bug report at https://github.com/client9/shlib" + return 1 +} +untar() { + tarball=$1 + case "${tarball}" in + *.tar.gz | *.tgz) tar -xzf "${tarball}" ;; + *.tar) tar -xf "${tarball}" ;; + *.zip) unzip "${tarball}" ;; + *) + log_err "untar unknown archive format for ${tarball}" + return 1 + ;; + esac +} +mktmpdir() { + test -z "$TMPDIR" && TMPDIR="$(mktemp -d)" + mkdir -p "${TMPDIR}" + echo "${TMPDIR}" +} +http_download_curl() { + local_file=$1 + source_url=$2 + header=$3 + if [ -z "$header" ]; then + code=$(curl -w '%{http_code}' -sL -o "$local_file" "$source_url") + else + code=$(curl -w '%{http_code}' -sL -H "$header" -o "$local_file" "$source_url") + fi + if [ "$code" != "200" ]; then + log_debug "http_download_curl received HTTP status $code" + return 1 + fi + return 0 +} +http_download_wget() { + local_file=$1 + source_url=$2 + header=$3 + if [ -z "$header" ]; then + wget -q -O "$local_file" "$source_url" + else + wget -q --header "$header" -O "$local_file" "$source_url" + fi +} +http_download() { + log_debug "http_download $2" + if is_command curl; then + http_download_curl "$@" + return + elif is_command wget; then + http_download_wget "$@" + return + fi + log_crit "http_download unable to find wget or curl" + return 1 +} +http_copy() { + tmp=$(mktemp) + http_download "${tmp}" "$1" "$2" || return 1 + body=$(cat "$tmp") + rm -f "${tmp}" + echo "$body" +} +github_release() { + owner_repo=$1 + version=$2 + test -z "$version" && version="latest" + giturl="https://github.com/${owner_repo}/releases/${version}" + json=$(http_copy "$giturl" "Accept:application/json") + test -z "$json" && return 1 + version=$(echo "$json" | tr -s '\n' ' ' | sed 's/.*"tag_name":"//' | sed 's/".*//') + test -z "$version" && return 1 + echo "$version" +} +hash_sha256() { + TARGET=${1:-/dev/stdin} + if is_command gsha256sum; then + hash=$(gsha256sum "$TARGET") || return 1 + echo "$hash" | cut -d ' ' -f 1 + elif is_command sha256sum; then + hash=$(sha256sum "$TARGET") || return 1 + echo "$hash" | cut -d ' ' -f 1 + elif is_command shasum; then + hash=$(shasum -a 256 "$TARGET" 2>/dev/null) || return 1 + echo "$hash" | cut -d ' ' -f 1 + elif is_command openssl; then + hash=$(openssl -dst openssl dgst -sha256 "$TARGET") || return 1 + echo "$hash" | cut -d ' ' -f a + else + log_crit "hash_sha256 unable to find command to compute sha-256 hash" + return 1 + fi +} +hash_sha256_verify() { + TARGET=$1 + checksums=$2 + if [ -z "$checksums" ]; then + log_err "hash_sha256_verify checksum file not specified in arg2" + return 1 + fi + BASENAME=${TARGET##*/} + want=$(grep "${BASENAME}" "${checksums}" 2>/dev/null | tr '\t' ' ' | cut -d ' ' -f 1) + if [ -z "$want" ]; then + log_err "hash_sha256_verify unable to find checksum for '${TARGET}' in '${checksums}'" + return 1 + fi + got=$(hash_sha256 "$TARGET") + if [ "$want" != "$got" ]; then + log_err "hash_sha256_verify checksum for '$TARGET' did not verify ${want} vs $got" + return 1 + fi +} +cat /dev/null <&2 - exit 1 - } - rm -f "$TAR_FILE" - curl -s -L -o "$TAR_FILE" \ - "$RELEASES_URL/download/$VERSION/gometalinter_$(uname -s)_$(uname -m).tar.gz" -} - -download -tar -xf "$TAR_FILE" -C "$TMPDIR" -"${TMPDIR}/gometalinter" "$@" diff --git a/scripts/package.sh b/scripts/package.sh deleted file mode 100755 index 02dacd74..00000000 --- a/scripts/package.sh +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/bash -e - -# Only build packages for tagged releases -TAG="$(git tag -l --points-at HEAD)" - -export CGO_ENABLED=0 - -GO_VERSION="$(go version | awk '{print $3}' | cut -d. -f1-2)" - -if [ "$GO_VERSION" != "go1.9" ]; then - echo "$0: not packaging; not on Go 1.9" - exit 0 -fi - -if echo "$TAG" | grep -q '^v[0-9]\.[0-9]\.[0-9]\(-.*\)?$' && false; then - echo "$0: not packaging; no tag or tag not in semver format" - exit 0 -fi - -LINTERS=" - github.com/alecthomas/gocyclo - github.com/alexkohler/nakedret - github.com/client9/misspell/cmd/misspell - github.com/GoASTScanner/gas - github.com/golang/lint/golint - github.com/gordonklaus/ineffassign - github.com/jgautheron/goconst/cmd/goconst - github.com/kisielk/errcheck - github.com/mdempsky/maligned - github.com/mdempsky/unconvert - github.com/mibk/dupl - github.com/opennota/check/cmd/structcheck - github.com/opennota/check/cmd/varcheck - github.com/stripe/safesql - github.com/tsenart/deadcode - github.com/walle/lll/cmd/lll - golang.org/x/tools/cmd/goimports - golang.org/x/tools/cmd/gotype - honnef.co/go/tools/cmd/gosimple - honnef.co/go/tools/cmd/megacheck - honnef.co/go/tools/cmd/staticcheck - honnef.co/go/tools/cmd/unused - mvdan.cc/interfacer - mvdan.cc/unparam -" - -eval "$(go env | FS='' awk '{printf "REAL_%s\n", $0}')" - -function install_go_binary() { - local SRC - if [ "$GOOS" = "$REAL_GOOS" -a "$GOARCH" = "$REAL_GOARCH" ]; then - SRC="${GOPATH}/bin" - else - SRC="${GOPATH}/bin/${GOOS}_${GOARCH}" - fi - install -m 755 "${SRC}/${1}${SUFFIX}" "${2}" -} - -function packager() { - if [ "$GOOS" = "windows" ]; then - zip -9 -r -o "${1}".zip "${1}" 1>&2 - echo "${1}".zip - else - tar cvfj "${1}".tar.bz2 "${1}" 1>&2 - echo "${1}".tar.bz2 - fi -} - -rm -rf "${PWD}/dist" - -for GOOS in linux darwin windows; do - SUFFIX="" - if [ "$GOOS" = "windows" ]; then - SUFFIX=".exe" - fi - - for GOARCH in 386 amd64; do - export GOPATH="${REAL_GOPATH}" - DEST="${PWD}/dist/gometalinter-${TAG}-${GOOS}-${GOARCH}" - install -d -m 755 "${DEST}/linters" - install -m 644 COPYING "${DEST}" - install -m 644 README.md "${DEST}" - echo "${DEST}" - export GOOS GOARCH - - go build -i . - go build -o "${DEST}/gometalinter${SUFFIX}" -ldflags="-X main.Version=${TAG}" . - - export GOPATH="$PWD/_linters" - - go install -v ${LINTERS} - for LINTER in ${LINTERS}; do - install_go_binary $(basename ${LINTER}) "${DEST}/linters" - done - - OUTPUT="$(cd "${PWD}/dist" && packager "$(basename ${DEST})")" - (cd "${PWD}/dist" && shasum -a 256 "${OUTPUT}" > "${OUTPUT}.sha256") - done -done