1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-08-07 22:02:56 +03:00

Hack: log commands with pids to /tmp/git.log

This commit is contained in:
Stefan Haller
2025-05-02 18:20:10 +02:00
parent c2aab81f54
commit 815829d52c
8 changed files with 62 additions and 3 deletions

View File

@@ -176,7 +176,7 @@ func (self *BranchLoader) GetBehindBaseBranchValuesForAllBranches(
Arg("--count"). Arg("--count").
Arg(fmt.Sprintf("%s...%s", branch.FullRefName(), baseBranch)). Arg(fmt.Sprintf("%s...%s", branch.FullRefName(), baseBranch)).
ToArgv(), ToArgv(),
).DontLog().RunWithOutput() ).DontLog().SuppressLogHack().RunWithOutput()
if err != nil { if err != nil {
return err return err
} }
@@ -220,7 +220,7 @@ func (self *BranchLoader) GetBaseBranch(branch *models.Branch, mainBranches *Mai
Arg("--format=%(refname)"). Arg("--format=%(refname)").
Arg(mainBranches.Get()...). Arg(mainBranches.Get()...).
ToArgv(), ToArgv(),
).DontLog().RunWithOutput() ).DontLog().SuppressLogHack().RunWithOutput()
if err != nil { if err != nil {
return "", err return "", err
} }

View File

@@ -71,7 +71,7 @@ func (self *MainBranches) GetMergeBase(refName string) string {
output, _ := self.cmd.New( output, _ := self.cmd.New(
NewGitCmd("merge-base").Arg(refName).Arg(mainBranches...). NewGitCmd("merge-base").Arg(refName).Arg(mainBranches...).
ToArgv(), ToArgv(),
).DontLog().RunWithOutput() ).DontLog().SuppressLogHack().RunWithOutput()
return ignoringWarnings(output) return ignoringWarnings(output)
} }

View File

