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:
2026-08-07 18:51:21 +00:00
parent 6cf9211407
commit 7ae470e530
121 changed files with 8344 additions and 5406 deletions

View File

@@ -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
}

View File

@@ -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

View File

@@ -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