summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Haller <stefan@haller-berlin.de>2024-04-14 20:06:25 +0200
committerStefan Haller <stefan@haller-berlin.de>2024-04-18 10:10:30 +0200
commit1869fda8006731ecc15b748028ce1b9742a4c756 (patch)
treef4f3793d6bcd55d14db39c6919c943b30a0848a6
parent5396a706611220077d32d01058d5e4b025eab0de (diff)
Make OnWorker callback return an error
This lets us get rid of a few more calls to Error(), and it simplifies things for clients of OnWorker: they can simply return an error from their callback like we do everywhere else.
-rw-r--r--pkg/gui/background.go3
-rw-r--r--pkg/gui/controllers/helpers/app_status_helper.go14
-rw-r--r--pkg/gui/controllers/helpers/inline_status_helper.go12
-rw-r--r--pkg/gui/controllers/helpers/refresh_helper.go6
-rw-r--r--pkg/gui/controllers/local_commits_controller.go6
-rw-r--r--pkg/gui/controllers/sub_commits_controller.go6
-rw-r--r--pkg/gui/controllers/workspace_reset_controller.go3
-rw-r--r--pkg/gui/gui.go9
-rw-r--r--pkg/gui/gui_common.go2
-rw-r--r--pkg/gui/types/common.go2
-rw-r--r--pkg/tasks/async_handler.go7
-rw-r--r--pkg/tasks/async_handler_test.go4
12 files changed, 30 insertions, 44 deletions
diff --git a/pkg/gui/background.go b/pkg/gui/background.go
index 342e3127e..db267c0dc 100644
--- a/pkg/gui/background.go
+++ b/pkg/gui/background.go
@@ -87,9 +87,10 @@ func (self *BackgroundRoutineMgr) goEvery(interval time.Duration, stop chan stru
if self.pauseBackgroundRefreshes {
continue
}
- self.gui.c.OnWorker(func(gocui.Task) {
+ self.gui.c.OnWorker(func(gocui.Task) error {
_ = function()
done <- struct{}{}
+ return nil
})
// waiting so that we don't bunch up refreshes if the refresh takes longer than the interval
<-done
diff --git a/pkg/gui/controllers/helpers/app_status_helper.go b/pkg/gui/controllers/helpers/app_status_helper.go
index 31bfcca3a..b0d1b3818 100644
--- a/pkg/gui/controllers/helpers/app_status_helper.go
+++ b/pkg/gui/controllers/helpers/app_status_helper.go
@@ -59,15 +59,10 @@ func (self appStatusHelperTask) Continue() {
// withWaitingStatus wraps a function and shows a waiting status while the function is still executing
func (self *AppStatusHelper) WithWaitingStatus(message string, f func(gocui.Task) error) {
- self.c.OnWorker(func(task gocui.Task) {
- err := self.statusMgr().WithWaitingStatus(message, self.renderAppStatus, func(waitingStatusHandle *status.WaitingStatusHandle) error {
+ self.c.OnWorker(func(task gocui.Task) error {
+ return self.statusMgr().WithWaitingStatus(message, self.renderAppStatus, func(waitingStatusHandle *status.WaitingStatusHandle) error {
return f(appStatusHelperTask{task, waitingStatusHandle})
})
- if err != nil {
- self.c.OnUIThread(func() error {
- return err
- })
- }
})
}
@@ -91,7 +86,7 @@ func (self *AppStatusHelper) GetStatusString() string {
}
func (self *AppStatusHelper) renderAppStatus() {
- self.c.OnWorker(func(_ gocui.Task) {
+ self.c.OnWorker(func(_ gocui.Task) error {
ticker := time.NewTicker(time.Millisecond * time.Duration(self.c.UserConfig.Gui.Spinner.Rate))
defer ticker.Stop()
for range ticker.C {
@@ -103,9 +98,10 @@ func (self *AppStatusHelper) renderAppStatus() {
})
if appStatus == "" {
- return
+ break
}
}
+ return nil
})
}
diff --git a/pkg/gui/controllers/helpers/inline_status_helper.go b/pkg/gui/controllers/helpers/inline_status_helper.go
index cfe7eb844..b13f19473 100644
--- a/pkg/gui/controllers/helpers/inline_status_helper.go
+++ b/pkg/gui/controllers/helpers/inline_status_helper.go
@@ -68,17 +68,11 @@ func (self *InlineStatusHelper) WithInlineStatus(opts InlineStatusOpts, f func(g
view := context.GetView()
visible := view.Visible && self.windowHelper.TopViewInWindow(context.GetWindowName(), false) == view
if visible && context.IsItemVisible(opts.Item) {
- self.c.OnWorker(func(task gocui.Task) {
+ self.c.OnWorker(func(task gocui.Task) error {
self.start(opts)
+ defer self.stop(opts)
- err := f(inlineStatusHelperTask{task, self, opts})
- if err != nil {
- self.c.OnUIThread(func() error {
- return err
- })
- }
-
- self.stop(opts)
+ return f(inlineStatusHelperTask{task, self, opts})
})
} else {
message := presentation.ItemOperationToString(opts.Operation, self.c.Tr)
diff --git a/pkg/gui/controllers/helpers/refresh_helper.go b/pkg/gui/controllers/helpers/refresh_helper.go
index 811795639..f6c5768c8 100644
--- a/pkg/gui/controllers/helpers/refresh_helper.go
+++ b/pkg/gui/controllers/helpers/refresh_helper.go
@@ -104,8 +104,9 @@ func (self *RefreshHelper) Refresh(options types.RefreshOptions) error {
// everything happens fast and it's better to have everything update
// in the one frame
if !self.c.InDemo() && options.Mode == types.ASYNC {
- self.c.OnWorker(func(t gocui.Task) {
+ self.c.OnWorker(func(t gocui.Task) error {
f()
+ return nil
})
} else {
wg.Add(1)
@@ -246,10 +247,11 @@ func getModeName(mode types.RefreshMode) string {
func (self *RefreshHelper) refreshReflogCommitsConsideringStartup() {
switch self.c.State().GetRepoState().GetStartupStage() {
case types.INITIAL:
- self.c.OnWorker(func(_ gocui.Task) {
+ self.c.OnWorker(func(_ gocui.Task) error {
_ = self.refreshReflogCommits()
self.refreshBranches(false, true)
self.c.State().GetRepoState().SetStartupStage(types.COMPLETE)
+ return nil
})
case types.COMPLETE:
diff --git a/pkg/gui/controllers/local_commits_controller.go b/pkg/gui/controllers/local_commits_controller.go
index d0066fd70..b889ec361 100644
--- a/pkg/gui/controllers/local_commits_controller.go
+++ b/pkg/gui/controllers/local_commits_controller.go
@@ -1153,10 +1153,8 @@ func (self *LocalCommitsController) GetOnFocus() func(types.OnFocusOpts) error {
context := self.context()
if context.GetSelectedLineIdx() > COMMIT_THRESHOLD && context.GetLimitCommits() {
context.SetLimitCommits(false)
- self.c.OnWorker(func(_ gocui.Task) {
- if err := self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.COMMITS}}); err != nil {
- _ = self.c.Error(err)
- }
+ self.c.OnWorker(func(_ gocui.Task) error {
+ return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.COMMITS}})
})
}
diff --git a/pkg/gui/controllers/sub_commits_controller.go b/pkg/gui/controllers/sub_commits_controller.go
index 90c6461a6..9ce708272 100644
--- a/pkg/gui/controllers/sub_commits_controller.go
+++ b/pkg/gui/controllers/sub_commits_controller.go
@@ -68,10 +68,8 @@ func (self *SubCommitsController) GetOnFocus() func(types.OnFocusOpts) error {
context := self.context()
if context.GetSelectedLineIdx() > COMMIT_THRESHOLD && context.GetLimitCommits() {
context.SetLimitCommits(false)
- self.c.OnWorker(func(_ gocui.Task) {
- if err := self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.SUB_COMMITS}}); err != nil {
- _ = self.c.Error(err)
- }
+ self.c.OnWorker(func(_ gocui.Task) error {
+ return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.SUB_COMMITS}})
})
}
diff --git a/pkg/gui/controllers/workspace_reset_controller.go b/pkg/gui/controllers/workspace_reset_controller.go
index 0cd799b60..cc0f4cb5a 100644
--- a/pkg/gui/controllers/workspace_reset_controller.go
+++ b/pkg/gui/controllers/workspace_reset_controller.go
@@ -180,7 +180,7 @@ func (self *FilesController) Explode(v *gocui.View, onDone func()) {
style.FgBlack.SetBold(),
}
- self.c.OnWorker(func(_ gocui.Task) {
+ self.c.OnWorker(func(_ gocui.Task) error {
max := 25
for i := 0; i < max; i++ {
image := getExplodeImage(width, height, i, max)
@@ -198,6 +198,7 @@ func (self *FilesController) Explode(v *gocui.View, onDone func()) {
onDone()
return nil
})
+ return nil
})
}
diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go
index 37c181b16..90dd4ea77 100644
--- a/pkg/gui/gui.go
+++ b/pkg/gui/gui.go
@@ -958,13 +958,8 @@ func (gui *Gui) onUIThread(f func() error) {
})
}
-func (gui *Gui) onWorker(f func(t gocui.Task)) {
- gui.g.OnWorker(func(t gocui.Task) error {
- // Hack: adapt to the changed signature in the simplest possible way.
- // We'll make this cleaner in subsequent commits in this branch.
- f(t)
- return nil
- })
+func (gui *Gui) onWorker(f func(gocui.Task) error) {
+ gui.g.OnWorker(f)
}
func (gui *Gui) getWindowDimensions(informationStr string, appStatus string) map[string]boxlayout.Dimensions {
diff --git a/pkg/gui/gui_common.go b/pkg/gui/gui_common.go
index f45440312..a75aa3658 100644
--- a/pkg/gui/gui_common.go
+++ b/pkg/gui/gui_common.go
@@ -151,7 +151,7 @@ func (self *guiCommon) OnUIThread(f func() error) {
self.gui.onUIThread(f)
}
-func (self *guiCommon) OnWorker(f func(gocui.Task)) {
+func (self *guiCommon) OnWorker(f func(gocui.Task) error) {
self.gui.onWorker(f)
}
diff --git a/pkg/gui/types/common.go b/pkg/gui/types/common.go
index 694cdcc56..6675668b0 100644
--- a/pkg/gui/types/common.go
+++ b/pkg/gui/types/common.go
@@ -85,7 +85,7 @@ type IGuiCommon interface {
OnUIThread(f func() error)
// Runs a function in a goroutine. Use this whenever you want to run a goroutine and keep track of the fact
// that lazygit is still busy. See docs/dev/Busy.md
- OnWorker(f func(gocui.Task))
+ OnWorker(f func(gocui.Task) error)
// Function to call at the end of our 'layout' function which renders views
// For example, you may want a view's line to be focused only after that view is
// resized, if in accordion mode.
diff --git a/pkg/tasks/async_handler.go b/pkg/tasks/async_handler.go
index 6f3f41b29..658687af9 100644
--- a/pkg/tasks/async_handler.go
+++ b/pkg/tasks/async_handler.go
@@ -18,10 +18,10 @@ type AsyncHandler struct {
lastId int
mutex deadlock.Mutex
onReject func()
- onWorker func(func(gocui.Task))
+ onWorker func(func(gocui.Task) error)
}
-func NewAsyncHandler(onWorker func(func(gocui.Task))) *AsyncHandler {
+func NewAsyncHandler(onWorker func(func(gocui.Task) error)) *AsyncHandler {
return &AsyncHandler{
mutex: deadlock.Mutex{},
onWorker: onWorker,
@@ -34,9 +34,10 @@ func (self *AsyncHandler) Do(f func() func()) {
id := self.currentId
self.mutex.Unlock()
- self.onWorker(func(gocui.Task) {
+ self.onWorker(func(gocui.Task) error {
after := f()
self.handle(after, id)
+ return nil
})
}
diff --git a/pkg/tasks/async_handler_test.go b/pkg/tasks/async_handler_test.go
index ebead7aa7..6da363cd9 100644
--- a/pkg/tasks/async_handler_test.go
+++ b/pkg/tasks/async_handler_test.go
@@ -13,8 +13,8 @@ func TestAsyncHandler(t *testing.T) {
wg := sync.WaitGroup{}
wg.Add(2)
- onWorker := func(f func(gocui.Task)) {
- go f(gocui.NewFakeTask())
+ onWorker := func(f func(gocui.Task) error) {
+ go func() { _ = f(gocui.NewFakeTask()) }()
}
handler := NewAsyncHandler(onWorker)
handler.onReject = func() {