diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 000000000..1004218da --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,40 @@ +run: + deadline: 5m + +output: + sort-results: true + +linters: + enable: + - depguard + - gofumpt + - goimports + - revive + - misspell + - staticcheck + - promlinter + - tenv + - errorlint + - exportloopref + - predeclared + - maligned + +issues: + max-same-issues: 0 + exclude-rules: + - path: _test.go + linters: + - maligned + +linters-settings: + depguard: + list-type: blacklist + include-go-root: true + packages-with-error-message: + - io/ioutil: "Use corresponding 'os' or 'io' functions instead." + goimports: + local-prefixes: github.com/prymitive/karma + gofumpt: + extra-rules: true + maligned: + suggest-new: true diff --git a/cmd/karma/acl.go b/cmd/karma/acl.go index aeba2f875..3d48b2d71 100644 --- a/cmd/karma/acl.go +++ b/cmd/karma/acl.go @@ -17,9 +17,7 @@ const ( aclActionAllow = "allow" ) -var ( - allACLActions = []string{aclActionAllow, aclActionBlock, aclActionRequireMatcher} -) +var allACLActions = []string{aclActionAllow, aclActionBlock, aclActionRequireMatcher} type silenceFilter struct { Name string diff --git a/cmd/karma/alerts.go b/cmd/karma/alerts.go index ec98907ca..9e42c3874 100644 --- a/cmd/karma/alerts.go +++ b/cmd/karma/alerts.go @@ -25,7 +25,7 @@ func getFiltersFromQuery(filterStrings []string) []filters.FilterT { return matchFilters } -func countLabel(countStore map[string]map[string]int, key string, val string) { +func countLabel(countStore map[string]map[string]int, key, val string) { if _, found := countStore[key]; !found { countStore[key] = make(map[string]int) } diff --git a/cmd/karma/assets.go b/cmd/karma/assets.go index 68125ff36..44c8b3b72 100644 --- a/cmd/karma/assets.go +++ b/cmd/karma/assets.go @@ -18,7 +18,7 @@ func contentText(w http.ResponseWriter) { w.Header().Set("Content-Type", "text/plain; charset=utf-8") } -func serveFileOr404(path string, contentType string) http.HandlerFunc { +func serveFileOr404(path, contentType string) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") if path == "" { diff --git a/cmd/karma/assets_test.go b/cmd/karma/assets_test.go index e4d76d999..4a26e5ce7 100644 --- a/cmd/karma/assets_test.go +++ b/cmd/karma/assets_test.go @@ -124,7 +124,7 @@ func TestStaticFiles(t *testing.T) { mime string } - var staticFileTests = []staticFileTestCase{ + staticFileTests := []staticFileTestCase{ { path: "/favicon.ico", code: 200, @@ -185,7 +185,7 @@ func TestStaticFilesPrefix(t *testing.T) { mime string } - var staticFilePrefixTests = []staticFileTestCase{ + staticFilePrefixTests := []staticFileTestCase{ { path: "/sub/favicon.ico", code: 200, diff --git a/cmd/karma/auth_headers_test.go b/cmd/karma/auth_headers_test.go index a438541fd..aafd309c5 100644 --- a/cmd/karma/auth_headers_test.go +++ b/cmd/karma/auth_headers_test.go @@ -64,7 +64,7 @@ func TestAuthHeader(t *testing.T) { defer httpmock.DeactivateAndReset() for _, testCase := range authHeaderTests { - testCase := testCase //scopelint pin + testCase := testCase // scopelint pin for _, version := range mock.ListAllMocks() { apiCache, _ = lru.New(100) @@ -85,7 +85,8 @@ func TestAuthHeader(t *testing.T) { "metrics", "api/v2/status", "api/v2/silences", - "api/v2/alerts/groups"} { + "api/v2/alerts/groups", + } { uri := fmt.Sprintf("%s/%s", testCase.alertmanagerURI, m) diff --git a/cmd/karma/main.go b/cmd/karma/main.go index a85a2088b..cb5708b91 100644 --- a/cmd/karma/main.go +++ b/cmd/karma/main.go @@ -167,7 +167,7 @@ func setupRouter(router *chi.Mux, historyPoller *historyPoller) { } } - walkFunc := func(method string, route string, handler http.Handler, middlewares ...func(http.Handler) http.Handler) error { + walkFunc := func(method, route string, handler http.Handler, middlewares ...func(http.Handler) http.Handler) error { log.Debug(). Str("method", method). Str("route", route). @@ -235,6 +235,7 @@ func setupUpstreams() error { func msgFormatter(msg any) string { return fmt.Sprintf("msg=%q", msg) } + func lvlFormatter(level any) string { if level == nil { return "" @@ -425,7 +426,7 @@ func writePidFile() error { if pidFile != "" { log.Info().Str("path", pidFile).Msg("Writing PID file") pid := os.Getpid() - err := os.WriteFile(pidFile, []byte(strconv.Itoa(pid)), 0644) + err := os.WriteFile(pidFile, []byte(strconv.Itoa(pid)), 0o644) if err != nil { return fmt.Errorf("failed to write a PID file: %w", err) } diff --git a/cmd/karma/proxy_test.go b/cmd/karma/proxy_test.go index 8a8090ffc..983b30815 100644 --- a/cmd/karma/proxy_test.go +++ b/cmd/karma/proxy_test.go @@ -213,7 +213,7 @@ func TestProxyHeaders(t *testing.T) { defer httpmock.DeactivateAndReset() for _, testCase := range proxyHeaderTests { - testCase := testCase //scopelint pin + testCase := testCase // scopelint pin r := testRouter() am, err := alertmanager.NewAlertmanager( "cluster", diff --git a/cmd/karma/script_test.go b/cmd/karma/script_test.go index e31fdb8d8..e09653c18 100644 --- a/cmd/karma/script_test.go +++ b/cmd/karma/script_test.go @@ -43,7 +43,6 @@ func TestMain(m *testing.M) { ecode = 1 } os.Exit(ecode) - } func TestScripts(t *testing.T) { diff --git a/cmd/karma/tests/testscript/059_log_full_config_env.txt b/cmd/karma/tests/testscript/059_log_full_config_env.txt index 06094e3c6..e2c29cf2f 100644 --- a/cmd/karma/tests/testscript/059_log_full_config_env.txt +++ b/cmd/karma/tests/testscript/059_log_full_config_env.txt @@ -209,9 +209,9 @@ level=info msg=" key: \"\"" level=info msg=" port: 1234" level=info msg=" prefix: /prefix/" level=info msg="log:" -level=info msg=" config: true" level=info msg=" level: info" level=info msg=" format: text" +level=info msg=" config: true" level=info msg=" requests: false" level=info msg=" timestamp: false" level=info msg="receivers:" diff --git a/cmd/karma/tests/testscript/060_log_full_config_file.txt b/cmd/karma/tests/testscript/060_log_full_config_file.txt index ea38a531d..6c90bfaa1 100644 --- a/cmd/karma/tests/testscript/060_log_full_config_file.txt +++ b/cmd/karma/tests/testscript/060_log_full_config_file.txt @@ -242,9 +242,9 @@ level=info msg=" key: \"\"" level=info msg=" port: 8080" level=info msg=" prefix: /" level=info msg="log:" -level=info msg=" config: true" level=info msg=" level: info" level=info msg=" format: text" +level=info msg=" config: true" level=info msg=" requests: false" level=info msg=" timestamp: false" level=info msg="receivers:" diff --git a/cmd/karma/tests/testscript/065_proxy-with-readonly.txt b/cmd/karma/tests/testscript/065_proxy-with-readonly.txt index 8d328b349..00736e049 100644 --- a/cmd/karma/tests/testscript/065_proxy-with-readonly.txt +++ b/cmd/karma/tests/testscript/065_proxy-with-readonly.txt @@ -104,9 +104,9 @@ level=info msg=" key: \"\"" level=info msg=" port: 8080" level=info msg=" prefix: /" level=info msg="log:" -level=info msg=" config: true" level=info msg=" level: info" level=info msg=" format: text" +level=info msg=" config: true" level=info msg=" requests: false" level=info msg=" timestamp: false" level=info msg="receivers:" diff --git a/cmd/karma/tests/testscript/066_proxy.txt b/cmd/karma/tests/testscript/066_proxy.txt index c767fe1fb..1b67a28e8 100644 --- a/cmd/karma/tests/testscript/066_proxy.txt +++ b/cmd/karma/tests/testscript/066_proxy.txt @@ -104,9 +104,9 @@ level=info msg=" key: \"\"" level=info msg=" port: 8080" level=info msg=" prefix: /" level=info msg="log:" -level=info msg=" config: true" level=info msg=" level: info" level=info msg=" format: text" +level=info msg=" config: true" level=info msg=" requests: false" level=info msg=" timestamp: false" level=info msg="receivers:" diff --git a/cmd/karma/tests/testscript/067_readonly.txt b/cmd/karma/tests/testscript/067_readonly.txt index 8c2b9f53a..74a3346f9 100644 --- a/cmd/karma/tests/testscript/067_readonly.txt +++ b/cmd/karma/tests/testscript/067_readonly.txt @@ -104,9 +104,9 @@ level=info msg=" key: \"\"" level=info msg=" port: 8080" level=info msg=" prefix: /" level=info msg="log:" -level=info msg=" config: true" level=info msg=" level: info" level=info msg=" format: text" +level=info msg=" config: true" level=info msg=" requests: false" level=info msg=" timestamp: false" level=info msg="receivers:" diff --git a/cmd/karma/tests/testscript/070_upper_case_keys.txt b/cmd/karma/tests/testscript/070_upper_case_keys.txt index 52b2ee403..72f13ca4e 100644 --- a/cmd/karma/tests/testscript/070_upper_case_keys.txt +++ b/cmd/karma/tests/testscript/070_upper_case_keys.txt @@ -114,9 +114,9 @@ level=info msg=" key: \"\"" level=info msg=" port: 8080" level=info msg=" prefix: /" level=info msg="log:" -level=info msg=" config: true" level=info msg=" level: info" level=info msg=" format: text" +level=info msg=" config: true" level=info msg=" requests: false" level=info msg=" timestamp: false" level=info msg="receivers:" diff --git a/cmd/karma/tests/testscript/097_proxy_url_config.txt b/cmd/karma/tests/testscript/097_proxy_url_config.txt index 9c797761a..1a7a714d9 100644 --- a/cmd/karma/tests/testscript/097_proxy_url_config.txt +++ b/cmd/karma/tests/testscript/097_proxy_url_config.txt @@ -104,9 +104,9 @@ level=info msg=" key: \"\"" level=info msg=" port: 8080" level=info msg=" prefix: /" level=info msg="log:" -level=info msg=" config: true" level=info msg=" level: info" level=info msg=" format: text" +level=info msg=" config: true" level=info msg=" requests: false" level=info msg=" timestamp: false" level=info msg="receivers:" diff --git a/cmd/karma/views.go b/cmd/karma/views.go index 839697eb1..660382397 100644 --- a/cmd/karma/views.go +++ b/cmd/karma/views.go @@ -680,7 +680,7 @@ func silences(w http.ResponseWriter, r *http.Request) { recentFirst = false } - sort.Slice(dedupedSilences, func(i int, j int) bool { + sort.Slice(dedupedSilences, func(i, j int) bool { if dedupedSilences[i].Silence.EndsAt.Equal(dedupedSilences[j].Silence.EndsAt) { if dedupedSilences[i].Silence.StartsAt.Equal(dedupedSilences[j].Silence.StartsAt) { return dedupedSilences[i].Silence.ID < dedupedSilences[j].Silence.ID diff --git a/cmd/karma/views_test.go b/cmd/karma/views_test.go index fddfc468b..e19655e77 100644 --- a/cmd/karma/views_test.go +++ b/cmd/karma/views_test.go @@ -3044,6 +3044,7 @@ func (ew *gzErrWriter) Write(p []byte) (n int, err error) { } return len(p), nil } + func (ew *gzErrWriter) Close() error { if ew.failClose { return errors.New("Close error") diff --git a/internal/alertmanager/dedup.go b/internal/alertmanager/dedup.go index 0739d20ae..3dabd50e0 100644 --- a/internal/alertmanager/dedup.go +++ b/internal/alertmanager/dedup.go @@ -242,7 +242,6 @@ func DedupKnownLabelValues(name string) []string { for _, alert := range ag.Alerts { if v := alert.Labels.Get(name); v != nil { dedupedValues[v.Value] = true - } } } diff --git a/internal/alertmanager/models.go b/internal/alertmanager/models.go index 58d5a2a62..ee2dc16bb 100644 --- a/internal/alertmanager/models.go +++ b/internal/alertmanager/models.go @@ -37,6 +37,7 @@ type HealthCheck struct { } // Alertmanager represents Alertmanager upstream instance +// nolint: maligned type Alertmanager struct { URI string `json:"uri"` ExternalURI string `json:"-"` diff --git a/internal/alertmanager/upstream.go b/internal/alertmanager/upstream.go index b3f5a23dd..5ebd461da 100644 --- a/internal/alertmanager/upstream.go +++ b/internal/alertmanager/upstream.go @@ -18,9 +18,7 @@ import ( // Option allows to pass functional options to NewAlertmanager() type Option func(am *Alertmanager) error -var ( - upstreams = map[string]*Alertmanager{} -) +var upstreams = map[string]*Alertmanager{} // NewAlertmanager creates a new Alertmanager instance func NewAlertmanager(cluster, name, upstreamURI string, opts ...Option) (*Alertmanager, error) { diff --git a/internal/config/config.go b/internal/config/config.go index 7c12a1f09..c7cc2ee10 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -26,10 +26,8 @@ import ( yaml "gopkg.in/yaml.v3" ) -var ( - // Config will hold final configuration read from the file and flags - Config *configSchema -) +// Config will hold final configuration read from the file and flags +var Config *configSchema func init() { Config = &configSchema{} diff --git a/internal/config/config_test.go b/internal/config/config_test.go index b71906dff..4c27cd246 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -133,9 +133,9 @@ listen: port: 80 prefix: / log: - config: false level: info format: text + config: false requests: false timestamp: false receivers: diff --git a/internal/config/models.go b/internal/config/models.go index ee133906f..c79b01578 100644 --- a/internal/config/models.go +++ b/internal/config/models.go @@ -107,6 +107,7 @@ type configSchema struct { Author string Comment string } `yaml:"alertAcknowledgement" koanf:"alertAcknowledgement"` + // nolint: maligned Annotations struct { Default struct { Hidden bool @@ -182,9 +183,9 @@ type configSchema struct { Prefix string } Log struct { - Config bool Level string Format string + Config bool Requests bool Timestamp bool } @@ -205,6 +206,7 @@ type configSchema struct { Labels []string } } `yaml:"silenceForm" koanf:"silenceForm"` + // nolint: maligned UI struct { Refresh time.Duration HideFiltersWhenIdle bool `yaml:"hideFiltersWhenIdle" koanf:"hideFiltersWhenIdle"` diff --git a/internal/filters/autocomplete_test.go b/internal/filters/autocomplete_test.go index 67880defa..4b8f6c4b9 100644 --- a/internal/filters/autocomplete_test.go +++ b/internal/filters/autocomplete_test.go @@ -63,7 +63,8 @@ var acTests = []acTest{ CreatedBy: "me@example.com", TicketID: "JIRA-1", }, - }}, + }, + }, }, SilencedBy: []string{"1234567890"}, }, diff --git a/internal/filters/filter_cluster.go b/internal/filters/filter_cluster.go index 5e7173e92..5dea11078 100644 --- a/internal/filters/filter_cluster.go +++ b/internal/filters/filter_cluster.go @@ -30,7 +30,6 @@ func (filter *alertmanagerClusterFilter) Match(alert *models.Alert, matches int) func (filter *alertmanagerClusterFilter) MatchAlertmanager(am *models.AlertmanagerInstance) bool { return filter.Matcher.Compare(am.Cluster, filter.Value) - } func newAlertmanagerClusterFilter() FilterT { diff --git a/internal/mapper/round_tripper.go b/internal/mapper/round_tripper.go index 6cd8c1f82..da87ad651 100644 --- a/internal/mapper/round_tripper.go +++ b/internal/mapper/round_tripper.go @@ -21,7 +21,7 @@ func (hrt *headersRoundTripper) RoundTrip(r *http.Request) (*http.Response, erro return hrt.inner.RoundTrip(r) } -func SetAuth(inner http.RoundTripper, username string, password string) http.RoundTripper { +func SetAuth(inner http.RoundTripper, username, password string) http.RoundTripper { return &authRoundTripper{ inner: inner, Username: username, diff --git a/internal/mock/mock.go b/internal/mock/mock.go index 75e8d0436..a2f1995a7 100644 --- a/internal/mock/mock.go +++ b/internal/mock/mock.go @@ -10,21 +10,21 @@ import ( ) // GetAbsoluteMockPath returns absolute path for given mock file -func GetAbsoluteMockPath(filename string, version string) string { +func GetAbsoluteMockPath(filename, version string) string { _, f, _, _ := runtime.Caller(0) cwd := filepath.Dir(f) return path.Join(cwd, version, filename) } // GetMockResponder returns a httpmock.Responder for given file/version -func GetMockResponder(url string, version string, filename string) httpmock.Responder { +func GetMockResponder(url, version, filename string) httpmock.Responder { fullPath := GetAbsoluteMockPath(filename, version) mockJSON, _ := os.ReadFile(fullPath) return httpmock.NewBytesResponder(200, mockJSON) } // RegisterURL for given url and return 200 status register mock http responder -func RegisterURL(url string, version string, filename string) { +func RegisterURL(url, version, filename string) { httpmock.RegisterResponder("GET", url, GetMockResponder(url, version, filename)) } diff --git a/internal/models/annotation.go b/internal/models/annotation.go index f25f0e4f5..75710cf2b 100644 --- a/internal/models/annotation.go +++ b/internal/models/annotation.go @@ -26,11 +26,12 @@ type Annotations []Annotation func (a Annotations) Len() int { return len(a) - } + func (a Annotations) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + func (a Annotations) Less(i, j int) bool { // Sort the anotations listed in config.Config.Annotations.Order first, in // the order they appear in that list; remaining annotations are sorted alphabetically. diff --git a/internal/models/api.go b/internal/models/api.go index 746eaa629..0d26d2750 100644 --- a/internal/models/api.go +++ b/internal/models/api.go @@ -59,9 +59,11 @@ type LabelValueStatsList []LabelValueStats func (lvsl LabelValueStatsList) Len() int { return len(lvsl) } + func (lvsl LabelValueStatsList) Swap(i, j int) { lvsl[i], lvsl[j] = lvsl[j], lvsl[i] } + func (lvsl LabelValueStatsList) Less(i, j int) bool { if lvsl[i].Hits == lvsl[j].Hits { return sortorder.NaturalLess(lvsl[i].Value, lvsl[j].Value) @@ -81,9 +83,11 @@ type LabelNameStatsList []LabelNameStats func (lnsl LabelNameStatsList) Len() int { return len(lnsl) } + func (lnsl LabelNameStatsList) Swap(i, j int) { lnsl[i], lnsl[j] = lnsl[j], lnsl[i] } + func (lnsl LabelNameStatsList) Less(i, j int) bool { if lnsl[i].Hits == lnsl[j].Hits { return lnsl[i].Name < lnsl[j].Name @@ -144,7 +148,6 @@ func (ag *APIAlertGroup) dedupLabels() { } ag.Shared.Labels = sharedLabels - } func (ag *APIAlertGroup) removeGroupingLabels(dropNames []string) { @@ -417,6 +420,7 @@ type LabelSettings struct { type LabelsSettings map[string]LabelSettings // Settings is used to export karma configuration that is used by UI +// nolint: maligned type Settings struct { AnnotationsDefaultHidden bool `json:"annotationsDefaultHidden"` AnnotationsHidden []string `json:"annotationsHidden"` @@ -444,6 +448,7 @@ type APIGrid struct { StateCount map[string]int `json:"stateCount"` } +// nolint: maligned type AlertsRequest struct { Filters []string `json:"filters"` GridLabel string `json:"gridLabel"` diff --git a/internal/models/api_test.go b/internal/models/api_test.go index f6d41dc17..ec08ee3fb 100644 --- a/internal/models/api_test.go +++ b/internal/models/api_test.go @@ -183,7 +183,7 @@ func TestDedupWithBadSource(t *testing.T) { } func TestNameStatsSort(t *testing.T) { - var nameStats = models.LabelNameStatsList{ + nameStats := models.LabelNameStatsList{ { Name: "@state", Hits: 24, diff --git a/internal/regex/regex.go b/internal/regex/regex.go index efdb63db2..30fa988d2 100644 --- a/internal/regex/regex.go +++ b/internal/regex/regex.go @@ -17,7 +17,6 @@ func WrapRegexWithAnchors(r string) string { } func MustCompileAnchored(r string) *regexp.Regexp { - return regexp.MustCompile(WrapRegexWithAnchors(r)) } diff --git a/internal/slices/slices.go b/internal/slices/slices.go index fbbecd7cc..e39816ed2 100644 --- a/internal/slices/slices.go +++ b/internal/slices/slices.go @@ -36,7 +36,7 @@ func StringSliceToSHA1(stringArray []string) (string, error) { return fmt.Sprintf("%x", h.Sum(nil)), nil } -func StringSliceDiff(slice1 []string, slice2 []string) ([]string, []string) { +func StringSliceDiff(slice1, slice2 []string) ([]string, []string) { missing := []string{} extra := []string{} diff --git a/internal/transform/colors.go b/internal/transform/colors.go index d2939a060..226be78e4 100644 --- a/internal/transform/colors.go +++ b/internal/transform/colors.go @@ -15,7 +15,7 @@ import ( plcolors "gopkg.in/go-playground/colors.v1" ) -func labelToSeed(key string, val string) int64 { +func labelToSeed(key, val string) int64 { h := sha1.New() _, _ = io.WriteString(h, key) _, _ = io.WriteString(h, val) @@ -66,7 +66,7 @@ func parseCustomColor(colorStore models.LabelsColorMap, key, val, customColor st // ColorLabel update karmaColorMap object with a color object generated // from label key and value passed here // It's used to generate unique colors for configured labels -func ColorLabel(colorStore models.LabelsColorMap, key string, val string) { +func ColorLabel(colorStore models.LabelsColorMap, key, val string) { // first handle custom colors _, ok := config.Config.Labels.Color.Custom[key] if ok { diff --git a/internal/transform/strip.go b/internal/transform/strip.go index c29d361bb..9ec2f7f6f 100644 --- a/internal/transform/strip.go +++ b/internal/transform/strip.go @@ -13,7 +13,8 @@ import ( // it takes the list of label keys to ignore and alert label map // it will return label map without labels found on the ignore list func StripLables(keptLabels, ignoredLabels []string, keptLabelsRegex, ignoredLabelsRegex []*regexp.Regexp, - sourceLabels models.Labels) models.Labels { + sourceLabels models.Labels, +) models.Labels { // empty keep lists means keep everything by default keepAll := len(keptLabels) == 0 && len(keptLabelsRegex) == 0 labels := models.Labels{} diff --git a/internal/uri/urls.go b/internal/uri/urls.go index 13e77072d..ac5e075ef 100644 --- a/internal/uri/urls.go +++ b/internal/uri/urls.go @@ -8,7 +8,7 @@ import ( // JoinURL can be used to join a base url (http(s)://domain.com) and a path (/my/path) // it will return a joined string or an error (if you supply invalid url) -func JoinURL(base string, sub string) (string, error) { +func JoinURL(base, sub string) (string, error) { u, err := url.Parse(base) if err != nil { return "", err diff --git a/make/go.mk b/make/go.mk index 6f3275142..60e5c51e7 100644 --- a/make/go.mk +++ b/make/go.mk @@ -39,13 +39,15 @@ $(GOBIN)/golangci-lint: tools/golangci-lint/go.mod tools/golangci-lint/go.sum go install -modfile=tools/golangci-lint/go.mod github.com/golangci/golangci-lint/cmd/golangci-lint .PHONY: lint-go lint-go: $(GOBIN)/golangci-lint lint-go-looppointer - $(ENV) golangci-lint run -v --timeout 5m -E staticcheck,misspell,promlinter,revive,tenv,errorlint,exportloopref,predeclared + $(ENV) golangci-lint run -v -$(GOBIN)/lint-go-goimports: tools/goimports/go.mod tools/goimports/go.sum +$(GOBIN)/goimports: tools/goimports/go.mod tools/goimports/go.sum go install -modfile=tools/goimports/go.mod golang.org/x/tools/cmd/goimports +$(GOBIN)/gofumpt: tools/gofumpt/go.mod tools/gofumpt/go.sum + go install -modfile=tools/gofumpt/go.mod mvdan.cc/gofumpt .PHONY: format-go -format-go: $(GOBIN)/lint-go-goimports - gofmt -l -s -w . +format-go: $(GOBIN)/goimports $(GOBIN)/gofumpt + gofumpt -extra -w . goimports -local github.com/prymitive/karma -w . .PHONY: download-deps-go diff --git a/tools/gofumpt/go.mod b/tools/gofumpt/go.mod new file mode 100644 index 000000000..54c308054 --- /dev/null +++ b/tools/gofumpt/go.mod @@ -0,0 +1,13 @@ +module _ + +go 1.18 + +require mvdan.cc/gofumpt v0.3.1 + +require ( + github.com/google/go-cmp v0.5.7 // indirect + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect + golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8 // indirect + golang.org/x/tools v0.1.10 // indirect +) diff --git a/tools/gofumpt/go.sum b/tools/gofumpt/go.sum new file mode 100644 index 000000000..044448ade --- /dev/null +++ b/tools/gofumpt/go.sum @@ -0,0 +1,20 @@ +github.com/frankban/quicktest v1.14.2 h1:SPb1KFFmM+ybpEjPUhCCkZOM5xlovT5UbrMvWnXyBns= +github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8 h1:OH54vjqzRWmbJ62fjuhxy7AxFFgoHN0/DPc/UrL8cAs= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= +mvdan.cc/gofumpt v0.3.1 h1:avhhrOmv0IuvQVK7fvwV91oFSGAk5/6Po8GXTzICeu8= +mvdan.cc/gofumpt v0.3.1/go.mod h1:w3ymliuxvzVx8DAutBnVyDqYb1Niy/yCJt/lk821YCE= diff --git a/tools/gofumpt/main.go b/tools/gofumpt/main.go new file mode 100644 index 000000000..471fd0a86 --- /dev/null +++ b/tools/gofumpt/main.go @@ -0,0 +1,7 @@ +//go:build tools + +package tools + +import ( + _ "mvdan.cc/gofumpt" +)