Skip to content

Commit 6589147

Browse files
authored
Merge pull request #109 from pjbgf/linter
build: Add golangci-lint checks
2 parents 3b169b7 + b321518 commit 6589147

34 files changed

+946
-687
lines changed

.github/workflows/test.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,10 @@ jobs:
2121
uses: actions/setup-go@v5
2222
with:
2323
go-version: ${{ matrix.go-version }}
24+
25+
- name: Validate
26+
if: matrix.platform == 'ubuntu-latest'
27+
run: make validate
28+
2429
- name: Test
2530
run: make test

.gitignore

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
/coverage.txt
22
/vendor
3-
Gopkg.lock
4-
Gopkg.toml
3+
/build/

.golangci.yaml

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
linters:
2+
disable-all: true
3+
enable:
4+
- asasalint
5+
- asciicheck
6+
- bidichk
7+
- bodyclose
8+
- containedctx
9+
- contextcheck
10+
- decorder
11+
- dogsled
12+
- dupl
13+
- dupword
14+
- durationcheck
15+
- errcheck
16+
- errchkjson
17+
- errname
18+
- errorlint
19+
- exhaustive
20+
- ginkgolinter
21+
- gocheckcompilerdirectives
22+
- gochecknoinits
23+
- gochecksumtype
24+
- goheader
25+
- goimports
26+
- gomodguard
27+
- goprintffuncname
28+
- gosimple
29+
- gosmopolitan
30+
- govet
31+
- grouper
32+
- importas
33+
- ineffassign
34+
- loggercheck
35+
- makezero
36+
- mirror
37+
- misspell
38+
- noctx
39+
- nosprintfhostport
40+
- promlinter
41+
- reassign
42+
- revive
43+
- rowserrcheck
44+
- sloglint
45+
- spancheck
46+
- sqlclosecheck
47+
- tagalign
48+
- tagliatelle
49+
- tenv
50+
- testableexamples
51+
- typecheck
52+
- unconvert
53+
- unused
54+
- usestdlibvars
55+
- wastedassign
56+
- whitespace
57+
- zerologlint

Makefile

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,15 @@ GOCMD = go
33
GOTEST = $(GOCMD) test
44
WASIRUN_WRAPPER := $(CURDIR)/scripts/wasirun-wrapper
55

6+
GOLANGCI_VERSION ?= v1.63.4
7+
TOOLS_BIN := $(shell mkdir -p build/tools && realpath build/tools)
8+
9+
GOLANGCI = $(TOOLS_BIN)/golangci-lint-$(GOLANGCI_VERSION)
10+
$(GOLANGCI):
11+
rm -f $(TOOLS_BIN)/golangci-lint*
12+
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/$(GOLANGCI_VERSION)/install.sh | sh -s -- -b $(TOOLS_BIN) $(GOLANGCI_VERSION)
13+
mv $(TOOLS_BIN)/golangci-lint $(TOOLS_BIN)/golangci-lint-$(GOLANGCI_VERSION)
14+
615
.PHONY: test
716
test:
817
$(GOTEST) -race ./...
@@ -16,3 +25,24 @@ wasitest: export GOARCH=wasm
1625
wasitest: export GOOS=wasip1
1726
wasitest:
1827
$(GOTEST) -exec $(WASIRUN_WRAPPER) ./...
28+
29+
validate: validate-lint validate-dirty ## Run validation checks.
30+
31+
validate-lint: $(GOLANGCI)
32+
$(GOLANGCI) run
33+
34+
define go-install-tool
35+
@[ -f $(1) ] || { \
36+
set -e ;\
37+
echo "Downloading $(2)" ;\
38+
GOBIN=$(TOOLS_BIN) go install $(2) ;\
39+
}
40+
endef
41+
42+
validate-dirty:
43+
ifneq ($(shell git status --porcelain --untracked-files=no),)
44+
@echo worktree is dirty
45+
@git --no-pager status
46+
@git --no-pager diff
47+
@exit 1
48+
endif

fs_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package billy_test
33
import (
44
"testing"
55

6-
. "github.com/go-git/go-billy/v6"
6+
. "github.com/go-git/go-billy/v6" //nolint
77
"github.com/go-git/go-billy/v6/internal/test"
88
"github.com/stretchr/testify/assert"
99
)

helper/chroot/chroot.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
)
1212