@@ -19,6 +19,8 @@ type CmdObj struct {
// see DontLog() // see DontLog()
dontLog bool dontLog bool
LogHackSuppressed bool
// see StreamOutput() // see StreamOutput()
streamOutput bool streamOutput bool
@@ -111,6 +113,11 @@ func (self *CmdObj) DontLog() *CmdObj {
return self return self
} }
func (self *CmdObj) SuppressLogHack() *CmdObj {
self.LogHackSuppressed = true
return self
}
// This returns false if DontLog() was called // This returns false if DontLog() was called
func (self *CmdObj) ShouldLog() bool { func (self *CmdObj) ShouldLog() bool {
return !self.dontLog return !self.dontLog

View File

@@ -3,7 +3,9 @@ package oscommands
import ( import (
"bufio" "bufio"
"bytes" "bytes"
"fmt"
"io" "io"
"os"
"os/exec" "os/exec"
"regexp" "regexp"
"strings" "strings"
@@ -29,6 +31,16 @@ type cmdObjRunner struct {
var _ ICmdObjRunner = &cmdObjRunner{} var _ ICmdObjRunner = &cmdObjRunner{}
func LogCmd(message string) {
f, err := os.OpenFile("/tmp/git.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0o644)
if err != nil {
return
}
timestamp := time.Now().Format(time.DateTime)
_, _ = f.WriteString(fmt.Sprintf("%s: # lazygit # %s\n", timestamp, message))
_ = f.Close()
}
func (self *cmdObjRunner) Run(cmdObj *CmdObj) error { func (self *cmdObjRunner) Run(cmdObj *CmdObj) error {
if cmdObj.Mutex() != nil { if cmdObj.Mutex() != nil {
cmdObj.Mutex().Lock() cmdObj.Mutex().Lock()
@@ -105,7 +117,13 @@ func (self *cmdObjRunner) RunWithOutputAux(cmdObj *CmdObj) (string, error) {
} }
t := time.Now() t := time.Now()
if !cmdObj.LogHackSuppressed {
LogCmd(fmt.Sprintf("Starting cmd: %s", cmdObj.ToString()))
}
output, err := sanitisedCommandOutput(cmdObj.GetCmd().CombinedOutput()) output, err := sanitisedCommandOutput(cmdObj.GetCmd().CombinedOutput())
if !cmdObj.LogHackSuppressed {
LogCmd(fmt.Sprintf("Done running cmd: %s, pid: %d", cmdObj.ToString(), cmdObj.GetCmd().Process.Pid))
}
if err != nil { if err != nil {
self.log.WithField("command", cmdObj.ToString()).Error(output) self.log.WithField("command", cmdObj.ToString()).Error(output)
} }
@@ -127,7 +145,13 @@ func (self *cmdObjRunner) RunWithOutputsAux(cmdObj *CmdObj) (string, string, err
cmd := cmdObj.GetCmd() cmd := cmdObj.GetCmd()
cmd.Stdout = &outBuffer cmd.Stdout = &outBuffer
cmd.Stderr = &errBuffer cmd.Stderr = &errBuffer
if !cmdObj.LogHackSuppressed {
LogCmd(fmt.Sprintf("Starting cmd: %s", cmdObj.ToString()))
}
err := cmd.Run() err := cmd.Run()
if !cmdObj.LogHackSuppressed {
LogCmd(fmt.Sprintf("Done running cmd: %s, pid: %d", cmdObj.ToString(), cmdObj.GetCmd().Process.Pid))
}
self.log.Infof("%s (%s)", cmdObj.ToString(), time.Since(t)) self.log.Infof("%s (%s)", cmdObj.ToString(), time.Since(t))
@@ -167,6 +191,10 @@ func (self *cmdObjRunner) RunAndProcessLines(cmdObj *CmdObj, onLine func(line st
return err return err
} }
if !cmdObj.LogHackSuppressed {
LogCmd(fmt.Sprintf("Started cmd: %s, pid: %d", cmdObj.ToString(), cmdObj.GetCmd().Process.Pid))
}
for scanner.Scan() { for scanner.Scan() {
line := scanner.Text() line := scanner.Text()
stop, err := onLine(line) stop, err := onLine(line)
@@ -174,18 +202,24 @@ func (self *cmdObjRunner) RunAndProcessLines(cmdObj *CmdObj, onLine func(line st
return err return err
} }
if stop { if stop {
LogCmd(fmt.Sprintf("Killing cmd pid: %d", cmdObj.GetCmd().Process.Pid))
_ = Kill(cmd) _ = Kill(cmd)
break break
} }
} }
if scanner.Err() != nil { if scanner.Err() != nil {
LogCmd(fmt.Sprintf("Scanner failed, killing cmd pid: %d", cmdObj.GetCmd().Process.Pid))
_ = Kill(cmd) _ = Kill(cmd)
return scanner.Err() return scanner.Err()
} }
_ = cmd.Wait() _ = cmd.Wait()
if !cmdObj.LogHackSuppressed {
LogCmd(fmt.Sprintf("Done running cmd: %s, pid: %d", cmdObj.ToString(), cmdObj.GetCmd().Process.Pid))
}
self.log.Infof("%s (%s)", cmdObj.ToString(), time.Since(t)) self.log.Infof("%s (%s)", cmdObj.ToString(), time.Since(t))
return nil return nil
@@ -361,6 +395,8 @@ func (self *cmdObjRunner) processOutput(
// Note that we don't break the loop after this, because we // Note that we don't break the loop after this, because we
// still need to drain the output, otherwise the Wait() call // still need to drain the output, otherwise the Wait() call
// later might block. // later might block.
LogCmd(fmt.Sprintf("Killing cmd pid: %d", cmdObj.GetCmd().Process.Pid))
if err := Kill(cmdObj.GetCmd()); err != nil { if err := Kill(cmdObj.GetCmd()); err != nil {
self.log.Error(err) self.log.Error(err)
} }
@@ -454,6 +490,8 @@ func (self *cmdObjRunner) getCmdHandlerNonPty(cmd *exec.Cmd) (*cmdHandler, error
return nil, err return nil, err
} }
LogCmd(fmt.Sprintf("Started cmd: %s, pid: %d", cmd.Args, cmd.Process.Pid))
return &cmdHandler{ return &cmdHandler{
stdoutPipe: stdoutReader, stdoutPipe: stdoutReader,
stdinPipe: buf, stdinPipe: buf,

View File

@@ -4,6 +4,7 @@
package oscommands package oscommands
import ( import (
"fmt"
"os/exec" "os/exec"
"github.com/creack/pty" "github.com/creack/pty"
@@ -17,6 +18,8 @@ func (self *cmdObjRunner) getCmdHandlerPty(cmd *exec.Cmd) (*cmdHandler, error) {
return nil, err return nil, err
} }
LogCmd(fmt.Sprintf("Started cmd: %s, pid: %d", cmd.Args, cmd.Process.Pid))
return &cmdHandler{ return &cmdHandler{
stdoutPipe: ptmx, stdoutPipe: ptmx,
stdinPipe: ptmx, stdinPipe: ptmx,

View File

@@ -4,6 +4,7 @@
package gui package gui
import ( import (
"fmt"
"io" "io"
"os" "os"
"os/exec" "os/exec"
@@ -11,6 +12,7 @@ import (
"github.com/creack/pty" "github.com/creack/pty"
"github.com/jesseduffield/gocui" "github.com/jesseduffield/gocui"
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
"github.com/jesseduffield/lazygit/pkg/utils" "github.com/jesseduffield/lazygit/pkg/utils"
"github.com/samber/lo" "github.com/samber/lo"
) )
@@ -82,6 +84,8 @@ func (gui *Gui) newPtyTask(view *gocui.View, cmd *exec.Cmd, prefix string) error
gui.c.Log.Error(err) gui.c.Log.Error(err)
} }
oscommands.LogCmd(fmt.Sprintf("Started cmd: %s, pid: %d", cmd.Args, cmd.Process.Pid))
gui.Mutexes.PtyMutex.Lock() gui.Mutexes.PtyMutex.Lock()
gui.viewPtmxMap[view.Name()] = ptmx gui.viewPtmxMap[view.Name()] = ptmx
gui.Mutexes.PtyMutex.Unlock() gui.Mutexes.PtyMutex.Unlock()

View File

@@ -1,11 +1,13 @@
package gui package gui
import ( import (
"fmt"
"io" "io"
"os/exec" "os/exec"
"strings" "strings"
"github.com/jesseduffield/gocui" "github.com/jesseduffield/gocui"
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
"github.com/jesseduffield/lazygit/pkg/tasks" "github.com/jesseduffield/lazygit/pkg/tasks"
) )
@@ -29,6 +31,8 @@ func (gui *Gui) newCmdTask(view *gocui.View, cmd *exec.Cmd, prefix string) error
gui.c.Log.Error(err) gui.c.Log.Error(err)
} }
oscommands.LogCmd(fmt.Sprintf("Started cmd: %s, pid: %d", cmd.Args, cmd.Process.Pid))
return cmd, r return cmd, r
} }

View File

@@ -168,6 +168,7 @@ func (self *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), p
self.throttle = time.Since(startTime) < THROTTLE_TIME && timeToStart > COMMAND_START_THRESHOLD self.throttle = time.Since(startTime) < THROTTLE_TIME && timeToStart > COMMAND_START_THRESHOLD
// Kill the still-running command. // Kill the still-running command.
oscommands.LogCmd(fmt.Sprintf("Killing cmd pid: %d", cmd.Process.Pid))
if err := oscommands.Kill(cmd); err != nil { if err := oscommands.Kill(cmd); err != nil {
if !strings.Contains(err.Error(), "process already finished") { if !strings.Contains(err.Error(), "process already finished") {
self.Log.Errorf("error when trying to kill cmd task: %v; Command: %v %v", err, cmd.Path, cmd.Args) self.Log.Errorf("error when trying to kill cmd task: %v; Command: %v %v", err, cmd.Path, cmd.Args)
@@ -307,6 +308,8 @@ func (self *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), p
default: default:
self.Log.Errorf("Unexpected error when running cmd task: %v; Failed command: %v %v", err, cmd.Path, cmd.Args) self.Log.Errorf("Unexpected error when running cmd task: %v; Failed command: %v %v", err, cmd.Path, cmd.Args)
} }
} else {
oscommands.LogCmd(fmt.Sprintf("Done running cmd pid: %d", cmd.Process.Pid))
} }
// calling this here again in case the program ended on its own accord // calling this here again in case the program ended on its own accord