From 188bae9479cc60d2be2d4b57a92a6fbd43c0bd00 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 13 Sep 2021 22:57:50 +0200 Subject: [PATCH] Improve internal logging infrastructure --- internal/chezmoi/attr.go | 33 +++++++++++++++++++++ internal/chezmoi/entrystate.go | 3 ++ internal/chezmoi/sourcestateentry.go | 43 ++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/internal/chezmoi/attr.go b/internal/chezmoi/attr.go index 9361608543b..ccedbd0235f 100644 --- a/internal/chezmoi/attr.go +++ b/internal/chezmoi/attr.go @@ -3,6 +3,8 @@ package chezmoi import ( "io/fs" "strings" + + "github.com/rs/zerolog" ) // A SourceFileTargetType is a the type of a target represented by a file in the @@ -20,6 +22,15 @@ const ( SourceFileTypeSymlink ) +var sourceFileTypeStrs = map[SourceFileTargetType]string{ + SourceFileTypeCreate: "create", + SourceFileTypeFile: "file", + SourceFileTypeModify: "modify", + SourceFileTypeRemove: "remove", + SourceFileTypeScript: "script", + SourceFileTypeSymlink: "symlink", +} + // DirAttr holds attributes parsed from a source directory name. type DirAttr struct { TargetName string @@ -76,6 +87,14 @@ func parseDirAttr(sourceName string) DirAttr { } } +// MarshalZerologObject implements zerolog.Marshaler. +func (da DirAttr) MarshalZerologObject(e *zerolog.Event) { + e.Str("targetName", da.TargetName) + e.Bool("exact", da.Exact) + e.Bool("private", da.Private) + e.Bool("readOnly", da.ReadOnly) +} + // SourceName returns da's source name. func (da DirAttr) SourceName() string { sourceName := "" @@ -236,6 +255,20 @@ func parseFileAttr(sourceName, encryptedSuffix string) FileAttr { } } +// MarshalZerologObject implements zerolog.ObjectMarshaler. +func (fa FileAttr) MarshalZerologObject(e *zerolog.Event) { + e.Str("TargetName", fa.TargetName) + e.Str("Type", sourceFileTypeStrs[fa.Type]) + e.Bool("Empty", fa.Empty) + e.Bool("Encrypted", fa.Encrypted) + e.Bool("Executable", fa.Executable) + e.Bool("Once", fa.Once) + e.Int("Order", fa.Order) + e.Bool("Private", fa.Private) + e.Bool("ReadOnly", fa.ReadOnly) + e.Bool("Template", fa.Template) +} + // SourceName returns fa's source name. func (fa FileAttr) SourceName(encryptedSuffix string) string { sourceName := "" diff --git a/internal/chezmoi/entrystate.go b/internal/chezmoi/entrystate.go index b7d615e66f2..c37204b8b17 100644 --- a/internal/chezmoi/entrystate.go +++ b/internal/chezmoi/entrystate.go @@ -66,6 +66,9 @@ func (s *EntryState) Overwrite() bool { } func (s *EntryState) MarshalZerologObject(e *zerolog.Event) { + if s == nil { + return + } e.Str("Type", string(s.Type)) e.Int("Mode", int(s.Mode)) e.Stringer("ContentsSHA256", s.ContentsSHA256) diff --git a/internal/chezmoi/sourcestateentry.go b/internal/chezmoi/sourcestateentry.go index b4afd4e27be..92994f3ead5 100644 --- a/internal/chezmoi/sourcestateentry.go +++ b/internal/chezmoi/sourcestateentry.go @@ -1,7 +1,16 @@ package chezmoi +import ( + "encoding/hex" + + "github.com/rs/zerolog" + + "github.com/twpayne/chezmoi/v2/internal/chezmoilog" +) + // A SourceStateEntry represents the state of an entry in the source state. type SourceStateEntry interface { + zerolog.LogObjectMarshaler Evaluate() error Order() int SourceRelPath() SourceRelPath @@ -42,6 +51,12 @@ func (s *SourceStateDir) Evaluate() error { return nil } +// MarshalZerologObject implements zerolog.LogObjectMarshaler. +func (s *SourceStateDir) MarshalZerologObject(e *zerolog.Event) { + e.Stringer("sourceRelPath", s.sourceRelPath) + e.Object("attr", s.Attr) +} + // Order returns s's order. func (s *SourceStateDir) Order() int { return 0 @@ -63,6 +78,23 @@ func (s *SourceStateFile) Evaluate() error { return err } +// MarshalZerologObject implements zerolog.LogObjectMarshaler. +func (s *SourceStateFile) MarshalZerologObject(e *zerolog.Event) { + e.Stringer("sourceRelPath", s.sourceRelPath) + e.Interface("attr", s.Attr) + contents, contentsErr := s.Contents() + e.Bytes("contents", chezmoilog.FirstFewBytes(contents)) + if contentsErr != nil { + e.Str("contentsErr", contentsErr.Error()) + } + e.Err(contentsErr) + contentsSHA256, contentsSHA256Err := s.ContentsSHA256() + e.Str("contentsSHA256", hex.EncodeToString(contentsSHA256)) + if contentsSHA256Err != nil { + e.Str("contentsSHA256Err", contentsSHA256Err.Error()) + } +} + // Order returns s's order. func (s *SourceStateFile) Order() int { return s.Attr.Order @@ -87,6 +119,11 @@ func (s *SourceStateRemove) Evaluate() error { return nil } +// MarshalZerologObject implements zerolog.LogObjectMarshaler. +func (s *SourceStateRemove) MarshalZerologObject(e *zerolog.Event) { + e.Stringer("targetRelPath", s.targetRelPath) +} + // Order returns s's order. func (s *SourceStateRemove) Order() int { return 0 @@ -107,6 +144,12 @@ func (s *SourceStateRenameDir) Evaluate() error { return nil } +// MarashalLogObject implements zerolog.LogObjectMarshaler. +func (s *SourceStateRenameDir) MarshalZerologObject(e *zerolog.Event) { + e.Stringer("oldSourceRelPath", s.oldSourceRelPath) + e.Stringer("newSourceRelPath", s.newSourceRelPath) +} + // Order returns s's order. func (s *SourceStateRenameDir) Order() int { return -1