summaryrefslogtreecommitdiffstats
path: root/pkg/tasks/tasks.go
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2020-03-01 12:30:48 +1100
committerJesse Duffield <jessedduffield@gmail.com>2020-03-04 00:12:23 +1100
commit355f1615aba5b0b75485596fee0ae93d054081d4 (patch)
tree81a932f5ec7ae0bed07d114e7d8bf37cdaf6a08a /pkg/tasks/tasks.go
parent113252b0ae3cb4d9f978398a6292b7f4737034ff (diff)
supporing custom pagers step 1
Diffstat (limited to 'pkg/tasks/tasks.go')
-rw-r--r--pkg/tasks/tasks.go114
1 files changed, 102 insertions, 12 deletions
diff --git a/pkg/tasks/tasks.go b/pkg/tasks/tasks.go
index 26846c439..716de488e 100644
--- a/pkg/tasks/tasks.go
+++ b/pkg/tasks/tasks.go
@@ -4,10 +4,12 @@ import (
"bufio"
"fmt"
"io"
+ "os"
"os/exec"
"sync"
"time"
+ "github.com/jesseduffield/lazygit/pkg/commands"
"github.com/sirupsen/logrus"
)
@@ -60,7 +62,7 @@ func (m *ViewBufferManager) NewCmdTask(cmd *exec.Cmd, linesToRead int) func(chan
go func() {
<-stop
if cmd.ProcessState == nil {
- if err := kill(cmd); err != nil {
+ if err := commands.Kill(cmd); err != nil {
m.Log.Warn(err)
}
}
@@ -105,6 +107,95 @@ func (m *ViewBufferManager) NewCmdTask(cmd *exec.Cmd, linesToRead int) func(chan
select {
case <-stop:
+ m.refreshView()
+ break outer
+ default:
+ }
+ if !ok {
+ m.refreshView()
+ break outer
+ }
+ m.writer.Write(append(scanner.Bytes(), []byte("\n")...))
+ }
+ m.refreshView()
+ case <-stop:
+ m.refreshView()
+ break outer
+ }
+ }
+ m.refreshView()
+
+ if err := cmd.Wait(); err != nil {
+ m.Log.Warn(err)
+ }
+
+ close(done)
+ }()
+
+ m.readLines <- linesToRead
+
+ <-done
+
+ return nil
+ }
+}
+
+func (m *ViewBufferManager) NewPtyTask(ptmx *os.File, cmd *exec.Cmd, linesToRead int, onClose func()) func(chan struct{}) error {
+ return func(stop chan struct{}) error {
+ r := ptmx
+
+ defer ptmx.Close()
+
+ done := make(chan struct{})
+ go func() {
+ <-stop
+ commands.Kill(cmd)
+ ptmx.Close()
+ }()
+
+ loadingMutex := sync.Mutex{}
+
+ // not sure if it's the right move to redefine this or not
+ m.readLines = make(chan int, 1024)
+
+ go func() {
+ scanner := bufio.NewScanner(r)
+ scanner.Split(bufio.ScanLines)
+
+ loaded := false
+
+ go func() {
+ ticker := time.NewTicker(time.Millisecond * 100)
+ defer ticker.Stop()
+ select {
+ case <-ticker.C:
+ loadingMutex.Lock()
+ if !loaded {
+ m.beforeStart()
+ m.writer.Write([]byte("loading..."))
+ m.refreshView()
+ }
+ loadingMutex.Unlock()
+ case <-stop:
+ return
+ }
+ }()
+
+ outer:
+ for {
+ select {
+ case linesToRead := <-m.readLines:
+ for i := 0; i < linesToRead; i++ {
+ ok := scanner.Scan()
+ loadingMutex.Lock()
+ if !loaded {
+ m.beforeStart()
+ loaded = true
+ }
+ loadingMutex.Unlock()
+
+ select {
+ case <-stop:
break outer
default:
}
@@ -124,12 +215,18 @@ func (m *ViewBufferManager) NewCmdTask(cmd *exec.Cmd, linesToRead int) func(chan
m.Log.Warn(err)
}
+ m.refreshView()
+
+ onClose()
+
close(done)
}()
m.readLines <- linesToRead
+ m.Log.Warn("waiting for done channel")
<-done
+ m.Log.Warn("done channel returned")
return nil
}
@@ -141,7 +238,7 @@ func (t *ViewBufferManager) Close() {
return
}
- c := make(chan struct{}, 1)
+ c := make(chan struct{})
go func() {
t.currentTask.Stop()
@@ -170,7 +267,10 @@ func (m *ViewBufferManager) NewTask(f func(stop chan struct{}) error) error {
m.waitingMutex.Lock()
defer m.waitingMutex.Unlock()
+
+ m.Log.Infof("done waiting")
if taskID < m.newTaskId {
+ m.Log.Infof("returning cos the task is obsolete")
return
}
@@ -216,13 +316,3 @@ func (t *Task) Stop() {
t.stopped = true
return
}
-
-// kill kills a process
-func kill(cmd *exec.Cmd) error {
- if cmd.Process == nil {
- // somebody got to it before we were able to, poor bastard
- return nil
- }
-
- return cmd.Process.Kill()
-}