diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/attachment.go | 2 | ||||
-rw-r--r-- | lib/crypto/crypto.go | 2 | ||||
-rw-r--r-- | lib/crypto/gpg/gpgbin/gpgbin.go | 2 | ||||
-rw-r--r-- | lib/crypto/pgp/pgp.go | 2 | ||||
-rw-r--r-- | lib/hooks/exec.go | 2 | ||||
-rw-r--r-- | lib/ipc/receive.go | 2 | ||||
-rw-r--r-- | lib/log/logger.go | 152 | ||||
-rw-r--r-- | lib/log/panic-logger.go | 60 | ||||
-rw-r--r-- | lib/messageview.go | 2 | ||||
-rw-r--r-- | lib/open.go | 2 | ||||
-rw-r--r-- | lib/pama/apply.go | 2 | ||||
-rw-r--r-- | lib/pama/drop.go | 2 | ||||
-rw-r--r-- | lib/pama/list.go | 2 | ||||
-rw-r--r-- | lib/pama/models/view.go | 2 | ||||
-rw-r--r-- | lib/pama/revctrl/git.go | 2 | ||||
-rw-r--r-- | lib/pama/revctrl/revctrl.go | 2 | ||||
-rw-r--r-- | lib/pama/store/store.go | 2 | ||||
-rw-r--r-- | lib/pama/unlink.go | 2 | ||||
-rw-r--r-- | lib/pama/worktree.go | 2 | ||||
-rw-r--r-- | lib/parse/ansi.go | 2 | ||||
-rw-r--r-- | lib/parse/daterange.go | 2 | ||||
-rw-r--r-- | lib/parse/header.go | 2 | ||||
-rw-r--r-- | lib/parse/match.go | 2 | ||||
-rw-r--r-- | lib/rfc822/message.go | 2 | ||||
-rw-r--r-- | lib/state/templates.go | 2 | ||||
-rw-r--r-- | lib/threadbuilder.go | 2 | ||||
-rw-r--r-- | lib/ui/textinput.go | 2 | ||||
-rw-r--r-- | lib/ui/ui.go | 2 | ||||
-rw-r--r-- | lib/watchers/fsevents.go | 2 | ||||
-rw-r--r-- | lib/watchers/inotify.go | 2 | ||||
-rw-r--r-- | lib/xdg/home.go | 2 |
31 files changed, 241 insertions, 29 deletions
diff --git a/lib/attachment.go b/lib/attachment.go index a8a8103d..aa3cd108 100644 --- a/lib/attachment.go +++ b/lib/attachment.go @@ -10,7 +10,7 @@ import ( "path/filepath" "strings" - "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rjarry/aerc/lib/log" "github.com/emersion/go-message/mail" "github.com/pkg/errors" ) diff --git a/lib/crypto/crypto.go b/lib/crypto/crypto.go index e58e6075..af3d1e78 100644 --- a/lib/crypto/crypto.go +++ b/lib/crypto/crypto.go @@ -7,7 +7,7 @@ import ( "git.sr.ht/~rjarry/aerc/config" "git.sr.ht/~rjarry/aerc/lib/crypto/gpg" "git.sr.ht/~rjarry/aerc/lib/crypto/pgp" - "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rjarry/aerc/lib/log" "git.sr.ht/~rjarry/aerc/models" "github.com/ProtonMail/go-crypto/openpgp" "github.com/emersion/go-message/mail" diff --git a/lib/crypto/gpg/gpgbin/gpgbin.go b/lib/crypto/gpg/gpgbin/gpgbin.go index a83ebb37..69f290fd 100644 --- a/lib/crypto/gpg/gpgbin/gpgbin.go +++ b/lib/crypto/gpg/gpgbin/gpgbin.go @@ -10,7 +10,7 @@ import ( "strconv" "strings" - "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rjarry/aerc/lib/log" "git.sr.ht/~rjarry/aerc/models" ) diff --git a/lib/crypto/pgp/pgp.go b/lib/crypto/pgp/pgp.go index af406446..6195233d 100644 --- a/lib/crypto/pgp/pgp.go +++ b/lib/crypto/pgp/pgp.go @@ -8,8 +8,8 @@ import ( "strings" "time" + "git.sr.ht/~rjarry/aerc/lib/log" "git.sr.ht/~rjarry/aerc/lib/xdg" - "git.sr.ht/~rjarry/aerc/log" "git.sr.ht/~rjarry/aerc/models" "github.com/ProtonMail/go-crypto/openpgp" "github.com/ProtonMail/go-crypto/openpgp/armor" diff --git a/lib/hooks/exec.go b/lib/hooks/exec.go index bea35f32..ecc33b28 100644 --- a/lib/hooks/exec.go +++ b/lib/hooks/exec.go @@ -4,7 +4,7 @@ import ( "os" "os/exec" - "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rjarry/aerc/lib/log" ) func RunHook(h HookType) error { diff --git a/lib/ipc/receive.go b/lib/ipc/receive.go index dbacc660..e2fffaf0 100644 --- a/lib/ipc/receive.go +++ b/lib/ipc/receive.go @@ -14,8 +14,8 @@ import ( "git.sr.ht/~rjarry/go-opt" "git.sr.ht/~rjarry/aerc/config" + "git.sr.ht/~rjarry/aerc/lib/log" "git.sr.ht/~rjarry/aerc/lib/xdg" - "git.sr.ht/~rjarry/aerc/log" ) type AercServer struct { diff --git a/lib/log/logger.go b/lib/log/logger.go new file mode 100644 index 00000000..2ece5f32 --- /dev/null +++ b/lib/log/logger.go @@ -0,0 +1,152 @@ +package log + +import ( + "fmt" + "io" + "log" + "os" + "strings" +) + +type LogLevel int + +const ( + TRACE LogLevel = 5 + DEBUG LogLevel = 10 + INFO LogLevel = 20 + WARN LogLevel = 30 + ERROR LogLevel = 40 +) + +var ( + trace *log.Logger + dbg *log.Logger + info *log.Logger + warn *log.Logger + err *log.Logger + minLevel LogLevel = TRACE +) + +func Init(file *os.File, level LogLevel) { + minLevel = level + flags := log.Ldate | log.Ltime | log.Lmicroseconds | log.Lshortfile + if file != nil { + trace = log.New(file, "TRACE ", flags) + dbg = log.New(file, "DEBUG ", flags) + info = log.New(file, "INFO ", flags) + warn = log.New(file, "WARN ", flags) + err = log.New(file, "ERROR ", flags) + } +} + +func ParseLevel(value string) (LogLevel, error) { + switch strings.ToLower(value) { + case "trace": + return TRACE, nil + case "debug": + return DEBUG, nil + case "info": + return INFO, nil + case "warn", "warning": + return WARN, nil + case "err", "error": + return ERROR, nil + } + return 0, fmt.Errorf("%s: invalid log level", value) +} + +func ErrorLogger() *log.Logger { + if err == nil { + return log.New(io.Discard, "", log.LstdFlags) + } + return err +} + +type Logger interface { + Tracef(string, ...interface{}) + Debugf(string, ...interface{}) + Infof(string, ...interface{}) + Warnf(string, ...interface{}) + Errorf(string, ...interface{}) +} + +type logger struct { + name string + calldepth int +} + +func NewLogger(name string, calldepth int) Logger { + return &logger{name: name, calldepth: calldepth} +} + +func (l *logger) format(message string, args ...interface{}) string { + if len(args) > 0 { + message = fmt.Sprintf(message, args...) + } + if l.name != "" { + message = fmt.Sprintf("[%s] %s", l.name, message) + } + return message +} + +func (l *logger) Tracef(message string, args ...interface{}) { + if trace == nil || minLevel > TRACE { + return + } + message = l.format(message, args...) + trace.Output(l.calldepth, message) //nolint:errcheck // we can't do anything with what we log +} + +func (l *logger) Debugf(message string, args ...interface{}) { + if dbg == nil || minLevel > DEBUG { + return + } + message = l.format(message, args...) + dbg.Output(l.calldepth, message) //nolint:errcheck // we can't do anything with what we log +} + +func (l *logger) Infof(message string, args ...interface{}) { + if info == nil || minLevel > INFO { + return + } + message = l.format(message, args...) + info.Output(l.calldepth, message) //nolint:errcheck // we can't do anything with what we log +} + +func (l *logger) Warnf(message string, args ...interface{}) { + if warn == nil || minLevel > WARN { + return + } + message = l.format(message, args...) + warn.Output(l.calldepth, message) //nolint:errcheck // we can't do anything with what we log +} + +func (l *logger) Errorf(message string, args ...interface{}) { + if err == nil || minLevel > ERROR { + return + } + message = l.format(message, args...) + err.Output(l.calldepth, message) //nolint:errcheck // we can't do anything with what we log +} + +var root = logger{calldepth: 3} + +func Tracef(message string, args ...interface{}) { + root.Tracef(message, args...) +} + +func Debugf(message string, args ...interface{}) { + root.Debugf(message, args...) +} + +func Infof(message string, args ...interface{}) { + root.Infof(message, args...) +} + +func Warnf(message string, args ...interface{}) { + root.Warnf(message, args...) +} + +func Errorf(message string, args ...interface{}) { + root.Errorf(message, args...) +} diff --git a/lib/log/panic-logger.go b/lib/log/panic-logger.go new file mode 100644 index 00000000..a1904415 --- /dev/null +++ b/lib/log/panic-logger.go @@ -0,0 +1,60 @@ +package log + +import ( + "fmt" + "io" + "os" + "runtime/debug" + "strings" + "time" +) + +var ( + UICleanup = func() {} + BuildInfo string +) + +// PanicHandler tries to restore the terminal. A stack trace is written to +// aerc-crash.log and then passed on if a panic occurs. +func PanicHandler() { + r := recover() + + if r == nil { + return + } + + UICleanup() + + filename := time.Now().Format("/tmp/aerc-crash-20060102-150405.log") + + panicLog, err := os.OpenFile(filename, os.O_SYNC|os.O_APPEND|os.O_CREATE|os.O_WRONLY|os.O_EXCL, 0o600) + if err != nil { + // we tried, not possible. bye + panic(r) + } + defer panicLog.Close() + + outputs := io.MultiWriter(panicLog, os.Stderr) + + // if any error happens here, we do not care. + fmt.Fprintln(panicLog, strings.Repeat("#", 80)) + fmt.Fprint(panicLog, strings.Repeat(" ", 34)) + fmt.Fprintln(panicLog, "PANIC CAUGHT!") + fmt.Fprint(panicLog, strings.Repeat(" ", 24)) + fmt.Fprintln(panicLog, time.Now().Format("2006-01-02T15:04:05.000000-0700")) + fmt.Fprintln(panicLog, strings.Repeat("#", 80)) + fmt.Fprintf(outputs, "%s\n", panicMessage) + fmt.Fprintf(outputs, "Version: %s\n", BuildInfo) + fmt.Fprintf(panicLog, "Error: %v\n\n", r) + panicLog.Write(debug.Stack()) //nolint:errcheck // we are already in a panic, so not much we can do here + fmt.Fprintf(os.Stderr, "\nThis error was also written to: %s\n", filename) + panic(r) +} + +const panicMessage = ` +aerc has encountered a critical error and has terminated. Please help us fix +this by sending this log and the steps to reproduce the crash to: +~rjarry/aerc-devel@lists.sr.ht + +Thank you +` diff --git a/lib/messageview.go b/lib/messageview.go index 6e1ce858..34549023 100644 --- a/lib/messageview.go +++ b/lib/messageview.go @@ -10,8 +10,8 @@ import ( _ "github.com/emersion/go-message/charset" "git.sr.ht/~rjarry/aerc/lib/crypto" + "git.sr.ht/~rjarry/aerc/lib/log" "git.sr.ht/~rjarry/aerc/lib/rfc822" - "git.sr.ht/~rjarry/aerc/log" "git.sr.ht/~rjarry/aerc/models" "git.sr.ht/~rjarry/aerc/worker/types" ) diff --git a/lib/open.go b/lib/open.go index 21bee748..5ca819e0 100644 --- a/lib/open.go +++ b/lib/open.go @@ -10,7 +10,7 @@ import ( "github.com/danwakefield/fnmatch" "git.sr.ht/~rjarry/aerc/config" - "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rjarry/aerc/lib/log" ) func XDGOpenMime( diff --git a/lib/pama/apply.go b/lib/pama/apply.go index 3d701347..f97c7701 100644 --- a/lib/pama/apply.go +++ b/lib/pama/apply.go @@ -6,8 +6,8 @@ import ( "math/rand" "strings" + "git.sr.ht/~rjarry/aerc/lib/log" "git.sr.ht/~rjarry/aerc/lib/pama/models" - "git.sr.ht/~rjarry/aerc/log" ) func (m PatchManager) CurrentProject() (p models.Project, err error) { diff --git a/lib/pama/drop.go b/lib/pama/drop.go index 595bc87d..fd48575b 100644 --- a/lib/pama/drop.go +++ b/lib/pama/drop.go @@ -3,8 +3,8 @@ package pama import ( "fmt" + "git.sr.ht/~rjarry/aerc/lib/log" "git.sr.ht/~rjarry/aerc/lib/pama/models" - "git.sr.ht/~rjarry/aerc/log" ) func (m PatchManager) DropPatch(patch string) error { diff --git a/lib/pama/list.go b/lib/pama/list.go index 950f130d..7ab9e3d1 100644 --- a/lib/pama/list.go +++ b/lib/pama/list.go @@ -5,8 +5,8 @@ import ( "io" "strings" + "git.sr.ht/~rjarry/aerc/lib/log" "git.sr.ht/~rjarry/aerc/lib/pama/models" - "git.sr.ht/~rjarry/aerc/log" ) func (m PatchManager) Projects(name string) ([]models.Project, error) { diff --git a/lib/pama/models/view.go b/lib/pama/models/view.go index 6a5b6bd4..ff2aa710 100644 --- a/lib/pama/models/view.go +++ b/lib/pama/models/view.go @@ -6,7 +6,7 @@ import ( "strings" "text/template" - "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rjarry/aerc/lib/log" ) var templateText = ` diff --git a/lib/pama/revctrl/git.go b/lib/pama/revctrl/git.go index 2a35754e..ce024078 100644 --- a/lib/pama/revctrl/git.go +++ b/lib/pama/revctrl/git.go @@ -8,8 +8,8 @@ import ( "path/filepath" "strings" + "git.sr.ht/~rjarry/aerc/lib/log" "git.sr.ht/~rjarry/aerc/lib/pama/models" - "git.sr.ht/~rjarry/aerc/log" ) func init() { diff --git a/lib/pama/revctrl/revctrl.go b/lib/pama/revctrl/revctrl.go index 42532216..cd9202f0 100644 --- a/lib/pama/revctrl/revctrl.go +++ b/lib/pama/revctrl/revctrl.go @@ -4,8 +4,8 @@ import ( "errors" "fmt" + "git.sr.ht/~rjarry/aerc/lib/log" "git.sr.ht/~rjarry/aerc/lib/pama/models" - "git.sr.ht/~rjarry/aerc/log" ) var ErrUnsupported = errors.New("unsupported") diff --git a/lib/pama/store/store.go b/lib/pama/store/store.go index aaee5412..385d607e 100644 --- a/lib/pama/store/store.go +++ b/lib/pama/store/store.go @@ -8,9 +8,9 @@ import ( "path" "strings" + "git.sr.ht/~rjarry/aerc/lib/log" "git.sr.ht/~rjarry/aerc/lib/pama/models" "git.sr.ht/~rjarry/aerc/lib/xdg" - "git.sr.ht/~rjarry/aerc/log" "github.com/syndtr/goleveldb/leveldb" ) diff --git a/lib/pama/unlink.go b/lib/pama/unlink.go index 2def5403..6a35e1a3 100644 --- a/lib/pama/unlink.go +++ b/lib/pama/unlink.go @@ -3,7 +3,7 @@ package pama import ( "fmt" - "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rjarry/aerc/lib/log" ) // Unlink removes provided project diff --git a/lib/pama/worktree.go b/lib/pama/worktree.go index 9ecfadf6..1718e430 100644 --- a/lib/pama/worktree.go +++ b/lib/pama/worktree.go @@ -7,9 +7,9 @@ import ( "path/filepath" "strings" + "git.sr.ht/~rjarry/aerc/lib/log" "git.sr.ht/~rjarry/aerc/lib/pama/models" "git.sr.ht/~rjarry/aerc/lib/xdg" - "git.sr.ht/~rjarry/aerc/log" ) func cacheDir() (string, error) { diff --git a/lib/parse/ansi.go b/lib/parse/ansi.go index df50042c..12ea4c07 100644 --- a/lib/parse/ansi.go +++ b/lib/parse/ansi.go @@ -8,7 +8,7 @@ import ( "os" "regexp" - "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rjarry/aerc/lib/log" ) var AnsiReg = regexp.MustCompile("\x1B\\[[0-?]*[ -/]*[@-~]") diff --git a/lib/parse/daterange.go b/lib/parse/daterange.go index bd984ed5..26368609 100644 --- a/lib/parse/daterange.go +++ b/lib/parse/daterange.go @@ -5,7 +5,7 @@ import ( "strings" "time" - "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rjarry/aerc/lib/log" ) const dateFmt = "2006-01-02" diff --git a/lib/parse/header.go b/lib/parse/header.go index 361b3af0..522d178c 100644 --- a/lib/parse/header.go +++ b/lib/parse/header.go @@ -3,7 +3,7 @@ package parse import ( "strings" - "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rjarry/aerc/lib/log" "github.com/emersion/go-message/mail" ) diff --git a/lib/parse/match.go b/lib/parse/match.go index ac43673e..dc5a06cc 100644 --- a/lib/parse/match.go +++ b/lib/parse/match.go @@ -4,7 +4,7 @@ import ( "regexp" "sync" - "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rjarry/aerc/lib/log" ) var reCache sync.Map diff --git a/lib/rfc822/message.go b/lib/rfc822/message.go index 7b0d0552..f511ea19 100644 --- a/lib/rfc822/message.go +++ b/lib/rfc822/message.go @@ -10,8 +10,8 @@ import ( "strings" "time" + "git.sr.ht/~rjarry/aerc/lib/log" "git.sr.ht/~rjarry/aerc/lib/parse" - "git.sr.ht/~rjarry/aerc/log" "git.sr.ht/~rjarry/aerc/models" "github.com/emersion/go-message" _ "github.com/emersion/go-message/charset" diff --git a/lib/state/templates.go b/lib/state/templates.go index ec679211..e1570cd3 100644 --- a/lib/state/templates.go +++ b/lib/state/templates.go @@ -10,9 +10,9 @@ import ( "time" "git.sr.ht/~rjarry/aerc/config" + "git.sr.ht/~rjarry/aerc/lib/log" "git.sr.ht/~rjarry/aerc/lib/ui" "git.sr.ht/~rjarry/aerc/lib/xdg" - "git.sr.ht/~rjarry/aerc/log" "git.sr.ht/~rjarry/aerc/models" "github.com/danwakefield/fnmatch" sortthread "github.com/emersion/go-imap-sortthread" diff --git a/lib/threadbuilder.go b/lib/threadbuilder.go index 63ae80d3..c18ab3d0 100644 --- a/lib/threadbuilder.go +++ b/lib/threadbuilder.go @@ -6,7 +6,7 @@ import ( "time" "git.sr.ht/~rjarry/aerc/lib/iterator" - "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rjarry/aerc/lib/log" "git.sr.ht/~rjarry/aerc/models" "git.sr.ht/~rjarry/aerc/worker/types" "github.com/gatherstars-com/jwz" diff --git a/lib/ui/textinput.go b/lib/ui/textinput.go index a01184f2..29f71509 100644 --- a/lib/ui/textinput.go +++ b/lib/ui/textinput.go @@ -9,7 +9,7 @@ import ( "github.com/mattn/go-runewidth" "git.sr.ht/~rjarry/aerc/config" - "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rjarry/aerc/lib/log" "git.sr.ht/~rockorager/vaxis" ) diff --git a/lib/ui/ui.go b/lib/ui/ui.go index ce0a7e93..d63ebf36 100644 --- a/lib/ui/ui.go +++ b/lib/ui/ui.go @@ -7,7 +7,7 @@ import ( "syscall" "git.sr.ht/~rjarry/aerc/config" - "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rjarry/aerc/lib/log" "git.sr.ht/~rockorager/vaxis" ) diff --git a/lib/watchers/fsevents.go b/lib/watchers/fsevents.go index 905db2af..a273dcb0 100644 --- a/lib/watchers/fsevents.go +++ b/lib/watchers/fsevents.go @@ -6,7 +6,7 @@ package watchers import ( "time" - "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rjarry/aerc/lib/log" "github.com/fsnotify/fsevents" ) diff --git a/lib/watchers/inotify.go b/lib/watchers/inotify.go index 22290307..dd34fc4f 100644 --- a/lib/watchers/inotify.go +++ b/lib/watchers/inotify.go @@ -4,7 +4,7 @@ package watchers import ( - "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rjarry/aerc/lib/log" "github.com/fsnotify/fsnotify" ) diff --git a/lib/xdg/home.go b/lib/xdg/home.go index 3471e5e2..39894cf6 100644 --- a/lib/xdg/home.go +++ b/lib/xdg/home.go @@ -6,7 +6,7 @@ import ( "path" "strings" - "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rjarry/aerc/lib/log" ) // assign to a local var to allow mocking in unit tests |