From 1869fda8006731ecc15b748028ce1b9742a4c756 Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Sun, 14 Apr 2024 20:06:25 +0200 Subject: 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. --- pkg/gui/background.go | 3 ++- pkg/gui/controllers/helpers/app_status_helper.go | 14 +++++--------- pkg/gui/controllers/helpers/inline_status_helper.go | 12 +++--------- pkg/gui/controllers/helpers/refresh_helper.go | 6 ++++-- pkg/gui/controllers/local_commits_controller.go | 6 ++---- pkg/gui/controllers/sub_commits_controller.go | 6 ++---- pkg/gui/controllers/workspace_reset_controller.go | 3 ++- pkg/gui/gui.go | 9 ++------- pkg/gui/gui_common.go | 2 +- pkg/gui/types/common.go | 2 +- pkg/tasks/async_handler.go | 7 ++++--- pkg/tasks/async_handler_test.go | 4 ++-- 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() { -- cgit v1.2.3