From 021cae7e00df4fdc3f9122a04ed7093da2e1ac0b Mon Sep 17 00:00:00 2001 From: Adrien Mulattieri Date: Tue, 23 Jul 2024 15:08:37 +0200 Subject: [PATCH 1/4] Bump to go1.22 --- .golangci.yml | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 13 ++++++ fields.go | 2 +- go.mod | 2 +- stack.go | 2 +- stack_test.go | 2 +- wrap.go | 2 +- 7 files changed, 143 insertions(+), 5 deletions(-) create mode 100644 .golangci.yml create mode 100644 Makefile diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..0a3335b --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,125 @@ +linters: + # Please, do not use `enable-all`: it's deprecated and will be removed soon. + # Inverted configuration with `enable-all` and `disable` is not scalable during updates of golangci-lint. + # Full list of linters - https://golangci-lint.run/usage/linters + disable-all: true + enable: + - bodyclose # https://github.com/timakin/bodyclose + - gomodguard + - errcheck # Mandatory. Do not disable. + - gocritic + - goimports + - gosec + - gosimple + - govet + - noctx + - nolintlint + - ineffassign # Mandatory. Do not disable. + - staticcheck # Mandatory. Do not disable. + - stylecheck + - typecheck + - unused + +# Other linters: +# - dogsled +# - dupl +# - exportloopref +# - exhaustive # e.g. missing cases in switch of type +# - funlen +# - gochecknoinits +# - gocognit +# - goconst +# - gocyclo +# - goerr113 +# - gofmt +# - goprintffuncname +# - lll +# - misspell +# - nakedret +# - nlreturn +# - prealloc +# - revive +# - rowserrcheck +# - stylecheck +# - unconvert +# - unparam + +linters-settings: + gocritic: + enabled-tags: + - diagnostic + - experimental + - opinionated + - performance + - style + disabled-checks: + - dupImport # https://github.com/go-critic/go-critic/issues/845 + - whyNoLint # checked by nolintlint linter + - hugeParam # TODO(vtopc): configure(80 bytes is probably not so much) and enable. + - rangeValCopy # TODO(vtopc): configure(disable for tests) and enable. + - appendAssign + - commentedOutCode + + errcheck: + # List of functions to exclude from checking, where each entry is a single function to exclude. + # See https://github.com/kisielk/errcheck#excluding-functions for details. + exclude-functions: + - (io.Closer).Close + - (io.ReadCloser).Close + + govet: + enable-all: true + disable: + - shadow + - fieldalignment + + gomodguard: + blocked: + # List of blocked modules. + # Default: [] + modules: + - github.com/golang/protobuf: + recommendations: + - google.golang.org/protobuf + reason: "see https://developers.google.com/protocol-buffers/docs/reference/go/faq#modules" + - github.com/pkg/errors: + recommendations: + - errors + - github.com/mailgun/errors + reason: "Deprecated" + + stylecheck: + # https://staticcheck.io/docs/options#checks + checks: ["all"] + +issues: + # Maximum issues count per one linter. Set to 0 to disable. Default is 50. + max-issues-per-linter: 0 + + # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. + max-same-issues: 50 + + exclude: + # Some packages have deprecated fields which continue to be useful + - SA1019 + + exclude-rules: + # Exclude some rules from tests. + - path: '_test\.go$' + linters: + - gosec + - noctx + - path: '_test\.go$' + text: "unnamedResult:" + - path: '.*mxresolv.*' + linters: + - gosec + + +run: + # include test files or not, default is true + tests: true + + # Timeout for analysis, e.g. 30s, 5m. + # Default: 1m + timeout: 5m \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f735896 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +GOLANGCI_LINT = $(GOPATH)/bin/golangci-lint +GOLANGCI_LINT_VERSION = v1.57.2 + +.PHONY: lint +lint: $(GOLANGCI_LINT) + $(GOLANGCI_LINT) run + +$(GOLANGCI_LINT): + curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(GOPATH)/bin $(GOLANGCI_LINT_VERSION) + +.PHONY: test +test: + go test -p 1 ./... -short -race -timeout 1m -count=1 diff --git a/fields.go b/fields.go index f500c80..5b3f2e8 100644 --- a/fields.go +++ b/fields.go @@ -132,7 +132,7 @@ func (c *fields) Is(target error) bool { // cause of the issue. We only support this because some code // depends on github.com/pkg/errors.Cause() returning the cause // of the error. -// deprecated use error.Is() or error.As() instead +// Deprecated: use error.Is() or error.As() instead func (c *fields) Cause() error { return c.wrapped } func (c *fields) Error() string { diff --git a/go.mod b/go.mod index a2b50e3..0dd6019 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/mailgun/errors -go 1.19 +go 1.21 require ( github.com/ahmetb/go-linq v3.0.0+incompatible diff --git a/stack.go b/stack.go index 69b01ec..9d07098 100644 --- a/stack.go +++ b/stack.go @@ -36,7 +36,7 @@ func (w *stack) Is(target error) bool { // cause of the issue. We only support this because some code // depends on github.com/pkg/errors.Cause() returning the cause // of the error. -// deprecated use error.Is() or error.As() instead +// Deprecated: use error.Is() or error.As() instead func (w *stack) Cause() error { return w.error } func (w *stack) HasFields() map[string]any { diff --git a/stack_test.go b/stack_test.go index 04e094c..b07d54a 100644 --- a/stack_test.go +++ b/stack_test.go @@ -136,7 +136,7 @@ func TestFormatStack(t *testing.T) { for _, tt := range tests { t.Run(tt.Name, func(t *testing.T) { out := fmt.Sprintf(tt.format, tt.err) - //t.Log(out) + // t.Log(out) for _, line := range tt.want { assert.Contains(t, out, line) diff --git a/wrap.go b/wrap.go index d3069dd..d1d0715 100644 --- a/wrap.go +++ b/wrap.go @@ -62,7 +62,7 @@ func (e *wrappedError) Is(target error) bool { // cause of the issue. We only support this because some code // depends on github.com/pkg/errors.Cause() returning the cause // of the error. -// deprecated use error.Is() or error.As() instead +// Deprecated: use error.Is() or error.As() instead func (e *wrappedError) Cause() error { return e.wrapped } func (e *wrappedError) Error() string { From bc776b96fdbd4bba4f211a9db95e184a41b63025 Mon Sep 17 00:00:00 2001 From: Adrien Mulattieri Date: Tue, 23 Jul 2024 15:48:21 +0200 Subject: [PATCH 2/4] Add Join() from stdlib --- .github/workflows/test.yaml | 2 +- errors.go | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 98d55e4..1731daf 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -16,7 +16,7 @@ jobs: strategy: matrix: go-version: - - 1.19.x + - 1.21.x os: [ ubuntu-latest ] runs-on: ${{ matrix.os }} steps: diff --git a/errors.go b/errors.go index c55116b..14f2fc6 100644 --- a/errors.go +++ b/errors.go @@ -97,4 +97,16 @@ func Last(err error, target any) bool { return false } +// Join returns an error that wraps the given errors. +// Any nil error values are discarded. +// Join returns nil if every value in errs is nil. +// The error formats as the concatenation of the strings obtained +// by calling the Error method of each element of errs, with a newline +// between each string. +// +// A non-nil error returned by Join implements the Unwrap() []error method. +func Join(errs ...error) error { + return errors.Join(errs...) +} + var errorType = reflect.TypeOf((*error)(nil)).Elem() From c0e9ffff10df9b97f68edccad05cff231bcefd19 Mon Sep 17 00:00:00 2001 From: Adrien Mulattieri Date: Wed, 24 Jul 2024 13:56:11 +0200 Subject: [PATCH 3/4] Add linter to CI --- .github/workflows/lint.yaml | 38 +++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/workflows/lint.yaml diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml new file mode 100644 index 0000000..fb4e7d1 --- /dev/null +++ b/.github/workflows/lint.yaml @@ -0,0 +1,38 @@ +name: Lint + +on: + push: + branches: + - master + pull_request: + +env: + SSH_AUTH_SOCK: /tmp/ssh_agent.sock + GOLANGCI_LINT_VERSION: v1.57.2 + +jobs: + lint: + name: lint + strategy: + matrix: + os: [ ubuntu-latest ] + runs-on: ${{ matrix.os }} + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version-file: ./go.mod + cache: true # caching and restoring go modules and build outputs + + - name: Check that 'go mod tidy' was called before commit + run: go mod tidy && git diff --exit-code + + - name: golangci-lint + uses: golangci/golangci-lint-action@v4 + with: + version: ${{ env.GOLANGCI_LINT_VERSION }} + skip-cache: true # cache/restore is done by actions/setup-go@v3 step + args: -v From db574317a568a91f4e290e582e2b021d44dfca0d Mon Sep 17 00:00:00 2001 From: Adrien Mulattieri Date: Wed, 24 Jul 2024 14:11:32 +0200 Subject: [PATCH 4/4] Trigger CI for main push --- .github/workflows/lint.yaml | 1 + .github/workflows/test.yaml | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index fb4e7d1..b312a43 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -4,6 +4,7 @@ on: push: branches: - master + - main pull_request: env: diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 1731daf..cb7b599 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -6,9 +6,6 @@ on: - master - main pull_request: - branches: - - master - - main jobs: test: