Remediate all lint findings under the canonical golangci-lint config
Fix every finding surfaced by the canonical .golangci.yml with golangci-lint v2.12.2 (refs #61), behavior-preserving throughout: - err113: dynamic errors replaced with package-level sentinels and %w wrapping; direct comparisons converted to errors.Is - goprintffuncname: printf-style helpers renamed with an f suffix (ui.Writer message methods, cli.ReportErrorf, database.Fatalf, vaultik stdoutf) and all call sites updated - revive: stuttering type names renamed (blob.Handler, blob.WithReader, blob.ChunkPosition, storage.URL, storage.Info), doc comments added, unused parameters blanked, package comments added - contextcheck/noctx: ctx threaded through blob.Packer (AddChunk/Flush/FinalizeBlob/PackChunks) and scanner call sites; context-aware exec and sql variants used - funlen/cyclop/gocognit/nestif/dupl: oversized or duplicated functions split into focused helpers across production and test code - paralleltest/tparallel/thelper/usetesting/testpackage: tests parallelized where safe (global log.Initialize kept in the serial phase), helpers marked, t.TempDir adopted, external test packages where only exported API is used - gosec: integer conversions clamped or justified, header timeouts added, remaining findings suppressed with per-site justifications - mnd/goconst/lll/wsl_v5/nlreturn/noinlineerr/errcheck and other mechanical findings fixed directly Remove the deprecated log.LogOptions alias (callers migrated to log.Options). make check is green.
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
// Package log provides the application-wide structured logger: slog
|
||||
// with a colorized TTY handler on terminals and JSON output otherwise.
|
||||
package log
|
||||
|
||||
import (
|
||||
@@ -12,12 +14,12 @@ import (
|
||||
"golang.org/x/term"
|
||||
)
|
||||
|
||||
// LogLevel represents the logging level.
|
||||
type LogLevel int
|
||||
// Level represents the logging level.
|
||||
type Level int
|
||||
|
||||
const (
|
||||
// LevelFatal represents a fatal error level that will exit the program.
|
||||
LevelFatal LogLevel = iota
|
||||
LevelFatal Level = iota
|
||||
// LevelError represents an error level.
|
||||
LevelError
|
||||
// LevelWarn represents a warning level.
|
||||
@@ -38,6 +40,7 @@ type Config struct {
|
||||
Quiet bool
|
||||
}
|
||||
|
||||
//nolint:gochecknoglobals // package-level logger is the package's purpose
|
||||
var logger *slog.Logger
|
||||
|
||||
// Initialize sets up the global logger based on the provided configuration.
|
||||
@@ -45,18 +48,19 @@ func Initialize(cfg Config) {
|
||||
// Determine log level based on configuration
|
||||
var level slog.Level
|
||||
|
||||
if cfg.Cron || cfg.Quiet {
|
||||
switch {
|
||||
case cfg.Cron || cfg.Quiet:
|
||||
// In cron/quiet mode keep warnings and errors visible — the
|
||||
// whole point of --cron is to stay silent only on total
|
||||
// success, so that anything cron emails to root is genuinely
|
||||
// "something went wrong, look at it." A backup with stuck
|
||||
// permission errors or skipped files should NOT be silent.
|
||||
level = slog.LevelWarn
|
||||
} else if cfg.Debug || strings.Contains(os.Getenv("GODEBUG"), "vaultik") {
|
||||
case cfg.Debug || strings.Contains(os.Getenv("GODEBUG"), "vaultik"):
|
||||
level = slog.LevelDebug
|
||||
} else if cfg.Verbose {
|
||||
case cfg.Verbose:
|
||||
level = slog.LevelInfo
|
||||
} else {
|
||||
default:
|
||||
level = slog.LevelWarn
|
||||
}
|
||||
|
||||
@@ -78,9 +82,13 @@ func Initialize(cfg Config) {
|
||||
slog.SetDefault(logger)
|
||||
}
|
||||
|
||||
// callerSkipFrames is the number of stack frames between runtime.Caller
|
||||
// and the code that invoked the package-level logging function.
|
||||
const callerSkipFrames = 2
|
||||
|
||||
// getCaller returns the caller information as a string
|
||||
func getCaller(skip int) string {
|
||||
_, file, line, ok := runtime.Caller(skip)
|
||||
func getCaller() string {
|
||||
_, file, line, ok := runtime.Caller(callerSkipFrames)
|
||||
if !ok {
|
||||
return "unknown"
|
||||
}
|
||||
@@ -92,7 +100,7 @@ func getCaller(skip int) string {
|
||||
func Fatal(msg string, args ...any) {
|
||||
if logger != nil {
|
||||
// Add caller info to args
|
||||
args = append(args, "caller", getCaller(2))
|
||||
args = append(args, "caller", getCaller())
|
||||
logger.Error(msg, args...)
|
||||
}
|
||||
|
||||
@@ -107,7 +115,7 @@ func Fatalf(format string, args ...any) {
|
||||
// Error logs an error message.
|
||||
func Error(msg string, args ...any) {
|
||||
if logger != nil {
|
||||
args = append(args, "caller", getCaller(2))
|
||||
args = append(args, "caller", getCaller())
|
||||
logger.Error(msg, args...)
|
||||
}
|
||||
}
|
||||
@@ -120,7 +128,7 @@ func Errorf(format string, args ...any) {
|
||||
// Warn logs a warning message.
|
||||
func Warn(msg string, args ...any) {
|
||||
if logger != nil {
|
||||
args = append(args, "caller", getCaller(2))
|
||||
args = append(args, "caller", getCaller())
|
||||
logger.Warn(msg, args...)
|
||||
}
|
||||
}
|
||||
@@ -133,7 +141,7 @@ func Warnf(format string, args ...any) {
|
||||
// Notice logs a notice message (mapped to Info level).
|
||||
func Notice(msg string, args ...any) {
|
||||
if logger != nil {
|
||||
args = append(args, "caller", getCaller(2))
|
||||
args = append(args, "caller", getCaller())
|
||||
logger.Info(msg, args...)
|
||||
}
|
||||
}
|
||||
@@ -146,7 +154,7 @@ func Noticef(format string, args ...any) {
|
||||
// Info logs an informational message.
|
||||
func Info(msg string, args ...any) {
|
||||
if logger != nil {
|
||||
args = append(args, "caller", getCaller(2))
|
||||
args = append(args, "caller", getCaller())
|
||||
logger.Info(msg, args...)
|
||||
}
|
||||
}
|
||||
@@ -159,7 +167,7 @@ func Infof(format string, args ...any) {
|
||||
// Debug logs a debug message.
|
||||
func Debug(msg string, args ...any) {
|
||||
if logger != nil {
|
||||
args = append(args, "caller", getCaller(2))
|
||||
args = append(args, "caller", getCaller())
|
||||
logger.Debug(msg, args...)
|
||||
}
|
||||
}
|
||||
@@ -179,7 +187,7 @@ func With(args ...any) *slog.Logger {
|
||||
}
|
||||
|
||||
// WithContext returns a logger with the provided context.
|
||||
func WithContext(ctx context.Context) *slog.Logger {
|
||||
func WithContext(_ context.Context) *slog.Logger {
|
||||
return logger
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@ import (
|
||||
)
|
||||
|
||||
// Module exports logging functionality for dependency injection.
|
||||
//
|
||||
//nolint:gochecknoglobals // fx module definitions are package globals
|
||||
var Module = fx.Module("log",
|
||||
fx.Invoke(func(cfg Config) {
|
||||
Initialize(cfg)
|
||||
@@ -12,12 +14,12 @@ var Module = fx.Module("log",
|
||||
)
|
||||
|
||||
// New creates a new logger configuration from provided options.
|
||||
func New(opts LogOptions) Config {
|
||||
func New(opts Options) Config {
|
||||
return Config(opts)
|
||||
}
|
||||
|
||||
// LogOptions are provided by the CLI.
|
||||
type LogOptions struct {
|
||||
// Options are provided by the CLI.
|
||||
type Options struct {
|
||||
Verbose bool
|
||||
Debug bool
|
||||
Cron bool
|
||||
|
||||
@@ -94,6 +94,11 @@ func (h *TTYHandler) Handle(_ context.Context, r slog.Record) error {
|
||||
if a.Key == "bytes" {
|
||||
value = formatBytes(a.Value.Int64())
|
||||
}
|
||||
case slog.KindAny, slog.KindBool, slog.KindFloat64, slog.KindString,
|
||||
slog.KindTime, slog.KindUint64, slog.KindGroup, slog.KindLogValuer:
|
||||
// Plain string form above is already correct for these kinds.
|
||||
default:
|
||||
// Future kinds also use the plain string form.
|
||||
}
|
||||
|
||||
_, _ = fmt.Fprintf(h.out, " %s%s%s=%s%s%s",
|
||||
@@ -109,26 +114,27 @@ func (h *TTYHandler) Handle(_ context.Context, r slog.Record) error {
|
||||
}
|
||||
|
||||
// WithAttrs returns a new handler with the given attributes.
|
||||
func (h *TTYHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
|
||||
func (h *TTYHandler) WithAttrs(_ []slog.Attr) slog.Handler {
|
||||
return h // Simplified for now
|
||||
}
|
||||
|
||||
// WithGroup returns a new handler with the given group name.
|
||||
func (h *TTYHandler) WithGroup(name string) slog.Handler {
|
||||
func (h *TTYHandler) WithGroup(_ string) slog.Handler {
|
||||
return h // Simplified for now
|
||||
}
|
||||
|
||||
// formatDuration formats a duration in a human-readable way
|
||||
func formatDuration(d time.Duration) string {
|
||||
if d < time.Millisecond {
|
||||
switch {
|
||||
case d < time.Millisecond:
|
||||
return fmt.Sprintf("%dµs", d.Microseconds())
|
||||
} else if d < time.Second {
|
||||
case d < time.Second:
|
||||
return fmt.Sprintf("%dms", d.Milliseconds())
|
||||
} else if d < time.Minute {
|
||||
case d < time.Minute:
|
||||
return fmt.Sprintf("%.1fs", d.Seconds())
|
||||
default:
|
||||
return d.String()
|
||||
}
|
||||
|
||||
return d.String()
|
||||
}
|
||||
|
||||
// formatBytes formats bytes in a human-readable way
|
||||
|
||||
Reference in New Issue
Block a user