From ead9ea00e5350803949eba95583ed13160797bbd Mon Sep 17 00:00:00 2001 From: Snider Date: Wed, 18 Mar 2026 13:20:30 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20resolve=20CodeRabbit=20findings=20?= =?UTF-8?q?=E2=80=94=20init=20ordering,=20crash=20safety,=20lock=20order?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - log.go: remove atomic.Pointer — defaultLog init was nil (var runs before init()) - error.go: Reports(n) validates n<=0, appendReport creates parent dir - contract.go: WithServiceLock is order-independent (LockApply after all opts) Co-Authored-By: Virgil --- pkg/core/contract.go | 3 ++- pkg/core/error.go | 4 +++- pkg/core/log.go | 16 ++++------------ 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/pkg/core/contract.go b/pkg/core/contract.go index cab7fa0..7c2f604 100644 --- a/pkg/core/contract.go +++ b/pkg/core/contract.go @@ -106,6 +106,7 @@ func New(opts ...Option) (*Core, error) { } } + c.LockApply() return c, nil } @@ -188,10 +189,10 @@ func WithAssets(efs embed.FS) Option { // WithServiceLock prevents service registration after initialisation. +// Order-independent — lock is applied after all options are processed. func WithServiceLock() Option { return func(c *Core) error { c.LockEnable() - c.LockApply() return nil } } diff --git a/pkg/core/error.go b/pkg/core/error.go index e9ec161..b0e6077 100644 --- a/pkg/core/error.go +++ b/pkg/core/error.go @@ -13,6 +13,7 @@ import ( "iter" "maps" "os" + "path/filepath" "runtime" "runtime/debug" "strings" @@ -385,7 +386,7 @@ func (h *ErrPan) Reports(n int) ([]CrashReport, error) { if err := json.Unmarshal(data, &reports); err != nil { return nil, err } - if len(reports) <= n { + if n <= 0 || len(reports) <= n { return reports, nil } return reports[len(reports)-n:], nil @@ -406,6 +407,7 @@ func (h *ErrPan) appendReport(report CrashReport) { reports = append(reports, report) if data, err := json.MarshalIndent(reports, "", " "); err == nil { + _ = os.MkdirAll(filepath.Dir(h.filePath), 0755) _ = os.WriteFile(h.filePath, data, 0600) } } diff --git a/pkg/core/log.go b/pkg/core/log.go index 3b66599..276917b 100644 --- a/pkg/core/log.go +++ b/pkg/core/log.go @@ -12,7 +12,6 @@ import ( "os/user" "slices" "sync" - "sync/atomic" "time" ) @@ -298,23 +297,16 @@ func Username() string { // --- Default logger --- -var defaultLogPtr atomic.Pointer[Log] - -func init() { - l := NewLog(LogOpts{Level: LevelInfo}) - defaultLogPtr.Store(l) -} - -var defaultLog = defaultLogPtr.Load() +var defaultLog = NewLog(LogOpts{Level: LevelInfo}) // Default returns the default logger. func Default() *Log { - return defaultLogPtr.Load() + return defaultLog } -// SetDefault sets the default logger (thread-safe). +// SetDefault sets the default logger. func SetDefault(l *Log) { - defaultLogPtr.Store(l) + defaultLog = l } // SetLevel sets the default logger's level.