From 8c5c83cdf23a3df985fab6d6b318a8e111683e66 Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Sat, 18 May 2019 12:51:06 +1000 Subject: [PATCH] show logs of selected containers --- pkg/gui/containers_panel.go | 49 +++++++++---------------------------- pkg/gui/gui.go | 8 ++++++ 2 files changed, 20 insertions(+), 37 deletions(-) diff --git a/pkg/gui/containers_panel.go b/pkg/gui/containers_panel.go index ab558cde..558acf16 100644 --- a/pkg/gui/containers_panel.go +++ b/pkg/gui/containers_panel.go @@ -1,14 +1,11 @@ package gui import ( - "bufio" - "context" "fmt" - "io" + "os/exec" "time" "github.com/davecgh/go-spew/spew" - "github.com/docker/docker/api/types" "github.com/jesseduffield/gocui" "github.com/jesseduffield/lazydocker/pkg/commands" "github.com/jesseduffield/lazydocker/pkg/utils" @@ -71,54 +68,32 @@ func (gui *Gui) handleContainerSelect(g *gocui.Gui, v *gocui.View, alreadySelect // return err // } - logsReader, err := gui.DockerCommand.Client.ContainerLogs(context.Background(), container.Container.ID, types.ContainerLogsOptions{ - ShowStdout: true, - ShowStderr: true, - Follow: true, - Tail: "20", - Timestamps: true, - }) - if err != nil { - return err - } - mainView := gui.getMainView() gui.State.MainWriterID++ writerID := gui.State.MainWriterID mainView.Clear() - gui.Log.Warn(writerID) + mainView.SetOrigin(0, 0) + mainView.SetCursor(0, 0) + mainView.Autoscroll = true + + var cmd *exec.Cmd + cmd = gui.OSCommand.RunCustomCommand("docker logs --since=60m --timestamps " + container.ID) + + cmd.Stdout = mainView + cmd.Start() go func() { - defer logsReader.Close() - - time.Sleep(time.Second / 10) - - rd := bufio.NewReader(logsReader) for { + time.Sleep(time.Second / 100) if gui.State.MainWriterID != writerID { + cmd.Process.Kill() return } - - line, err := rd.ReadString('\n') - if err != nil { - if err == io.EOF { - return - } - - gui.Log.Errorf("read file line error: %v", err) - return - } - gui.g.Update(func(g *gocui.Gui) error { - mainView.Write([]byte(line)) - return nil - }) } }() return nil - - // return gui.renderString(g, "main", string(data)) } func (gui *Gui) refreshContainers() error { diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index 3c837c9f..f0f5a257 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -479,6 +479,7 @@ func (gui *Gui) Run() error { // TODO: see if this is right // gui.goEvery(time.Second*10, gui.refreshContainers) gui.goEvery(time.Millisecond*50, gui.renderAppStatus) + gui.goEvery(time.Millisecond*10, gui.reRender) }() g.SetManager(gocui.ManagerFunc(gui.layout), gocui.ManagerFunc(gui.getFocusLayout())) @@ -491,6 +492,13 @@ func (gui *Gui) Run() error { return err } +func (gui *Gui) reRender() error { + gui.g.Update(func(g *gocui.Gui) error { + return nil + }) + return nil +} + // RunWithSubprocesses loops, instantiating a new gocui.Gui with each iteration // if the error returned from a run is a ErrSubProcess, it runs the subprocess // otherwise it handles the error, possibly by quitting the application