Hermitise and bump golangci-lint.
This commit is contained in:
@@ -15,6 +15,25 @@ linters:
|
||||
- gocognit
|
||||
- gomnd
|
||||
- goprintffuncname
|
||||
- paralleltest
|
||||
- nlreturn
|
||||
- goerr113
|
||||
- ifshort
|
||||
- testpackage
|
||||
- wrapcheck
|
||||
- exhaustivestruct
|
||||
- forbidigo
|
||||
- gci
|
||||
- godot
|
||||
- gofumpt
|
||||
- cyclop
|
||||
- errorlint
|
||||
- nestif
|
||||
- golint
|
||||
- scopelint
|
||||
- interfacer
|
||||
- tagliatelle
|
||||
- thelper
|
||||
|
||||
linters-settings:
|
||||
govet:
|
||||
@@ -26,6 +45,8 @@ linters-settings:
|
||||
min-occurrences: 3
|
||||
gocyclo:
|
||||
min-complexity: 20
|
||||
exhaustive:
|
||||
default-signifies-exhaustive: true
|
||||
|
||||
issues:
|
||||
max-per-linter: 0
|
||||
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
hermit
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
hermit
|
||||
@@ -0,0 +1,7 @@
|
||||
# Hermit environment
|
||||
|
||||
This is a [Hermit](https://github.com/cashapp/hermit) bin directory.
|
||||
|
||||
The symlinks in this directory are managed by Hermit and will automatically
|
||||
download and install Hermit itself as well as packages. These packages are
|
||||
local to this environment.
|
||||
Executable
+19
@@ -0,0 +1,19 @@
|
||||
#!/bin/bash
|
||||
# This file must be used with "source bin/activate-hermit" from bash or zsh.
|
||||
# You cannot run it directly
|
||||
|
||||
if [ "${BASH_SOURCE-}" = "$0" ]; then
|
||||
echo "You must source this script: \$ source $0" >&2
|
||||
exit 33
|
||||
fi
|
||||
|
||||
BIN_DIR="$(dirname "${BASH_SOURCE[0]:-${(%):-%x}}")"
|
||||
if "${BIN_DIR}/hermit" noop > /dev/null; then
|
||||
eval "$("${BIN_DIR}/hermit" activate "${BIN_DIR}/..")"
|
||||
|
||||
if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ]; then
|
||||
hash -r 2>/dev/null
|
||||
fi
|
||||
|
||||
echo "Hermit environment $("${HERMIT_ENV}"/bin/hermit env HERMIT_ENV) activated"
|
||||
fi
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
.golangci-lint-1.40.1.pkg
|
||||
Executable
+26
@@ -0,0 +1,26 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
if [ -z "${HERMIT_STATE_DIR}" ]; then
|
||||
case "$(uname -s)" in
|
||||
Darwin)
|
||||
export HERMIT_STATE_DIR="${HOME}/Library/Caches/hermit"
|
||||
;;
|
||||
Linux)
|
||||
export HERMIT_STATE_DIR="${XDG_CACHE_HOME:-${HOME}/.cache}/hermit"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
export HERMIT_DIST_URL="${HERMIT_DIST_URL:-https://github.com/cashapp/hermit/releases/download/stable}"
|
||||
HERMIT_CHANNEL="$(basename "${HERMIT_DIST_URL}")"
|
||||
export HERMIT_CHANNEL
|
||||
export HERMIT_EXE=${HERMIT_EXE:-${HERMIT_STATE_DIR}/pkg/hermit@${HERMIT_CHANNEL}/hermit}
|
||||
|
||||
if [ ! -x "${HERMIT_EXE}" ]; then
|
||||
echo "Bootstrapping ${HERMIT_EXE} from ${HERMIT_DIST_URL}" 1>&2
|
||||
curl -fsSL "${HERMIT_DIST_URL}/install.sh" | /bin/bash 1>&2
|
||||
fi
|
||||
|
||||
exec "${HERMIT_EXE}" --level=fatal exec "$0" -- "$@"
|
||||
+3
-2
@@ -6,8 +6,9 @@ import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/alecthomas/kong"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/alecthomas/kong"
|
||||
)
|
||||
|
||||
func TestMultipleConfigLoading(t *testing.T) {
|
||||
@@ -47,7 +48,7 @@ func makeConfig(t *testing.T, config interface{}) (path string, cleanup func())
|
||||
t.Helper()
|
||||
w, err := ioutil.TempFile("", "")
|
||||
require.NoError(t, err)
|
||||
defer w.Close()
|
||||
defer w.Close() // nolint: gosec
|
||||
err = json.NewEncoder(w).Encode(config)
|
||||
require.NoError(t, err)
|
||||
return w.Name(), func() { os.Remove(w.Name()) }
|
||||
|
||||
@@ -585,6 +585,7 @@ func (c *Context) getValue(value *Value) reflect.Value {
|
||||
v.Set(reflect.MakeSlice(v.Type(), 0, 0))
|
||||
case reflect.Map:
|
||||
v.Set(reflect.MakeMap(v.Type()))
|
||||
default:
|
||||
}
|
||||
c.values[value] = v
|
||||
}
|
||||
|
||||
@@ -24,7 +24,6 @@ func TestApplyDefaults(t *testing.T) {
|
||||
expected: CLI{Str: "str", Duration: time.Second}},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
// nolint: scopelint
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
err := ApplyDefaults(&tt.target)
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -11,7 +11,6 @@ import (
|
||||
"github.com/alecthomas/kong"
|
||||
)
|
||||
|
||||
// nolint: govet
|
||||
type threeArg struct {
|
||||
RequiredThree bool `required`
|
||||
Three string `arg`
|
||||
@@ -54,7 +53,6 @@ Flags:
|
||||
}
|
||||
|
||||
func TestHelp(t *testing.T) {
|
||||
// nolint: govet
|
||||
var cli struct {
|
||||
String string `help:"A string flag."`
|
||||
Bool bool `help:"A bool flag with very long help that wraps a lot and is verbose and is really verbose."`
|
||||
@@ -163,7 +161,6 @@ Flags:
|
||||
}
|
||||
|
||||
func TestFlagsLast(t *testing.T) {
|
||||
// nolint: govet
|
||||
var cli struct {
|
||||
String string `help:"A string flag."`
|
||||
Bool bool `help:"A bool flag with very long help that wraps a lot and is verbose and is really verbose."`
|
||||
@@ -272,7 +269,6 @@ Flags:
|
||||
}
|
||||
|
||||
func TestHelpTree(t *testing.T) {
|
||||
// nolint: govet
|
||||
var cli struct {
|
||||
One struct {
|
||||
Thing struct {
|
||||
@@ -367,7 +363,6 @@ Commands:
|
||||
}
|
||||
|
||||
func TestHelpCompactNoExpand(t *testing.T) {
|
||||
// nolint: govet
|
||||
var cli struct {
|
||||
One struct {
|
||||
Thing struct {
|
||||
@@ -484,7 +479,6 @@ func TestCustomHelpFormatter(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestHelpGrouping(t *testing.T) {
|
||||
// nolint: govet
|
||||
var cli struct {
|
||||
GroupedAString string `help:"A string flag grouped in A." group:"Group A"`
|
||||
FreeString string `help:"A non grouped string flag."`
|
||||
|
||||
@@ -385,7 +385,7 @@ func (k *Kong) LoadConfig(path string) (Resolver, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer r.Close()
|
||||
defer r.Close() // nolint: gosec
|
||||
|
||||
return k.loader(r)
|
||||
}
|
||||
|
||||
@@ -118,7 +118,6 @@ func TestFlagSliceWithSeparator(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestArgSlice(t *testing.T) {
|
||||
// nolint: govet
|
||||
var cli struct {
|
||||
Slice []int `arg`
|
||||
Flag bool
|
||||
@@ -131,7 +130,6 @@ func TestArgSlice(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestArgSliceWithSeparator(t *testing.T) {
|
||||
// nolint: govet
|
||||
var cli struct {
|
||||
Slice []string `arg`
|
||||
Flag bool
|
||||
@@ -498,7 +496,6 @@ func TestHooks(t *testing.T) {
|
||||
for _, test := range tests {
|
||||
*ctx = hookContext{}
|
||||
cli.One = hookCmd{}
|
||||
// nolint: scopelint
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
_, err := p.Parse(strings.Split(test.input, " "))
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -125,7 +125,7 @@ type BoolMapper interface {
|
||||
// A MapperFunc is a single function that complies with the Mapper interface.
|
||||
type MapperFunc func(ctx *DecodeContext, target reflect.Value) error
|
||||
|
||||
func (m MapperFunc) Decode(ctx *DecodeContext, target reflect.Value) error { // nolint: golint
|
||||
func (m MapperFunc) Decode(ctx *DecodeContext, target reflect.Value) error { // nolint: revive
|
||||
return m(ctx, target)
|
||||
}
|
||||
|
||||
@@ -737,7 +737,7 @@ func SplitEscaped(s string, sep rune) (out []string) {
|
||||
func JoinEscaped(s []string, sep rune) string {
|
||||
escaped := []string{}
|
||||
for _, e := range s {
|
||||
escaped = append(escaped, strings.Replace(e, string(sep), `\`+string(sep), -1))
|
||||
escaped = append(escaped, strings.ReplaceAll(e, string(sep), `\`+string(sep)))
|
||||
}
|
||||
return strings.Join(escaped, string(sep))
|
||||
}
|
||||
@@ -748,7 +748,7 @@ type NamedFileContentFlag struct {
|
||||
Contents []byte
|
||||
}
|
||||
|
||||
func (f *NamedFileContentFlag) Decode(ctx *DecodeContext) error { // nolint: golint
|
||||
func (f *NamedFileContentFlag) Decode(ctx *DecodeContext) error { // nolint: revive
|
||||
var filename string
|
||||
err := ctx.Scan.PopValueInto("filename", &filename)
|
||||
if err != nil {
|
||||
@@ -772,7 +772,7 @@ func (f *NamedFileContentFlag) Decode(ctx *DecodeContext) error { // nolint: gol
|
||||
// FileContentFlag is a flag value that loads a file's contents into its value.
|
||||
type FileContentFlag []byte
|
||||
|
||||
func (f *FileContentFlag) Decode(ctx *DecodeContext) error { // nolint: golint
|
||||
func (f *FileContentFlag) Decode(ctx *DecodeContext) error { // nolint: revive
|
||||
var filename string
|
||||
err := ctx.Scan.PopValueInto("filename", &filename)
|
||||
if err != nil {
|
||||
|
||||
@@ -205,6 +205,7 @@ func (n *Node) Path() (out string) {
|
||||
out += " " + n.Name
|
||||
case ArgumentNode:
|
||||
out += " " + "<" + n.Name + ">"
|
||||
default:
|
||||
}
|
||||
return strings.TrimSpace(out)
|
||||
}
|
||||
|
||||
+3
-3
@@ -19,7 +19,7 @@ type Option interface {
|
||||
// OptionFunc is function that adheres to the Option interface.
|
||||
type OptionFunc func(k *Kong) error
|
||||
|
||||
func (o OptionFunc) Apply(k *Kong) error { return o(k) } // nolint: golint
|
||||
func (o OptionFunc) Apply(k *Kong) error { return o(k) } // nolint: revive
|
||||
|
||||
// Vars sets the variables to use for interpolation into help strings and default values.
|
||||
//
|
||||
@@ -198,7 +198,7 @@ func BindToProvider(provider interface{}) Option {
|
||||
errv := out[1]
|
||||
var err error
|
||||
if !errv.IsNil() {
|
||||
err = errv.Interface().(error)
|
||||
err = errv.Interface().(error) // nolint
|
||||
}
|
||||
return out[0], err
|
||||
}
|
||||
@@ -254,7 +254,7 @@ func ConfigureHelp(options HelpOptions) Option {
|
||||
// See also ExplicitGroups for a more structured alternative.
|
||||
type Groups map[string]string
|
||||
|
||||
func (g Groups) Apply(k *Kong) error { // nolint: golint
|
||||
func (g Groups) Apply(k *Kong) error { // nolint: revive
|
||||
for key, info := range g {
|
||||
lines := strings.Split(info, "\n")
|
||||
title := strings.TrimSpace(lines[0])
|
||||
|
||||
+1
-1
@@ -28,7 +28,7 @@ func TestBindTo(t *testing.T) {
|
||||
}
|
||||
|
||||
saw := ""
|
||||
method := func(i iface) error { // nolint: unparam
|
||||
method := func(i iface) error {
|
||||
saw = string(i.(impl))
|
||||
return nil
|
||||
}
|
||||
|
||||
+3
-3
@@ -22,10 +22,10 @@ type ResolverFunc func(context *Context, parent *Path, flag *Flag) (interface{},
|
||||
|
||||
var _ Resolver = ResolverFunc(nil)
|
||||
|
||||
func (r ResolverFunc) Resolve(context *Context, parent *Path, flag *Flag) (interface{}, error) { // nolint: golint
|
||||
func (r ResolverFunc) Resolve(context *Context, parent *Path, flag *Flag) (interface{}, error) { // nolint: revive
|
||||
return r(context, parent, flag)
|
||||
}
|
||||
func (r ResolverFunc) Validate(app *Application) error { return nil } // nolint: golint
|
||||
func (r ResolverFunc) Validate(app *Application) error { return nil } // nolint: revive
|
||||
|
||||
// JSON returns a Resolver that retrieves values from a JSON source.
|
||||
//
|
||||
@@ -37,7 +37,7 @@ func JSON(r io.Reader) (Resolver, error) {
|
||||
return nil, err
|
||||
}
|
||||
var f ResolverFunc = func(context *Context, parent *Path, flag *Flag) (interface{}, error) {
|
||||
name := strings.Replace(flag.Name, "-", "_", -1)
|
||||
name := strings.ReplaceAll(flag.Name, "-", "_")
|
||||
raw, ok := values[name]
|
||||
if !ok {
|
||||
return nil, nil
|
||||
|
||||
@@ -192,7 +192,6 @@ func TestLastResolverWins(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestResolverSatisfiesRequired(t *testing.T) {
|
||||
// nolint: govet
|
||||
var cli struct {
|
||||
Int int `required`
|
||||
}
|
||||
|
||||
@@ -68,7 +68,6 @@ func TestEscapedQuote(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestBareTags(t *testing.T) {
|
||||
// nolint: govet
|
||||
var cli struct {
|
||||
Cmd struct {
|
||||
Arg string `arg`
|
||||
@@ -84,7 +83,6 @@ func TestBareTags(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestBareTagsWithJsonTag(t *testing.T) {
|
||||
// nolint: govet
|
||||
var cli struct {
|
||||
Cmd struct {
|
||||
Arg string `json:"-" optional arg`
|
||||
@@ -100,7 +98,6 @@ func TestBareTagsWithJsonTag(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestManySeps(t *testing.T) {
|
||||
// nolint: govet
|
||||
var cli struct {
|
||||
Arg string `arg optional default:"hi"`
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user