Skip to content

Commit ff090e8

Browse files
committed
lint: version CI tooling in go.tool.mod
The linters and formatters were pinned by hardcoding module@version strings in Makefile variables and invoking them with go run. That keeps the versions away from Go's normal module tooling, so there is no go.sum entry to verify them and no easy way to update them. Track golangci-lint, goimports-reviser and gofumpt as tool dependencies in a dedicated go.tool.mod instead, and drive them through go tool -modfile. The module stays separate from the main go.mod so these development-only dependencies do not pollute the build graph. To update a tool, run go get -modfile=go.tool.mod -tool <module>@<version>. Signed-off-by: Robin Jarry <robin@jarry.cc>
1 parent b684b81 commit ff090e8

4 files changed

Lines changed: 1168 additions & 9 deletions

File tree

‎.codespellrc‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,5 @@ skip =
99
docs/.venv,
1010
*_templ.go,
1111
pw,
12+
go*.mod,
13+
go*.sum,

‎Makefile‎

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,12 @@ docs:
8181
-Dhtml_theme=sphinx_rtd_theme \
8282
docs docs/_build
8383

84-
import_reviser ?= github.com/incu6us/goimports-reviser/v3@v3.12.6
84+
# CI tooling lives in its own module (go.tool.mod) to keep it out of the main
85+
# go.mod. To update a tool version:
86+
# go get -modfile=go.tool.mod -tool <module>@<version>
87+
GO_TOOL = $(GO) tool -modfile=go.tool.mod
8588
import_reviser_flags ?= -rm-unused -project-name github.com/getpatchwork/patchwork -use-cache
86-
gofumpt ?= mvdan.cc/gofumpt@v0.9.2
87-
golangci_lint ?= github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.13.2
88-
license_exclude = *.md *.asc *.yaml docs/requirements.txt *.service CONTRIBUTORS LICENSE .* go.mod go.sum pkg/mail/testdata docs/deployment/nginx.conf docs/deployment/js_challenge.lua
89+
license_exclude = *.md *.asc *.yaml docs/requirements.txt *.service CONTRIBUTORS LICENSE .* go*.mod go*.sum pkg/mail/testdata docs/deployment/nginx.conf docs/deployment/js_challenge.lua
8990

