Skip to content

Commit c240c0c

Browse files
committed
Read all lines from task when jumping to bottom
1 parent 03234f1 commit c240c0c

File tree

3 files changed

+40
-11
lines changed

3 files changed

+40
-11
lines changed

pkg/gui/controllers/view_selection_controller.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,15 @@ func (self *ViewSelectionController) handleGotoTop() error {
9595
}
9696

9797
func (self *ViewSelectionController) handleGotoBottom() error {
98-
v := self.Context().GetView()
99-
self.handleLineChange(v.ViewLinesHeight())
98+
if manager := self.c.GetViewBufferManagerForView(self.context.GetView()); manager != nil {
99+
manager.ReadToEnd(func() {
100+
self.c.OnUIThread(func() error {
101+
v := self.Context().GetView()
102+
self.handleLineChange(v.ViewLinesHeight())
103+
return nil
104+
})
105+
})
106+
}
107+
100108
return nil
101109
}

pkg/tasks/tasks.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ type LinesToRead struct {
7070
// do an initial refresh. Only set for the initial read request; -1 for
7171
// subsequent requests.
7272
InitialRefreshAfter int
73+
74+
// Function to call after reading the lines is done
75+
Then func()
7376
}
7477

7578
func (m *ViewBufferManager) GetTaskKey() string {
@@ -105,6 +108,16 @@ func (self *ViewBufferManager) ReadLines(n int) {
105108
}
106109
}
107110

111+
func (self *ViewBufferManager) ReadToEnd(then func()) {
112+
if self.readLines != nil {
113+
go utils.Safe(func() {
114+
self.readLines <- LinesToRead{Total: -1, InitialRefreshAfter: -1, Then: then}
115+
})
116+
} else if then != nil {
117+
then()
118+
}
119+
}
120+
108121
func (self *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), prefix string, linesToRead LinesToRead, onDoneFn func()) func(TaskOpts) error {
109122
return func(opts TaskOpts) error {
110123
var onDoneOnce sync.Once
@@ -234,11 +247,17 @@ func (self *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), p
234247
case <-opts.Stop:
235248
break outer
236249
case linesToRead := <-self.readLines:
237-
for i := 0; i < linesToRead.Total; i++ {
250+
callThen := func() {
251+
if linesToRead.Then != nil {
252+
linesToRead.Then()
253+
}
254+
}
255+
for i := 0; linesToRead.Total == -1 || i < linesToRead.Total; i++ {
238256
var ok bool
239257
var line []byte
240258
select {
241259
case <-opts.Stop:
260+
callThen()
242261
break outer
243262
case line, ok = <-lineChan:
244263
break
@@ -258,6 +277,7 @@ func (self *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), p
258277
// if we're here then there's nothing left to scan from the source
259278
// so we're at the EOF and can flush the stale content
260279
self.onEndOfInput()
280+
callThen()
261281
break outer
262282
}
263283
writeToView(append(line, '\n'))
@@ -272,6 +292,7 @@ func (self *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), p
272292
}
273293
refreshViewIfStale()
274294
onFirstPageShown()
295+
callThen()
275296
}
276297
}
277298

pkg/tasks/tasks_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func TestNewCmdTaskInstantStop(t *testing.T) {
5252
return cmd, reader
5353
}
5454

55-
fn := manager.NewCmdTask(start, "prefix\n", LinesToRead{20, -1}, onDone)
55+
fn := manager.NewCmdTask(start, "prefix\n", LinesToRead{20, -1, nil}, onDone)
5656

5757
_ = fn(TaskOpts{Stop: stop, InitialContentLoaded: func() { task.Done() }})
5858

@@ -115,7 +115,7 @@ func TestNewCmdTask(t *testing.T) {
115115
return cmd, reader
116116
}
117117

118-
fn := manager.NewCmdTask(start, "prefix\n", LinesToRead{20, -1}, onDone)
118+
fn := manager.NewCmdTask(start, "prefix\n", LinesToRead{20, -1, nil}, onDone)
119119
wg := sync.WaitGroup{}
120120
wg.Add(1)
121121
go func() {
@@ -184,37 +184,37 @@ func TestNewCmdTaskRefresh(t *testing.T) {
184184
{
185185
"total < initialRefreshAfter",
186186
150,
187-
LinesToRead{100, 120},
187+
LinesToRead{100, 120, nil},
188188
[]int{100},
189189
},
190190
{
191191
"total == initialRefreshAfter",
192192
150,
193-
LinesToRead{100, 100},
193+
LinesToRead{100, 100, nil},
194194
[]int{100},
195195
},
196196
{
197197
"total > initialRefreshAfter",
198198
150,
199-
LinesToRead{100, 50},
199+
LinesToRead{100, 50, nil},
200200
[]int{50, 100},
201201
},
202202
{
203203
"initialRefreshAfter == -1",
204204
150,
205-
LinesToRead{100, -1},
205+
LinesToRead{100, -1, nil},
206206
[]int{100},
207207
},
208208
{
209209
"totalTaskLines < initialRefreshAfter",
210210
25,
211-
LinesToRead{100, 50},
211+
LinesToRead{100, 50, nil},
212212
[]int{25},
213213
},
214214
{
215215
"totalTaskLines between total and initialRefreshAfter",
216216
75,
217-
LinesToRead{100, 50},
217+
LinesToRead{100, 50, nil},
218218
[]int{50, 75},
219219
},
220220
}

0 commit comments

Comments
 (0)