From f6a9c727faa06142208d8189441414b6bedb7b98 Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Tue, 7 Aug 2018 18:05:43 +1000 Subject: [PATCH] run subprocess cleanly --- gitcommands.go | 17 ++++++++--------- gui.go | 14 ++++++-------- main.go | 22 +++++++++++++++++++--- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/gitcommands.go b/gitcommands.go index 27b567766..862b93d2e 100644 --- a/gitcommands.go +++ b/gitcommands.go @@ -349,15 +349,14 @@ func getOpenCommand() (string, string) { } func runSubProcess(g *gocui.Gui, cmdName string, commandArgs ...string) { - // TODO: find a way to wait for the subprocess without having to - // close and reinitialize the gui - // g.Close() // TODO: find a way to make close properly after uncommenting - cmd := exec.Command(cmdName, commandArgs...) - cmd.Stdin = os.Stdin - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - cmd.Run() - run() // start another Gui + subprocess = exec.Command(cmdName, commandArgs...) + subprocess.Stdin = os.Stdin + subprocess.Stdout = os.Stdout + subprocess.Stderr = os.Stderr + + g.Update(func(g *gocui.Gui) error { + return ErrSubprocess + }) } func getBranchDiff(branch string, baseBranch string) (string, error) { diff --git a/gui.go b/gui.go index b2bda8c72..a3a92bd06 100644 --- a/gui.go +++ b/gui.go @@ -5,7 +5,6 @@ import ( // "io" // "io/ioutil" - "log" "strings" "time" @@ -321,10 +320,10 @@ func updateLoader(g *gocui.Gui) { } } -func run() { +func run() (err error) { g, err := gocui.NewGui(gocui.OutputNormal, OverlappingEdges) if err != nil { - log.Panicln(err) + return } defer g.Close() @@ -343,13 +342,12 @@ func run() { g.SetManagerFunc(layout) - if err := keybindings(g); err != nil { - log.Panicln(err) + if err = keybindings(g); err != nil { + return } - if err := g.MainLoop(); err != nil && err != gocui.ErrQuit { - log.Panicln(err) - } + err = g.MainLoop() + return } func quit(g *gocui.Gui, v *gocui.View) error { diff --git a/main.go b/main.go index b3586b04e..a0b87d716 100644 --- a/main.go +++ b/main.go @@ -1,19 +1,25 @@ package main import ( + "errors" "flag" "fmt" "log" "os" + "os/exec" "os/user" "time" "github.com/fatih/color" + "github.com/jesseduffield/gocui" ) +// ErrSubProcess is raised when we are running a subprocess var ( - startTime time.Time - debugging bool + startTime time.Time + debugging bool + ErrSubprocess = errors.New("running subprocess") + subprocess *exec.Cmd ) func homeDirectory() string { @@ -65,5 +71,15 @@ func main() { startTime = time.Now() verifyInGitRepo() navigateToRepoRootDirectory() - run() + for { + if err := run(); err != nil { + if err == gocui.ErrQuit { + break + } else if err == ErrSubprocess { + subprocess.Run() + } else { + log.Panicln(err) + } + } + } }