From e3b2d86b06dd2b49596543688c4a2383288482d1 Mon Sep 17 00:00:00 2001 From: Jan De Dobbeleer Date: Sat, 7 May 2022 16:43:24 +0200 Subject: [PATCH] fix(debug): trace startup logic --- src/engine/config.go | 2 ++ src/engine/engine.go | 1 + src/environment/darwin.go | 2 +- src/environment/shell.go | 58 ++++++++++++++++++--------------- src/environment/unix.go | 10 +++--- src/environment/windows.go | 16 ++++----- src/environment/windows_unix.go | 2 +- src/mock/environment.go | 5 +++ 8 files changed, 54 insertions(+), 42 deletions(-) diff --git a/src/engine/config.go b/src/engine/config.go index ac63f7c3..446f0806 100644 --- a/src/engine/config.go +++ b/src/engine/config.go @@ -11,6 +11,7 @@ import ( "os" "path/filepath" "strings" + "time" "github.com/gookit/config/v2" "github.com/gookit/config/v2/json" @@ -90,6 +91,7 @@ func LoadConfig(env environment.Environment) *Config { } func loadConfig(env environment.Environment) *Config { + defer env.Trace(time.Now(), "config.loadConfig") var cfg Config configFile := env.Flags().Config if _, err := os.Stat(configFile); err != nil { diff --git a/src/engine/engine.go b/src/engine/engine.go index 0128c7b0..465648b5 100644 --- a/src/engine/engine.go +++ b/src/engine/engine.go @@ -197,6 +197,7 @@ func (e *Engine) PrintDebug(startTime time.Time, version string) string { } e.write(fmt.Sprintf("\n\x1b[1mRun duration:\x1b[0m %s\n", time.Since(startTime))) e.write(fmt.Sprintf("\n\x1b[1mCache path:\x1b[0m %s\n", e.Env.CachePath())) + e.write(fmt.Sprintf("\n\x1b[1mConfig path:\x1b[0m %s\n", e.Env.Flags().Config)) e.write("\n\x1b[1mLogs:\x1b[0m\n\n") e.write(e.Env.Logs()) return e.string() diff --git a/src/environment/darwin.go b/src/environment/darwin.go index 71893e0d..b5716c05 100644 --- a/src/environment/darwin.go +++ b/src/environment/darwin.go @@ -51,7 +51,7 @@ func (env *ShellEnvironment) parseBatteryOutput(output string) (*BatteryInfo, er } func (env *ShellEnvironment) BatteryState() (*BatteryInfo, error) { - defer env.trace(time.Now(), "BatteryInfo") + defer env.Trace(time.Now(), "BatteryInfo") output, err := env.RunCommand("pmset", "-g", "batt") if err != nil { env.log(Error, "BatteryInfo", err.Error()) diff --git a/src/environment/shell.go b/src/environment/shell.go index 9819c0ae..f3867775 100644 --- a/src/environment/shell.go +++ b/src/environment/shell.go @@ -189,6 +189,7 @@ type Environment interface { ConvertToWindowsPath(path string) string WifiNetwork() (*WifiInfo, error) TemplateCache() *TemplateCache + Trace(start time.Time, function string, args ...string) } type commandCache struct { @@ -227,6 +228,10 @@ type ShellEnvironment struct { } func (env *ShellEnvironment) Init() { + defer env.Trace(time.Now(), "Init") + if env.CmdFlags.Debug { + log.SetOutput(&env.logBuilder) + } if env.CmdFlags == nil { env.CmdFlags = &Flags{} } @@ -236,12 +241,10 @@ func (env *ShellEnvironment) Init() { env.cmdCache = &commandCache{ commands: newConcurrentMap(), } - if env.CmdFlags.Debug { - log.SetOutput(&env.logBuilder) - } } func (env *ShellEnvironment) resolveConfigPath() { + defer env.Trace(time.Now(), "resolveConfigPath") if len(env.CmdFlags.Config) == 0 { env.CmdFlags.Config = env.Getenv("POSH_THEME") } @@ -274,6 +277,7 @@ func (env *ShellEnvironment) resolveConfigPath() { } func (env *ShellEnvironment) downloadConfig(location string) error { + defer env.Trace(time.Now(), "downloadConfig", location) configPath := filepath.Join(env.CachePath(), "config.omp.json") cfg, err := env.HTTPRequest(location, 5000) if err != nil { @@ -292,7 +296,7 @@ func (env *ShellEnvironment) downloadConfig(location string) error { return nil } -func (env *ShellEnvironment) trace(start time.Time, function string, args ...string) { +func (env *ShellEnvironment) Trace(start time.Time, function string, args ...string) { if !env.CmdFlags.Debug { return } @@ -318,14 +322,14 @@ func (env *ShellEnvironment) debugF(function string, fn func() string) { } func (env *ShellEnvironment) Getenv(key string) string { - defer env.trace(time.Now(), "Getenv", key) + defer env.Trace(time.Now(), "Getenv", key) val := os.Getenv(key) env.log(Debug, "Getenv", val) return val } func (env *ShellEnvironment) Pwd() string { - defer env.trace(time.Now(), "Pwd") + defer env.Trace(time.Now(), "Pwd") lock.Lock() defer func() { lock.Unlock() @@ -353,7 +357,7 @@ func (env *ShellEnvironment) Pwd() string { } func (env *ShellEnvironment) HasFiles(pattern string) bool { - defer env.trace(time.Now(), "HasFiles", pattern) + defer env.Trace(time.Now(), "HasFiles", pattern) cwd := env.Pwd() pattern = cwd + env.PathSeparator() + pattern matches, err := filepath.Glob(pattern) @@ -374,7 +378,7 @@ func (env *ShellEnvironment) HasFiles(pattern string) bool { } func (env *ShellEnvironment) HasFilesInDir(dir, pattern string) bool { - defer env.trace(time.Now(), "HasFilesInDir", pattern) + defer env.Trace(time.Now(), "HasFilesInDir", pattern) pattern = dir + env.PathSeparator() + pattern matches, err := filepath.Glob(pattern) if err != nil { @@ -387,7 +391,7 @@ func (env *ShellEnvironment) HasFilesInDir(dir, pattern string) bool { } func (env *ShellEnvironment) HasFileInParentDirs(pattern string, depth uint) bool { - defer env.trace(time.Now(), "HasFileInParent", pattern, fmt.Sprint(depth)) + defer env.Trace(time.Now(), "HasFileInParent", pattern, fmt.Sprint(depth)) currentFolder := env.Pwd() for c := 0; c < int(depth); c++ { @@ -408,7 +412,7 @@ func (env *ShellEnvironment) HasFileInParentDirs(pattern string, depth uint) boo } func (env *ShellEnvironment) HasFolder(folder string) bool { - defer env.trace(time.Now(), "HasFolder", folder) + defer env.Trace(time.Now(), "HasFolder", folder) f, err := os.Stat(folder) if err != nil { env.log(Debug, "HasFolder", "false") @@ -423,7 +427,7 @@ func (env *ShellEnvironment) ResolveSymlink(path string) (string, error) { } func (env *ShellEnvironment) FileContent(file string) string { - defer env.trace(time.Now(), "FileContent", file) + defer env.Trace(time.Now(), "FileContent", file) if !filepath.IsAbs(file) { file = filepath.Join(env.Pwd(), file) } @@ -438,7 +442,7 @@ func (env *ShellEnvironment) FileContent(file string) string { } func (env *ShellEnvironment) LsDir(path string) []fs.DirEntry { - defer env.trace(time.Now(), "LsDir", path) + defer env.Trace(time.Now(), "LsDir", path) entries, err := os.ReadDir(path) if err != nil { env.log(Error, "LsDir", err.Error()) @@ -455,12 +459,12 @@ func (env *ShellEnvironment) LsDir(path string) []fs.DirEntry { } func (env *ShellEnvironment) PathSeparator() string { - defer env.trace(time.Now(), "PathSeparator") + defer env.Trace(time.Now(), "PathSeparator") return string(os.PathSeparator) } func (env *ShellEnvironment) User() string { - defer env.trace(time.Now(), "User") + defer env.Trace(time.Now(), "User") user := os.Getenv("USER") if user == "" { user = os.Getenv("USERNAME") @@ -470,7 +474,7 @@ func (env *ShellEnvironment) User() string { } func (env *ShellEnvironment) Host() (string, error) { - defer env.trace(time.Now(), "Host") + defer env.Trace(time.Now(), "Host") hostName, err := os.Hostname() if err != nil { env.log(Error, "Host", err.Error()) @@ -482,12 +486,12 @@ func (env *ShellEnvironment) Host() (string, error) { } func (env *ShellEnvironment) GOOS() string { - defer env.trace(time.Now(), "GOOS") + defer env.Trace(time.Now(), "GOOS") return runtime.GOOS } func (env *ShellEnvironment) RunCommand(command string, args ...string) (string, error) { - defer env.trace(time.Now(), "RunCommand", append([]string{command}, args...)...) + defer env.Trace(time.Now(), "RunCommand", append([]string{command}, args...)...) if cmd, ok := env.cmdCache.get(command); ok { command = cmd } @@ -514,7 +518,7 @@ func (env *ShellEnvironment) RunCommand(command string, args ...string) (string, } func (env *ShellEnvironment) RunShellCommand(shell, command string) string { - defer env.trace(time.Now(), "RunShellCommand", shell, command) + defer env.Trace(time.Now(), "RunShellCommand", shell, command) if out, err := env.RunCommand(shell, "-c", command); err == nil { return out } @@ -522,7 +526,7 @@ func (env *ShellEnvironment) RunShellCommand(shell, command string) string { } func (env *ShellEnvironment) CommandPath(command string) string { - defer env.trace(time.Now(), "HasCommand", command) + defer env.Trace(time.Now(), "HasCommand", command) if path, ok := env.cmdCache.get(command); ok { return path } @@ -548,12 +552,12 @@ func (env *ShellEnvironment) HasCommand(command string) bool { } func (env *ShellEnvironment) ErrorCode() int { - defer env.trace(time.Now(), "ErrorCode") + defer env.Trace(time.Now(), "ErrorCode") return env.CmdFlags.ErrorCode } func (env *ShellEnvironment) ExecutionTime() float64 { - defer env.trace(time.Now(), "ExecutionTime") + defer env.Trace(time.Now(), "ExecutionTime") if env.CmdFlags.ExecutionTime < 0 { return 0 } @@ -561,12 +565,12 @@ func (env *ShellEnvironment) ExecutionTime() float64 { } func (env *ShellEnvironment) Flags() *Flags { - defer env.trace(time.Now(), "Flags") + defer env.Trace(time.Now(), "Flags") return env.CmdFlags } func (env *ShellEnvironment) Shell() string { - defer env.trace(time.Now(), "Shell") + defer env.Trace(time.Now(), "Shell") if env.CmdFlags.Shell != "" { return env.CmdFlags.Shell } @@ -591,7 +595,7 @@ func (env *ShellEnvironment) Shell() string { } func (env *ShellEnvironment) HTTPRequest(targetURL string, timeout int, requestModifiers ...HTTPRequestModifier) ([]byte, error) { - defer env.trace(time.Now(), "HTTPRequest", targetURL) + defer env.Trace(time.Now(), "HTTPRequest", targetURL) ctx, cncl := context.WithTimeout(context.Background(), time.Millisecond*time.Duration(timeout)) defer cncl() request, err := http.NewRequestWithContext(ctx, http.MethodGet, targetURL, nil) @@ -624,7 +628,7 @@ func (env *ShellEnvironment) HTTPRequest(targetURL string, timeout int, requestM } func (env *ShellEnvironment) HasParentFilePath(path string) (*FileInfo, error) { - defer env.trace(time.Now(), "HasParentFilePath", path) + defer env.Trace(time.Now(), "HasParentFilePath", path) currentFolder := env.Pwd() for { searchPath := filepath.Join(currentFolder, path) @@ -649,7 +653,7 @@ func (env *ShellEnvironment) HasParentFilePath(path string) (*FileInfo, error) { } func (env *ShellEnvironment) StackCount() int { - defer env.trace(time.Now(), "StackCount") + defer env.Trace(time.Now(), "StackCount") if env.CmdFlags.StackCount < 0 { return 0 } @@ -669,7 +673,7 @@ func (env *ShellEnvironment) Logs() string { } func (env *ShellEnvironment) TemplateCache() *TemplateCache { - defer env.trace(time.Now(), "TemplateCache") + defer env.Trace(time.Now(), "TemplateCache") if env.tmplCache != nil { return env.tmplCache } diff --git a/src/environment/unix.go b/src/environment/unix.go index de475adc..210d3d9a 100644 --- a/src/environment/unix.go +++ b/src/environment/unix.go @@ -13,7 +13,7 @@ import ( ) func (env *ShellEnvironment) Root() bool { - defer env.trace(time.Now(), "Root") + defer env.Trace(time.Now(), "Root") return os.Geteuid() == 0 } @@ -26,7 +26,7 @@ func (env *ShellEnvironment) QueryWindowTitles(processName, windowTitleRegex str } func (env *ShellEnvironment) IsWsl() bool { - defer env.trace(time.Now(), "IsWsl") + defer env.Trace(time.Now(), "IsWsl") // one way to check // version := env.FileContent("/proc/version") // return strings.Contains(version, "microsoft") @@ -35,7 +35,7 @@ func (env *ShellEnvironment) IsWsl() bool { } func (env *ShellEnvironment) IsWsl2() bool { - defer env.trace(time.Now(), "IsWsl2") + defer env.Trace(time.Now(), "IsWsl2") if !env.IsWsl() { return false } @@ -44,7 +44,7 @@ func (env *ShellEnvironment) IsWsl2() bool { } func (env *ShellEnvironment) TerminalWidth() (int, error) { - defer env.trace(time.Now(), "TerminalWidth") + defer env.Trace(time.Now(), "TerminalWidth") if env.CmdFlags.TerminalWidth != 0 { return env.CmdFlags.TerminalWidth, nil } @@ -80,7 +80,7 @@ func (env *ShellEnvironment) Platform() string { } func (env *ShellEnvironment) CachePath() string { - defer env.trace(time.Now(), "CachePath") + defer env.Trace(time.Now(), "CachePath") // get XDG_CACHE_HOME if present if cachePath := returnOrBuildCachePath(env.Getenv("XDG_CACHE_HOME")); len(cachePath) != 0 { return cachePath diff --git a/src/environment/windows.go b/src/environment/windows.go index 4ffa6b38..f0189de6 100644 --- a/src/environment/windows.go +++ b/src/environment/windows.go @@ -18,7 +18,7 @@ import ( ) func (env *ShellEnvironment) Root() bool { - defer env.trace(time.Now(), "Root") + defer env.Trace(time.Now(), "Root") var sid *windows.SID // Although this looks scary, it is directly copied from the @@ -71,7 +71,7 @@ func (env *ShellEnvironment) Home() string { } func (env *ShellEnvironment) QueryWindowTitles(processName, windowTitleRegex string) (string, error) { - defer env.trace(time.Now(), "WindowTitle", windowTitleRegex) + defer env.Trace(time.Now(), "WindowTitle", windowTitleRegex) title, err := queryWindowTitles(processName, windowTitleRegex) if err != nil { env.log(Error, "QueryWindowTitles", err.Error()) @@ -80,17 +80,17 @@ func (env *ShellEnvironment) QueryWindowTitles(processName, windowTitleRegex str } func (env *ShellEnvironment) IsWsl() bool { - defer env.trace(time.Now(), "IsWsl") + defer env.Trace(time.Now(), "IsWsl") return false } func (env *ShellEnvironment) IsWsl2() bool { - defer env.trace(time.Now(), "IsWsl2") + defer env.Trace(time.Now(), "IsWsl2") return false } func (env *ShellEnvironment) TerminalWidth() (int, error) { - defer env.trace(time.Now(), "TerminalWidth") + defer env.Trace(time.Now(), "TerminalWidth") if env.CmdFlags.TerminalWidth != 0 { return env.CmdFlags.TerminalWidth, nil } @@ -113,7 +113,7 @@ func (env *ShellEnvironment) Platform() string { } func (env *ShellEnvironment) CachePath() string { - defer env.trace(time.Now(), "CachePath") + defer env.Trace(time.Now(), "CachePath") // get LOCALAPPDATA if present if cachePath := returnOrBuildCachePath(env.Getenv("LOCALAPPDATA")); len(cachePath) != 0 { return cachePath @@ -145,7 +145,7 @@ func (env *ShellEnvironment) LookWinAppPath(file string) (string, error) { // Returns a variant type if successful; nil and an error if not. // func (env *ShellEnvironment) WindowsRegistryKeyValue(path string) (*WindowsRegistryValue, error) { - env.trace(time.Now(), "WindowsRegistryKeyValue", path) + env.Trace(time.Now(), "WindowsRegistryKeyValue", path) // Format: // "HKLM\Software\Microsoft\Windows NT\CurrentVersion\EditionID" @@ -326,7 +326,7 @@ const ( ) func (env *ShellEnvironment) WifiNetwork() (*WifiInfo, error) { - env.trace(time.Now(), "WifiNetwork") + env.Trace(time.Now(), "WifiNetwork") // Open handle var pdwNegotiatedVersion uint32 var phClientHandle uint32 diff --git a/src/environment/windows_unix.go b/src/environment/windows_unix.go index 3f8e5aeb..5ac7a5c0 100644 --- a/src/environment/windows_unix.go +++ b/src/environment/windows_unix.go @@ -30,7 +30,7 @@ func mapMostLogicalState(currentState, newState battery.State) battery.State { } func (env *ShellEnvironment) BatteryState() (*BatteryInfo, error) { - defer env.trace(time.Now(), "BatteryInfo") + defer env.Trace(time.Now(), "BatteryInfo") parseBatteryInfo := func(batteries []*battery.Battery) *BatteryInfo { var info BatteryInfo diff --git a/src/mock/environment.go b/src/mock/environment.go index f95119fa..211d240f 100644 --- a/src/mock/environment.go +++ b/src/mock/environment.go @@ -3,6 +3,7 @@ package mock import ( "io/fs" "oh-my-posh/environment" + "time" mock "github.com/stretchr/testify/mock" ) @@ -229,3 +230,7 @@ func (env *MockedEnvironment) DirMatchesOneOf(dir string, regexes []string) bool args := env.Called(dir, regexes) return args.Bool(0) } + +func (env *MockedEnvironment) Trace(start time.Time, function string, args ...string) { + _ = env.Called(start, function, args) +}