1313
// ChrootHelper is a helper to implement billy.Chroot.
14-
type ChrootHelper struct {
14+
type ChrootHelper struct { //nolint
1515
underlying billy.Filesystem
1616
base string
1717
}

helper/chroot/chroot_test.go

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@ import (
88
"github.com/go-git/go-billy/v6"
99
"github.com/go-git/go-billy/v6/internal/test"
1010
"github.com/stretchr/testify/assert"
11+
"github.com/stretchr/testify/require"
1112
)
1213

1314
func TestCreate(t *testing.T) {
1415
m := &test.BasicMock{}
1516

1617
fs := New(m, "/foo")
1718
f, err := fs.Create("bar/qux")
18-
assert.NoError(t, err)
19+
require.NoError(t, err)
1920
assert.Equal(t, f.Name(), filepath.Join("bar", "qux"))
2021

2122
assert.Len(t, m.CreateArgs, 1)
@@ -35,7 +36,7 @@ func TestLeadingPeriodsPathNotCrossedBoundary(t *testing.T) {
3536

3637
fs := New(m, "/foo")
3738
f, err := fs.Create("..foo")
38-
assert.NoError(t, err)
39+
require.NoError(t, err)
3940
assert.Equal(t, f.Name(), "..foo")
4041
}
4142

@@ -44,7 +45,7 @@ func TestOpen(t *testing.T) {
4445

4546
fs := New(m, "/foo")
4647
f, err := fs.Open("bar/qux")
47-
assert.NoError(t, err)
48+
require.NoError(t, err)
4849
assert.Equal(t, f.Name(), filepath.Join("bar", "qux"))
4950

5051
assert.Len(t, m.OpenArgs, 1)
@@ -56,7 +57,7 @@ func TestChroot(t *testing.T) {
5657

5758
fs, _ := New(m, "/foo").Chroot("baz")
5859
f, err := fs.Open("bar/qux")
59-
assert.NoError(t, err)
60+
require.NoError(t, err)
6061
assert.Equal(t, f.Name(), filepath.Join("bar", "qux"))
6162

6263
assert.Len(t, m.OpenArgs, 1)
@@ -84,7 +85,7 @@ func TestOpenFile(t *testing.T) {
8485

8586
fs := New(m, "/foo")
8687
f, err := fs.OpenFile("bar/qux", 42, 0777)
87-
assert.NoError(t, err)
88+
require.NoError(t, err)
8889
assert.Equal(t, f.Name(), filepath.Join("bar", "qux"))
8990

9091
assert.Len(t, m.OpenFileArgs, 1)
@@ -104,7 +105,7 @@ func TestStat(t *testing.T) {
104105

105106
fs := New(m, "/foo")
106107
_, err := fs.Stat("bar/qux")
107-
assert.NoError(t, err)
108+
require.NoError(t, err)
108109

109110
assert.Len(t, m.StatArgs, 1)
110111
assert.Equal(t, m.StatArgs[0], "/foo/bar/qux")
@@ -123,7 +124,7 @@ func TestRename(t *testing.T) {
123124

124125
fs := New(m, "/foo")
125126
err := fs.Rename("bar/qux", "qux/bar")
126-
assert.NoError(t, err)
127+
require.NoError(t, err)
127128

128129
assert.Len(t, m.RenameArgs, 1)
129130
assert.Equal(t, m.RenameArgs[0], [2]string{"/foo/bar/qux", "/foo/qux/bar"})
@@ -145,7 +146,7 @@ func TestRemove(t *testing.T) {
145146

146147
fs := New(m, "/foo")
147148
err := fs.Remove("bar/qux")
148-
assert.NoError(t, err)
149+
require.NoError(t, err)
149150

150151
assert.Len(t, m.RemoveArgs, 1)
151152
assert.Equal(t, m.RemoveArgs[0], "/foo/bar/qux")
@@ -164,7 +165,7 @@ func TestTempFile(t *testing.T) {
164165

165166
fs := New(m, "/foo")
166167
_, err := fs.TempFile("bar", "qux")
167-
assert.NoError(t, err)
168+
require.NoError(t, err)
168169

169170
assert.Len(t, m.TempFileArgs, 1)
170171
assert.Equal(t, m.TempFileArgs[0], [2]string{"/foo/bar", "qux"})
@@ -191,7 +192,7 @@ func TestReadDir(t *testing.T) {
191192

192193
fs := New(m, "/foo")
193194
_, err := fs.ReadDir("bar")
194-
assert.NoError(t, err)
195+
require.NoError(t, err)
195196

196197
assert.Len(t, m.ReadDirArgs, 1)
197198
assert.Equal(t, m.ReadDirArgs[0], "/foo/bar")
@@ -218,7 +219,7 @@ func TestMkDirAll(t *testing.T) {
218219

219220
fs := New(m, "/foo")
220221
err := fs.MkdirAll("bar", 0777)
221-
assert.NoError(t, err)
222+
require.NoError(t, err)
222223

223224
assert.Len(t, m.MkdirAllArgs, 1)
224225
assert.Equal(t, m.MkdirAllArgs[0], [2]interface{}{"/foo/bar", os.FileMode(0777)})
@@ -245,7 +246,7 @@ func TestLstat(t *testing.T) {
245246

246247
fs := New(m, "/foo")
247248
_, err := fs.Lstat("qux")
248-
assert.NoError(t, err)
249+
require.NoError(t, err)
249250

250251
assert.Len(t, m.LstatArgs, 1)
251252
assert.Equal(t, m.LstatArgs[0], "/foo/qux")
@@ -272,7 +273,7 @@ func TestSymlink(t *testing.T) {
272273

273274
fs := New(m, "/foo")
274275
err := fs.Symlink("../baz", "qux/bar")
275-
assert.NoError(t, err)
276+
require.NoError(t, err)
276277

277278
assert.Len(t, m.SymlinkArgs, 1)
278279
assert.Equal(t, m.SymlinkArgs[0], [2]string{filepath.FromSlash("../baz"), "/foo/qux/bar"})
@@ -283,7 +284,7 @@ func TestSymlinkWithAbsoluteTarget(t *testing.T) {
283284

284285
fs := New(m, "/foo")
285286
err := fs.Symlink("/bar", "qux/baz")
286-
assert.NoError(t, err)
287+
require.NoError(t, err)
287288

288289
assert.Len(t, m.SymlinkArgs, 1)
289290
assert.Equal(t, m.SymlinkArgs[0], [2]string{filepath.FromSlash("/foo/bar"), "/foo/qux/baz"})
@@ -310,7 +311,7 @@ func TestReadlink(t *testing.T) {
310311

311312
fs := New(m, "/foo")
312313
link, err := fs.Readlink("/qux")
313-
assert.NoError(t, err)
314+
require.NoError(t, err)
314315
assert.Equal(t, link, filepath.FromSlash("/qux"))
315316

316317
assert.Len(t, m.ReadlinkArgs, 1)
@@ -322,7 +323,7 @@ func TestReadlinkWithRelative(t *testing.T) {
322323

323324
fs := New(m, "/foo")
324325
link, err := fs.Readlink("qux/bar")
325-
assert.NoError(t, err)
326+
require.NoError(t, err)
326327
assert.Equal(t, link, filepath.FromSlash("/qux/bar"))
327328

328329
assert.Len(t, m.ReadlinkArgs, 1)

helper/iofs/iofs_test.go

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,6 @@ type errorList interface {
1717
Unwrap() []error
1818
}
1919

20-
type wrappedError interface {
21-
Unwrap() error
22-
}
23-
2420
// TestWithFSTest leverages the packaged Go fstest package, which seems comprehensive.
2521
func TestWithFSTest(t *testing.T) {
2622
t.Parallel()
@@ -32,17 +28,17 @@ func TestWithFSTest(t *testing.T) {
3228
"bar.txt": "goodbye, world",
3329
filepath.Join("dir", "baz.txt"): "こんにちわ, world",
3430
}
35-
created_files := make([]string, 0, len(files))
31+
createdFiles := make([]string, 0, len(files))
3632
for filename, contents := range files {
3733
makeFile(memfs, t, filename, contents)
38-
created_files = append(created_files, filename)
34+
createdFiles = append(createdFiles, filename)
3935
}
4036

4137
if runtime.GOOS == "windows" {
4238
t.Skip("fstest.TestFS is not yet windows path aware")
4339
}
4440

45-
err := fstest.TestFS(iofs, created_files...)
41+
err := fstest.TestFS(iofs, createdFiles...)
4642
if err != nil {
4743
checkFsTestError(t, err, files)
4844
}
@@ -101,7 +97,6 @@ func checkFsTestError(t *testing.T, err error, files map[string]string) {
10197
// has nicely-Joined wrapped errors. Try that first.
10298
if errs, ok := err.(errorList); ok {
10399
for _, e := range errs.Unwrap() {
104-
105100
if strings.Contains(e.Error(), "ModTime") {
106101
// Memfs returns the current time for Stat().ModTime(), which triggers
107102
// a diff complaint in fstest. We can ignore this, or store modtimes
@@ -129,10 +124,10 @@ func checkFsTestError(t *testing.T, err error, files map[string]string) {
129124
// We filter on "empty line" or "ModTime" or "$filename: mismatch" to ignore these.
130125
lines := strings.Split(err.Error(), "\n")
131126
filtered := make([]string, 0, len(lines))
132-
filename_mismatches := make(map[string]struct{}, len(files)*2)
127+
mismatches := make(map[string]struct{}, len(files)*2)
133128
for name := range files {
134129
for dirname := name; dirname != "."; dirname = filepath.Dir(dirname) {
135-
filename_mismatches[dirname+": mismatch:"] = struct{}{}
130+
mismatches[dirname+": mismatch:"] = struct{}{}
136131
}
137132
}
138133
if strings.TrimSpace(lines[0]) == "TestFS found errors:" {
@@ -144,7 +139,7 @@ func checkFsTestError(t *testing.T, err error, files map[string]string) {
144139
continue
145140
}
146141

147-
if _, ok := filename_mismatches[trimmed]; ok {
142+
if _, ok := mismatches[trimmed]; ok {
148143
continue
149144
}
150145
filtered = append(filtered, line)

0 commit comments

Comments
 (0)