Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

linter configuration similar to FerretDB #27

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
243 changes: 237 additions & 6 deletions .golangci.yml
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

May parts for that configuration reference FerretDB repo imports, packages, etc. They don't exist in this repository. The configuration should be updated.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rkarthick15 any news? Anything we could help you with?

Original file line number Diff line number Diff line change
@@ -1,24 +1,255 @@
---
# Linters that should pass for all FerretDB and tools code.

run:
timeout: 3m

# https://golangci-lint.run/usage/linters/
linters-settings:
# asciicheck
depguard:
rules:
old-packages:
files:
- $all
deny:
- pkg: golang.org/x/net/context
desc: use `context` package instead
- pkg: golang.org/x/exp/slices
desc: use `slices` package instead
- pkg: maps
desc: use `golang.org/x/exp/maps` package instead
- pkg: github.com/jackc/pgconn
desc: use `github.com/jackc/pgx/v5/pgconn` package instead
- pkg: github.com/jackc/pgproto3
desc: use `github.com/jackc/pgx/v5/pgproto3` package instead
- pkg: github.com/jackc/pgtype
desc: use `github.com/jackc/pgx/v5/pgtype` package instead
- pkg: github.com/jackc/pgx$
desc: use `github.com/jackc/pgx/v5` package instead
- pkg: github.com/jackc/pgx/v4
desc: use `github.com/jackc/pgx/v5` package instead

wire-in-tools:
files:
- "**/tools/**/*.go"
deny:
- pkg: github.com/FerretDB/FerretDB/internal/
desc: tools should not import FerretDB code

types:
files:
- "**/internal/util/logging/*.go"
deny:
- pkg: github.com/FerretDB/FerretDB/internal/types
sjson:
files:
- $all
- "!**/internal/backends/sqlite/*.go"
- "!**/internal/backends/postgresql/*.go"
- "!**/internal/backends/postgresql/metadata/*.go"
- "!**/internal/backends/mysql/*.go"
- "!**/internal/backends/mysql/metadata/*.go"
- "!**/internal/backends/hana/*.go"
deny:
- pkg: github.com/FerretDB/FerretDB/internal/handler/sjson
common:
files:
- "**/internal/backends/**.go"
- "**/internal/clientconn/cursor/*.go"
deny:
- pkg: github.com/FerretDB/FerretDB/internal/handler/common
handlererrors:
files:
- $all
- "!**/internal/clientconn/*.go"
- "!**/internal/handler/**.go"
deny:
- pkg: github.com/FerretDB/FerretDB/internal/handler/handlererrors
backends:
files:
- "**/internal/clientconn/cursor/*.go"
deny:
- pkg: github.com/FerretDB/FerretDB/internal/backends
exhaustive:
default-signifies-exhaustive: false
forbidigo:
forbid:
- p: ^\Qpgxpool.Pool.AcquireFunc\E$
pkg: ^\Qgithub.com/jackc/pgx/v5/pgxpool\E$
msg: Use `Acquire` with `defer Release()` instead.

# integration tests use a different configuration file
- p: ^\Qbson.E\E$
pkg: ^\Qgo.mongodb.org/mongo-driver/bson\E$
msg: Use `*types.Document` or `*types.Array` instead.
- p: ^\Qprimitive.E\E$
pkg: ^\Qgo.mongodb.org/mongo-driver/bson/primitive\E$
msg: Use `*types.Document` or `*types.Array` instead.
- p: ^\Qbson.D\E$
pkg: ^\Qgo.mongodb.org/mongo-driver/bson\E$
msg: Use `*types.Document` instead.
- p: ^\Qprimitive.D\E$
pkg: ^\Qgo.mongodb.org/mongo-driver/bson/primitive\E$
msg: Use `*types.Document` instead.
- p: ^\Qbson.M\E$
pkg: ^\Qgo.mongodb.org/mongo-driver/bson\E$
msg: Use `*types.Document` instead.
- p: ^\Qprimitive.M\E$
pkg: ^\Qgo.mongodb.org/mongo-driver/bson/primitive\E$
msg: Use `*types.Document` instead.
- p: ^\Qbson.A\E$
pkg: ^\Qgo.mongodb.org/mongo-driver/bson\E$
msg: Use `*types.Array` instead.
- p: ^\Qprimitive.A\E$
pkg: ^\Qgo.mongodb.org/mongo-driver/bson/primitive\E$
msg: Use `*types.Array` instead.
exclude-godoc-examples: true
analyze-types: true
gci:
sections:
- standard
- default
- prefix(github.com/FerretDB/FerretDB)
goconst:
min-occurrences: 5
ignore-tests: true
godot:
scope: toplevel
exclude:
- check interfaces
capital: true
godox:
keywords:
- BUG
- FIXME
- HACK
goheader:
# Please do not update it, including bumping a year.
template: |-
Copyright 2021 FerretDB Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
goimports:
local-prefixes: github.com/FerretDB/FerretDB
gomodguard:
blocked:
modules: []
gosimple:
checks: ["all"]
govet:
enable-all: true
settings:
shadow:
strict: true
disable:
- fieldalignment
- nilness
- shadow
importas:
no-unaliased: false
no-extra-aliases: true
alias:
- pkg: github.com/prometheus/client_model/go
alias: dto
- pkg: modernc.org/sqlite
alias: sqlite3
- pkg: modernc.org/sqlite/lib
alias: sqlite3lib
- pkg: go.opentelemetry.io/otel/attribute
alias: otelattribute
- pkg: go.opentelemetry.io/otel/codes
alias: otelcodes
- pkg: go.opentelemetry.io/otel/trace
alias: oteltrace
- pkg: go.opentelemetry.io/otel/sdk/resource
alias: otelsdkresource
- pkg: go.opentelemetry.io/otel/sdk/trace
alias: otelsdktrace
- pkg: go.opentelemetry.io/otel/semconv/v1.21.0
alias: otelsemconv
- pkg: github.com/FerretDB/FerretDB/internal/backends/mysql/metadata/pool
alias: mysqlpool
# ineffassign
lll:
line-length: 130
tab-width: 4
misspell:
ignore-words:
- guiness # present in the test dataset
extra-words: # https://go.dev/wiki/Spelling, https://github.com/golangci/misspell/issues/11
- typo: "iff"
correction: "if"
- typo: "cancelation"
correction: "cancellation"
nolintlint:
allow-unused: false
allow-no-explanation: []
require-explanation: true
require-specific: true
revive:
ignore-generated-header: true
severity: error
rules: []
sloglint:
no-mixed-args: true
kv-only: false
attr-only: true
no-global: "all"
context: "scope"
static-msg: false # TODO https://github.com/FerretDB/FerretDB/issues/3421
no-raw-keys: false # TODO https://github.com/FerretDB/FerretDB/issues/3421
key-naming-case: snake
args-on-sep-lines: false
staticcheck:
checks:
- all
- -SA1019 # ignore deprecation errors in existing code; new code is checked by the other configuration
# unused
whitespace:
multi-if: false
multi-func: false

