summaryrefslogtreecommitdiffstats
path: root/pkg/logs
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2022-05-07 15:23:08 +1000
committerJesse Duffield <jessedduffield@gmail.com>2022-05-07 16:02:04 +1000
commitcd5b041b0f8b95b473849d222b71aa2fe3b24899 (patch)
tree87b6610fa4fcbee10390966d47d1adac5e60618f /pkg/logs
parentcf80978f15a60f8edd64990e24224a8f69707869 (diff)
clearer separation of concerns when bootstrapping application
Diffstat (limited to 'pkg/logs')
-rw-r--r--pkg/logs/logs.go34
-rw-r--r--pkg/logs/logs_default.go31
-rw-r--r--pkg/logs/logs_windows.go73
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
+}