From b35976ce7be7205d088abafa53f20216654ff934 Mon Sep 17 00:00:00 2001 From: andrey Date: Tue, 23 Dec 2025 18:59:33 +0300 Subject: [PATCH 1/5] add lint action --- .gitea/workflows/lint.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .gitea/workflows/lint.yml diff --git a/.gitea/workflows/lint.yml b/.gitea/workflows/lint.yml new file mode 100644 index 0000000..25f3928 --- /dev/null +++ b/.gitea/workflows/lint.yml @@ -0,0 +1,23 @@ +name: Go Lint + +on: [push, pull_request] + +jobs: + lint: + runs-on: ubuntu-latest # Use a Gitea Actions runner label + steps: + - name: Check out repository code + uses: actions/checkout@v4 # Action to clone the repo + + - name: Set up Go + uses: actions/setup-go@v5 # Action to install a specific Go version + with: + go-version: '1.22' # Specify your required Go version + + - name: Run golangci-lint + uses: golangci/golangci-lint-action@v3 # Use the golangci-lint action + with: + version: v1.54.0 # Specify the linter version + # Optional: additional arguments + args: --verbose + -- 2.49.1 From 1637fb511936e17e05e4ae393c6a821551e6ab75 Mon Sep 17 00:00:00 2001 From: andrey Date: Tue, 23 Dec 2025 20:59:06 +0300 Subject: [PATCH 2/5] update lint --- .gitea/workflows/{lint.yml => goaction.yml} | 9 +- .golangci.yml | 125 +++++++------- README.md | 2 +- bench_test.go | 8 +- entry/caller.go | 1 + entry/entry.go | 10 +- entry/pool.go | 2 +- field.go | 2 +- field/encoder.go | 118 ++++++------- field/encoder_json_test.go | 1 + field/field.go | 10 +- field/value.go | 95 +++++------ global.go | 68 ++++---- go.mod | 2 +- level/level_test.go | 4 +- logger.go | 177 ++++++++++---------- logger_example_test.go | 13 +- middleware.go | 5 +- source.go | 6 +- writter.go | 11 +- 20 files changed, 345 insertions(+), 324 deletions(-) rename .gitea/workflows/{lint.yml => goaction.yml} (72%) diff --git a/.gitea/workflows/lint.yml b/.gitea/workflows/goaction.yml similarity index 72% rename from .gitea/workflows/lint.yml rename to .gitea/workflows/goaction.yml index 25f3928..5e943af 100644 --- a/.gitea/workflows/lint.yml +++ b/.gitea/workflows/goaction.yml @@ -1,4 +1,4 @@ -name: Go Lint +name: Go Action on: [push, pull_request] @@ -12,12 +12,15 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 # Action to install a specific Go version with: - go-version: '1.22' # Specify your required Go version + go-version: '1.25.5' # Specify your required Go version - name: Run golangci-lint uses: golangci/golangci-lint-action@v3 # Use the golangci-lint action with: - version: v1.54.0 # Specify the linter version + version: v2.7.2 # Specify the linter version # Optional: additional arguments args: --verbose + - name: Test with the Go CLI + run: go test ./... + diff --git a/.golangci.yml b/.golangci.yml index e2ed2a9..cb9cd7e 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,9 +1,24 @@ -run: - timeout: 5m - -linters-settings: +version: "2" +linters: + default: all + disable: + - wsl + - depguard + - nolintlint + settings: + funcorder: + constructor: false + recvcheck: + disable-builtin: false + exclusions: + - "*.String" + - "*.UnmarshalText" + - "*.UnmarshalJSON" + - "*.UnmarshalBinary" dupl: threshold: 100 + exhaustive: + default-signifies-exhaustive: true funlen: lines: 100 statements: 50 @@ -12,65 +27,61 @@ linters-settings: min-occurrences: 2 gocyclo: min-complexity: 15 - govet: - check-shadowing: true lll: line-length: 140 - fieldalignment: - suggest-new: true misspell: - locale: US - exhaustive: - default-signifies-exhaustive: true + locale: US + tagliatelle: + case: + rules: + avro: snake + bson: camel + json: snake + xml: camel + yaml: camel + use-field-name: true varnamelen: min-name-length: 2 ignore-names: - err - - n + - "n" - i - w - tagliatelle: - case: - use-field-name: true - rules: - json: snake - yaml: camel - xml: camel - bson: camel - avro: snake - -linters: - enable-all: true - disable: - # deprecated - - interfacer - - structcheck - - varcheck - - golint - - deadcode - - scopelint - - exhaustivestruct - - ifshort - - nosnakecase - - maligned - - - depguard # need configure - - nolintlint # use with space - -issues: - # Excluding configuration per-path, per-linter, per-text and per-source - exclude-rules: - - path: _test\.go - linters: - - gomnd - - ireturn - - exhaustruct - - gochecknoglobals - - path: _example_test\.go - linters: - - lll - - goerr113 - - path: example/* - linters: - - gomnd - - lll + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + rules: + - linters: + - exhaustruct + - gochecknoglobals + - ireturn + - mnd + path: _test\.go + - linters: + - err113 + - lll + path: _example_test\.go + - linters: + - lll + - mnd + path: example/* + paths: + - third_party$ + - builtin$ + - examples$ +formatters: + enable: + - gci + - gofmt + - gofumpt + - goimports + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ diff --git a/README.md b/README.md index c27dec8..d930e70 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # log -[![Build Status](https://drone.gitoa.ru/api/badges/go-4devs/log/status.svg)](https://drone.gitoa.ru/go-4devs/log) +![Build Status](https://gitoa.ru/go-4devs/log/actions/workflows/goaction/badge.svg) [![Go Report Card](https://goreportcard.com/badge/gitoa.ru/go-4devs/log)](https://goreportcard.com/report/gitoa.ru/go-4devs/log) [![GoDoc](https://godoc.org/gitoa.ru/go-4devs/log?status.svg)](http://godoc.org/gitoa.ru/go-4devs/log) diff --git a/bench_test.go b/bench_test.go index df0fad5..4c51447 100644 --- a/bench_test.go +++ b/bench_test.go @@ -69,10 +69,10 @@ func getMessage(iter int) string { return _messages[iter%1000] } -func fakeFmtArgs() []interface{} { +func fakeFmtArgs() []any { // Need to keep this a function instead of a package-global var so that we // pay the cast-to-interface{} penalty on each call. - return []interface{}{ + return []any{ _tenInts[0], _tenInts, _tenStrings[0], @@ -101,8 +101,8 @@ func fakeFields() []field.Field { } } -func fakeSugarFields() []interface{} { - return []interface{}{ +func fakeSugarFields() []any { + return []any{ "int", _tenInts[0], "ints", _tenInts, "string", _tenStrings[0], diff --git a/entry/caller.go b/entry/caller.go index deaba93..82fc759 100644 --- a/entry/caller.go +++ b/entry/caller.go @@ -8,6 +8,7 @@ import ( func Caller(depth int, full bool) string { const offset = 3 + _, file, line, has := runtime.Caller(depth + offset) if !has { diff --git a/entry/entry.go b/entry/entry.go index fde6b9b..ef4f9b0 100644 --- a/entry/entry.go +++ b/entry/entry.go @@ -32,7 +32,7 @@ func WithMessage(msg string) Option { } } -func WithMessagef(format string, args ...interface{}) Option { +func WithMessagef(format string, args ...any) Option { return func(e *Entry) { e.format = format e.args = args @@ -50,7 +50,7 @@ func New(opts ...Option) *Entry { fields: make(field.Fields, 0, defaultCap+1), level: level.Debug, format: "", - args: make([]interface{}, 0, defaultCap+1), + args: make([]any, 0, defaultCap+1), } for _, opt := range opts { @@ -63,7 +63,7 @@ func New(opts ...Option) *Entry { // Entry slice field. type Entry struct { format string - args []interface{} + args []any level level.Level fields field.Fields } @@ -133,7 +133,7 @@ func (e *Entry) SetMessage(msg string) *Entry { return e } -func (e *Entry) SetMessagef(format string, args ...interface{}) *Entry { +func (e *Entry) SetMessagef(format string, args ...any) *Entry { if e == nil { return New().SetMessagef(format, args...) } @@ -154,7 +154,7 @@ func (e *Entry) Add(fields ...field.Field) *Entry { return e } -func (e *Entry) AddAny(key string, value interface{}) *Entry { +func (e *Entry) AddAny(key string, value any) *Entry { return e.Add(field.Any(key, value)) } diff --git a/entry/pool.go b/entry/pool.go index e98abc4..d2bf5aa 100644 --- a/entry/pool.go +++ b/entry/pool.go @@ -4,7 +4,7 @@ import "sync" //nolint:gochecknoglobals var pool = sync.Pool{ - New: func() interface{} { + New: func() any { return New() }, } diff --git a/field.go b/field.go index 4ca6f70..e8bc68c 100644 --- a/field.go +++ b/field.go @@ -5,7 +5,7 @@ import ( ) // Field create field. -func Field(key string, value interface{}) field.Field { +func Field(key string, value any) field.Field { return field.Any(key, value) } diff --git a/field/encoder.go b/field/encoder.go index f2fc9cb..ae1a8db 100644 --- a/field/encoder.go +++ b/field/encoder.go @@ -1,4 +1,3 @@ -//nolint:gomnd package field import ( @@ -104,46 +103,6 @@ func (b BaseEncoder) AppendDelimiter(dst []byte, deli byte) []byte { return append(dst, deli) } -//nolint:gocyclo,cyclop -func (b BaseEncoder) appendValue(dst []byte, val Value, prefix string, deli byte) []byte { - switch val.Kind { - case KindGroup: - return b.appendGroup(dst, val.AsGroup(), prefix) - case KindClosure: - return b.appendValue(dst, AnyValue(val.Resolve()), prefix, deli) - case KindArray: - return b.AppendArray(b.AppendDelimiter(dst, deli), val.AsArray()) - case KindNil: - return b.AppendNull(b.AppendDelimiter(dst, deli)) - case KindBool: - return b.AppendBool(b.AppendDelimiter(dst, deli), val.AsBool()) - case KindBinary: - return b.AppendBytes(b.AppendDelimiter(dst, deli), val.AsBinary()) - case KindComplex128: - return b.AppendComplex(b.AppendDelimiter(dst, deli), val.AsComplex128()) - case KindInt64: - return b.AppendInt(b.AppendDelimiter(dst, deli), val.AsInt64()) - case KindFloat32: - return b.AppendFloat(b.AppendDelimiter(dst, deli), float64(val.AsFloat32()), 32) - case KindFloat64: - return b.AppendFloat(b.AppendDelimiter(dst, deli), val.AsFloat64(), 64) - case KindUint64: - return b.AppendUint(b.AppendDelimiter(dst, deli), val.AsUint64()) - case KindError: - return b.AppendString(b.AppendDelimiter(dst, deli), val.AsError().Error()) - case KindString: - return b.AppendString(b.AppendDelimiter(dst, deli), val.AsString()) - case KindDuration: - return b.AppendDuration(b.AppendDelimiter(dst, deli), val.AsDuration()) - case KindTime: - return b.AppendTime(b.AppendDelimiter(dst, deli), val.AsTime()) - case KindAny: - return b.DefaultValue(b.AppendDelimiter(dst, deli), b, val) - } - - return b.DefaultValue(b.AppendDelimiter(dst, deli), b, val) -} - func (b BaseEncoder) AppendDuration(dst []byte, d time.Duration) []byte { return b.AppendString(dst, d.String()) } @@ -204,12 +163,6 @@ func (b BaseEncoder) AppendField(dst []byte, field Field) []byte { return b.appendField(dst, field, prefix, b.delimeter) } -func (b BaseEncoder) appendField(dst []byte, field Field, prefix string, deli byte) []byte { - dst = b.AppendKey(dst, field.Key, prefix) - - return b.appendValue(dst, field.Value, field.Key+".", deli) -} - func (b BaseEncoder) AppendKey(dst []byte, key string, prefix string) []byte { if prefix != "" { dst = append(dst, prefix...) @@ -218,6 +171,7 @@ func (b BaseEncoder) AppendKey(dst []byte, key string, prefix string) []byte { return b.AppendString(dst, key) } +//nolint:mnd func (b BaseEncoder) AppendComplex(dst []byte, c complex128) []byte { cmplx := strconv.FormatComplex(c, 'g', -1, 128) @@ -228,6 +182,7 @@ func (b BaseEncoder) AppendFloat(dst []byte, f float64, bitSize int) []byte { return strconv.AppendFloat(dst, f, 'g', -1, bitSize) } +//nolint:mnd func (b BaseEncoder) AppendUint(dst []byte, u uint64) []byte { return strconv.AppendUint(dst, u, 10) } @@ -236,6 +191,7 @@ func (b BaseEncoder) AppendNull(dst []byte) []byte { return append(dst, b.nullValue...) } +//nolint:mnd func (b BaseEncoder) AppendInt(dst []byte, val int64) []byte { return strconv.AppendInt(dst, val, 10) } @@ -251,17 +207,6 @@ func (b BaseEncoder) AppendGroup(dst []byte, fields []Field) []byte { return append(dst, b.group.end) } -func (b BaseEncoder) appendGroup(dst []byte, fields []Field, prefix string) []byte { - if len(fields) > 0 { - dst = b.appendField(dst, fields[0], ".", b.delimeter) - for _, field := range fields[1:] { - dst = b.appendField(append(dst, b.group.deli), field, prefix, b.delimeter) - } - } - - return dst -} - func (b BaseEncoder) AppendArray(dst []byte, in []Value) []byte { dst = append(dst, b.array.start) if len(in) > 0 { @@ -280,3 +225,60 @@ func (b BaseEncoder) AppendBytes(dst, in []byte) []byte { return append(dst, '"') } + +func (b BaseEncoder) appendGroup(dst []byte, fields []Field, prefix string) []byte { + if len(fields) > 0 { + dst = b.appendField(dst, fields[0], ".", b.delimeter) + for _, field := range fields[1:] { + dst = b.appendField(append(dst, b.group.deli), field, prefix, b.delimeter) + } + } + + return dst +} + +func (b BaseEncoder) appendField(dst []byte, field Field, prefix string, deli byte) []byte { + dst = b.AppendKey(dst, field.Key, prefix) + + return b.appendValue(dst, field.Value, field.Key+".", deli) +} + +//nolint:mnd,gocyclo,cyclop +func (b BaseEncoder) appendValue(dst []byte, val Value, prefix string, deli byte) []byte { + switch val.Kind { + case KindGroup: + return b.appendGroup(dst, val.AsGroup(), prefix) + case KindClosure: + return b.appendValue(dst, AnyValue(val.Resolve()), prefix, deli) + case KindArray: + return b.AppendArray(b.AppendDelimiter(dst, deli), val.AsArray()) + case KindNil: + return b.AppendNull(b.AppendDelimiter(dst, deli)) + case KindBool: + return b.AppendBool(b.AppendDelimiter(dst, deli), val.AsBool()) + case KindBinary: + return b.AppendBytes(b.AppendDelimiter(dst, deli), val.AsBinary()) + case KindComplex128: + return b.AppendComplex(b.AppendDelimiter(dst, deli), val.AsComplex128()) + case KindInt64: + return b.AppendInt(b.AppendDelimiter(dst, deli), val.AsInt64()) + case KindFloat32: + return b.AppendFloat(b.AppendDelimiter(dst, deli), float64(val.AsFloat32()), 32) + case KindFloat64: + return b.AppendFloat(b.AppendDelimiter(dst, deli), val.AsFloat64(), 64) + case KindUint64: + return b.AppendUint(b.AppendDelimiter(dst, deli), val.AsUint64()) + case KindError: + return b.AppendString(b.AppendDelimiter(dst, deli), val.AsError().Error()) + case KindString: + return b.AppendString(b.AppendDelimiter(dst, deli), val.AsString()) + case KindDuration: + return b.AppendDuration(b.AppendDelimiter(dst, deli), val.AsDuration()) + case KindTime: + return b.AppendTime(b.AppendDelimiter(dst, deli), val.AsTime()) + case KindAny: + return b.DefaultValue(b.AppendDelimiter(dst, deli), b, val) + } + + return b.DefaultValue(b.AppendDelimiter(dst, deli), b, val) +} diff --git a/field/encoder_json_test.go b/field/encoder_json_test.go index f910f91..2370c72 100644 --- a/field/encoder_json_test.go +++ b/field/encoder_json_test.go @@ -15,6 +15,7 @@ func TestEncoderJSONAppendField_string(t *testing.T) { encode := field.NewEncoderJSON() buf := buffer.New() + defer func() { buf.Free() }() diff --git a/field/field.go b/field/field.go index ac32ce9..51a56f0 100644 --- a/field/field.go +++ b/field/field.go @@ -2,6 +2,7 @@ package field import ( "fmt" + "slices" "time" ) @@ -502,13 +503,6 @@ func (f Field) String() string { return fmt.Sprintf("%s=%+v", f.Key, f.Value) } -// String implent stringer. func (f Field) IsKey(keys ...string) bool { - for _, key := range keys { - if key == f.Key { - return true - } - } - - return false + return slices.Contains(keys, f.Key) } diff --git a/field/value.go b/field/value.go index 6ff09f8..0cd3801 100644 --- a/field/value.go +++ b/field/value.go @@ -1,4 +1,4 @@ -// nolint: exhaustruct +//nolint:exhaustruct package field import ( @@ -27,7 +27,7 @@ func StringpValue(value *string) Value { return StringValue(*value) } -// StringpValue returns a new Value for a string. +// StringsValue returns a new Value for a string. func StringsValue(value []string) Value { return Value{ Kind: KindArray, @@ -115,7 +115,7 @@ func Uint8sValue(values []uint8) Value { } } -// Uint64sValue returns a Value for a []uint64. +// Uint64pValue returns a Value for a []uint64. func Uint64pValue(v *uint64) Value { if v == nil { return NilValue() @@ -145,7 +145,7 @@ func Int64sValue(value []int64) Value { } } -// Int64sValue returns a Value for an *int64. +// Int64pValue returns a Value for an *int64. func Int64pValue(value *int64) Value { if value == nil { return NilValue() @@ -159,7 +159,7 @@ func Float64Value(v float64) Value { return Value{num: math.Float64bits(v), Kind: KindFloat64} } -// Float64Value returns a Value for a floating-points number. +// Float64sValue returns a Value for a floating-points number. func Float64sValue(values []float64) Value { return Value{ Kind: KindArray, @@ -175,7 +175,7 @@ func Float64sValue(values []float64) Value { } } -// Float64Value returns a Value for a floating-points number. +// Float64pValue returns a Value for a floating-points number. func Float64pValue(v *float64) Value { if v == nil { return NilValue() @@ -208,7 +208,7 @@ func Complex128Value(v complex128) Value { } } -// Complex128Value returns a Value for a []complex128. +// Complex128sValue returns a Value for a []complex128. func Complex128sValue(values []complex128) Value { return Value{ Kind: KindArray, @@ -224,7 +224,7 @@ func Complex128sValue(values []complex128) Value { } } -// Complex128Value returns a Value for a *complex128. +// Complex128pValue returns a Value for a *complex128. func Complex128pValue(v *complex128) Value { if v == nil { return NilValue() @@ -275,7 +275,7 @@ func DurationValue(v time.Duration) Value { return Value{inum: v.Nanoseconds(), Kind: KindDuration} } -// DurationValue returns a Value for a *time.Duration. +// DurationpValue returns a Value for a *time.Duration. func DurationpValue(v *time.Duration) Value { if v == nil { return NilValue() @@ -284,7 +284,7 @@ func DurationpValue(v *time.Duration) Value { return DurationValue(*v) } -// DurationValue returns a Value for a *time.Duration. +// DurationsValue returns a Value for a *time.Duration. func DurationsValue(values []time.Duration) Value { return Value{ Kind: KindArray, @@ -469,42 +469,7 @@ func (v Value) String() string { return string(v.append(buf)) } -// append appends a text representation of v to dst. -// v is formatted as with fmt.Sprint. -// -//nolint:gomnd,cyclop -func (v Value) append(dst []byte) []byte { - switch v.Kind { - case KindString: - return append(dst, v.AsString()...) - case KindInt64: - return strconv.AppendInt(dst, v.inum, 10) - case KindUint64: - return strconv.AppendUint(dst, v.num, 10) - case KindFloat64: - return strconv.AppendFloat(dst, v.AsFloat64(), 'g', -1, 64) - case KindFloat32: - return strconv.AppendFloat(dst, float64(v.AsFloat32()), 'g', -1, 32) - case KindBool: - return strconv.AppendBool(dst, v.AsBool()) - case KindDuration: - return append(dst, v.AsDuration().String()...) - case KindTime: - return append(dst, v.AsTime().String()...) - case KindError: - return append(dst, v.AsError().Error()...) - case KindGroup: - return fmt.Append(dst, v.AsGroup()) - case KindClosure: - return fmt.Append(dst, v.Resolve()) - case KindAny: - return fmt.Append(dst, v.any) - default: - return fmt.Appendf(dst, "%+v", v.any) - } -} - -// nolint: gocyclo,cyclop +//nolint:gocyclo,cyclop func (v Value) Any() any { switch v.Kind { case KindAny, KindBinary: @@ -542,7 +507,7 @@ func (v Value) Any() any { return v.any } -// nolint: forcetypeassert +//nolint:forcetypeassert func (v Value) AsString() string { if v.Kind != KindString { return "" @@ -567,6 +532,7 @@ func (v Value) AsUint64() uint64 { return v.num } +//nolint:gosec func (v Value) AsFloat32() float32 { return math.Float32frombits(uint32(v.num)) } @@ -649,3 +615,38 @@ func (v Value) AsArray() Values { return nil } } + +// append appends a text representation of v to dst. +// v is formatted as with fmt.Sprint. +// +//nolint:mnd,cyclop +func (v Value) append(dst []byte) []byte { + switch v.Kind { + case KindString: + return append(dst, v.AsString()...) + case KindInt64: + return strconv.AppendInt(dst, v.inum, 10) + case KindUint64: + return strconv.AppendUint(dst, v.num, 10) + case KindFloat64: + return strconv.AppendFloat(dst, v.AsFloat64(), 'g', -1, 64) + case KindFloat32: + return strconv.AppendFloat(dst, float64(v.AsFloat32()), 'g', -1, 32) + case KindBool: + return strconv.AppendBool(dst, v.AsBool()) + case KindDuration: + return append(dst, v.AsDuration().String()...) + case KindTime: + return append(dst, v.AsTime().String()...) + case KindError: + return append(dst, v.AsError().Error()...) + case KindGroup: + return fmt.Append(dst, v.AsGroup()) + case KindClosure: + return fmt.Append(dst, v.Resolve()) + case KindAny: + return fmt.Append(dst, v.any) + default: + return fmt.Appendf(dst, "%+v", v.any) + } +} diff --git a/global.go b/global.go index 97c3270..74681ed 100644 --- a/global.go +++ b/global.go @@ -9,7 +9,7 @@ import ( "gitoa.ru/go-4devs/log/level" ) -//nolint:gochecknoglobals,gomnd +//nolint:gochecknoglobals var global = With(New(), WithTime(KeyTime, time.RFC3339), WithLevel(KeyLevel, level.Debug), @@ -28,112 +28,112 @@ func Log() Logger { } // Emerg log by emergency level. -func Emerg(ctx context.Context, args ...interface{}) { +func Emerg(ctx context.Context, args ...any) { global.Emerg(ctx, args...) } // Alert log by alert level. -func Alert(ctx context.Context, args ...interface{}) { +func Alert(ctx context.Context, args ...any) { global.Alert(ctx, args...) } // Crit log by critical level. -func Crit(ctx context.Context, args ...interface{}) { +func Crit(ctx context.Context, args ...any) { global.Crit(ctx, args...) } // Err log by error level. -func Err(ctx context.Context, args ...interface{}) { +func Err(ctx context.Context, args ...any) { global.Err(ctx, args...) } // Warn logs by warning level. -func Warn(ctx context.Context, args ...interface{}) { +func Warn(ctx context.Context, args ...any) { global.Warn(ctx, args...) } // Notice log by notice level. -func Notice(ctx context.Context, args ...interface{}) { +func Notice(ctx context.Context, args ...any) { global.Notice(ctx, args...) } // Info log by info level. -func Info(ctx context.Context, args ...interface{}) { +func Info(ctx context.Context, args ...any) { global.Info(ctx, args...) } // Debug log by debug level. -func Debug(ctx context.Context, args ...interface{}) { +func Debug(ctx context.Context, args ...any) { global.Debug(ctx, args...) } // Print log by info level and arguments. -func Print(args ...interface{}) { +func Print(args ...any) { global.Print(args...) } // Fatal log by alert level and arguments. -func Fatal(args ...interface{}) { +func Fatal(args ...any) { global.Fatal(args...) } // Panic log by emergency level and arguments. -func Panic(args ...interface{}) { +func Panic(args ...any) { global.Panic(args...) } // Println log by info level and arguments. -func Println(args ...interface{}) { +func Println(args ...any) { global.Println(args...) } // Fatalln log by alert level and arguments. -func Fatalln(args ...interface{}) { +func Fatalln(args ...any) { global.Fatalln(args...) } // Panicln log by emergency level and arguments. -func Panicln(args ...interface{}) { +func Panicln(args ...any) { global.Panicln(args...) } // EmergKVs sugared log by emergency level and key-values. -func EmergKVs(ctx context.Context, msg string, args ...interface{}) { +func EmergKVs(ctx context.Context, msg string, args ...any) { global.EmergKVs(ctx, msg, args...) } // AlertKVs sugared log by alert level and key-values. -func AlertKVs(ctx context.Context, msg string, args ...interface{}) { +func AlertKVs(ctx context.Context, msg string, args ...any) { global.AlertKVs(ctx, msg, args...) } // CritKVs sugared log by critcal level and key-values. -func CritKVs(ctx context.Context, msg string, args ...interface{}) { +func CritKVs(ctx context.Context, msg string, args ...any) { global.CritKVs(ctx, msg, args...) } // ErrKVs sugared log by error level and key-values. -func ErrKVs(ctx context.Context, msg string, args ...interface{}) { +func ErrKVs(ctx context.Context, msg string, args ...any) { global.ErrKVs(ctx, msg, args...) } // WarnKVs sugared log by warning level and key-values. -func WarnKVs(ctx context.Context, msg string, args ...interface{}) { +func WarnKVs(ctx context.Context, msg string, args ...any) { global.WarnKVs(ctx, msg, args...) } // NoticeKVs sugared log by notice level and key-values. -func NoticeKVs(ctx context.Context, msg string, args ...interface{}) { +func NoticeKVs(ctx context.Context, msg string, args ...any) { global.NoticeKVs(ctx, msg, args...) } // InfoKVs sugared log by info level and key-values. -func InfoKVs(ctx context.Context, msg string, args ...interface{}) { +func InfoKVs(ctx context.Context, msg string, args ...any) { global.InfoKVs(ctx, msg, args...) } // DebugKVs sugared log by debug level and key-values. -func DebugKVs(ctx context.Context, msg string, args ...interface{}) { +func DebugKVs(ctx context.Context, msg string, args ...any) { global.DebugKVs(ctx, msg, args...) } @@ -178,57 +178,57 @@ func DebugKV(ctx context.Context, msg string, args ...field.Field) { } // Emergf log by emergency level by format and arguments. -func Emergf(ctx context.Context, format string, args ...interface{}) { +func Emergf(ctx context.Context, format string, args ...any) { global.Emergf(ctx, format, args...) } // Alertf log by alert level by format and arguments. -func Alertf(ctx context.Context, format string, args ...interface{}) { +func Alertf(ctx context.Context, format string, args ...any) { global.Alertf(ctx, format, args...) } // Critf log by critical level by format and arguments. -func Critf(ctx context.Context, format string, args ...interface{}) { +func Critf(ctx context.Context, format string, args ...any) { global.Critf(ctx, format, args...) } // Errf log by error level by format and arguments. -func Errf(ctx context.Context, format string, args ...interface{}) { +func Errf(ctx context.Context, format string, args ...any) { global.Errf(ctx, format, args...) } // Warnf log by warning level by format and arguments. -func Warnf(ctx context.Context, format string, args ...interface{}) { +func Warnf(ctx context.Context, format string, args ...any) { global.Warnf(ctx, format, args...) } // Noticef log by notice level by format and arguments. -func Noticef(ctx context.Context, format string, args ...interface{}) { +func Noticef(ctx context.Context, format string, args ...any) { global.Noticef(ctx, format, args...) } // Infof log by info level by format and arguments. -func Infof(ctx context.Context, format string, args ...interface{}) { +func Infof(ctx context.Context, format string, args ...any) { global.Noticef(ctx, format, args...) } // Debugf log by debug level by format and arguments. -func Debugf(ctx context.Context, format string, args ...interface{}) { +func Debugf(ctx context.Context, format string, args ...any) { global.Debugf(ctx, format, args...) } // Printf log by info level by format and arguments without context. -func Printf(format string, args ...interface{}) { +func Printf(format string, args ...any) { global.Printf(format, args...) } // Fatalf log by alert level by format and arguments without context. -func Fatalf(format string, args ...interface{}) { +func Fatalf(format string, args ...any) { global.Fatalf(format, args...) } // Panicf log by emergency level and arguments without context. -func Panicf(format string, args ...interface{}) { +func Panicf(format string, args ...any) { global.Panicf(format, args...) } diff --git a/go.mod b/go.mod index 4ea2a71..96e9859 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ module gitoa.ru/go-4devs/log -go 1.20 +go 1.22 diff --git a/level/level_test.go b/level/level_test.go index 5f24c56..de56039 100644 --- a/level/level_test.go +++ b/level/level_test.go @@ -51,7 +51,9 @@ func TestUnmarshalJSON(t *testing.T) { for expect, actuals := range levels { for _, actual := range actuals { var level level.Level - if err := level.UnmarshalJSON([]byte(actual)); err != nil { + + err := level.UnmarshalJSON([]byte(actual)) + if err != nil { t.Errorf("%s got err: %s", level, err) continue diff --git a/logger.go b/logger.go index f6a1236..26895a3 100644 --- a/logger.go +++ b/logger.go @@ -28,172 +28,118 @@ func (l Logger) Write(in []byte) (int, error) { return l.write(context.Background(), level.Info, string(in)) } -func (l Logger) write(ctx context.Context, level level.Level, msg string, fields ...field.Field) (int, error) { - data := entry.Get() - - defer func() { - entry.Put(data) - }() - - return l(ctx, data.SetLevel(level).SetMessage(msg).Add(fields...)) -} - -func (l Logger) writef(ctx context.Context, level level.Level, format string, args ...interface{}) (int, error) { - data := entry.Get() - - defer func() { - entry.Put(data) - }() - - return l(ctx, data.SetLevel(level).SetMessagef(format, args...)) -} - -func (l Logger) kv(_ context.Context, args ...interface{}) field.Fields { - kvEntry := entry.Get() - - defer func() { - entry.Put(kvEntry) - }() - - for i := 0; i < len(args); i++ { - if f, ok := args[i].(field.Field); ok { - kvEntry = kvEntry.Add(f) - - continue - } - - if i == len(args)-1 { - kvEntry = kvEntry.AddAny(badKey, args[i]) - - break - } - - key, val := args[i], args[i+1] - if keyStr, ok := key.(string); ok { - kvEntry = kvEntry.AddAny(keyStr, val) - i++ - - continue - } - - kvEntry = kvEntry.AddAny(badKey, args[i]) - } - - return kvEntry.Fields() -} - // With adds middlewares to logger. func (l Logger) With(mw ...Middleware) Logger { return With(l, mw...) } // Emerg log by emergency level. -func (l Logger) Emerg(ctx context.Context, args ...interface{}) { +func (l Logger) Emerg(ctx context.Context, args ...any) { writeOutput(l.writef(ctx, level.Emergency, "", args...)) } // Alert log by alert level. -func (l Logger) Alert(ctx context.Context, args ...interface{}) { +func (l Logger) Alert(ctx context.Context, args ...any) { writeOutput(l.writef(ctx, level.Alert, "", args...)) } // Crit log by critical level. -func (l Logger) Crit(ctx context.Context, args ...interface{}) { +func (l Logger) Crit(ctx context.Context, args ...any) { writeOutput(l.writef(ctx, level.Critical, "", args...)) } // Err log by error level. -func (l Logger) Err(ctx context.Context, args ...interface{}) { +func (l Logger) Err(ctx context.Context, args ...any) { writeOutput(l.writef(ctx, level.Error, "", args...)) } // Warn log by warning level. -func (l Logger) Warn(ctx context.Context, args ...interface{}) { +func (l Logger) Warn(ctx context.Context, args ...any) { writeOutput(l.writef(ctx, level.Warning, "", args...)) } // Notice log by notice level. -func (l Logger) Notice(ctx context.Context, args ...interface{}) { +func (l Logger) Notice(ctx context.Context, args ...any) { writeOutput(l.writef(ctx, level.Notice, "", args...)) } // Info log by info level. -func (l Logger) Info(ctx context.Context, args ...interface{}) { +func (l Logger) Info(ctx context.Context, args ...any) { writeOutput(l.writef(ctx, level.Info, "", args...)) } // Debug log by debug level. -func (l Logger) Debug(ctx context.Context, args ...interface{}) { +func (l Logger) Debug(ctx context.Context, args ...any) { writeOutput(l.writef(ctx, level.Debug, "", args...)) } // Print log by info level and arguments. -func (l Logger) Print(args ...interface{}) { +func (l Logger) Print(args ...any) { writeOutput(l.writef(context.Background(), level.Info, "", args...)) } // Fatal log by alert level and arguments. -func (l Logger) Fatal(args ...interface{}) { +func (l Logger) Fatal(args ...any) { writeOutput(l.writef(context.Background(), level.Alert, "", args...)) } // Panic log by emergency level and arguments. -func (l Logger) Panic(args ...interface{}) { +func (l Logger) Panic(args ...any) { writeOutput(l.writef(context.Background(), level.Emergency, "", args...)) } // Println log by info level and arguments. -func (l Logger) Println(args ...interface{}) { +func (l Logger) Println(args ...any) { writeOutput(l.write(context.Background(), level.Info, fmt.Sprintln(args...))) } // Fatalln log by alert level and arguments. -func (l Logger) Fatalln(args ...interface{}) { +func (l Logger) Fatalln(args ...any) { writeOutput(l.write(context.Background(), level.Alert, fmt.Sprintln(args...))) } // Panicln log by emergency level and arguments. -func (l Logger) Panicln(args ...interface{}) { +func (l Logger) Panicln(args ...any) { writeOutput(l.write(context.Background(), level.Emergency, fmt.Sprintln(args...))) } // EmergKVs sugared log by emergency level and key-values. -func (l Logger) EmergKVs(ctx context.Context, msg string, args ...interface{}) { +func (l Logger) EmergKVs(ctx context.Context, msg string, args ...any) { writeOutput(l.write(ctx, level.Emergency, msg, l.kv(ctx, args...)...)) } // AlertKVs sugared log by alert level and key-values. -func (l Logger) AlertKVs(ctx context.Context, msg string, args ...interface{}) { +func (l Logger) AlertKVs(ctx context.Context, msg string, args ...any) { writeOutput(l.write(ctx, level.Alert, msg, l.kv(ctx, args...)...)) } // CritKVs sugared log by critcal level and key-values. -func (l Logger) CritKVs(ctx context.Context, msg string, args ...interface{}) { +func (l Logger) CritKVs(ctx context.Context, msg string, args ...any) { writeOutput(l.write(ctx, level.Critical, msg, l.kv(ctx, args...)...)) } // ErrKVs sugared log by error level and key-values. -func (l Logger) ErrKVs(ctx context.Context, msg string, args ...interface{}) { +func (l Logger) ErrKVs(ctx context.Context, msg string, args ...any) { writeOutput(l.write(ctx, level.Error, msg, l.kv(ctx, args...)...)) } // WarnKVs sugared log by warning level and key-values. -func (l Logger) WarnKVs(ctx context.Context, msg string, args ...interface{}) { +func (l Logger) WarnKVs(ctx context.Context, msg string, args ...any) { writeOutput(l.write(ctx, level.Warning, msg, l.kv(ctx, args...)...)) } // NoticeKVs sugared log by notice level and key-values. -func (l Logger) NoticeKVs(ctx context.Context, msg string, args ...interface{}) { +func (l Logger) NoticeKVs(ctx context.Context, msg string, args ...any) { writeOutput(l.write(ctx, level.Notice, msg, l.kv(ctx, args...)...)) } // InfoKVs sugared log by info level and key-values. -func (l Logger) InfoKVs(ctx context.Context, msg string, args ...interface{}) { +func (l Logger) InfoKVs(ctx context.Context, msg string, args ...any) { writeOutput(l.write(ctx, level.Info, msg, l.kv(ctx, args...)...)) } // DebugKVs sugared log by debug level and key-values. -func (l Logger) DebugKVs(ctx context.Context, msg string, args ...interface{}) { +func (l Logger) DebugKVs(ctx context.Context, msg string, args ...any) { writeOutput(l.write(ctx, level.Debug, msg, l.kv(ctx, args...)...)) } @@ -238,57 +184,57 @@ func (l Logger) DebugKV(ctx context.Context, msg string, args ...field.Field) { } // Emergf log by emergency level by format and arguments. -func (l Logger) Emergf(ctx context.Context, format string, args ...interface{}) { +func (l Logger) Emergf(ctx context.Context, format string, args ...any) { writeOutput(l.writef(ctx, level.Emergency, format, args...)) } // Alertf log by alert level by format and arguments. -func (l Logger) Alertf(ctx context.Context, format string, args ...interface{}) { +func (l Logger) Alertf(ctx context.Context, format string, args ...any) { writeOutput(l.writef(ctx, level.Alert, format, args...)) } // Critf log by critical level by format and arguments. -func (l Logger) Critf(ctx context.Context, format string, args ...interface{}) { +func (l Logger) Critf(ctx context.Context, format string, args ...any) { writeOutput(l.writef(ctx, level.Critical, format, args...)) } // Errf log by error level by format and arguments. -func (l Logger) Errf(ctx context.Context, format string, args ...interface{}) { +func (l Logger) Errf(ctx context.Context, format string, args ...any) { writeOutput(l.writef(ctx, level.Error, format, args...)) } // Warnf log by warning level by format and arguments. -func (l Logger) Warnf(ctx context.Context, format string, args ...interface{}) { +func (l Logger) Warnf(ctx context.Context, format string, args ...any) { writeOutput(l.writef(ctx, level.Warning, format, args...)) } // Noticef log by notice level by format and arguments. -func (l Logger) Noticef(ctx context.Context, format string, args ...interface{}) { +func (l Logger) Noticef(ctx context.Context, format string, args ...any) { writeOutput(l.writef(ctx, level.Notice, format, args...)) } // Infof log by info level by format and arguments. -func (l Logger) Infof(ctx context.Context, format string, args ...interface{}) { +func (l Logger) Infof(ctx context.Context, format string, args ...any) { writeOutput(l.writef(ctx, level.Info, format, args...)) } // Debugf log by debug level by format and arguments. -func (l Logger) Debugf(ctx context.Context, format string, args ...interface{}) { +func (l Logger) Debugf(ctx context.Context, format string, args ...any) { writeOutput(l.writef(ctx, level.Debug, format, args...)) } // Printf log by info level by format and arguments without context. -func (l Logger) Printf(format string, args ...interface{}) { +func (l Logger) Printf(format string, args ...any) { writeOutput(l.writef(context.Background(), level.Info, format, args...)) } // Fatalf log by alert level by format and arguments without context. -func (l Logger) Fatalf(format string, args ...interface{}) { +func (l Logger) Fatalf(format string, args ...any) { writeOutput(l.writef(context.Background(), level.Alert, format, args...)) } // Panicf log by emergency level and arguments without context. -func (l Logger) Panicf(format string, args ...interface{}) { +func (l Logger) Panicf(format string, args ...any) { writeOutput(l.writef(context.Background(), level.Emergency, format, args...)) } @@ -301,12 +247,67 @@ func (l Logger) Writer(ctx context.Context, level level.Level, fields ...field.F } } +func (l Logger) kv(_ context.Context, args ...any) field.Fields { + kvEntry := entry.Get() + + defer func() { + entry.Put(kvEntry) + }() + + for i := 0; i < len(args); i++ { + if f, ok := args[i].(field.Field); ok { + kvEntry = kvEntry.Add(f) + + continue + } + + if i == len(args)-1 { + kvEntry = kvEntry.AddAny(badKey, args[i]) + + break + } + + key, val := args[i], args[i+1] + if keyStr, ok := key.(string); ok { + kvEntry = kvEntry.AddAny(keyStr, val) + i++ + + continue + } + + kvEntry = kvEntry.AddAny(badKey, args[i]) + } + + return kvEntry.Fields() +} + +func (l Logger) write(ctx context.Context, level level.Level, msg string, fields ...field.Field) (int, error) { + data := entry.Get() + + defer func() { + entry.Put(data) + }() + + return l(ctx, data.SetLevel(level).SetMessage(msg).Add(fields...)) +} + +func (l Logger) writef(ctx context.Context, level level.Level, format string, args ...any) (int, error) { + data := entry.Get() + + defer func() { + entry.Put(data) + }() + + return l(ctx, data.SetLevel(level).SetMessagef(format, args...)) +} + //nolint:containedctx type writer struct { + Logger + ctx context.Context level level.Level fields []field.Field - Logger } func (w writer) WithLevel(level level.Level) writer { diff --git a/logger_example_test.go b/logger_example_test.go index ffda553..44aebbc 100644 --- a/logger_example_test.go +++ b/logger_example_test.go @@ -213,8 +213,8 @@ func ExampleNew_jsonFormat() { logger.Err(ctx, "same error message") logger.WarnKVs(ctx, "same warn message", "obj", Obj{Name: "obj name"}) // Output: - // {"msg":"same error message","level":"error","go-version":"go1.22.2"} - // {"msg":"same warn message","obj":{"Name":"obj name","IsEnable":false},"level":"warning","go-version":"go1.22.2"} + // {"msg":"same error message","level":"error","go-version":"go1.25.5"} + // {"msg":"same warn message","obj":{"Name":"obj name","IsEnable":false},"level":"warning","go-version":"go1.25.5"} } func ExampleNew_textEncoding() { @@ -227,8 +227,8 @@ func ExampleNew_textEncoding() { logger.InfoKVs(ctx, "same info message", "api-version", 0.1, "obj", Obj{Name: "text value", IsEnable: true}) // Output: - // msg="same error message" level=error go-version=go1.22.2 - // msg="same info message" api-version=0.1 obj={Name:text value IsEnable:true} level=info go-version=go1.22.2 + // msg="same error message" level=error go-version=go1.25.5 + // msg="same info message" api-version=0.1 obj={Name:text value IsEnable:true} level=info go-version=go1.25.5 } type ctxKey string @@ -243,6 +243,7 @@ func levelInfo(ctx context.Context, entry *entry.Entry, handler log.Logger) (int func ExampleWith() { var requestID ctxKey = "requestID" + vctx := context.WithValue(ctx, requestID, "6a5fa048-7181-11ea-bc55-0242ac130003") logger := log.New(log.WithStdout()).With( @@ -252,7 +253,7 @@ func ExampleWith() { log.GoVersion("go"), ) logger.Info(vctx, "same message") - // Output: msg="same message" level=info requestID=6a5fa048-7181-11ea-bc55-0242ac130003 api=0.1.0 go=go1.22.2 + // Output: msg="same message" level=info requestID=6a5fa048-7181-11ea-bc55-0242ac130003 api=0.1.0 go=go1.25.5 } func ExampleLogger_Print() { @@ -263,7 +264,7 @@ func ExampleLogger_Print() { log.GoVersion("go"), ) logger.Print("same message") - // Output: msg="same message" level=info client=http api=0.1.0 go=go1.22.2 + // Output: msg="same message" level=info client=http api=0.1.0 go=go1.25.5 } func ExamplePrint() { diff --git a/middleware.go b/middleware.go index bd16860..3b023cf 100644 --- a/middleware.go +++ b/middleware.go @@ -62,7 +62,7 @@ func WithLevel(key string, lvl level.Level) Middleware { } // KeyValue add field by const key value. -func KeyValue(key string, value interface{}) Middleware { +func KeyValue(key string, value any) Middleware { return func(ctx context.Context, e *entry.Entry, handler Logger) (int, error) { return handler(ctx, e.AddAny(key, value)) } @@ -75,7 +75,7 @@ func GoVersion(key string) Middleware { } } -// WithContext add field by context key. +// WithContextValue add field by context key. func WithContextValue(keys ...fmt.Stringer) Middleware { return func(ctx context.Context, e *entry.Entry, handler Logger) (int, error) { for _, key := range keys { @@ -93,6 +93,7 @@ func WithName(name string) Middleware { } // WithCaller adds called file. +// // Deprecated: use WithSource. func WithCaller(key string, depth int, full bool) Middleware { const offset = 2 diff --git a/source.go b/source.go index b033765..3acf6b8 100644 --- a/source.go +++ b/source.go @@ -82,13 +82,13 @@ type Source struct { } func (l Source) MarshalText() ([]byte, error) { - return []byte(fmt.Sprintf("%s:%d", l.File, l.Line)), nil + return fmt.Appendf(nil, "%s:%d", l.File, l.Line), nil } func (l Source) MarshalJSON() ([]byte, error) { return fmt.Appendf([]byte{}, `{"file":"%s","line":%d,"func":"%s"}`, l.File, l.Line, l.Func), nil } -func errSourceField(skip, max int) field.Field { - return field.String(KeySource, fmt.Sprintf("source not found by frames[%d:%d]", skip, max)) +func errSourceField(skip, mframe int) field.Field { + return field.String(KeySource, fmt.Sprintf("source not found by frames[%d:%d]", skip, mframe)) } diff --git a/writter.go b/writter.go index 6f17440..44d3835 100644 --- a/writter.go +++ b/writter.go @@ -13,16 +13,16 @@ import ( // Keys for "built-in" attributes. const ( - // TimeKey is the key used by the built-in handlers for the time + // KeyTime is the key used by the built-in handlers for the time // when the log method is called. The associated Value is a [time.Time]. KeyTime = "time" - // LevelKey is the key used by the built-in handlers for the level + // KeyLevel is the key used by the built-in handlers for the level // of the log call. The associated value is a [Level]. KeyLevel = "level" - // MessageKey is the key used by the built-in handlers for the + // KeyMessage is the key used by the built-in handlers for the // message of the log call. The associated value is a string. KeyMessage = "msg" - // SourceKey is the key used by the built-in handlers for the source file + // KeySource is the key used by the built-in handlers for the source file // and line of the log call. The associated value is a string. KeySource = "source" // KeyName logger name. @@ -104,6 +104,7 @@ func FormatWithBracket(enc Encoder) func(io.Writer, *entry.Entry) (int, error) { return func(w io.Writer, data *entry.Entry) (int, error) { buf := buffer.New() + defer func() { buf.Free() }() @@ -139,6 +140,7 @@ func FormatWithBracket(enc Encoder) func(io.Writer, *entry.Entry) (int, error) { func FormatString(enc Encoder) func(io.Writer, *entry.Entry) (int, error) { return func(w io.Writer, entry *entry.Entry) (int, error) { buf := buffer.New() + defer func() { buf.Free() }() @@ -163,6 +165,7 @@ func FormatString(enc Encoder) func(io.Writer, *entry.Entry) (int, error) { func FormatJSON(enc Encoder) func(w io.Writer, entry *entry.Entry) (int, error) { return func(w io.Writer, entry *entry.Entry) (int, error) { buf := buffer.New() + defer func() { buf.Free() }() -- 2.49.1 From 893a0be43ac3aeb5eab67357f575b00bfe26a895 Mon Sep 17 00:00:00 2001 From: andrey Date: Tue, 23 Dec 2025 21:13:01 +0300 Subject: [PATCH 3/5] update action version --- .gitea/workflows/goaction.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/goaction.yml b/.gitea/workflows/goaction.yml index 5e943af..5d12b1b 100644 --- a/.gitea/workflows/goaction.yml +++ b/.gitea/workflows/goaction.yml @@ -15,12 +15,12 @@ jobs: go-version: '1.25.5' # Specify your required Go version - name: Run golangci-lint - uses: golangci/golangci-lint-action@v3 # Use the golangci-lint action + uses: golangci/golangci-lint-action@v8 # Use the golangci-lint action with: version: v2.7.2 # Specify the linter version # Optional: additional arguments args: --verbose - - name: Test with the Go CLI + - name: Run go test run: go test ./... -- 2.49.1 From 8cdcafec7d2ce4113e0315d0e0a38fe3ab3a6c1c Mon Sep 17 00:00:00 2001 From: andrey Date: Tue, 23 Dec 2025 21:30:43 +0300 Subject: [PATCH 4/5] update job name --- .gitea/workflows/goaction.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/goaction.yml b/.gitea/workflows/goaction.yml index 5d12b1b..7f7abe9 100644 --- a/.gitea/workflows/goaction.yml +++ b/.gitea/workflows/goaction.yml @@ -3,7 +3,7 @@ name: Go Action on: [push, pull_request] jobs: - lint: + goaction: runs-on: ubuntu-latest # Use a Gitea Actions runner label steps: - name: Check out repository code -- 2.49.1 From af0a67dfec4bc1ccf6a26597f3a5ab218983747b Mon Sep 17 00:00:00 2001 From: andrey Date: Tue, 23 Dec 2025 21:39:27 +0300 Subject: [PATCH 5/5] update linters --- .golangci.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index cb9cd7e..ce6313f 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -3,9 +3,15 @@ linters: default: all disable: - wsl - - depguard - - nolintlint + - noinlineerr settings: + depguard: + rules: + main: + allow: + - $gostd + - gitoa.ru + funcorder: constructor: false recvcheck: -- 2.49.1