linters:
disable-all: true
enable:
# TODO https://github.com/FerretDB/wire/issues/4
- asciicheck
- depguard
- exhaustive
- forbidigo
- gci
- gochecksumtype
- goconst
- godot
- godox
- goheader
- goimports
- gomodguard
- gosimple
- govet
- importas
- ineffassign
- lll
- misspell
- nolintlint
- revive
- sloglint
- staticcheck
- unused
- whitespace

issues:
max-issues-per-linter: 0
max-same-issues: 0

exclude-use-default: false
exclude-rules: []
exclude-rules:
# we don't want to introduce that constant
- linters: [goconst]
text: "^string `_id` has \\d+ occurrences, make it a constant"
4 changes: 2 additions & 2 deletions internal/bsonproto/binary.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ const (
// BinaryGeneric represents a BSON Binary generic subtype.
BinaryGeneric = BinarySubtype(0x00) // generic

// BinaryFunction represents a BSON Binary function subtype
// BinaryFunction represents a BSON Binary function subtype.
BinaryFunction = BinarySubtype(0x01) // function

// BinaryGenericOld represents a BSON Binary generic-old subtype.
Expand Down Expand Up @@ -63,7 +63,7 @@ func SizeBinary(v Binary) int {

// EncodeBinary encodes [Binary] value v into b.
//
// b must be at least len(v.B)+5 ([SizeBinary]) bytes long; otherwise, EncodeBinary will panic.
// "b" must be at least len(v.B)+5 ([SizeBinary]) bytes long; otherwise, EncodeBinary will panic.
// Only b[0:len(v.B)+5] bytes are modified.
func EncodeBinary(b []byte, v Binary) {
i := len(v.B)
Expand Down
2 changes: 1 addition & 1 deletion internal/bsonproto/bool.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ const SizeBool = 1

// EncodeBool encodes bool value v into b.
//
// b must be at least 1 ([SizeBool]) byte long; otherwise, EncodeBool will panic.
// "b" must be at least 1 ([SizeBool]) byte long; otherwise, EncodeBool will panic.
// Only b[0] is modified.
func EncodeBool(b []byte, v bool) {
if v {
Expand Down
4 changes: 2 additions & 2 deletions internal/bsonproto/bsonproto.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,15 +69,15 @@ func SizeAny(v any) int {

// Encode encodes value v into b.
//
// b must be at least Size(v) bytes long; otherwise, Encode will panic.
// "b" must be at least Size(v) bytes long; otherwise, Encode will panic.
// Only b[0:Size(v)] bytes are modified.
func Encode[T ScalarType](b []byte, v T) {
EncodeAny(b, v)
}

// EncodeAny encodes value v into b.
//
// b must be at least Size(v) bytes long; otherwise, EncodeAny will panic.
// "b" must be at least Size(v) bytes long; otherwise, EncodeAny will panic.
// Only b[0:Size(v)] bytes are modified.
//
// It panics if v is not a [ScalarType] (including CString).
Expand Down
2 changes: 1 addition & 1 deletion internal/bsonproto/cstring.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func SizeCString(v string) int {

// EncodeCString encodes cstring value v into b.
//
// b must be at least len(v)+1 ([SizeCString]) bytes long; otherwise, EncodeString will panic.
// "b" must be at least len(v)+1 ([SizeCString]) bytes long; otherwise, EncodeString will panic.
// Only b[0:len(v)+1] bytes are modified.
func EncodeCString(b []byte, v string) {
// ensure b length early
Expand Down
7 changes: 5 additions & 2 deletions internal/bsonproto/decimal128.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ const SizeDecimal128 = 16

// EncodeDecimal128 encodes [Decimal128] value v into b.
//
// b must be at least 16 ([SizeDecimal128]) bytes long; otherwise, EncodeDecimal128 will panic.
// "b" must be at least 16 ([SizeDecimal128]) bytes long; otherwise, EncodeDecimal128 will panic.
// Only b[0:16] bytes are modified.
func EncodeDecimal128(b []byte, v Decimal128) {
binary.LittleEndian.PutUint64(b, uint64(v.L))
Expand All @@ -44,7 +44,10 @@ func DecodeDecimal128(b []byte) (Decimal128, error) {
var res Decimal128

if len(b) < SizeDecimal128 {
return res, fmt.Errorf("DecodeDecimal128: expected at least %d bytes, got %d: %w", SizeDecimal128, len(b), ErrDecodeShortInput)
return res, fmt.Errorf(
"DecodeDecimal128: expected at least %d bytes, got %d: %w",
SizeDecimal128, len(b), ErrDecodeShortInput,
)
}

res.L = binary.LittleEndian.Uint64(b[:8])
Expand Down
2 changes: 1 addition & 1 deletion internal/bsonproto/float64.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const SizeFloat64 = 8

// EncodeFloat64 encodes float64 value v into b.
//
// b must be at least 8 ([SizeFloat64]) bytes long; otherwise, EncodeFloat64 will panic.
// "b" must be at least 8 ([SizeFloat64]) bytes long; otherwise, EncodeFloat64 will panic.
// Only b[0:8] bytes are modified.
//
// Infinities, NaNs, negative zeros are preserved.
Expand Down
2 changes: 1 addition & 1 deletion internal/bsonproto/int32.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ const SizeInt32 = 4

// EncodeInt32 encodes int32 value v into b.
//
// b must be at least 4 ([SizeInt32]) bytes long; otherwise, EncodeInt32 will panic.
// "b" must be at least 4 ([SizeInt32]) bytes long; otherwise, EncodeInt32 will panic.
// Only b[0:4] bytes are modified.
func EncodeInt32(b []byte, v int32) {
binary.LittleEndian.PutUint32(b, uint32(v))
Expand Down
2 changes: 1 addition & 1 deletion internal/bsonproto/int64.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ const SizeInt64 = 8

// EncodeInt64 encodes int64 value v into b.
//
// b must be at least 8 ([SizeInt64]) bytes long; otherwise, EncodeInt64 will panic.
// "b" must be at least 8 ([SizeInt64]) bytes long; otherwise, EncodeInt64 will panic.
// Only b[0:8] bytes are modified.
func EncodeInt64(b []byte, v int64) {
binary.LittleEndian.PutUint64(b, uint64(v))
Expand Down
7 changes: 5 additions & 2 deletions internal/bsonproto/objectid.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ const SizeObjectID = 12

// EncodeObjectID encodes [ObjectID] value v into b.
//
// b must be at least 12 ([SizeObjectID]) bytes long; otherwise, EncodeObjectID will panic.
// "b" must be at least 12 ([SizeObjectID]) bytes long; otherwise, EncodeObjectID will panic.
// Only b[0:12] bytes are modified.
func EncodeObjectID(b []byte, v ObjectID) {
_ = b[11]
Expand All @@ -40,7 +40,10 @@ func DecodeObjectID(b []byte) (ObjectID, error) {
var res ObjectID

if len(b) < SizeObjectID {
return res, fmt.Errorf("DecodeObjectID: expected at least %d bytes, got %d: %w", SizeObjectID, len(b), ErrDecodeShortInput)
return res, fmt.Errorf(
"DecodeObjectID: expected at least %d bytes, got %d: %w",
SizeObjectID, len(b), ErrDecodeShortInput,
)
}

copy(res[:], b)
Expand Down
2 changes: 1 addition & 1 deletion internal/bsonproto/regex.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func SizeRegex(v Regex) int {

// EncodeRegex encodes [Regex] value v into b.
//
// b must be at least len(v.Pattern)+len(v.Options)+2 ([SizeRegex]) bytes long; otherwise, EncodeRegex will panic.
// "b" must be at least len(v.Pattern)+len(v.Options)+2 ([SizeRegex]) bytes long; otherwise, EncodeRegex will panic.
// Only b[0:len(v.Pattern)+len(v.Options)+2] bytes are modified.
func EncodeRegex(b []byte, v Regex) {
// ensure b length early
Expand Down
Loading