9091
.PHONY: test
9192
test: pw
@@ -105,17 +106,17 @@ lint:
105106
exit 1; \
106107
}
107108
@echo '[goimports-reviser]'
108-
$Q ! $(GO) run $(import_reviser) $(import_reviser_flags) -list-diff -output stdout ./... | grep . || { \
109+
$Q ! $(GO_TOOL) goimports-reviser $(import_reviser_flags) -list-diff -output stdout ./... | grep . || { \
109110
echo 'error: above files need import sorting'; \
110111
exit 1; \
111112
}
112113
@echo '[gofumpt]'
113-
$Q ! $(GO) run $(gofumpt) -d . | grep ^diff || { \
114+
$Q ! $(GO_TOOL) gofumpt -d . | grep ^diff || { \
114115
echo 'error: above files need reformatting'; \
115116
exit 1; \
116117
}
117118
@echo '[golangci-lint]'
118-
@$(GO) run $(golangci_lint) run
119+
@$(GO_TOOL) golangci-lint run
119120
@echo '[license-check]'
120121
$Q ! git --no-pager grep -LF 'SPDX-License-Identifier: GPL-2.0-or-later' -- $(addprefix :!:,$(license_exclude)) || { \
121122
echo 'error: above files are missing license'; \
@@ -133,8 +134,8 @@ lint:
133134
.PHONY: format
134135
format:
135136
$(GO) tool templ fmt .
136-
$(GO) run $(import_reviser) $(import_reviser_flags) ./...
137-
$(GO) run $(gofumpt) -w .
137+
$(GO_TOOL) goimports-reviser $(import_reviser_flags) ./...
138+
$(GO_TOOL) gofumpt -w .
138139

139140
REVISION_RANGE ?= @{u}..
140141

‎go.tool.mod‎

Lines changed: 226 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
1+
// ex: ft=gomod
2+
module github.com/getpatchwork/patchwork/tools
3+
4+
go 1.26.0
5+
6+
tool (
7+
github.com/golangci/golangci-lint/v2/cmd/golangci-lint
8+
github.com/incu6us/goimports-reviser/v3
9+
mvdan.cc/gofumpt
10+
)
11+
12+
require (
13+
4d63.com/gocheckcompilerdirectives v1.4.0 // indirect
14+
4d63.com/gochecknoglobals v0.2.2 // indirect
15+
charm.land/lipgloss/v2 v2.0.6 // indirect
16+
codeberg.org/chavacava/garif v0.2.0 // indirect
17+
codeberg.org/polyfloyd/go-errorlint v1.9.0 // indirect
18+
dev.gaijin.team/go/exhaustruct/v4 v4.0.0 // indirect
19+
dev.gaijin.team/go/exhaustruct/v5 v5.0.3 // indirect
20+
dev.gaijin.team/go/golib v0.8.1 // indirect
21+
github.com/4meepo/tagalign v1.4.3 // indirect
22+
github.com/Abirdcfly/dupword v0.1.8 // indirect
23+
github.com/AdminBenni/iota-mixing v1.0.0 // indirect
24+
github.com/AlwxSin/noinlineerr v1.0.6 // indirect
25+
github.com/Antonboom/errname v1.1.2 // indirect
26+
github.com/Antonboom/nilnil v1.1.2 // indirect
27+
github.com/Antonboom/testifylint v1.6.4 // indirect
28+
github.com/BurntSushi/toml v1.6.0 // indirect
29+
github.com/ClickHouse/clickhouse-go-linter v1.2.1 // indirect
30+
github.com/Djarvur/go-err113 v0.1.1 // indirect
31+
github.com/Masterminds/semver/v3 v3.5.0 // indirect
32+
github.com/MirrexOne/unqueryvet v1.5.4 // indirect
33+
github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect
34+
github.com/alecthomas/chroma/v2 v2.27.0 // indirect
35+
github.com/alecthomas/go-check-sumtype v0.3.1 // indirect
36+
github.com/alexkohler/nakedret/v2 v2.0.6 // indirect
37+
github.com/alexkohler/prealloc v1.1.0 // indirect
38+
github.com/alfatraining/structtag v1.0.0 // indirect
39+
github.com/alingse/asasalint v0.0.11 // indirect
40+
github.com/alingse/nilnesserr v0.2.0 // indirect
41+
github.com/ashanbrown/forbidigo/v2 v2.3.1 // indirect
42+
github.com/ashanbrown/makezero/v2 v2.2.1 // indirect
43+
github.com/beorn7/perks v1.0.1 // indirect
44+
github.com/bkielbasa/cyclop v1.2.3 // indirect
45+
github.com/blizzy78/varnamelen v0.8.0 // indirect
46+
github.com/bombsimon/wsl/v4 v4.7.0 // indirect
47+
github.com/bombsimon/wsl/v5 v5.9.0 // indirect
48+
github.com/breml/bidichk v0.3.3 // indirect
49+
github.com/breml/errchkjson v0.4.1 // indirect
50+
github.com/butuzov/ireturn v0.4.1 // indirect
51+
github.com/butuzov/mirror v1.3.3 // indirect
52+
github.com/catenacyber/perfsprint v0.10.1 // indirect
53+
github.com/ccojocar/zxcvbn-go v1.0.4 // indirect
54+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
55+
github.com/charithe/durationcheck v0.0.11 // indirect
56+
github.com/charmbracelet/colorprofile v0.4.3 // indirect
57+
github.com/charmbracelet/ultraviolet v0.0.0-20260811164956-006e29f97886 // indirect
58+
github.com/charmbracelet/x/ansi v0.11.8 // indirect
59+
github.com/charmbracelet/x/term v0.2.2 // indirect
60+
github.com/charmbracelet/x/termios v0.1.1 // indirect
61+
github.com/charmbracelet/x/windows v0.2.2 // indirect
62+
github.com/ckaznocha/intrange v0.3.1 // indirect
63+
github.com/clipperhouse/displaywidth v0.11.0 // indirect
64+
github.com/clipperhouse/uax29/v2 v2.7.0 // indirect
65+
github.com/curioswitch/go-reassign v0.3.0 // indirect
66+
github.com/daixiang0/gci v0.13.7 // indirect
67+
github.com/dave/dst v0.27.3 // indirect
68+
github.com/denis-tingaikin/go-header v0.5.0 // indirect
69+
github.com/dlclark/regexp2/v2 v2.2.1 // indirect
70+
github.com/ettle/strcase v0.2.0 // indirect
71+
github.com/fatih/color v1.19.0 // indirect
72+
github.com/fatih/structtag v1.2.0 // indirect
73+
github.com/firefart/nonamedreturns v1.0.8 // indirect
74+
github.com/fsnotify/fsnotify v1.9.0 // indirect
75+
github.com/fzipp/gocyclo v0.6.0 // indirect
76+
github.com/ghostiam/protogetter v0.3.21 // indirect
77+
github.com/go-critic/go-critic v0.14.4 // indirect
78+
github.com/go-toolsmith/astcast v1.1.0 // indirect
79+
github.com/go-toolsmith/astcopy v1.1.0 // indirect
80+
github.com/go-toolsmith/astequal v1.2.0 // indirect
81+
github.com/go-toolsmith/astfmt v1.1.0 // indirect
82+
github.com/go-toolsmith/astp v1.1.0 // indirect
83+
github.com/go-toolsmith/strparse v1.1.0 // indirect
84+
github.com/go-toolsmith/typep v1.1.0 // indirect
85+
github.com/go-viper/mapstructure/v2 v2.5.0 // indirect
86+
github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect
87+
github.com/gobwas/glob v0.2.3 // indirect
88+
github.com/godoc-lint/godoc-lint v0.11.2 // indirect
89+
github.com/gofrs/flock v0.13.0 // indirect
90+
github.com/golang/protobuf v1.5.3 // indirect
91+
github.com/golangci/asciicheck v0.5.0 // indirect
92+
github.com/golangci/canonicalheader v0.0.0-20260827115959-a25c71c521f6 // indirect
93+
github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202 // indirect
94+
github.com/golangci/go-printf-func-name v0.1.1 // indirect
95+
github.com/golangci/gofmt v0.0.0-20260820135601-e84e05053792 // indirect
96+
github.com/golangci/golangci-lint/v2 v2.13.2 // indirect
97+
github.com/golangci/golines v0.15.0 // indirect
98+
github.com/golangci/misspell v0.8.0 // indirect
99+
github.com/golangci/plugin-module-register v0.1.2 // indirect
100+
github.com/golangci/revgrep v0.8.0 // indirect
101+
github.com/golangci/rowserrcheck v0.0.0-20260419091836-c5f79b8a11ba // indirect
102+
github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e // indirect
103+
github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e // indirect
104+
github.com/google/go-cmp v0.7.0 // indirect
105+
github.com/gordonklaus/ineffassign v0.2.0 // indirect
106+
github.com/gostaticanalysis/analysisutil v0.7.1 // indirect
107+
github.com/gostaticanalysis/comment v1.5.0 // indirect
108+
github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect
109+
github.com/gostaticanalysis/nilerr v0.1.2 // indirect
110+
github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect
111+
github.com/hashicorp/go-version v1.9.0 // indirect
112+
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
113+
github.com/hashicorp/hcl v1.0.0 // indirect
114+
github.com/hexops/gotextdiff v1.0.3 // indirect
115+
github.com/inconshreveable/mousetrap v1.1.0 // indirect
116+
github.com/incu6us/goimports-reviser/v3 v3.12.6 // indirect
117+
github.com/jgautheron/goconst v1.11.0 // indirect
118+
github.com/jjti/go-spancheck v0.6.5 // indirect
119+
github.com/julz/importas v0.2.0 // indirect
120+
github.com/karamaru-alpha/copyloopvar v1.2.2 // indirect
121+
github.com/kisielk/errcheck v1.20.0 // indirect
122+
github.com/kkHAIKE/contextcheck v1.1.6 // indirect
123+
github.com/kulti/thelper v0.7.1 // indirect
124+
github.com/kunwardeep/paralleltest v1.0.15 // indirect
125+
github.com/ldez/exptostd v0.4.5 // indirect
126+
github.com/ldez/gomoddirectives v0.9.0 // indirect
127+
github.com/ldez/grignotin v0.10.1 // indirect
128+
github.com/ldez/structtags v0.6.1 // indirect
129+
github.com/ldez/tagliatelle v0.7.2 // indirect
130+
github.com/ldez/usetesting v0.5.0 // indirect
131+
github.com/leonklingele/grouper v1.1.2 // indirect
132+
github.com/lucasb-eyer/go-colorful v1.4.1 // indirect
133+
github.com/macabu/inamedparam v0.2.0 // indirect
134+
github.com/magiconair/properties v1.8.6 // indirect
135+
github.com/manuelarte/embeddedstructfieldcheck v0.4.0 // indirect
136+
github.com/manuelarte/funcorder v0.6.0 // indirect
137+
github.com/maratori/testableexamples v1.0.1 // indirect
138+
github.com/maratori/testpackage v1.1.2 // indirect
139+
github.com/matoous/godox v1.1.0 // indirect
140+
github.com/mattn/go-colorable v0.1.15 // indirect
141+
github.com/mattn/go-isatty v0.0.20 // indirect
142+
github.com/mattn/go-runewidth v0.0.24 // indirect
143+
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
144+
github.com/mgechev/revive v1.15.0 // indirect
145+
github.com/mitchellh/go-homedir v1.1.0 // indirect
146+
github.com/mitchellh/mapstructure v1.5.0 // indirect
147+
github.com/moricho/tparallel v0.3.2 // indirect
148+
github.com/muesli/cancelreader v0.2.2 // indirect
149+
github.com/nakabonne/nestif v0.3.1 // indirect
150+
github.com/nishanths/exhaustive v0.12.0 // indirect
151+
github.com/nishanths/predeclared v0.2.2 // indirect
152+
github.com/nunnatsa/ginkgolinter v0.24.0 // indirect
153+
github.com/pelletier/go-toml v1.9.5 // indirect
154+
github.com/pelletier/go-toml/v2 v2.4.3 // indirect
155+
github.com/prometheus/client_golang v1.12.1 // indirect
156+
github.com/prometheus/client_model v0.2.0 // indirect
157+
github.com/prometheus/common v0.32.1 // indirect
158+
github.com/prometheus/procfs v0.7.3 // indirect
159+
github.com/quasilyte/go-ruleguard v0.4.5 // indirect
160+
github.com/quasilyte/go-ruleguard/dsl v0.3.23 // indirect
161+
github.com/quasilyte/gogrep v0.5.0 // indirect
162+
github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect
163+
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect
164+
github.com/raeperd/recvcheck v0.3.0 // indirect
165+
github.com/rivo/uniseg v0.4.7 // indirect
166+
github.com/rogpeppe/go-internal v1.16.0 // indirect
167+
github.com/ryancurrah/gomodguard v1.4.1 // indirect
168+
github.com/ryancurrah/gomodguard/v2 v2.1.3 // indirect
169+
github.com/ryanrolds/sqlclosecheck v0.6.0 // indirect
170+
github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect
171+
github.com/santhosh-tekuri/jsonschema/v6 v6.0.3 // indirect
172+
github.com/sashamelentyev/interfacebloat v1.1.0 // indirect
173+
github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect
174+
github.com/securego/gosec/v2 v2.28.0 // indirect
175+
github.com/sirupsen/logrus v1.10.1 // indirect
176+
github.com/sivchari/containedctx v1.0.3 // indirect
177+
github.com/sonatard/noctx v0.5.1 // indirect
178+
github.com/sourcegraph/go-diff v0.8.0 // indirect
179+
github.com/spf13/afero v1.15.0 // indirect
180+
github.com/spf13/cast v1.5.0 // indirect
181+
github.com/spf13/cobra v1.10.2 // indirect
182+
github.com/spf13/jwalterweatherman v1.1.0 // indirect
183+
github.com/spf13/pflag v1.0.10 // indirect
184+
github.com/spf13/viper v1.12.0 // indirect
185+
github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect
186+
github.com/stbenjam/no-sprintf-host-port v0.3.1 // indirect
187+
github.com/stretchr/objx v0.5.3 // indirect
188+
github.com/stretchr/testify v1.12.1 // indirect
189+
github.com/subosito/gotenv v1.4.1 // indirect
190+
github.com/tetafro/godot v1.5.6 // indirect
191+
github.com/timakin/bodyclose v0.0.0-20260129054331-73d1f95b84b4 // indirect
192+
github.com/timonwong/loggercheck v0.11.0 // indirect
193+
github.com/tomarrell/wrapcheck/v2 v2.12.0 // indirect
194+
github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect
195+
github.com/ultraware/funlen v0.2.0 // indirect
196+
github.com/ultraware/whitespace v0.2.0 // indirect
197+
github.com/uudashr/gocognit v1.2.1 // indirect
198+
github.com/uudashr/iface v1.5.1 // indirect
199+
github.com/xen0n/gosmopolitan v1.3.0 // indirect
200+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
201+
github.com/yagipy/maintidx v1.0.0 // indirect
202+
github.com/yeya24/promlinter v0.3.0 // indirect
203+
github.com/ykadowak/zerologlint v0.1.5 // indirect
204+
gitlab.com/bosi/decorder v0.4.2 // indirect
205+
go-simpler.org/musttag v0.14.0 // indirect
206+
go-simpler.org/sloglint v0.12.0 // indirect
207+
go.augendre.info/arangolint v0.4.0 // indirect
208+
go.augendre.info/fatcontext v0.10.0 // indirect
209+
go.uber.org/multierr v1.10.0 // indirect
210+
go.uber.org/zap v1.27.0 // indirect
211+
go.yaml.in/yaml/v3 v3.0.5 // indirect
212+
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect
213+
golang.org/x/exp/typeparams v0.0.0-20260811152304-ee035b5b010f // indirect
214+
golang.org/x/mod v0.40.0 // indirect
215+
golang.org/x/sync v0.22.0 // indirect
216+
golang.org/x/sys v0.47.0 // indirect
217+
golang.org/x/text v0.40.0 // indirect
218+
golang.org/x/tools v0.49.0 // indirect
219+
google.golang.org/protobuf v1.36.11 // indirect
220+
gopkg.in/ini.v1 v1.67.0 // indirect
221+
gopkg.in/yaml.v2 v2.4.0 // indirect
222+
gopkg.in/yaml.v3 v3.0.1 // indirect
223+
honnef.co/go/tools v0.8.1 // indirect
224+
mvdan.cc/gofumpt v0.11.0 // indirect
225+
mvdan.cc/unparam v0.0.0-20260823230713-2fa3d841b0c8 // indirect
226+
)

0 commit comments

Comments
 (0)