diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2022-05-07 15:23:08 +1000 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2022-05-07 16:02:04 +1000 |
commit | cd5b041b0f8b95b473849d222b71aa2fe3b24899 (patch) | |
tree | 87b6610fa4fcbee10390966d47d1adac5e60618f /pkg/logs | |
parent | cf80978f15a60f8edd64990e24224a8f69707869 (diff) |
clearer separation of concerns when bootstrapping application
Diffstat (limited to 'pkg/logs')
-rw-r--r-- | pkg/logs/logs.go | 34 | ||||
-rw-r--r-- | pkg/logs/logs_default.go | 31 | ||||
-rw-r--r-- | pkg/logs/logs_windows.go | 73 |
3 files changed, 138 insertions, 0 deletions
diff --git a/pkg/logs/logs.go b/pkg/logs/logs.go new file mode 100644 index 000000000..a4fe94031 --- /dev/null +++ b/pkg/logs/logs.go @@ -0,0 +1,34 @@ +package logs + +import ( + "fmt" + "log" + "os" + + "github.com/aybabtme/humanlog" + "github.com/jesseduffield/lazygit/pkg/config" +) + +// TailLogs lets us run `lazygit --logs` to print the logs produced by other lazygit processes. +// This makes for easier debugging. +func TailLogs() { + logFilePath, err := config.LogPath() + if err != nil { + log.Fatal(err) + } + + fmt.Printf("Tailing log file %s\n\n", logFilePath) + + opts := humanlog.DefaultOptions + opts.Truncates = false + + _, err = os.Stat(logFilePath) + if err != nil { + if os.IsNotExist(err) { + log.Fatal("Log file does not exist. Run `lazygit --debug` first to create the log file") + } + log.Fatal(err) + } + + TailLogsForPlatform(logFilePath, opts) +} diff --git a/pkg/logs/logs_default.go b/pkg/logs/logs_default.go new file mode 100644 index 000000000..b4474720c --- /dev/null +++ b/pkg/logs/logs_default.go @@ -0,0 +1,31 @@ +//go:build !windows +// +build !windows + +package logs + +import ( + "log" + "os" + + "github.com/aybabtme/humanlog" + "github.com/jesseduffield/lazygit/pkg/secureexec" +) + +func TailLogsForPlatform(logFilePath string, opts *humanlog.HandlerOptions) { + cmd := secureexec.Command("tail", "-f", logFilePath) + + stdout, _ := cmd.StdoutPipe() + if err := cmd.Start(); err != nil { + log.Fatal(err) + } + + if err := humanlog.Scanner(stdout, os.Stdout, opts); err != nil { + log.Fatal(err) + } + + if err := cmd.Wait(); err != nil { + log.Fatal(err) + } + + os.Exit(0) +} diff --git a/pkg/logs/logs_windows.go b/pkg/logs/logs_windows.go new file mode 100644 index 000000000..7fa17db26 --- /dev/null +++ b/pkg/logs/logs_windows.go @@ -0,0 +1,73 @@ +//go:build windows +// +build windows + +package logs + +import ( + "bufio" + "log" + "os" + "strings" + "time" + + "github.com/aybabtme/humanlog" +) + +func TailLogsForPlatform(logFilePath string, opts *humanlog.HandlerOptions) { + var lastModified int64 = 0 + var lastOffset int64 = 0 + for { + stat, err := os.Stat(logFilePath) + if err != nil { + log.Fatal(err) + } + if stat.ModTime().Unix() > lastModified { + err = TailFrom(lastOffset, logFilePath, opts) + if err != nil { + log.Fatal(err) + } + } + lastOffset = stat.Size() + time.Sleep(1 * time.Second) + } +} + +func OpenAndSeek(filepath string, offset int64) (*os.File, error) { + file, err := os.Open(filepath) + if err != nil { + return nil, err + } + + _, err = file.Seek(offset, 0) + if err != nil { + _ = file.Close() + return nil, err + } + return file, nil +} + +func TailFrom(lastOffset int64, logFilePath string, opts *humanlog.HandlerOptions) error { + file, err := OpenAndSeek(logFilePath, lastOffset) + if err != nil { + return err + } + + fileScanner := bufio.NewScanner(file) + var lines []string + for fileScanner.Scan() { + lines = append(lines, fileScanner.Text()) + } + file.Close() + lineCount := len(lines) + lastTen := lines + if lineCount > 10 { + lastTen = lines[lineCount-10:] + } + for _, line := range lastTen { + reader := strings.NewReader(line) + if err := humanlog.Scanner(reader, os.Stdout, opts); err != nil { + log.Fatal(err) + } + } + return nil +} |