1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-06-04 23:37:41 +02:00

Get rid of a lot of error return values (#3890)

- **PR Description**

Change many functions in the gui package (and some in gocui) to no
longer return errors.

There might be more that could be changed in this way, but I feel these
are the main ones.

Fixes #3887.
This commit is contained in:
Stefan Haller 2024-09-06 08:48:44 +02:00 committed by GitHub
commit 4c6c915a77
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
121 changed files with 1171 additions and 716 deletions

8
go.mod
View File

@ -16,7 +16,7 @@ require (
github.com/integrii/flaggy v1.4.0 github.com/integrii/flaggy v1.4.0
github.com/jesseduffield/generics v0.0.0-20220320043834-727e535cbe68 github.com/jesseduffield/generics v0.0.0-20220320043834-727e535cbe68
github.com/jesseduffield/go-git/v5 v5.1.2-0.20221018185014-fdd53fef665d github.com/jesseduffield/go-git/v5 v5.1.2-0.20221018185014-fdd53fef665d
github.com/jesseduffield/gocui v0.3.1-0.20240824154427-0fc91d5098e4 github.com/jesseduffield/gocui v0.3.1-0.20240906064314-bfab49c720d7
github.com/jesseduffield/kill v0.0.0-20220618033138-bfbe04675d10 github.com/jesseduffield/kill v0.0.0-20220618033138-bfbe04675d10
github.com/jesseduffield/lazycore v0.0.0-20221012050358-03d2e40243c5 github.com/jesseduffield/lazycore v0.0.0-20221012050358-03d2e40243c5
github.com/jesseduffield/minimal/gitignore v0.3.3-0.20211018110810-9cde264e6b1e github.com/jesseduffield/minimal/gitignore v0.3.3-0.20211018110810-9cde264e6b1e
@ -75,8 +75,8 @@ require (
github.com/xanzy/ssh-agent v0.2.1 // indirect github.com/xanzy/ssh-agent v0.2.1 // indirect
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect
golang.org/x/net v0.7.0 // indirect golang.org/x/net v0.7.0 // indirect
golang.org/x/sys v0.24.0 // indirect golang.org/x/sys v0.25.0 // indirect
golang.org/x/term v0.23.0 // indirect golang.org/x/term v0.24.0 // indirect
golang.org/x/text v0.17.0 // indirect golang.org/x/text v0.18.0 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect
) )

16
go.sum
View File

@ -188,8 +188,8 @@ github.com/jesseduffield/generics v0.0.0-20220320043834-727e535cbe68 h1:EQP2Tv8T
github.com/jesseduffield/generics v0.0.0-20220320043834-727e535cbe68/go.mod h1:+LLj9/WUPAP8LqCchs7P+7X0R98HiFujVFANdNaxhGk= github.com/jesseduffield/generics v0.0.0-20220320043834-727e535cbe68/go.mod h1:+LLj9/WUPAP8LqCchs7P+7X0R98HiFujVFANdNaxhGk=
github.com/jesseduffield/go-git/v5 v5.1.2-0.20221018185014-fdd53fef665d h1:bO+OmbreIv91rCe8NmscRwhFSqkDJtzWCPV4Y+SQuXE= github.com/jesseduffield/go-git/v5 v5.1.2-0.20221018185014-fdd53fef665d h1:bO+OmbreIv91rCe8NmscRwhFSqkDJtzWCPV4Y+SQuXE=
github.com/jesseduffield/go-git/v5 v5.1.2-0.20221018185014-fdd53fef665d/go.mod h1:nGNEErzf+NRznT+N2SWqmHnDnF9aLgANB1CUNEan09o= github.com/jesseduffield/go-git/v5 v5.1.2-0.20221018185014-fdd53fef665d/go.mod h1:nGNEErzf+NRznT+N2SWqmHnDnF9aLgANB1CUNEan09o=
github.com/jesseduffield/gocui v0.3.1-0.20240824154427-0fc91d5098e4 h1:2su9wjacqT/WxvNrzzdvA6rBJa6n/yZ/jvaS1r60HfM= github.com/jesseduffield/gocui v0.3.1-0.20240906064314-bfab49c720d7 h1:QeLCKRAt4T6sBg5tSrOc4OojCuAcPxUA+4vNMPY4aH4=
github.com/jesseduffield/gocui v0.3.1-0.20240824154427-0fc91d5098e4/go.mod h1:XtEbqCbn45keRXEu+OMZkjN5gw6AEob59afsgHjokZ8= github.com/jesseduffield/gocui v0.3.1-0.20240906064314-bfab49c720d7/go.mod h1:XtEbqCbn45keRXEu+OMZkjN5gw6AEob59afsgHjokZ8=
github.com/jesseduffield/kill v0.0.0-20220618033138-bfbe04675d10 h1:jmpr7KpX2+2GRiE91zTgfq49QvgiqB0nbmlwZ8UnOx0= github.com/jesseduffield/kill v0.0.0-20220618033138-bfbe04675d10 h1:jmpr7KpX2+2GRiE91zTgfq49QvgiqB0nbmlwZ8UnOx0=
github.com/jesseduffield/kill v0.0.0-20220618033138-bfbe04675d10/go.mod h1:aA97kHeNA+sj2Hbki0pvLslmE4CbDyhBeSSTUUnOuVo= github.com/jesseduffield/kill v0.0.0-20220618033138-bfbe04675d10/go.mod h1:aA97kHeNA+sj2Hbki0pvLslmE4CbDyhBeSSTUUnOuVo=
github.com/jesseduffield/lazycore v0.0.0-20221012050358-03d2e40243c5 h1:CDuQmfOjAtb1Gms6a1p5L2P8RhbLUq5t8aL7PiQd2uY= github.com/jesseduffield/lazycore v0.0.0-20221012050358-03d2e40243c5 h1:CDuQmfOjAtb1Gms6a1p5L2P8RhbLUq5t8aL7PiQd2uY=
@ -475,14 +475,14 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM=
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@ -493,8 +493,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=

View File

@ -83,7 +83,7 @@ func (self *BackgroundRoutineMgr) startBackgroundFetch() {
} }
err := self.backgroundFetch() err := self.backgroundFetch()
if err != nil && strings.Contains(err.Error(), "exit status 128") && isNew { if err != nil && strings.Contains(err.Error(), "exit status 128") && isNew {
_ = self.gui.c.Alert(self.gui.c.Tr.NoAutomaticGitFetchTitle, self.gui.c.Tr.NoAutomaticGitFetchBody) self.gui.c.Alert(self.gui.c.Tr.NoAutomaticGitFetchTitle, self.gui.c.Tr.NoAutomaticGitFetchBody)
} else { } else {
self.goEvery(time.Second*time.Duration(userConfig.Refresher.FetchInterval), self.gui.stopChan, func() error { self.goEvery(time.Second*time.Duration(userConfig.Refresher.FetchInterval), self.gui.stopChan, func() error {
err := self.backgroundFetch() err := self.backgroundFetch()

View File

@ -1,7 +1,6 @@
package gui package gui
import ( import (
"errors"
"sync" "sync"
"github.com/jesseduffield/lazygit/pkg/gui/context" "github.com/jesseduffield/lazygit/pkg/gui/context"
@ -37,9 +36,9 @@ func NewContextMgr(
// use when you don't want to return to the original context upon // use when you don't want to return to the original context upon
// hitting escape: you want to go that context's parent instead. // hitting escape: you want to go that context's parent instead.
func (self *ContextMgr) Replace(c types.Context) error { func (self *ContextMgr) Replace(c types.Context) {
if !c.IsFocusable() { if !c.IsFocusable() {
return nil return
} }
self.Lock() self.Lock()
@ -51,14 +50,14 @@ func (self *ContextMgr) Replace(c types.Context) error {
self.ContextStack = append(self.ContextStack[0:len(self.ContextStack)-1], c) self.ContextStack = append(self.ContextStack[0:len(self.ContextStack)-1], c)
} }
defer self.Unlock() self.Unlock()
return self.Activate(c, types.OnFocusOpts{}) self.Activate(c, types.OnFocusOpts{})
} }
func (self *ContextMgr) Push(c types.Context, opts ...types.OnFocusOpts) error { func (self *ContextMgr) Push(c types.Context, opts ...types.OnFocusOpts) {
if len(opts) > 1 { if len(opts) > 1 {
return errors.New("cannot pass multiple opts to Push") panic("cannot pass multiple opts to Push")
} }
singleOpts := types.OnFocusOpts{} singleOpts := types.OnFocusOpts{}
@ -68,22 +67,18 @@ func (self *ContextMgr) Push(c types.Context, opts ...types.OnFocusOpts) error {
} }
if !c.IsFocusable() { if !c.IsFocusable() {
return nil return
} }
contextsToDeactivate, contextToActivate := self.pushToContextStack(c) contextsToDeactivate, contextToActivate := self.pushToContextStack(c)
for _, contextToDeactivate := range contextsToDeactivate { for _, contextToDeactivate := range contextsToDeactivate {
if err := self.deactivate(contextToDeactivate, types.OnFocusLostOpts{NewContextKey: c.GetKey()}); err != nil { self.deactivate(contextToDeactivate, types.OnFocusLostOpts{NewContextKey: c.GetKey()})
return err
}
} }
if contextToActivate == nil { if contextToActivate != nil {
return nil self.Activate(contextToActivate, singleOpts)
} }
return self.Activate(contextToActivate, singleOpts)
} }
// Adjusts the context stack based on the context that's being pushed and // Adjusts the context stack based on the context that's being pushed and
@ -144,13 +139,13 @@ func (self *ContextMgr) pushToContextStack(c types.Context) ([]types.Context, ty
return contextsToDeactivate, c return contextsToDeactivate, c
} }
func (self *ContextMgr) Pop() error { func (self *ContextMgr) Pop() {
self.Lock() self.Lock()
if len(self.ContextStack) == 1 { if len(self.ContextStack) == 1 {
// cannot escape from bottommost context // cannot escape from bottommost context
self.Unlock() self.Unlock()
return nil return
} }
var currentContext types.Context var currentContext types.Context
@ -160,14 +155,12 @@ func (self *ContextMgr) Pop() error {
self.Unlock() self.Unlock()
if err := self.deactivate(currentContext, types.OnFocusLostOpts{NewContextKey: newContext.GetKey()}); err != nil { self.deactivate(currentContext, types.OnFocusLostOpts{NewContextKey: newContext.GetKey()})
return err
}
return self.Activate(newContext, types.OnFocusOpts{}) self.Activate(newContext, types.OnFocusOpts{})
} }
func (self *ContextMgr) deactivate(c types.Context, opts types.OnFocusLostOpts) error { func (self *ContextMgr) deactivate(c types.Context, opts types.OnFocusLostOpts) {
view, _ := self.gui.c.GocuiGui().View(c.GetViewName()) view, _ := self.gui.c.GocuiGui().View(c.GetViewName())
if opts.NewContextKey != context.SEARCH_CONTEXT_KEY { if opts.NewContextKey != context.SEARCH_CONTEXT_KEY {
@ -183,18 +176,14 @@ func (self *ContextMgr) deactivate(c types.Context, opts types.OnFocusLostOpts)
view.Visible = false view.Visible = false
} }
if err := c.HandleFocusLost(opts); err != nil { c.HandleFocusLost(opts)
return err
}
return nil
} }
func (self *ContextMgr) Activate(c types.Context, opts types.OnFocusOpts) error { func (self *ContextMgr) Activate(c types.Context, opts types.OnFocusOpts) {
viewName := c.GetViewName() viewName := c.GetViewName()
v, err := self.gui.c.GocuiGui().View(viewName) v, err := self.gui.c.GocuiGui().View(viewName)
if err != nil { if err != nil {
return err panic(err)
} }
self.gui.helpers.Window.SetWindowContext(c) self.gui.helpers.Window.SetWindowContext(c)
@ -205,7 +194,7 @@ func (self *ContextMgr) Activate(c types.Context, opts types.OnFocusOpts) error
oldView.HighlightInactive = true oldView.HighlightInactive = true
} }
if _, err := self.gui.c.GocuiGui().SetCurrentView(viewName); err != nil { if _, err := self.gui.c.GocuiGui().SetCurrentView(viewName); err != nil {
return err panic(err)
} }
self.gui.helpers.Search.RenderSearchStatus(c) self.gui.helpers.Search.RenderSearchStatus(c)
@ -219,11 +208,7 @@ func (self *ContextMgr) Activate(c types.Context, opts types.OnFocusOpts) error
self.gui.c.GocuiGui().Cursor = v.Editable self.gui.c.GocuiGui().Cursor = v.Editable
if err := c.HandleFocus(opts); err != nil { c.HandleFocus(opts)
return err
}
return nil
} }
func (self *ContextMgr) Current() types.Context { func (self *ContextMgr) Current() types.Context {

View File

@ -16,7 +16,7 @@ type BaseContext struct {
keybindingsFns []types.KeybindingsFn keybindingsFns []types.KeybindingsFn
mouseKeybindingsFns []types.MouseKeybindingsFn mouseKeybindingsFns []types.MouseKeybindingsFn
onClickFn func() error onClickFn func() error
onRenderToMainFn func() error onRenderToMainFn func()
onFocusFn onFocusFn onFocusFn onFocusFn
onFocusLostFn onFocusLostFn onFocusLostFn onFocusLostFn
@ -31,8 +31,8 @@ type BaseContext struct {
} }
type ( type (
onFocusFn = func(types.OnFocusOpts) error onFocusFn = func(types.OnFocusOpts)
onFocusLostFn = func(types.OnFocusLostOpts) error onFocusLostFn = func(types.OnFocusLostOpts)
) )
var _ types.IBaseContext = &BaseContext{} var _ types.IBaseContext = &BaseContext{}
@ -148,13 +148,13 @@ func (self *BaseContext) GetOnClick() func() error {
return self.onClickFn return self.onClickFn
} }
func (self *BaseContext) AddOnRenderToMainFn(fn func() error) { func (self *BaseContext) AddOnRenderToMainFn(fn func()) {
if fn != nil { if fn != nil {
self.onRenderToMainFn = fn self.onRenderToMainFn = fn
} }
} }
func (self *BaseContext) GetOnRenderToMain() func() error { func (self *BaseContext) GetOnRenderToMain() func() {
return self.onRenderToMainFn return self.onRenderToMainFn
} }

View File

@ -49,7 +49,7 @@ func (self *ListContextTrait) FocusLine() {
} else if self.renderOnlyVisibleLines { } else if self.renderOnlyVisibleLines {
newOrigin, _ := self.GetViewTrait().ViewPortYBounds() newOrigin, _ := self.GetViewTrait().ViewPortYBounds()
if oldOrigin != newOrigin { if oldOrigin != newOrigin {
return self.HandleRender() self.HandleRender()
} }
} }
return nil return nil
@ -72,26 +72,26 @@ func formatListFooter(selectedLineIdx int, length int) string {
return fmt.Sprintf("%d of %d", selectedLineIdx+1, length) return fmt.Sprintf("%d of %d", selectedLineIdx+1, length)
} }
func (self *ListContextTrait) HandleFocus(opts types.OnFocusOpts) error { func (self *ListContextTrait) HandleFocus(opts types.OnFocusOpts) {
self.FocusLine() self.FocusLine()
self.GetViewTrait().SetHighlight(self.list.Len() > 0) self.GetViewTrait().SetHighlight(self.list.Len() > 0)
return self.Context.HandleFocus(opts) self.Context.HandleFocus(opts)
} }
func (self *ListContextTrait) HandleFocusLost(opts types.OnFocusLostOpts) error { func (self *ListContextTrait) HandleFocusLost(opts types.OnFocusLostOpts) {
self.GetViewTrait().SetOriginX(0) self.GetViewTrait().SetOriginX(0)
if self.refreshViewportOnChange { if self.refreshViewportOnChange {
self.refreshViewport() self.refreshViewport()
} }
return self.Context.HandleFocusLost(opts) self.Context.HandleFocusLost(opts)
} }
// OnFocus assumes that the content of the context has already been rendered to the view. OnRender is the function which actually renders the content to the view // OnFocus assumes that the content of the context has already been rendered to the view. OnRender is the function which actually renders the content to the view
func (self *ListContextTrait) HandleRender() error { func (self *ListContextTrait) HandleRender() {
self.list.ClampSelection() self.list.ClampSelection()
if self.renderOnlyVisibleLines { if self.renderOnlyVisibleLines {
// Rendering only the visible area can save a lot of cell memory for // Rendering only the visible area can save a lot of cell memory for
@ -110,13 +110,12 @@ func (self *ListContextTrait) HandleRender() error {
} }
self.c.Render() self.c.Render()
self.setFooter() self.setFooter()
return nil
} }
func (self *ListContextTrait) OnSearchSelect(selectedLineIdx int) error { func (self *ListContextTrait) OnSearchSelect(selectedLineIdx int) error {
self.GetList().SetSelection(self.ViewIndexToModelIndex(selectedLineIdx)) self.GetList().SetSelection(self.ViewIndexToModelIndex(selectedLineIdx))
return self.HandleFocus(types.OnFocusOpts{}) self.HandleFocus(types.OnFocusOpts{})
return nil
} }
func (self *ListContextTrait) IsItemVisible(item types.HasUrn) bool { func (self *ListContextTrait) IsItemVisible(item types.HasUrn) bool {

View File

@ -197,9 +197,7 @@ func (self *MenuContext) OnMenuPress(selectedItem *types.MenuItem) error {
return nil return nil
} }
if err := self.c.Context().Pop(); err != nil { self.c.Context().Pop()
return err
}
if selectedItem == nil { if selectedItem == nil {
return nil return nil

View File

@ -68,13 +68,11 @@ func (self *MergeConflictsContext) IsUserScrolling() bool {
return self.viewModel.userVerticalScrolling return self.viewModel.userVerticalScrolling
} }
func (self *MergeConflictsContext) RenderAndFocus() error { func (self *MergeConflictsContext) RenderAndFocus() {
self.setContent() self.setContent()
self.FocusSelection() self.FocusSelection()
self.c.Render() self.c.Render()
return nil
} }
func (self *MergeConflictsContext) Render() error { func (self *MergeConflictsContext) Render() error {
@ -99,7 +97,7 @@ func (self *MergeConflictsContext) setContent() {
func (self *MergeConflictsContext) FocusSelection() { func (self *MergeConflictsContext) FocusSelection() {
if !self.IsUserScrolling() { if !self.IsUserScrolling() {
_ = self.GetView().SetOriginY(self.GetOriginY()) self.GetView().SetOriginY(self.GetOriginY())
} }
self.SetSelectedLineRange() self.SetSelectedLineRange()

View File

@ -53,7 +53,8 @@ func NewPatchExplorerContext(
func(selectedLineIdx int) error { func(selectedLineIdx int) error {
ctx.GetMutex().Lock() ctx.GetMutex().Lock()
defer ctx.GetMutex().Unlock() defer ctx.GetMutex().Unlock()
return ctx.NavigateTo(ctx.c.Context().IsCurrent(ctx), selectedLineIdx) ctx.NavigateTo(ctx.c.Context().IsCurrent(ctx), selectedLineIdx)
return nil
}), }),
) )
@ -78,28 +79,22 @@ func (self *PatchExplorerContext) GetIncludedLineIndices() []int {
return self.getIncludedLineIndices() return self.getIncludedLineIndices()
} }
func (self *PatchExplorerContext) RenderAndFocus(isFocused bool) error { func (self *PatchExplorerContext) RenderAndFocus(isFocused bool) {
self.setContent(isFocused) self.setContent(isFocused)
self.FocusSelection() self.FocusSelection()
self.c.Render() self.c.Render()
return nil
} }
func (self *PatchExplorerContext) Render(isFocused bool) error { func (self *PatchExplorerContext) Render(isFocused bool) {
self.setContent(isFocused) self.setContent(isFocused)
self.c.Render() self.c.Render()
return nil
} }
func (self *PatchExplorerContext) Focus() error { func (self *PatchExplorerContext) Focus() {
self.FocusSelection() self.FocusSelection()
self.c.Render() self.c.Render()
return nil
} }
func (self *PatchExplorerContext) setContent(isFocused bool) { func (self *PatchExplorerContext) setContent(isFocused bool) {
@ -116,7 +111,7 @@ func (self *PatchExplorerContext) FocusSelection() {
newOriginY := state.CalculateOrigin(origin, bufferHeight, numLines) newOriginY := state.CalculateOrigin(origin, bufferHeight, numLines)
_ = view.SetOriginY(newOriginY) view.SetOriginY(newOriginY)
startIdx, endIdx := state.SelectedRange() startIdx, endIdx := state.SelectedRange()
// As far as the view is concerned, we are always selecting a range // As far as the view is concerned, we are always selecting a range
@ -132,11 +127,11 @@ func (self *PatchExplorerContext) GetContentToRender(isFocused bool) string {
return self.GetState().RenderForLineIndices(isFocused, self.GetIncludedLineIndices()) return self.GetState().RenderForLineIndices(isFocused, self.GetIncludedLineIndices())
} }
func (self *PatchExplorerContext) NavigateTo(isFocused bool, selectedLineIdx int) error { func (self *PatchExplorerContext) NavigateTo(isFocused bool, selectedLineIdx int) {
self.GetState().SetLineSelectMode() self.GetState().SetLineSelectMode()
self.GetState().SelectLine(selectedLineIdx) self.GetState().SelectLine(selectedLineIdx)
return self.RenderAndFocus(isFocused) self.RenderAndFocus(isFocused)
} }
func (self *PatchExplorerContext) GetMutex() *deadlock.Mutex { func (self *PatchExplorerContext) GetMutex() *deadlock.Mutex {

View File

@ -31,43 +31,33 @@ func NewDisplayContext(key types.ContextKey, view *gocui.View, windowName string
) )
} }
func (self *SimpleContext) HandleFocus(opts types.OnFocusOpts) error { func (self *SimpleContext) HandleFocus(opts types.OnFocusOpts) {
if self.highlightOnFocus { if self.highlightOnFocus {
self.GetViewTrait().SetHighlight(true) self.GetViewTrait().SetHighlight(true)
} }
if self.onFocusFn != nil { if self.onFocusFn != nil {
if err := self.onFocusFn(opts); err != nil { self.onFocusFn(opts)
return err
}
} }
if self.onRenderToMainFn != nil { if self.onRenderToMainFn != nil {
if err := self.onRenderToMainFn(); err != nil { self.onRenderToMainFn()
return err
}
} }
return nil
} }
func (self *SimpleContext) HandleFocusLost(opts types.OnFocusLostOpts) error { func (self *SimpleContext) HandleFocusLost(opts types.OnFocusLostOpts) {
self.GetViewTrait().SetHighlight(false) self.GetViewTrait().SetHighlight(false)
_ = self.view.SetOriginX(0) self.view.SetOriginX(0)
if self.onFocusLostFn != nil { if self.onFocusLostFn != nil {
return self.onFocusLostFn(opts) self.onFocusLostFn(opts)
} }
return nil
} }
func (self *SimpleContext) HandleRender() error { func (self *SimpleContext) HandleRender() {
return nil
} }
func (self *SimpleContext) HandleRenderToMain() error { func (self *SimpleContext) HandleRenderToMain() {
if self.onRenderToMainFn != nil { if self.onRenderToMainFn != nil {
return self.onRenderToMainFn() self.onRenderToMainFn()
} }
return nil
} }

View File

@ -70,7 +70,7 @@ func (self *SuggestionsContext) SetSuggestions(suggestions []*types.Suggestion)
self.State.Suggestions = suggestions self.State.Suggestions = suggestions
self.SetSelection(0) self.SetSelection(0)
self.c.ResetViewOrigin(self.GetView()) self.c.ResetViewOrigin(self.GetView())
_ = self.HandleRender() self.HandleRender()
} }
func (self *SuggestionsContext) RefreshSuggestions() { func (self *SuggestionsContext) RefreshSuggestions() {

View File

@ -57,7 +57,7 @@ func (self *ViewTrait) SetFooter(value string) {
} }
func (self *ViewTrait) SetOriginX(value int) { func (self *ViewTrait) SetOriginX(value int) {
_ = self.view.SetOriginX(value) self.view.SetOriginX(value)
} }
// tells us the start of line indexes shown in the view currently as well as the capacity of lines shown in the viewport. // tells us the start of line indexes shown in the view currently as well as the capacity of lines shown in the viewport.

View File

@ -19,14 +19,14 @@ func (self *baseController) GetOnClick() func() error {
return nil return nil
} }
func (self *baseController) GetOnRenderToMain() func() error { func (self *baseController) GetOnRenderToMain() func() {
return nil return nil
} }
func (self *baseController) GetOnFocus() func(types.OnFocusOpts) error { func (self *baseController) GetOnFocus() func(types.OnFocusOpts) {
return nil return nil
} }
func (self *baseController) GetOnFocusLost() func(types.OnFocusLostOpts) error { func (self *baseController) GetOnFocusLost() func(types.OnFocusLostOpts) {
return nil return nil
} }

View File

@ -280,7 +280,7 @@ func (self *BasicCommitsController) createResetMenu(commit *models.Commit) error
} }
func (self *BasicCommitsController) checkout(commit *models.Commit) error { func (self *BasicCommitsController) checkout(commit *models.Commit) error {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.CheckoutCommit, Title: self.c.Tr.CheckoutCommit,
Prompt: self.c.Tr.SureCheckoutThisCommit, Prompt: self.c.Tr.SureCheckoutThisCommit,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -288,6 +288,7 @@ func (self *BasicCommitsController) checkout(commit *models.Commit) error {
return self.c.Helpers().Refs.CheckoutRef(commit.Hash, types.CheckoutRefOptions{}) return self.c.Helpers().Refs.CheckoutRef(commit.Hash, types.CheckoutRefOptions{})
}, },
}) })
return nil
} }
func (self *BasicCommitsController) copyRange(*models.Commit) error { func (self *BasicCommitsController) copyRange(*models.Commit) error {

View File

@ -201,10 +201,10 @@ func (self *BisectController) openStartBisectMenu(info *git_commands.BisectInfo,
{ {
Label: self.c.Tr.Bisect.ChooseTerms, Label: self.c.Tr.Bisect.ChooseTerms,
OnPress: func() error { OnPress: func() error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.Bisect.OldTermPrompt, Title: self.c.Tr.Bisect.OldTermPrompt,
HandleConfirm: func(oldTerm string) error { HandleConfirm: func(oldTerm string) error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.Bisect.NewTermPrompt, Title: self.c.Tr.Bisect.NewTermPrompt,
HandleConfirm: func(newTerm string) error { HandleConfirm: func(newTerm string) error {
self.c.LogAction(self.c.Tr.Actions.StartBisect) self.c.LogAction(self.c.Tr.Actions.StartBisect)
@ -215,8 +215,10 @@ func (self *BisectController) openStartBisectMenu(info *git_commands.BisectInfo,
return self.c.Helpers().Bisect.PostBisectCommandRefresh() return self.c.Helpers().Bisect.PostBisectCommandRefresh()
}, },
}) })
return nil
}, },
}) })
return nil
}, },
Key: 't', Key: 't',
}, },
@ -235,7 +237,7 @@ func (self *BisectController) showBisectCompleteMessage(candidateHashes []string
return err return err
} }
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.Bisect.CompleteTitle, Title: self.c.Tr.Bisect.CompleteTitle,
Prompt: fmt.Sprintf(prompt, strings.TrimSpace(formattedCommits)), Prompt: fmt.Sprintf(prompt, strings.TrimSpace(formattedCommits)),
HandleConfirm: func() error { HandleConfirm: func() error {
@ -247,6 +249,8 @@ func (self *BisectController) showBisectCompleteMessage(candidateHashes []string
return self.c.Helpers().Bisect.PostBisectCommandRefresh() return self.c.Helpers().Bisect.PostBisectCommandRefresh()
}, },
}) })
return nil
} }
func (self *BisectController) afterMark(selectCurrent bool, waitToReselect bool) error { func (self *BisectController) afterMark(selectCurrent bool, waitToReselect bool) error {
@ -290,7 +294,7 @@ func (self *BisectController) selectCurrentBisectCommit() {
for i, commit := range self.c.Model().Commits { for i, commit := range self.c.Model().Commits {
if commit.Hash == info.GetCurrentHash() { if commit.Hash == info.GetCurrentHash() {
self.context().SetSelection(i) self.context().SetSelection(i)
_ = self.context().HandleFocus(types.OnFocusOpts{}) self.context().HandleFocus(types.OnFocusOpts{})
break break
} }
} }

View File

@ -170,9 +170,9 @@ func (self *BranchesController) GetKeybindings(opts types.KeybindingsOpts) []*ty
} }
} }
func (self *BranchesController) GetOnRenderToMain() func() error { func (self *BranchesController) GetOnRenderToMain() func() {
return func() error { return func() {
return self.c.Helpers().Diff.WithDiffModeCheck(func() error { self.c.Helpers().Diff.WithDiffModeCheck(func() {
var task types.UpdateTask var task types.UpdateTask
branch := self.context().GetSelected() branch := self.context().GetSelected()
if branch == nil { if branch == nil {
@ -183,7 +183,7 @@ func (self *BranchesController) GetOnRenderToMain() func() error {
task = types.NewRunPtyTask(cmdObj.GetCmd()) task = types.NewRunPtyTask(cmdObj.GetCmd())
} }
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: self.c.MainViewPairs().Normal, Pair: self.c.MainViewPairs().Normal,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Title: self.c.Tr.LogTitle, Title: self.c.Tr.LogTitle,
@ -410,13 +410,15 @@ func (self *BranchesController) promptToCheckoutWorktree(worktree *models.Worktr
"worktreeName": worktree.Name, "worktreeName": worktree.Name,
}) })
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.SwitchToWorktree, Title: self.c.Tr.SwitchToWorktree,
Prompt: prompt, Prompt: prompt,
HandleConfirm: func() error { HandleConfirm: func() error {
return self.c.Helpers().Worktree.Switch(worktree, context.LOCAL_BRANCHES_CONTEXT_KEY) return self.c.Helpers().Worktree.Switch(worktree, context.LOCAL_BRANCHES_CONTEXT_KEY)
}, },
}) })
return nil
} }
func (self *BranchesController) handleCreatePullRequest(selectedBranch *models.Branch) error { func (self *BranchesController) handleCreatePullRequest(selectedBranch *models.Branch) error {
@ -460,7 +462,7 @@ func (self *BranchesController) forceCheckout() error {
message := self.c.Tr.SureForceCheckout message := self.c.Tr.SureForceCheckout
title := self.c.Tr.ForceCheckoutBranch title := self.c.Tr.ForceCheckoutBranch
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: title, Title: title,
Prompt: message, Prompt: message,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -471,10 +473,12 @@ func (self *BranchesController) forceCheckout() error {
return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
}, },
}) })
return nil
} }
func (self *BranchesController) checkoutByName() error { func (self *BranchesController) checkoutByName() error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.BranchName + ":", Title: self.c.Tr.BranchName + ":",
FindSuggestionsFunc: self.c.Helpers().Suggestions.GetRefsSuggestionsFunc(), FindSuggestionsFunc: self.c.Helpers().Suggestions.GetRefsSuggestionsFunc(),
HandleConfirm: func(response string) error { HandleConfirm: func(response string) error {
@ -485,18 +489,22 @@ func (self *BranchesController) checkoutByName() error {
} }
return self.c.Helpers().Refs.CheckoutRef(response, types.CheckoutRefOptions{ return self.c.Helpers().Refs.CheckoutRef(response, types.CheckoutRefOptions{
OnRefNotFound: func(ref string) error { OnRefNotFound: func(ref string) error {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.BranchNotFoundTitle, Title: self.c.Tr.BranchNotFoundTitle,
Prompt: fmt.Sprintf("%s %s%s", self.c.Tr.BranchNotFoundPrompt, ref, "?"), Prompt: fmt.Sprintf("%s %s%s", self.c.Tr.BranchNotFoundPrompt, ref, "?"),
HandleConfirm: func() error { HandleConfirm: func() error {
return self.createNewBranchWithName(ref) return self.createNewBranchWithName(ref)
}, },
}) })
return nil
}, },
}) })
}, },
}, },
) )
return nil
} }
func (self *BranchesController) createNewBranchWithName(newBranchName string) error { func (self *BranchesController) createNewBranchWithName(newBranchName string) error {
@ -586,7 +594,7 @@ func (self *BranchesController) forceDelete(branch *models.Branch) error {
}, },
) )
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: title, Title: title,
Prompt: message, Prompt: message,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -596,6 +604,8 @@ func (self *BranchesController) forceDelete(branch *models.Branch) error {
return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES}}) return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES}})
}, },
}) })
return nil
} }
func (self *BranchesController) delete(branch *models.Branch) error { func (self *BranchesController) delete(branch *models.Branch) error {
@ -715,7 +725,7 @@ func (self *BranchesController) createResetMenu(selectedBranch *models.Branch) e
func (self *BranchesController) rename(branch *models.Branch) error { func (self *BranchesController) rename(branch *models.Branch) error {
promptForNewName := func() error { promptForNewName := func() error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.NewBranchNamePrompt + " " + branch.Name + ":", Title: self.c.Tr.NewBranchNamePrompt + " " + branch.Name + ":",
InitialContent: branch.Name, InitialContent: branch.Name,
HandleConfirm: func(newBranchName string) error { HandleConfirm: func(newBranchName string) error {
@ -734,15 +744,15 @@ func (self *BranchesController) rename(branch *models.Branch) error {
for i, newBranch := range self.c.Model().Branches { for i, newBranch := range self.c.Model().Branches {
if newBranch.Name == newBranchName { if newBranch.Name == newBranchName {
self.context().SetSelection(i) self.context().SetSelection(i)
if err := self.context().HandleRender(); err != nil { self.context().HandleRender()
return err
}
} }
} }
return nil return nil
}, },
}) })
return nil
} }
// I could do an explicit check here for whether the branch is tracking a remote branch // I could do an explicit check here for whether the branch is tracking a remote branch
@ -752,11 +762,13 @@ func (self *BranchesController) rename(branch *models.Branch) error {
return promptForNewName() return promptForNewName()
} }
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.RenameBranch, Title: self.c.Tr.RenameBranch,
Prompt: self.c.Tr.RenameBranchWarning, Prompt: self.c.Tr.RenameBranchWarning,
HandleConfirm: promptForNewName, HandleConfirm: promptForNewName,
}) })
return nil
} }
func (self *BranchesController) newBranch(selectedBranch *models.Branch) error { func (self *BranchesController) newBranch(selectedBranch *models.Branch) error {
@ -781,13 +793,15 @@ func (self *BranchesController) createPullRequestMenu(selectedBranch *models.Bra
{ {
LabelColumns: fromToLabelColumns(branch.Name, self.c.Tr.SelectBranch), LabelColumns: fromToLabelColumns(branch.Name, self.c.Tr.SelectBranch),
OnPress: func() error { OnPress: func() error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: branch.Name + " →", Title: branch.Name + " →",
FindSuggestionsFunc: self.c.Helpers().Suggestions.GetRemoteBranchesSuggestionsFunc("/"), FindSuggestionsFunc: self.c.Helpers().Suggestions.GetRemoteBranchesSuggestionsFunc("/"),
HandleConfirm: func(targetBranchName string) error { HandleConfirm: func(targetBranchName string) error {
return self.createPullRequest(branch.Name, targetBranchName) return self.createPullRequest(branch.Name, targetBranchName)
}, },
}) })
return nil
}, },
}, },
} }

View File

@ -26,10 +26,9 @@ func (self *CommandLogController) GetKeybindings(opts types.KeybindingsOpts) []*
return bindings return bindings
} }
func (self *CommandLogController) GetOnFocusLost() func(types.OnFocusLostOpts) error { func (self *CommandLogController) GetOnFocusLost() func(types.OnFocusLostOpts) {
return func(types.OnFocusLostOpts) error { return func(types.OnFocusLostOpts) {
self.c.Views().Extras.Autoscroll = true self.c.Views().Extras.Autoscroll = true
return nil
} }
} }

View File

@ -60,11 +60,13 @@ func (self *CommitDescriptionController) GetMouseKeybindings(opts types.Keybindi
} }
func (self *CommitDescriptionController) switchToCommitMessage() error { func (self *CommitDescriptionController) switchToCommitMessage() error {
return self.c.Context().Replace(self.c.Contexts().CommitMessage) self.c.Context().Replace(self.c.Contexts().CommitMessage)
return nil
} }
func (self *CommitDescriptionController) close() error { func (self *CommitDescriptionController) close() error {
return self.c.Helpers().Commits.CloseCommitMessagePanel() self.c.Helpers().Commits.CloseCommitMessagePanel()
return nil
} }
func (self *CommitDescriptionController) confirm() error { func (self *CommitDescriptionController) confirm() error {
@ -79,7 +81,7 @@ func (self *CommitDescriptionController) openCommitMenu() error {
func (self *CommitDescriptionController) onClick(opts gocui.ViewMouseBindingOpts) error { func (self *CommitDescriptionController) onClick(opts gocui.ViewMouseBindingOpts) error {
// Activate the description panel when the commit message panel is currently active // Activate the description panel when the commit message panel is currently active
if self.c.Context().Current().GetKey() == context.COMMIT_MESSAGE_CONTEXT_KEY { if self.c.Context().Current().GetKey() == context.COMMIT_MESSAGE_CONTEXT_KEY {
return self.c.Context().Replace(self.c.Contexts().CommitDescription) self.c.Context().Replace(self.c.Contexts().CommitDescription)
} }
return nil return nil

View File

@ -69,10 +69,9 @@ func (self *CommitMessageController) GetMouseKeybindings(opts types.KeybindingsO
} }
} }
func (self *CommitMessageController) GetOnFocusLost() func(types.OnFocusLostOpts) error { func (self *CommitMessageController) GetOnFocusLost() func(types.OnFocusLostOpts) {
return func(types.OnFocusLostOpts) error { return func(types.OnFocusLostOpts) {
self.context().RenderCommitLength() self.context().RenderCommitLength()
return nil
} }
} }
@ -96,9 +95,7 @@ func (self *CommitMessageController) handleNextCommit() error {
} }
func (self *CommitMessageController) switchToCommitDescription() error { func (self *CommitMessageController) switchToCommitDescription() error {
if err := self.c.Context().Replace(self.c.Contexts().CommitDescription); err != nil { self.c.Context().Replace(self.c.Contexts().CommitDescription)
return err
}
return nil return nil
} }
@ -141,7 +138,8 @@ func (self *CommitMessageController) confirm() error {
} }
func (self *CommitMessageController) close() error { func (self *CommitMessageController) close() error {
return self.c.Helpers().Commits.CloseCommitMessagePanel() self.c.Helpers().Commits.CloseCommitMessagePanel()
return nil
} }
func (self *CommitMessageController) openCommitMenu() error { func (self *CommitMessageController) openCommitMenu() error {
@ -152,7 +150,7 @@ func (self *CommitMessageController) openCommitMenu() error {
func (self *CommitMessageController) onClick(opts gocui.ViewMouseBindingOpts) error { func (self *CommitMessageController) onClick(opts gocui.ViewMouseBindingOpts) error {
// Activate the commit message panel when the commit description panel is currently active // Activate the commit message panel when the commit description panel is currently active
if self.c.Context().Current().GetKey() == context.COMMIT_DESCRIPTION_CONTEXT_KEY { if self.c.Context().Current().GetKey() == context.COMMIT_DESCRIPTION_CONTEXT_KEY {
return self.c.Context().Replace(self.c.Contexts().CommitMessage) self.c.Context().Replace(self.c.Contexts().CommitMessage)
} }
return nil return nil

View File

@ -129,11 +129,11 @@ func (self *CommitFilesController) context() *context.CommitFilesContext {
return self.c.Contexts().CommitFiles return self.c.Contexts().CommitFiles
} }
func (self *CommitFilesController) GetOnRenderToMain() func() error { func (self *CommitFilesController) GetOnRenderToMain() func() {
return func() error { return func() {
node := self.context().GetSelected() node := self.context().GetSelected()
if node == nil { if node == nil {
return nil return
} }
from, to := self.context().GetFromAndToForDiff() from, to := self.context().GetFromAndToForDiff()
@ -147,7 +147,7 @@ func (self *CommitFilesController) GetOnRenderToMain() func() error {
pair = self.c.MainViewPairs().PatchBuilding pair = self.c.MainViewPairs().PatchBuilding
} }
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: pair, Pair: pair,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Title: self.c.Tr.Patch, Title: self.c.Tr.Patch,
@ -186,7 +186,7 @@ func (self *CommitFilesController) discard(selectedNodes []*filetree.CommitFileN
return err return err
} }
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.DiscardFileChangesTitle, Title: self.c.Tr.DiscardFileChangesTitle,
Prompt: self.c.Tr.DiscardFileChangesPrompt, Prompt: self.c.Tr.DiscardFileChangesPrompt,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -224,6 +224,8 @@ func (self *CommitFilesController) discard(selectedNodes []*filetree.CommitFileN
}) })
}, },
}) })
return nil
} }
func (self *CommitFilesController) open(node *filetree.CommitFileNode) error { func (self *CommitFilesController) open(node *filetree.CommitFileNode) error {
@ -307,7 +309,7 @@ func (self *CommitFilesController) toggleForPatch(selectedNodes []*filetree.Comm
from, to, reverse := self.currentFromToReverseForPatchBuilding() from, to, reverse := self.currentFromToReverseForPatchBuilding()
if self.c.Git().Patch.PatchBuilder.Active() && self.c.Git().Patch.PatchBuilder.NewPatchRequired(from, to, reverse) { if self.c.Git().Patch.PatchBuilder.Active() && self.c.Git().Patch.PatchBuilder.NewPatchRequired(from, to, reverse) {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.DiscardPatch, Title: self.c.Tr.DiscardPatch,
Prompt: self.c.Tr.DiscardPatchConfirm, Prompt: self.c.Tr.DiscardPatchConfirm,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -315,6 +317,8 @@ func (self *CommitFilesController) toggleForPatch(selectedNodes []*filetree.Comm
return toggle() return toggle()
}, },
}) })
return nil
} }
return toggle() return toggle()
@ -359,12 +363,13 @@ func (self *CommitFilesController) enterCommitFile(node *filetree.CommitFileNode
} }
} }
return self.c.Context().Push(self.c.Contexts().CustomPatchBuilder, opts) self.c.Context().Push(self.c.Contexts().CustomPatchBuilder, opts)
return nil
} }
from, to, reverse := self.currentFromToReverseForPatchBuilding() from, to, reverse := self.currentFromToReverseForPatchBuilding()
if self.c.Git().Patch.PatchBuilder.Active() && self.c.Git().Patch.PatchBuilder.NewPatchRequired(from, to, reverse) { if self.c.Git().Patch.PatchBuilder.Active() && self.c.Git().Patch.PatchBuilder.NewPatchRequired(from, to, reverse) {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.DiscardPatch, Title: self.c.Tr.DiscardPatch,
Prompt: self.c.Tr.DiscardPatchConfirm, Prompt: self.c.Tr.DiscardPatchConfirm,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -372,6 +377,8 @@ func (self *CommitFilesController) enterCommitFile(node *filetree.CommitFileNode
return enterTheFile() return enterTheFile()
}, },
}) })
return nil
} }
return enterTheFile() return enterTheFile()

View File

@ -49,7 +49,7 @@ func (self *ConfirmationController) GetKeybindings(opts types.KeybindingsOpts) [
self.c.UserConfig().Keybinding.Universal.Remove, self.c.UserConfig().Keybinding.Universal.Edit) self.c.UserConfig().Keybinding.Universal.Remove, self.c.UserConfig().Keybinding.Universal.Edit)
} }
self.c.Views().Suggestions.Subtitle = subtitle self.c.Views().Suggestions.Subtitle = subtitle
return self.c.Context().Replace(self.c.Contexts().Suggestions) self.c.Context().Replace(self.c.Contexts().Suggestions)
} }
return nil return nil
}, },
@ -59,10 +59,9 @@ func (self *ConfirmationController) GetKeybindings(opts types.KeybindingsOpts) [
return bindings return bindings
} }
func (self *ConfirmationController) GetOnFocusLost() func(types.OnFocusLostOpts) error { func (self *ConfirmationController) GetOnFocusLost() func(types.OnFocusLostOpts) {
return func(types.OnFocusLostOpts) error { return func(types.OnFocusLostOpts) {
self.c.Helpers().Confirmation.DeactivateConfirmationPrompt() self.c.Helpers().Confirmation.DeactivateConfirmationPrompt()
return nil
} }
} }

View File

@ -102,7 +102,8 @@ func (self *ContextLinesController) applyChange() error {
case context.STAGING_MAIN_CONTEXT_KEY, context.STAGING_SECONDARY_CONTEXT_KEY: case context.STAGING_MAIN_CONTEXT_KEY, context.STAGING_SECONDARY_CONTEXT_KEY:
return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.STAGING}}) return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.STAGING}})
default: default:
return currentContext.HandleRenderToMain() currentContext.HandleRenderToMain()
return nil
} }
} }

View File

@ -121,11 +121,10 @@ func (self *CustomPatchOptionsMenuAction) validateNormalWorkingTreeState() (bool
return true, nil return true, nil
} }
func (self *CustomPatchOptionsMenuAction) returnFocusFromPatchExplorerIfNecessary() error { func (self *CustomPatchOptionsMenuAction) returnFocusFromPatchExplorerIfNecessary() {
if self.c.Context().Current().GetKey() == self.c.Contexts().CustomPatchBuilder.GetKey() { if self.c.Context().Current().GetKey() == self.c.Contexts().CustomPatchBuilder.GetKey() {
return self.c.Helpers().PatchBuilding.Escape() self.c.Helpers().PatchBuilding.Escape()
} }
return nil
} }
func (self *CustomPatchOptionsMenuAction) handleDeletePatchFromCommit() error { func (self *CustomPatchOptionsMenuAction) handleDeletePatchFromCommit() error {
@ -133,9 +132,7 @@ func (self *CustomPatchOptionsMenuAction) handleDeletePatchFromCommit() error {
return err return err
} }
if err := self.returnFocusFromPatchExplorerIfNecessary(); err != nil { self.returnFocusFromPatchExplorerIfNecessary()
return err
}
return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func(gocui.Task) error { return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func(gocui.Task) error {
commitIndex := self.getPatchCommitIndex() commitIndex := self.getPatchCommitIndex()
@ -150,9 +147,7 @@ func (self *CustomPatchOptionsMenuAction) handleMovePatchToSelectedCommit() erro
return err return err
} }
if err := self.returnFocusFromPatchExplorerIfNecessary(); err != nil { self.returnFocusFromPatchExplorerIfNecessary()
return err
}
return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func(gocui.Task) error { return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func(gocui.Task) error {
commitIndex := self.getPatchCommitIndex() commitIndex := self.getPatchCommitIndex()
@ -167,9 +162,7 @@ func (self *CustomPatchOptionsMenuAction) handleMovePatchIntoWorkingTree() error
return err return err
} }
if err := self.returnFocusFromPatchExplorerIfNecessary(); err != nil { self.returnFocusFromPatchExplorerIfNecessary()
return err
}
pull := func(stash bool) error { pull := func(stash bool) error {
return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func(gocui.Task) error { return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func(gocui.Task) error {
@ -181,13 +174,15 @@ func (self *CustomPatchOptionsMenuAction) handleMovePatchIntoWorkingTree() error
} }
if self.c.Helpers().WorkingTree.IsWorkingTreeDirty() { if self.c.Helpers().WorkingTree.IsWorkingTreeDirty() {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.MustStashTitle, Title: self.c.Tr.MustStashTitle,
Prompt: self.c.Tr.MustStashWarning, Prompt: self.c.Tr.MustStashWarning,
HandleConfirm: func() error { HandleConfirm: func() error {
return pull(true) return pull(true)
}, },
}) })
return nil
} else { } else {
return pull(false) return pull(false)
} }
@ -198,12 +193,10 @@ func (self *CustomPatchOptionsMenuAction) handlePullPatchIntoNewCommit() error {
return err return err
} }
if err := self.returnFocusFromPatchExplorerIfNecessary(); err != nil { self.returnFocusFromPatchExplorerIfNecessary()
return err
}
commitIndex := self.getPatchCommitIndex() commitIndex := self.getPatchCommitIndex()
return self.c.Helpers().Commits.OpenCommitMessagePanel( self.c.Helpers().Commits.OpenCommitMessagePanel(
&helpers.OpenCommitMessagePanelOpts{ &helpers.OpenCommitMessagePanelOpts{
// Pass a commit index of one less than the moved-from commit, so that // Pass a commit index of one less than the moved-from commit, so that
// you can press up arrow once to recall the original commit message: // you can press up arrow once to recall the original commit message:
@ -214,23 +207,24 @@ func (self *CustomPatchOptionsMenuAction) handlePullPatchIntoNewCommit() error {
PreserveMessage: false, PreserveMessage: false,
OnConfirm: func(summary string, description string) error { OnConfirm: func(summary string, description string) error {
return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func(gocui.Task) error { return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func(gocui.Task) error {
_ = self.c.Helpers().Commits.CloseCommitMessagePanel() self.c.Helpers().Commits.CloseCommitMessagePanel()
self.c.LogAction(self.c.Tr.Actions.MovePatchIntoNewCommit) self.c.LogAction(self.c.Tr.Actions.MovePatchIntoNewCommit)
err := self.c.Git().Patch.PullPatchIntoNewCommit(self.c.Model().Commits, commitIndex, summary, description) err := self.c.Git().Patch.PullPatchIntoNewCommit(self.c.Model().Commits, commitIndex, summary, description)
if err := self.c.Helpers().MergeAndRebase.CheckMergeOrRebase(err); err != nil { if err := self.c.Helpers().MergeAndRebase.CheckMergeOrRebase(err); err != nil {
return err return err
} }
return self.c.Context().Push(self.c.Contexts().LocalCommits) self.c.Context().Push(self.c.Contexts().LocalCommits)
return nil
}) })
}, },
}, },
) )
return nil
} }
func (self *CustomPatchOptionsMenuAction) handleApplyPatch(reverse bool) error { func (self *CustomPatchOptionsMenuAction) handleApplyPatch(reverse bool) error {
if err := self.returnFocusFromPatchExplorerIfNecessary(); err != nil { self.returnFocusFromPatchExplorerIfNecessary()
return err
}
action := self.c.Tr.Actions.ApplyPatch action := self.c.Tr.Actions.ApplyPatch
if reverse { if reverse {

View File

@ -33,7 +33,7 @@ func (self *DiffingMenuAction) Call() error {
{ {
Label: self.c.Tr.EnterRefToDiff, Label: self.c.Tr.EnterRefToDiff,
OnPress: func() error { OnPress: func() error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.EnterRefName, Title: self.c.Tr.EnterRefName,
FindSuggestionsFunc: self.c.Helpers().Suggestions.GetRefsSuggestionsFunc(), FindSuggestionsFunc: self.c.Helpers().Suggestions.GetRefsSuggestionsFunc(),
HandleConfirm: func(response string) error { HandleConfirm: func(response string) error {
@ -41,6 +41,8 @@ func (self *DiffingMenuAction) Call() error {
return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
}, },
}) })
return nil
}, },
}, },
}...) }...)

View File

@ -224,13 +224,13 @@ func (self *FilesController) GetMouseKeybindings(opts types.KeybindingsOpts) []*
} }
} }
func (self *FilesController) GetOnRenderToMain() func() error { func (self *FilesController) GetOnRenderToMain() func() {
return func() error { return func() {
return self.c.Helpers().Diff.WithDiffModeCheck(func() error { self.c.Helpers().Diff.WithDiffModeCheck(func() {
node := self.context().GetSelected() node := self.context().GetSelected()
if node == nil { if node == nil {
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: self.c.MainViewPairs().Normal, Pair: self.c.MainViewPairs().Normal,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Title: self.c.Tr.DiffTitle, Title: self.c.Tr.DiffTitle,
@ -238,16 +238,18 @@ func (self *FilesController) GetOnRenderToMain() func() error {
Task: types.NewRenderStringTask(self.c.Tr.NoChangedFiles), Task: types.NewRenderStringTask(self.c.Tr.NoChangedFiles),
}, },
}) })
return
} }
if node.File != nil && node.File.HasInlineMergeConflicts { if node.File != nil && node.File.HasInlineMergeConflicts {
hasConflicts, err := self.c.Helpers().MergeConflicts.SetMergeState(node.GetPath()) hasConflicts, err := self.c.Helpers().MergeConflicts.SetMergeState(node.GetPath())
if err != nil { if err != nil {
return err return
} }
if hasConflicts { if hasConflicts {
return self.c.Helpers().MergeConflicts.Render() self.c.Helpers().MergeConflicts.Render()
return
} }
} }
@ -290,7 +292,7 @@ func (self *FilesController) GetOnRenderToMain() func() error {
} }
} }
return self.c.RenderToMainViews(refreshOpts) self.c.RenderToMainViews(refreshOpts)
}) })
} }
} }
@ -454,7 +456,8 @@ func (self *FilesController) press(nodes []*filetree.FileNode) error {
return err return err
} }
return self.context().HandleFocus(types.OnFocusOpts{}) self.context().HandleFocus(types.OnFocusOpts{})
return nil
} }
func (self *FilesController) Context() types.Context { func (self *FilesController) Context() types.Context {
@ -502,7 +505,8 @@ func (self *FilesController) EnterFile(opts types.OnFocusOpts) error {
return errors.New(self.c.Tr.FileStagingRequirements) return errors.New(self.c.Tr.FileStagingRequirements)
} }
return self.c.Context().Push(self.c.Contexts().Staging, opts) self.c.Context().Push(self.c.Contexts().Staging, opts)
return nil
} }
func (self *FilesController) toggleStagedAll() error { func (self *FilesController) toggleStagedAll() error {
@ -514,7 +518,8 @@ func (self *FilesController) toggleStagedAll() error {
return err return err
} }
return self.context().HandleFocus(types.OnFocusOpts{}) self.context().HandleFocus(types.OnFocusOpts{})
return nil
} }
func (self *FilesController) toggleStagedAllWithLock() error { func (self *FilesController) toggleStagedAllWithLock() error {
@ -596,13 +601,15 @@ func (self *FilesController) ignoreOrExcludeUntracked(node *filetree.FileNode, t
func (self *FilesController) ignoreOrExcludeFile(node *filetree.FileNode, trText string, trPrompt string, trAction string, f func(string) error) error { func (self *FilesController) ignoreOrExcludeFile(node *filetree.FileNode, trText string, trPrompt string, trAction string, f func(string) error) error {
if node.GetIsTracked() { if node.GetIsTracked() {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: trText, Title: trText,
Prompt: trPrompt, Prompt: trPrompt,
HandleConfirm: func() error { HandleConfirm: func() error {
return self.ignoreOrExcludeTracked(node, trAction, f) return self.ignoreOrExcludeTracked(node, trAction, f)
}, },
}) })
return nil
} }
return self.ignoreOrExcludeUntracked(node, trAction, f) return self.ignoreOrExcludeUntracked(node, trAction, f)
} }
@ -655,7 +662,7 @@ func (self *FilesController) refresh() error {
} }
func (self *FilesController) handleAmendCommitPress() error { func (self *FilesController) handleAmendCommitPress() error {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.AmendLastCommitTitle, Title: self.c.Tr.AmendLastCommitTitle,
Prompt: self.c.Tr.SureToAmend, Prompt: self.c.Tr.SureToAmend,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -668,6 +675,8 @@ func (self *FilesController) handleAmendCommitPress() error {
}) })
}, },
}) })
return nil
} }
func (self *FilesController) handleStatusFilterPressed() error { func (self *FilesController) handleStatusFilterPressed() error {
@ -954,7 +963,7 @@ func (self *FilesController) toggleTreeView() error {
} }
func (self *FilesController) handleStashSave(stashFunc func(message string) error, action string) error { func (self *FilesController) handleStashSave(stashFunc func(message string) error, action string) error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.StashChanges, Title: self.c.Tr.StashChanges,
HandleConfirm: func(stashComment string) error { HandleConfirm: func(stashComment string) error {
self.c.LogAction(action) self.c.LogAction(action)
@ -965,6 +974,8 @@ func (self *FilesController) handleStashSave(stashFunc func(message string) erro
return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.STASH, types.FILES}}) return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.STASH, types.FILES}})
}, },
}) })
return nil
} }
func (self *FilesController) onClickMain(opts gocui.ViewMouseBindingOpts) error { func (self *FilesController) onClickMain(opts gocui.ViewMouseBindingOpts) error {

View File

@ -61,13 +61,15 @@ func (self *FilteringMenuAction) Call() error {
menuItems = append(menuItems, &types.MenuItem{ menuItems = append(menuItems, &types.MenuItem{
Label: self.c.Tr.FilterPathOption, Label: self.c.Tr.FilterPathOption,
OnPress: func() error { OnPress: func() error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
FindSuggestionsFunc: self.c.Helpers().Suggestions.GetFilePathSuggestionsFunc(), FindSuggestionsFunc: self.c.Helpers().Suggestions.GetFilePathSuggestionsFunc(),
Title: self.c.Tr.EnterFileName, Title: self.c.Tr.EnterFileName,
HandleConfirm: func(response string) error { HandleConfirm: func(response string) error {
return self.setFilteringPath(strings.TrimSpace(response)) return self.setFilteringPath(strings.TrimSpace(response))
}, },
}) })
return nil
}, },
Tooltip: tooltip, Tooltip: tooltip,
}) })
@ -75,13 +77,15 @@ func (self *FilteringMenuAction) Call() error {
menuItems = append(menuItems, &types.MenuItem{ menuItems = append(menuItems, &types.MenuItem{
Label: self.c.Tr.FilterAuthorOption, Label: self.c.Tr.FilterAuthorOption,
OnPress: func() error { OnPress: func() error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
FindSuggestionsFunc: self.c.Helpers().Suggestions.GetAuthorsSuggestionsFunc(), FindSuggestionsFunc: self.c.Helpers().Suggestions.GetAuthorsSuggestionsFunc(),
Title: self.c.Tr.EnterAuthor, Title: self.c.Tr.EnterAuthor,
HandleConfirm: func(response string) error { HandleConfirm: func(response string) error {
return self.setFilteringAuthor(strings.TrimSpace(response)) return self.setFilteringAuthor(strings.TrimSpace(response))
}, },
}) })
return nil
}, },
Tooltip: tooltip, Tooltip: tooltip,
}) })
@ -116,9 +120,7 @@ func (self *FilteringMenuAction) setFiltering() error {
repoState.SetScreenMode(types.SCREEN_HALF) repoState.SetScreenMode(types.SCREEN_HALF)
} }
if err := self.c.Context().Push(self.c.Contexts().LocalCommits); err != nil { self.c.Context().Push(self.c.Contexts().LocalCommits)
return err
}
return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.COMMITS}, Then: func() error { return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.COMMITS}, Then: func() error {
self.c.Contexts().LocalCommits.SetSelection(0) self.c.Contexts().LocalCommits.SetSelection(0)

View File

@ -54,7 +54,7 @@ func (self *GitFlowController) handleCreateGitFlowMenu(branch *models.Branch) er
return func() error { return func() error {
title := utils.ResolvePlaceholderString(self.c.Tr.NewGitFlowBranchPrompt, map[string]string{"branchType": branchType}) title := utils.ResolvePlaceholderString(self.c.Tr.NewGitFlowBranchPrompt, map[string]string{"branchType": branchType})
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: title, Title: title,
HandleConfirm: func(name string) error { HandleConfirm: func(name string) error {
self.c.LogAction(self.c.Tr.Actions.GitFlowStart) self.c.LogAction(self.c.Tr.Actions.GitFlowStart)
@ -63,6 +63,8 @@ func (self *GitFlowController) handleCreateGitFlowMenu(branch *models.Branch) er
) )
}, },
}) })
return nil
} }
} }

View File

@ -13,7 +13,7 @@ func NewBisectHelper(c *HelperCommon) *BisectHelper {
} }
func (self *BisectHelper) Reset() error { func (self *BisectHelper) Reset() error {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.Bisect.ResetTitle, Title: self.c.Tr.Bisect.ResetTitle,
Prompt: self.c.Tr.Bisect.ResetPrompt, Prompt: self.c.Tr.Bisect.ResetPrompt,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -25,6 +25,8 @@ func (self *BisectHelper) Reset() error {
return self.PostBisectCommandRefresh() return self.PostBisectCommandRefresh()
}, },
}) })
return nil
} }
func (self *BisectHelper) PostBisectCommandRefresh() error { func (self *BisectHelper) PostBisectCommandRefresh() error {

View File

@ -32,7 +32,7 @@ func (self *BranchesHelper) ConfirmDeleteRemote(remoteName string, branchName st
"upstream": remoteName, "upstream": remoteName,
}, },
) )
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: title, Title: title,
Prompt: prompt, Prompt: prompt,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -45,6 +45,8 @@ func (self *BranchesHelper) ConfirmDeleteRemote(remoteName string, branchName st
}) })
}, },
}) })
return nil
} }
func ShortBranchName(fullBranchName string) string { func ShortBranchName(fullBranchName string) string {

View File

@ -63,7 +63,7 @@ func (self *CherryPickHelper) CopyRange(commitsList []*models.Commit, context ty
// HandlePasteCommits begins a cherry-pick rebase with the commits the user has copied. // HandlePasteCommits begins a cherry-pick rebase with the commits the user has copied.
// Only to be called from the branch commits controller // Only to be called from the branch commits controller
func (self *CherryPickHelper) Paste() error { func (self *CherryPickHelper) Paste() error {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.CherryPick, Title: self.c.Tr.CherryPick,
Prompt: self.c.Tr.SureCherryPick, Prompt: self.c.Tr.SureCherryPick,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -108,6 +108,8 @@ func (self *CherryPickHelper) Paste() error {
}) })
}, },
}) })
return nil
} }
func (self *CherryPickHelper) CanPaste() bool { func (self *CherryPickHelper) CanPaste() bool {

View File

@ -101,10 +101,7 @@ func (self *CommitsHelper) SwitchToEditor() error {
return err return err
} }
err = self.CloseCommitMessagePanel() self.CloseCommitMessagePanel()
if err != nil {
return err
}
return self.c.Contexts().CommitMessage.SwitchToEditor(filepath) return self.c.Contexts().CommitMessage.SwitchToEditor(filepath)
} }
@ -134,11 +131,9 @@ type OpenCommitMessagePanelOpts struct {
InitialMessage string InitialMessage string
} }
func (self *CommitsHelper) OpenCommitMessagePanel(opts *OpenCommitMessagePanelOpts) error { func (self *CommitsHelper) OpenCommitMessagePanel(opts *OpenCommitMessagePanelOpts) {
onConfirm := func(summary string, description string) error { onConfirm := func(summary string, description string) error {
if err := self.CloseCommitMessagePanel(); err != nil { self.CloseCommitMessagePanel()
return err
}
return opts.OnConfirm(summary, description) return opts.OnConfirm(summary, description)
} }
@ -154,7 +149,7 @@ func (self *CommitsHelper) OpenCommitMessagePanel(opts *OpenCommitMessagePanelOp
self.UpdateCommitPanelView(opts.InitialMessage) self.UpdateCommitPanelView(opts.InitialMessage)
return self.c.Context().Push(self.c.Contexts().CommitMessage) self.c.Context().Push(self.c.Contexts().CommitMessage)
} }
func (self *CommitsHelper) OnCommitSuccess() { func (self *CommitsHelper) OnCommitSuccess() {
@ -179,7 +174,7 @@ func (self *CommitsHelper) HandleCommitConfirm() error {
return nil return nil
} }
func (self *CommitsHelper) CloseCommitMessagePanel() error { func (self *CommitsHelper) CloseCommitMessagePanel() {
if self.c.Contexts().CommitMessage.GetPreserveMessage() { if self.c.Contexts().CommitMessage.GetPreserveMessage() {
message := self.JoinCommitMessageAndUnwrappedDescription() message := self.JoinCommitMessageAndUnwrappedDescription()
@ -193,7 +188,7 @@ func (self *CommitsHelper) CloseCommitMessagePanel() error {
self.c.Views().CommitMessage.Visible = false self.c.Views().CommitMessage.Visible = false
self.c.Views().CommitDescription.Visible = false self.c.Views().CommitDescription.Visible = false
return self.c.Context().Pop() self.c.Context().Pop()
} }
func (self *CommitsHelper) OpenCommitMenu(suggestionFunc func(string) []*types.Suggestion) error { func (self *CommitsHelper) OpenCommitMenu(suggestionFunc func(string) []*types.Suggestion) error {
@ -235,7 +230,7 @@ func (self *CommitsHelper) OpenCommitMenu(suggestionFunc func(string) []*types.S
} }
func (self *CommitsHelper) addCoAuthor(suggestionFunc func(string) []*types.Suggestion) error { func (self *CommitsHelper) addCoAuthor(suggestionFunc func(string) []*types.Suggestion) error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.AddCoAuthorPromptTitle, Title: self.c.Tr.AddCoAuthorPromptTitle,
FindSuggestionsFunc: suggestionFunc, FindSuggestionsFunc: suggestionFunc,
HandleConfirm: func(value string) error { HandleConfirm: func(value string) error {
@ -245,6 +240,8 @@ func (self *CommitsHelper) addCoAuthor(suggestionFunc func(string) []*types.Sugg
return nil return nil
}, },
}) })
return nil
} }
func (self *CommitsHelper) pasteCommitMessageFromClipboard() error { func (self *CommitsHelper) pasteCommitMessageFromClipboard() error {
@ -262,7 +259,7 @@ func (self *CommitsHelper) pasteCommitMessageFromClipboard() error {
} }
// Confirm before overwriting the commit message // Confirm before overwriting the commit message
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.PasteCommitMessageFromClipboard, Title: self.c.Tr.PasteCommitMessageFromClipboard,
Prompt: self.c.Tr.SurePasteCommitMessage, Prompt: self.c.Tr.SurePasteCommitMessage,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -270,4 +267,6 @@ func (self *CommitsHelper) pasteCommitMessageFromClipboard() error {
return nil return nil
}, },
}) })
return nil
} }

View File

@ -28,9 +28,7 @@ func (self *ConfirmationHelper) wrappedConfirmationFunction(cancel goContext.Can
return func() error { return func() error {
cancel() cancel()
if err := self.c.Context().Pop(); err != nil { self.c.Context().Pop()
return err
}
if function != nil { if function != nil {
if err := function(); err != nil { if err := function(); err != nil {
@ -163,7 +161,7 @@ func (self *ConfirmationHelper) prepareConfirmationPanel(
self.c.Views().Confirmation.Wrap = !opts.Editable self.c.Views().Confirmation.Wrap = !opts.Editable
self.c.Views().Confirmation.FgColor = theme.GocuiDefaultTextColor self.c.Views().Confirmation.FgColor = theme.GocuiDefaultTextColor
self.c.Views().Confirmation.Mask = runeForMask(opts.Mask) self.c.Views().Confirmation.Mask = runeForMask(opts.Mask)
_ = self.c.Views().Confirmation.SetOrigin(0, 0) self.c.Views().Confirmation.SetOrigin(0, 0)
suggestionsContext := self.c.Contexts().Suggestions suggestionsContext := self.c.Contexts().Suggestions
suggestionsContext.State.FindSuggestions = opts.FindSuggestionsFunc suggestionsContext.State.FindSuggestions = opts.FindSuggestionsFunc
@ -185,7 +183,7 @@ func runeForMask(mask bool) rune {
return 0 return 0
} }
func (self *ConfirmationHelper) CreatePopupPanel(ctx goContext.Context, opts types.CreatePopupPanelOpts) error { func (self *ConfirmationHelper) CreatePopupPanel(ctx goContext.Context, opts types.CreatePopupPanelOpts) {
self.c.Mutexes().PopupMutex.Lock() self.c.Mutexes().PopupMutex.Lock()
defer self.c.Mutexes().PopupMutex.Unlock() defer self.c.Mutexes().PopupMutex.Unlock()
@ -199,7 +197,7 @@ func (self *ConfirmationHelper) CreatePopupPanel(ctx goContext.Context, opts typ
if currentPopupOpts != nil && !currentPopupOpts.HasLoader { if currentPopupOpts != nil && !currentPopupOpts.HasLoader {
self.c.Log.Error("ignoring create popup panel because a popup panel is already open") self.c.Log.Error("ignoring create popup panel because a popup panel is already open")
cancel() cancel()
return nil return
} }
// remove any previous keybindings // remove any previous keybindings
@ -232,7 +230,7 @@ func (self *ConfirmationHelper) CreatePopupPanel(ctx goContext.Context, opts typ
self.c.State().GetRepoState().SetCurrentPopupOpts(&opts) self.c.State().GetRepoState().SetCurrentPopupOpts(&opts)
return self.c.Context().Push(self.c.Contexts().Confirmation) self.c.Context().Push(self.c.Contexts().Confirmation)
} }
func underlineLinks(text string) string { func underlineLinks(text string) string {
@ -366,11 +364,11 @@ func (self *ConfirmationHelper) layoutMenuPrompt(contentWidth int) int {
// We need to rerender to give the menu context a chance to update its // We need to rerender to give the menu context a chance to update its
// non-model items, and reinitialize the data it uses for converting // non-model items, and reinitialize the data it uses for converting
// between view index and model index. // between view index and model index.
_ = self.c.Contexts().Menu.HandleRender() self.c.Contexts().Menu.HandleRender()
// Then we need to refocus to ensure the cursor is in the right place in // Then we need to refocus to ensure the cursor is in the right place in
// the view. // the view.
_ = self.c.Contexts().Menu.HandleFocus(types.OnFocusOpts{}) self.c.Contexts().Menu.HandleFocus(types.OnFocusOpts{})
} }
return len(promptLines) return len(promptLines)
} }

View File

@ -27,7 +27,7 @@ func (self *CredentialsHelper) PromptUserForCredential(passOrUname oscommands.Cr
self.c.OnUIThread(func() error { self.c.OnUIThread(func() error {
title, mask := self.getTitleAndMask(passOrUname) title, mask := self.getTitleAndMask(passOrUname)
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: title, Title: title,
Mask: mask, Mask: mask,
HandleConfirm: func(input string) error { HandleConfirm: func(input string) error {
@ -41,6 +41,8 @@ func (self *CredentialsHelper) PromptUserForCredential(passOrUname oscommands.Cr
return nil return nil
}, },
}) })
return nil
}) })
return ch return ch

View File

@ -81,7 +81,7 @@ func (self *DiffHelper) ExitDiffMode() error {
return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
} }
func (self *DiffHelper) RenderDiff() error { func (self *DiffHelper) RenderDiff() {
args := self.DiffArgs() args := self.DiffArgs()
cmdObj := self.c.Git().Diff.DiffCmdObj(args) cmdObj := self.c.Git().Diff.DiffCmdObj(args)
task := types.NewRunPtyTask(cmdObj.GetCmd()) task := types.NewRunPtyTask(cmdObj.GetCmd())
@ -91,7 +91,7 @@ func (self *DiffHelper) RenderDiff() error {
"git diff "+strings.Join(args, " "), "git diff "+strings.Join(args, " "),
) )
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: self.c.MainViewPairs().Normal, Pair: self.c.MainViewPairs().Normal,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Title: "Diff", Title: "Diff",
@ -141,12 +141,12 @@ func (self *DiffHelper) currentlySelectedFilename() string {
return "" return ""
} }
func (self *DiffHelper) WithDiffModeCheck(f func() error) error { func (self *DiffHelper) WithDiffModeCheck(f func()) {
if self.c.Modes().Diffing.Active() { if self.c.Modes().Diffing.Active() {
return self.RenderDiff() self.RenderDiff()
} else {
f()
} }
return f()
} }
func (self *DiffHelper) IgnoringWhitespaceSubTitle() string { func (self *DiffHelper) IgnoringWhitespaceSubTitle() string {

View File

@ -137,17 +137,20 @@ func (self *FixupHelper) HandleFindBaseCommitForFixupPress() error {
} }
self.c.Contexts().LocalCommits.SetSelection(index) self.c.Contexts().LocalCommits.SetSelection(index)
return self.c.Context().Push(self.c.Contexts().LocalCommits) self.c.Context().Push(self.c.Contexts().LocalCommits)
return nil
} }
if warnAboutAddedLines { if warnAboutAddedLines {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.FindBaseCommitForFixup, Title: self.c.Tr.FindBaseCommitForFixup,
Prompt: self.c.Tr.HunksWithOnlyAddedLinesWarning, Prompt: self.c.Tr.HunksWithOnlyAddedLinesWarning,
HandleConfirm: func() error { HandleConfirm: func() error {
return doIt() return doIt()
}, },
}) })
return nil
} }
return doIt() return doIt()

View File

@ -151,7 +151,7 @@ func (self *InlineStatusHelper) stop(opts InlineStatusOpts) {
func (self *InlineStatusHelper) renderContext(contextKey types.ContextKey) { func (self *InlineStatusHelper) renderContext(contextKey types.ContextKey) {
self.c.OnUIThread(func() error { self.c.OnUIThread(func() error {
_ = self.c.ContextForKey(contextKey).HandleRender() self.c.ContextForKey(contextKey).HandleRender()
return nil return nil
}) })
} }

View File

@ -202,7 +202,8 @@ func (self *MergeAndRebaseHelper) PromptForConflictHandling() error {
{ {
Label: self.c.Tr.ViewConflictsMenuItem, Label: self.c.Tr.ViewConflictsMenuItem,
OnPress: func() error { OnPress: func() error {
return self.c.Context().Push(self.c.Contexts().Files) self.c.Context().Push(self.c.Contexts().Files)
return nil
}, },
}, },
{ {
@ -220,13 +221,15 @@ func (self *MergeAndRebaseHelper) PromptForConflictHandling() error {
func (self *MergeAndRebaseHelper) AbortMergeOrRebaseWithConfirm() error { func (self *MergeAndRebaseHelper) AbortMergeOrRebaseWithConfirm() error {
// prompt user to confirm that they want to abort, then do it // prompt user to confirm that they want to abort, then do it
mode := self.workingTreeStateNoun() mode := self.workingTreeStateNoun()
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: fmt.Sprintf(self.c.Tr.AbortTitle, mode), Title: fmt.Sprintf(self.c.Tr.AbortTitle, mode),
Prompt: fmt.Sprintf(self.c.Tr.AbortPrompt, mode), Prompt: fmt.Sprintf(self.c.Tr.AbortPrompt, mode),
HandleConfirm: func() error { HandleConfirm: func() error {
return self.genericMergeCommand(REBASE_OPTION_ABORT) return self.genericMergeCommand(REBASE_OPTION_ABORT)
}, },
}) })
return nil
} }
func (self *MergeAndRebaseHelper) workingTreeStateNoun() string { func (self *MergeAndRebaseHelper) workingTreeStateNoun() string {
@ -243,7 +246,7 @@ func (self *MergeAndRebaseHelper) workingTreeStateNoun() string {
// PromptToContinueRebase asks the user if they want to continue the rebase/merge that's in progress // PromptToContinueRebase asks the user if they want to continue the rebase/merge that's in progress
func (self *MergeAndRebaseHelper) PromptToContinueRebase() error { func (self *MergeAndRebaseHelper) PromptToContinueRebase() error {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.Continue, Title: self.c.Tr.Continue,
Prompt: self.c.Tr.ConflictsResolved, Prompt: self.c.Tr.ConflictsResolved,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -263,7 +266,7 @@ func (self *MergeAndRebaseHelper) PromptToContinueRebase() error {
root := self.c.Contexts().Files.FileTreeViewModel.GetRoot() root := self.c.Contexts().Files.FileTreeViewModel.GetRoot()
if root.GetHasUnstagedChanges() { if root.GetHasUnstagedChanges() {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.Continue, Title: self.c.Tr.Continue,
Prompt: self.c.Tr.UnstagedFilesAfterConflictsResolved, Prompt: self.c.Tr.UnstagedFilesAfterConflictsResolved,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -275,11 +278,15 @@ func (self *MergeAndRebaseHelper) PromptToContinueRebase() error {
return self.genericMergeCommand(REBASE_OPTION_CONTINUE) return self.genericMergeCommand(REBASE_OPTION_CONTINUE)
}, },
}) })
return nil
} }
return self.genericMergeCommand(REBASE_OPTION_CONTINUE) return self.genericMergeCommand(REBASE_OPTION_CONTINUE)
}, },
}) })
return nil
} }
func (self *MergeAndRebaseHelper) RebaseOntoRef(ref string) error { func (self *MergeAndRebaseHelper) RebaseOntoRef(ref string) error {
@ -346,7 +353,8 @@ func (self *MergeAndRebaseHelper) RebaseOntoRef(ref string) error {
if err = self.ResetMarkedBaseCommit(); err != nil { if err = self.ResetMarkedBaseCommit(); err != nil {
return err return err
} }
return self.c.Context().Push(self.c.Contexts().LocalCommits) self.c.Context().Push(self.c.Contexts().LocalCommits)
return nil
}, },
}, },
{ {

View File

@ -62,7 +62,7 @@ func (self *MergeConflictsHelper) EscapeMerge() error {
// files context over it. // files context over it.
// So long as both places call OnUIThread, we're fine. // So long as both places call OnUIThread, we're fine.
if self.c.Context().IsCurrent(self.c.Contexts().MergeConflicts) { if self.c.Context().IsCurrent(self.c.Contexts().MergeConflicts) {
return self.c.Context().Push(self.c.Contexts().Files) self.c.Context().Push(self.c.Contexts().Files)
} }
return nil return nil
}) })
@ -93,14 +93,15 @@ func (self *MergeConflictsHelper) SwitchToMerge(path string) error {
} }
} }
return self.c.Context().Push(self.c.Contexts().MergeConflicts) self.c.Context().Push(self.c.Contexts().MergeConflicts)
return nil
} }
func (self *MergeConflictsHelper) context() *context.MergeConflictsContext { func (self *MergeConflictsHelper) context() *context.MergeConflictsContext {
return self.c.Contexts().MergeConflicts return self.c.Contexts().MergeConflicts
} }
func (self *MergeConflictsHelper) Render() error { func (self *MergeConflictsHelper) Render() {
content := self.context().GetContentToRender() content := self.context().GetContentToRender()
var task types.UpdateTask var task types.UpdateTask
@ -111,7 +112,7 @@ func (self *MergeConflictsHelper) Render() error {
task = types.NewRenderStringWithScrollTask(content, 0, originY) task = types.NewRenderStringWithScrollTask(content, 0, originY)
} }
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: self.c.MainViewPairs().MergeConflicts, Pair: self.c.MainViewPairs().MergeConflicts,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Task: task, Task: task,

View File

@ -33,8 +33,8 @@ func (self *PatchBuildingHelper) ValidateNormalWorkingTreeState() (bool, error)
} }
// takes us from the patch building panel back to the commit files panel // takes us from the patch building panel back to the commit files panel
func (self *PatchBuildingHelper) Escape() error { func (self *PatchBuildingHelper) Escape() {
return self.c.Context().Pop() self.c.Context().Pop()
} }
// kills the custom patch and returns us back to the commit files panel if needed // kills the custom patch and returns us back to the commit files panel if needed
@ -42,9 +42,7 @@ func (self *PatchBuildingHelper) Reset() error {
self.c.Git().Patch.PatchBuilder.Reset() self.c.Git().Patch.PatchBuilder.Reset()
if self.c.Context().CurrentStatic().GetKind() != types.SIDE_CONTEXT { if self.c.Context().CurrentStatic().GetKind() != types.SIDE_CONTEXT {
if err := self.Escape(); err != nil { self.Escape()
return err
}
} }
if err := self.c.Refresh(types.RefreshOptions{ if err := self.c.Refresh(types.RefreshOptions{
@ -57,27 +55,28 @@ func (self *PatchBuildingHelper) Reset() error {
return self.c.PostRefreshUpdate(self.c.Context().Current()) return self.c.PostRefreshUpdate(self.c.Context().Current())
} }
func (self *PatchBuildingHelper) RefreshPatchBuildingPanel(opts types.OnFocusOpts) error { func (self *PatchBuildingHelper) RefreshPatchBuildingPanel(opts types.OnFocusOpts) {
selectedLineIdx := -1 selectedLineIdx := -1
if opts.ClickedWindowName == "main" { if opts.ClickedWindowName == "main" {
selectedLineIdx = opts.ClickedViewLineIdx selectedLineIdx = opts.ClickedViewLineIdx
} }
if !self.c.Git().Patch.PatchBuilder.Active() { if !self.c.Git().Patch.PatchBuilder.Active() {
return self.Escape() self.Escape()
return
} }
// get diff from commit file that's currently selected // get diff from commit file that's currently selected
path := self.c.Contexts().CommitFiles.GetSelectedPath() path := self.c.Contexts().CommitFiles.GetSelectedPath()
if path == "" { if path == "" {
return nil return
} }
from, to := self.c.Contexts().CommitFiles.GetFromAndToForDiff() from, to := self.c.Contexts().CommitFiles.GetFromAndToForDiff()
from, reverse := self.c.Modes().Diffing.GetFromAndReverseArgsForDiff(from) from, reverse := self.c.Modes().Diffing.GetFromAndReverseArgsForDiff(from)
diff, err := self.c.Git().WorkingTree.ShowFileDiff(from, to, reverse, path, true) diff, err := self.c.Git().WorkingTree.ShowFileDiff(from, to, reverse, path, true)
if err != nil { if err != nil {
return err return
} }
secondaryDiff := self.c.Git().Patch.PatchBuilder.RenderPatchForFile(patch.RenderPatchForFileOpts{ secondaryDiff := self.c.Git().Patch.PatchBuilder.RenderPatchForFile(patch.RenderPatchForFileOpts{
@ -94,14 +93,15 @@ func (self *PatchBuildingHelper) RefreshPatchBuildingPanel(opts types.OnFocusOpt
state := patch_exploring.NewState(diff, selectedLineIdx, oldState, self.c.Log) state := patch_exploring.NewState(diff, selectedLineIdx, oldState, self.c.Log)
context.SetState(state) context.SetState(state)
if state == nil { if state == nil {
return self.Escape() self.Escape()
return
} }
mainContent := context.GetContentToRender(true) mainContent := context.GetContentToRender(true)
self.c.Contexts().CustomPatchBuilder.FocusSelection() self.c.Contexts().CustomPatchBuilder.FocusSelection()
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: self.c.MainViewPairs().PatchBuilding, Pair: self.c.MainViewPairs().PatchBuilding,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Task: types.NewRenderStringWithoutScrollTask(mainContent), Task: types.NewRenderStringWithoutScrollTask(mainContent),

View File

@ -175,12 +175,12 @@ func (self *RefreshHelper) Refresh(options types.RefreshOptions) error {
if scopeSet.Includes(types.STAGING) { if scopeSet.Includes(types.STAGING) {
refresh("staging", func() { refresh("staging", func() {
fileWg.Wait() fileWg.Wait()
_ = self.stagingHelper.RefreshStagingPanel(types.OnFocusOpts{}) self.stagingHelper.RefreshStagingPanel(types.OnFocusOpts{})
}) })
} }
if scopeSet.Includes(types.PATCH_BUILDING) { if scopeSet.Includes(types.PATCH_BUILDING) {
refresh("patch building", func() { _ = self.patchBuildingHelper.RefreshPatchBuildingPanel(types.OnFocusOpts{}) }) refresh("patch building", func() { self.patchBuildingHelper.RefreshPatchBuildingPanel(types.OnFocusOpts{}) })
} }
if scopeSet.Includes(types.MERGE_CONFLICTS) || scopeSet.Includes(types.FILES) { if scopeSet.Includes(types.MERGE_CONFLICTS) || scopeSet.Includes(types.FILES) {
@ -469,9 +469,7 @@ func (self *RefreshHelper) refreshBranches(refreshWorktrees bool, keepBranchSele
}, },
func() { func() {
self.c.OnUIThread(func() error { self.c.OnUIThread(func() error {
if err := self.c.Contexts().Branches.HandleRender(); err != nil { self.c.Contexts().Branches.HandleRender()
self.c.Log.Error(err)
}
self.refreshStatus() self.refreshStatus()
return nil return nil
}) })
@ -504,9 +502,7 @@ func (self *RefreshHelper) refreshBranches(refreshWorktrees bool, keepBranchSele
// Need to re-render the commits view because the visualization of local // Need to re-render the commits view because the visualization of local
// branch heads might have changed // branch heads might have changed
self.c.Mutexes().LocalCommitsMutex.Lock() self.c.Mutexes().LocalCommitsMutex.Lock()
if err := self.c.Contexts().LocalCommits.HandleRender(); err != nil { self.c.Contexts().LocalCommits.HandleRender()
self.c.Log.Error(err)
}
self.c.Mutexes().LocalCommitsMutex.Unlock() self.c.Mutexes().LocalCommitsMutex.Unlock()
self.refreshStatus() self.refreshStatus()

View File

@ -78,8 +78,8 @@ func (self *RefsHelper) CheckoutRef(ref string, options types.CheckoutRefOptions
// offer to autostash changes // offer to autostash changes
self.c.OnUIThread(func() error { self.c.OnUIThread(func() error {
// (Before showing the prompt, render again to remove the inline status) // (Before showing the prompt, render again to remove the inline status)
_ = self.c.Contexts().Branches.HandleRender() self.c.Contexts().Branches.HandleRender()
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.AutoStashTitle, Title: self.c.Tr.AutoStashTitle,
Prompt: self.c.Tr.AutoStashPrompt, Prompt: self.c.Tr.AutoStashPrompt,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -97,6 +97,8 @@ func (self *RefsHelper) CheckoutRef(ref string, options types.CheckoutRefOptions
}) })
}, },
}) })
return nil
}) })
return nil return nil
} }
@ -115,9 +117,7 @@ func (self *RefsHelper) CheckoutRemoteBranch(fullBranchName string, localBranchN
// Switch to the branches context _before_ starting to check out the // Switch to the branches context _before_ starting to check out the
// branch, so that we see the inline status // branch, so that we see the inline status
if self.c.Context().Current() != self.c.Contexts().Branches { if self.c.Context().Current() != self.c.Contexts().Branches {
if err := self.c.Context().Push(self.c.Contexts().Branches); err != nil { self.c.Context().Push(self.c.Contexts().Branches)
return err
}
} }
return self.CheckoutRef(branchName, types.CheckoutRefOptions{}) return self.CheckoutRef(branchName, types.CheckoutRefOptions{})
} }
@ -285,9 +285,7 @@ func (self *RefsHelper) NewBranch(from string, fromFormattedName string, suggest
refresh := func() error { refresh := func() error {
if self.c.Context().Current() != self.c.Contexts().Branches { if self.c.Context().Current() != self.c.Contexts().Branches {
if err := self.c.Context().Push(self.c.Contexts().Branches); err != nil { self.c.Context().Push(self.c.Contexts().Branches)
return err
}
} }
self.c.Contexts().LocalCommits.SetSelection(0) self.c.Contexts().LocalCommits.SetSelection(0)
@ -296,7 +294,7 @@ func (self *RefsHelper) NewBranch(from string, fromFormattedName string, suggest
return self.c.Refresh(types.RefreshOptions{Mode: types.BLOCK_UI, KeepBranchSelectionIndex: true}) return self.c.Refresh(types.RefreshOptions{Mode: types.BLOCK_UI, KeepBranchSelectionIndex: true})
} }
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: message, Title: message,
InitialContent: suggestedBranchName, InitialContent: suggestedBranchName,
HandleConfirm: func(response string) error { HandleConfirm: func(response string) error {
@ -309,7 +307,7 @@ func (self *RefsHelper) NewBranch(from string, fromFormattedName string, suggest
if err := newBranchFunc(newBranchName, from); err != nil { if err := newBranchFunc(newBranchName, from); err != nil {
if IsSwitchBranchUncommitedChangesError(err) { if IsSwitchBranchUncommitedChangesError(err) {
// offer to autostash changes // offer to autostash changes
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.AutoStashTitle, Title: self.c.Tr.AutoStashTitle,
Prompt: self.c.Tr.AutoStashPrompt, Prompt: self.c.Tr.AutoStashPrompt,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -329,6 +327,8 @@ func (self *RefsHelper) NewBranch(from string, fromFormattedName string, suggest
return refreshError return refreshError
}, },
}) })
return nil
} }
return err return err
@ -337,6 +337,8 @@ func (self *RefsHelper) NewBranch(from string, fromFormattedName string, suggest
return refresh() return refresh()
}, },
}) })
return nil
} }
// SanitizedBranchName will remove all spaces in favor of a dash "-" to meet // SanitizedBranchName will remove all spaces in favor of a dash "-" to meet

View File

@ -41,9 +41,7 @@ func (self *SearchHelper) OpenFilterPrompt(context types.IFilterableContext) err
self.OnPromptContentChanged("") self.OnPromptContentChanged("")
promptView.RenderTextArea() promptView.RenderTextArea()
if err := self.c.Context().Push(self.c.Contexts().Search); err != nil { self.c.Context().Push(self.c.Contexts().Search)
return err
}
return self.c.ResetKeybindings() return self.c.ResetKeybindings()
} }
@ -60,9 +58,7 @@ func (self *SearchHelper) OpenSearchPrompt(context types.ISearchableContext) err
promptView.ClearTextArea() promptView.ClearTextArea()
promptView.RenderTextArea() promptView.RenderTextArea()
if err := self.c.Context().Push(self.c.Contexts().Search); err != nil { self.c.Context().Push(self.c.Contexts().Search)
return err
}
return self.c.ResetKeybindings() return self.c.ResetKeybindings()
} }
@ -115,11 +111,11 @@ func (self *SearchHelper) Confirm() error {
var err error var err error
switch state.SearchType() { switch state.SearchType() {
case types.SearchTypeFilter: case types.SearchTypeFilter:
err = self.ConfirmFilter() self.ConfirmFilter()
case types.SearchTypeSearch: case types.SearchTypeSearch:
err = self.ConfirmSearch() err = self.ConfirmSearch()
case types.SearchTypeNone: case types.SearchTypeNone:
err = self.c.Context().Pop() self.c.Context().Pop()
} }
if err != nil { if err != nil {
@ -129,14 +125,14 @@ func (self *SearchHelper) Confirm() error {
return self.c.ResetKeybindings() return self.c.ResetKeybindings()
} }
func (self *SearchHelper) ConfirmFilter() error { func (self *SearchHelper) ConfirmFilter() {
// We also do this on each keypress but we do it here again just in case // We also do this on each keypress but we do it here again just in case
state := self.searchState() state := self.searchState()
context, ok := state.Context.(types.IFilterableContext) context, ok := state.Context.(types.IFilterableContext)
if !ok { if !ok {
self.c.Log.Warnf("Context %s is not filterable", state.Context.GetKey()) self.c.Log.Warnf("Context %s is not filterable", state.Context.GetKey())
return nil return
} }
self.OnPromptContentChanged(self.promptContent()) self.OnPromptContentChanged(self.promptContent())
@ -145,7 +141,7 @@ func (self *SearchHelper) ConfirmFilter() error {
context.GetSearchHistory().Push(filterString) context.GetSearchHistory().Push(filterString)
} }
return self.c.Context().Pop() self.c.Context().Pop()
} }
func (self *SearchHelper) ConfirmSearch() error { func (self *SearchHelper) ConfirmSearch() error {
@ -163,9 +159,7 @@ func (self *SearchHelper) ConfirmSearch() error {
context.GetSearchHistory().Push(searchString) context.GetSearchHistory().Push(searchString)
} }
if err := self.c.Context().Pop(); err != nil { self.c.Context().Pop()
return err
}
return context.GetView().Search(searchString, modelSearchResults(context)) return context.GetView().Search(searchString, modelSearchResults(context))
} }
@ -188,9 +182,7 @@ func modelSearchResults(context types.ISearchableContext) []gocui.SearchPosition
func (self *SearchHelper) CancelPrompt() error { func (self *SearchHelper) CancelPrompt() error {
self.Cancel() self.Cancel()
if err := self.c.Context().Pop(); err != nil { self.c.Context().Pop()
return err
}
return self.c.ResetKeybindings() return self.c.ResetKeybindings()
} }
@ -237,7 +229,7 @@ func (self *SearchHelper) OnPromptContentChanged(searchString string) {
switch context := state.Context.(type) { switch context := state.Context.(type) {
case types.IFilterableContext: case types.IFilterableContext:
context.SetSelection(0) context.SetSelection(0)
_ = context.GetView().SetOriginY(0) context.GetView().SetOriginY(0)
context.SetFilter(searchString, self.c.UserConfig().Gui.UseFuzzySearch()) context.SetFilter(searchString, self.c.UserConfig().Gui.UseFuzzySearch())
_ = self.c.PostRefreshUpdate(context) _ = self.c.PostRefreshUpdate(context)
case types.ISearchableContext: case types.ISearchableContext:
@ -253,7 +245,7 @@ func (self *SearchHelper) ReApplyFilter(context types.Context) {
state := self.searchState() state := self.searchState()
if context == state.Context { if context == state.Context {
filterableContext.SetSelection(0) filterableContext.SetSelection(0)
_ = filterableContext.GetView().SetOriginY(0) filterableContext.GetView().SetOriginY(0)
} }
filterableContext.ReApplyFilter(self.c.UserConfig().Gui.UseFuzzySearch()) filterableContext.ReApplyFilter(self.c.UserConfig().Gui.UseFuzzySearch())
} }

View File

@ -19,14 +19,14 @@ func NewStagingHelper(
} }
// NOTE: used from outside this file // NOTE: used from outside this file
func (self *StagingHelper) RefreshStagingPanel(focusOpts types.OnFocusOpts) error { func (self *StagingHelper) RefreshStagingPanel(focusOpts types.OnFocusOpts) {
secondaryFocused := self.secondaryStagingFocused() secondaryFocused := self.secondaryStagingFocused()
mainFocused := self.mainStagingFocused() mainFocused := self.mainStagingFocused()
// this method could be called when the staging panel is not being used, // this method could be called when the staging panel is not being used,
// in which case we don't want to do anything. // in which case we don't want to do anything.
if !mainFocused && !secondaryFocused { if !mainFocused && !secondaryFocused {
return nil return
} }
mainSelectedLineIdx := -1 mainSelectedLineIdx := -1
@ -49,7 +49,8 @@ func (self *StagingHelper) RefreshStagingPanel(focusOpts types.OnFocusOpts) erro
} }
if file == nil || (!file.HasUnstagedChanges && !file.HasStagedChanges) { if file == nil || (!file.HasUnstagedChanges && !file.HasStagedChanges) {
return self.handleStagingEscape() self.handleStagingEscape()
return
} }
mainDiff := self.c.Git().WorkingTree.WorktreeFileDiff(file, true, false) mainDiff := self.c.Git().WorkingTree.WorktreeFileDiff(file, true, false)
@ -79,15 +80,18 @@ func (self *StagingHelper) RefreshStagingPanel(focusOpts types.OnFocusOpts) erro
secondaryContext.GetMutex().Unlock() secondaryContext.GetMutex().Unlock()
if mainState == nil && secondaryState == nil { if mainState == nil && secondaryState == nil {
return self.handleStagingEscape() self.handleStagingEscape()
return
} }
if mainState == nil && !secondaryFocused { if mainState == nil && !secondaryFocused {
return self.c.Context().Push(secondaryContext, focusOpts) self.c.Context().Push(secondaryContext, focusOpts)
return
} }
if secondaryState == nil && secondaryFocused { if secondaryState == nil && secondaryFocused {
return self.c.Context().Push(mainContext, focusOpts) self.c.Context().Push(mainContext, focusOpts)
return
} }
if secondaryFocused { if secondaryFocused {
@ -96,7 +100,7 @@ func (self *StagingHelper) RefreshStagingPanel(focusOpts types.OnFocusOpts) erro
self.c.Contexts().Staging.FocusSelection() self.c.Contexts().Staging.FocusSelection()
} }
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: self.c.MainViewPairs().Staging, Pair: self.c.MainViewPairs().Staging,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Task: types.NewRenderStringWithoutScrollTask(mainContent), Task: types.NewRenderStringWithoutScrollTask(mainContent),
@ -109,8 +113,8 @@ func (self *StagingHelper) RefreshStagingPanel(focusOpts types.OnFocusOpts) erro
}) })
} }
func (self *StagingHelper) handleStagingEscape() error { func (self *StagingHelper) handleStagingEscape() {
return self.c.Context().Push(self.c.Contexts().Files) self.c.Context().Push(self.c.Contexts().Files)
} }
func (self *StagingHelper) secondaryStagingFocused() bool { func (self *StagingHelper) secondaryStagingFocused() bool {

View File

@ -72,5 +72,6 @@ func (self *SubCommitsHelper) ViewSubCommits(opts ViewSubCommitsOpts) error {
return err return err
} }
return self.c.Context().Push(self.c.Contexts().SubCommits) self.c.Context().Push(self.c.Contexts().SubCommits)
return nil
} }

View File

@ -52,19 +52,21 @@ func (self *TagsHelper) OpenCreateTagPrompt(ref string, onCreate func()) error {
"confirmKey": self.c.UserConfig().Keybinding.Universal.Confirm, "confirmKey": self.c.UserConfig().Keybinding.Universal.Confirm,
}, },
) )
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.ForceTag, Title: self.c.Tr.ForceTag,
Prompt: prompt, Prompt: prompt,
HandleConfirm: func() error { HandleConfirm: func() error {
return doCreateTag(tagName, description, true) return doCreateTag(tagName, description, true)
}, },
}) })
} else {
return doCreateTag(tagName, description, false) return nil
} }
return doCreateTag(tagName, description, false)
} }
return self.commitsHelper.OpenCommitMessagePanel( self.commitsHelper.OpenCommitMessagePanel(
&OpenCommitMessagePanelOpts{ &OpenCommitMessagePanelOpts{
CommitIndex: context.NoCommitIndex, CommitIndex: context.NoCommitIndex,
InitialMessage: "", InitialMessage: "",
@ -74,4 +76,6 @@ func (self *TagsHelper) OpenCreateTagPrompt(ref string, onCreate func()) error {
OnConfirm: onConfirm, OnConfirm: onConfirm,
}, },
) )
return nil
} }

View File

@ -75,7 +75,8 @@ func (self *UpdateHelper) onUpdateFinish(err error) error {
) )
return errors.New(errMessage) return errors.New(errMessage)
} }
return self.c.Alert(self.c.Tr.UpdateCompletedTitle, self.c.Tr.UpdateCompleted) self.c.Alert(self.c.Tr.UpdateCompletedTitle, self.c.Tr.UpdateCompleted)
return nil
}) })
return nil return nil
@ -88,7 +89,7 @@ func (self *UpdateHelper) showUpdatePrompt(newVersion string) error {
}, },
) )
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.UpdateAvailableTitle, Title: self.c.Tr.UpdateAvailableTitle,
Prompt: message, Prompt: message,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -96,4 +97,6 @@ func (self *UpdateHelper) showUpdatePrompt(newVersion string) error {
return nil return nil
}, },
}) })
return nil
} }

View File

@ -47,12 +47,14 @@ func (self *UpstreamHelper) ParseUpstream(upstream string) (string, string, erro
} }
func (self *UpstreamHelper) promptForUpstream(initialContent string, onConfirm func(string) error) error { func (self *UpstreamHelper) promptForUpstream(initialContent string, onConfirm func(string) error) error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.EnterUpstream, Title: self.c.Tr.EnterUpstream,
InitialContent: initialContent, InitialContent: initialContent,
FindSuggestionsFunc: self.getRemoteBranchesSuggestionsFunc(" "), FindSuggestionsFunc: self.getRemoteBranchesSuggestionsFunc(" "),
HandleConfirm: onConfirm, HandleConfirm: onConfirm,
}) })
return nil
} }
func (self *UpstreamHelper) PromptForUpstreamWithInitialContent(currentBranch *models.Branch, onConfirm func(string) error) error { func (self *UpstreamHelper) PromptForUpstreamWithInitialContent(currentBranch *models.Branch, onConfirm func(string) error) error {

View File

@ -72,7 +72,7 @@ func (self *WorkingTreeHelper) FileForSubmodule(submodule *models.SubmoduleConfi
} }
func (self *WorkingTreeHelper) OpenMergeTool() error { func (self *WorkingTreeHelper) OpenMergeTool() error {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.MergeToolTitle, Title: self.c.Tr.MergeToolTitle,
Prompt: self.c.Tr.MergeToolPrompt, Prompt: self.c.Tr.MergeToolPrompt,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -82,11 +82,13 @@ func (self *WorkingTreeHelper) OpenMergeTool() error {
) )
}, },
}) })
return nil
} }
func (self *WorkingTreeHelper) HandleCommitPressWithMessage(initialMessage string) error { func (self *WorkingTreeHelper) HandleCommitPressWithMessage(initialMessage string) error {
return self.WithEnsureCommitableFiles(func() error { return self.WithEnsureCommitableFiles(func() error {
return self.commitsHelper.OpenCommitMessagePanel( self.commitsHelper.OpenCommitMessagePanel(
&OpenCommitMessagePanelOpts{ &OpenCommitMessagePanelOpts{
CommitIndex: context.NoCommitIndex, CommitIndex: context.NoCommitIndex,
InitialMessage: initialMessage, InitialMessage: initialMessage,
@ -97,6 +99,8 @@ func (self *WorkingTreeHelper) HandleCommitPressWithMessage(initialMessage strin
OnSwitchToEditor: self.switchFromCommitMessagePanelToEditor, OnSwitchToEditor: self.switchFromCommitMessagePanelToEditor,
}, },
) )
return nil
}) })
} }
@ -185,7 +189,7 @@ func (self *WorkingTreeHelper) WithEnsureCommitableFiles(handler func() error) e
} }
func (self *WorkingTreeHelper) promptToStageAllAndRetry(retry func() error) error { func (self *WorkingTreeHelper) promptToStageAllAndRetry(retry func() error) error {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.NoFilesStagedTitle, Title: self.c.Tr.NoFilesStagedTitle,
Prompt: self.c.Tr.NoFilesStagedPrompt, Prompt: self.c.Tr.NoFilesStagedPrompt,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -200,6 +204,8 @@ func (self *WorkingTreeHelper) promptToStageAllAndRetry(retry func() error) erro
return retry() return retry()
}, },
}) })
return nil
} }
// for when you need to refetch files before continuing an action. Runs synchronously. // for when you need to refetch files before continuing an action. Runs synchronously.

View File

@ -63,8 +63,8 @@ func (self *WorktreeHelper) NewWorktree() error {
branch := self.refsHelper.GetCheckedOutRef() branch := self.refsHelper.GetCheckedOutRef()
currentBranchName := branch.RefName() currentBranchName := branch.RefName()
f := func(detached bool) error { f := func(detached bool) {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.NewWorktreeBase, Title: self.c.Tr.NewWorktreeBase,
InitialContent: currentBranchName, InitialContent: currentBranchName,
FindSuggestionsFunc: self.suggestionsHelper.GetRefsSuggestionsFunc(), FindSuggestionsFunc: self.suggestionsHelper.GetRefsSuggestionsFunc(),
@ -84,13 +84,15 @@ func (self *WorktreeHelper) NewWorktree() error {
{ {
LabelColumns: []string{utils.ResolvePlaceholderString(self.c.Tr.CreateWorktreeFrom, placeholders)}, LabelColumns: []string{utils.ResolvePlaceholderString(self.c.Tr.CreateWorktreeFrom, placeholders)},
OnPress: func() error { OnPress: func() error {
return f(false) f(false)
return nil
}, },
}, },
{ {
LabelColumns: []string{utils.ResolvePlaceholderString(self.c.Tr.CreateWorktreeFromDetached, placeholders)}, LabelColumns: []string{utils.ResolvePlaceholderString(self.c.Tr.CreateWorktreeFromDetached, placeholders)},
OnPress: func() error { OnPress: func() error {
return f(true) f(true)
return nil
}, },
}, },
}, },
@ -114,7 +116,7 @@ func (self *WorktreeHelper) NewWorktreeCheckout(base string, canCheckoutBase boo
}) })
} }
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.NewWorktreePath, Title: self.c.Tr.NewWorktreePath,
HandleConfirm: func(path string) error { HandleConfirm: func(path string) error {
opts.Path = path opts.Path = path
@ -126,7 +128,7 @@ func (self *WorktreeHelper) NewWorktreeCheckout(base string, canCheckoutBase boo
if canCheckoutBase { if canCheckoutBase {
title := utils.ResolvePlaceholderString(self.c.Tr.NewBranchNameLeaveBlank, map[string]string{"default": base}) title := utils.ResolvePlaceholderString(self.c.Tr.NewBranchNameLeaveBlank, map[string]string{"default": base})
// prompt for the new branch name where a blank means we just check out the branch // prompt for the new branch name where a blank means we just check out the branch
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: title, Title: title,
HandleConfirm: func(branchName string) error { HandleConfirm: func(branchName string) error {
opts.Branch = branchName opts.Branch = branchName
@ -134,9 +136,11 @@ func (self *WorktreeHelper) NewWorktreeCheckout(base string, canCheckoutBase boo
return f() return f()
}, },
}) })
return nil
} else { } else {
// prompt for the new branch name where a blank means we just check out the branch // prompt for the new branch name where a blank means we just check out the branch
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.NewBranchName, Title: self.c.Tr.NewBranchName,
HandleConfirm: func(branchName string) error { HandleConfirm: func(branchName string) error {
if branchName == "" { if branchName == "" {
@ -148,9 +152,13 @@ func (self *WorktreeHelper) NewWorktreeCheckout(base string, canCheckoutBase boo
return f() return f()
}, },
}) })
return nil
} }
}, },
}) })
return nil
} }
func (self *WorktreeHelper) Switch(worktree *models.Worktree, contextKey types.ContextKey) error { func (self *WorktreeHelper) Switch(worktree *models.Worktree, contextKey types.ContextKey) error {
@ -178,7 +186,7 @@ func (self *WorktreeHelper) Remove(worktree *models.Worktree, force bool) error
}, },
) )
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: title, Title: title,
Prompt: message, Prompt: message,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -199,6 +207,8 @@ func (self *WorktreeHelper) Remove(worktree *models.Worktree, force bool) error
}) })
}, },
}) })
return nil
} }
func (self *WorktreeHelper) Detach(worktree *models.Worktree) error { func (self *WorktreeHelper) Detach(worktree *models.Worktree) error {

View File

@ -55,6 +55,7 @@ func (self *JumpToSideWindowController) goToSideWindow(window string) func() err
context := self.c.Helpers().Window.GetContextForWindow(window) context := self.c.Helpers().Window.GetContextForWindow(window)
return self.c.Context().Push(context) self.c.Context().Push(context)
return nil
} }
} }

View File

@ -54,7 +54,7 @@ func (self *ListController) HandleScrollUp() error {
scrollHeight := self.c.UserConfig().Gui.ScrollHeight scrollHeight := self.c.UserConfig().Gui.ScrollHeight
self.context.GetViewTrait().ScrollUp(scrollHeight) self.context.GetViewTrait().ScrollUp(scrollHeight)
if self.context.RenderOnlyVisibleLines() { if self.context.RenderOnlyVisibleLines() {
return self.context.HandleRender() self.context.HandleRender()
} }
return nil return nil
@ -64,7 +64,7 @@ func (self *ListController) HandleScrollDown() error {
scrollHeight := self.c.UserConfig().Gui.ScrollHeight scrollHeight := self.c.UserConfig().Gui.ScrollHeight
self.context.GetViewTrait().ScrollDown(scrollHeight) self.context.GetViewTrait().ScrollDown(scrollHeight)
if self.context.RenderOnlyVisibleLines() { if self.context.RenderOnlyVisibleLines() {
return self.context.HandleRender() self.context.HandleRender()
} }
return nil return nil
@ -73,7 +73,8 @@ func (self *ListController) HandleScrollDown() error {
func (self *ListController) scrollHorizontal(scrollFunc func()) error { func (self *ListController) scrollHorizontal(scrollFunc func()) error {
scrollFunc() scrollFunc()
return self.context.HandleFocus(types.OnFocusOpts{}) self.context.HandleFocus(types.OnFocusOpts{})
return nil
} }
func (self *ListController) handleLineChange(change int) error { func (self *ListController) handleLineChange(change int) error {
@ -115,7 +116,7 @@ func (self *ListController) handleLineChangeAux(f func(int), change int) error {
} }
if cursorMoved || rangeBefore != rangeAfter { if cursorMoved || rangeBefore != rangeAfter {
return self.context.HandleFocus(types.OnFocusOpts{}) self.context.HandleFocus(types.OnFocusOpts{})
} }
return nil return nil
@ -142,7 +143,8 @@ func (self *ListController) HandleToggleRangeSelect() error {
list.ToggleStickyRange() list.ToggleStickyRange()
return self.context.HandleFocus(types.OnFocusOpts{}) self.context.HandleFocus(types.OnFocusOpts{})
return nil
} }
func (self *ListController) HandleRangeSelectDown() error { func (self *ListController) HandleRangeSelectDown() error {
@ -171,14 +173,13 @@ func (self *ListController) HandleClick(opts gocui.ViewMouseBindingOpts) error {
if prevSelectedLineIdx == newSelectedLineIdx && alreadyFocused && self.context.GetOnClick() != nil { if prevSelectedLineIdx == newSelectedLineIdx && alreadyFocused && self.context.GetOnClick() != nil {
return self.context.GetOnClick()() return self.context.GetOnClick()()
} }
return self.context.HandleFocus(types.OnFocusOpts{}) self.context.HandleFocus(types.OnFocusOpts{})
return nil
} }
func (self *ListController) pushContextIfNotFocused() error { func (self *ListController) pushContextIfNotFocused() error {
if !self.isFocused() { if !self.isFocused() {
if err := self.c.Context().Push(self.context); err != nil { self.c.Context().Push(self.context)
return err
}
} }
return nil return nil

View File

@ -272,9 +272,9 @@ func (self *LocalCommitsController) GetKeybindings(opts types.KeybindingsOpts) [
return bindings return bindings
} }
func (self *LocalCommitsController) GetOnRenderToMain() func() error { func (self *LocalCommitsController) GetOnRenderToMain() func() {
return func() error { return func() {
return self.c.Helpers().Diff.WithDiffModeCheck(func() error { self.c.Helpers().Diff.WithDiffModeCheck(func() {
var task types.UpdateTask var task types.UpdateTask
commit := self.context().GetSelected() commit := self.context().GetSelected()
if commit == nil { if commit == nil {
@ -294,7 +294,7 @@ func (self *LocalCommitsController) GetOnRenderToMain() func() error {
task = self.c.Helpers().Diff.GetUpdateTaskForRenderingCommitsDiff(commit, refRange) task = self.c.Helpers().Diff.GetUpdateTaskForRenderingCommitsDiff(commit, refRange)
} }
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: self.c.MainViewPairs().Normal, Pair: self.c.MainViewPairs().Normal,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Title: "Patch", Title: "Patch",
@ -325,7 +325,7 @@ func (self *LocalCommitsController) squashDown(selectedCommits []*models.Commit,
return self.updateTodos(todo.Squash, selectedCommits) return self.updateTodos(todo.Squash, selectedCommits)
} }
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.Squash, Title: self.c.Tr.Squash,
Prompt: self.c.Tr.SureSquashThisCommit, Prompt: self.c.Tr.SureSquashThisCommit,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -335,6 +335,8 @@ func (self *LocalCommitsController) squashDown(selectedCommits []*models.Commit,
}) })
}, },
}) })
return nil
} }
func (self *LocalCommitsController) fixup(selectedCommits []*models.Commit, startIdx int, endIdx int) error { func (self *LocalCommitsController) fixup(selectedCommits []*models.Commit, startIdx int, endIdx int) error {
@ -342,7 +344,7 @@ func (self *LocalCommitsController) fixup(selectedCommits []*models.Commit, star
return self.updateTodos(todo.Fixup, selectedCommits) return self.updateTodos(todo.Fixup, selectedCommits)
} }
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.Fixup, Title: self.c.Tr.Fixup,
Prompt: self.c.Tr.SureFixupThisCommit, Prompt: self.c.Tr.SureFixupThisCommit,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -352,6 +354,8 @@ func (self *LocalCommitsController) fixup(selectedCommits []*models.Commit, star
}) })
}, },
}) })
return nil
} }
func (self *LocalCommitsController) reword(commit *models.Commit) error { func (self *LocalCommitsController) reword(commit *models.Commit) error {
@ -362,7 +366,7 @@ func (self *LocalCommitsController) reword(commit *models.Commit) error {
if self.c.UserConfig().Git.Commit.AutoWrapCommitMessage { if self.c.UserConfig().Git.Commit.AutoWrapCommitMessage {
commitMessage = helpers.TryRemoveHardLineBreaks(commitMessage, self.c.UserConfig().Git.Commit.AutoWrapWidth) commitMessage = helpers.TryRemoveHardLineBreaks(commitMessage, self.c.UserConfig().Git.Commit.AutoWrapWidth)
} }
return self.c.Helpers().Commits.OpenCommitMessagePanel( self.c.Helpers().Commits.OpenCommitMessagePanel(
&helpers.OpenCommitMessagePanelOpts{ &helpers.OpenCommitMessagePanelOpts{
CommitIndex: self.context().GetSelectedLineIdx(), CommitIndex: self.context().GetSelectedLineIdx(),
InitialMessage: commitMessage, InitialMessage: commitMessage,
@ -373,6 +377,8 @@ func (self *LocalCommitsController) reword(commit *models.Commit) error {
OnSwitchToEditor: self.switchFromCommitMessagePanelToEditor, OnSwitchToEditor: self.switchFromCommitMessagePanelToEditor,
}, },
) )
return nil
} }
func (self *LocalCommitsController) switchFromCommitMessagePanelToEditor(filepath string) error { func (self *LocalCommitsController) switchFromCommitMessagePanelToEditor(filepath string) error {
@ -442,13 +448,15 @@ func (self *LocalCommitsController) doRewordEditor() error {
func (self *LocalCommitsController) rewordEditor(commit *models.Commit) error { func (self *LocalCommitsController) rewordEditor(commit *models.Commit) error {
if self.c.UserConfig().Gui.SkipRewordInEditorWarning { if self.c.UserConfig().Gui.SkipRewordInEditorWarning {
return self.doRewordEditor() return self.doRewordEditor()
} else {
return self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.RewordInEditorTitle,
Prompt: self.c.Tr.RewordInEditorPrompt,
HandleConfirm: self.doRewordEditor,
})
} }
self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.RewordInEditorTitle,
Prompt: self.c.Tr.RewordInEditorPrompt,
HandleConfirm: self.doRewordEditor,
})
return nil
} }
func (self *LocalCommitsController) drop(selectedCommits []*models.Commit, startIdx int, endIdx int) error { func (self *LocalCommitsController) drop(selectedCommits []*models.Commit, startIdx int, endIdx int) error {
@ -460,7 +468,7 @@ func (self *LocalCommitsController) drop(selectedCommits []*models.Commit, start
nonUpdateRefTodos := groupedTodos[false] nonUpdateRefTodos := groupedTodos[false]
if len(updateRefTodos) > 0 { if len(updateRefTodos) > 0 {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.DropCommitTitle, Title: self.c.Tr.DropCommitTitle,
Prompt: self.c.Tr.DropUpdateRefPrompt, Prompt: self.c.Tr.DropUpdateRefPrompt,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -481,12 +489,14 @@ func (self *LocalCommitsController) drop(selectedCommits []*models.Commit, start
return self.updateTodos(todo.Drop, nonUpdateRefTodos) return self.updateTodos(todo.Drop, nonUpdateRefTodos)
}, },
}) })
return nil
} }
return self.updateTodos(todo.Drop, selectedCommits) return self.updateTodos(todo.Drop, selectedCommits)
} }
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.DropCommitTitle, Title: self.c.Tr.DropCommitTitle,
Prompt: self.c.Tr.DropCommitPrompt, Prompt: self.c.Tr.DropCommitPrompt,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -496,6 +506,8 @@ func (self *LocalCommitsController) drop(selectedCommits []*models.Commit, start
}) })
}, },
}) })
return nil
} }
func (self *LocalCommitsController) edit(selectedCommits []*models.Commit) error { func (self *LocalCommitsController) edit(selectedCommits []*models.Commit) error {
@ -680,7 +692,7 @@ func (self *LocalCommitsController) moveUp(selectedCommits []*models.Commit, sta
func (self *LocalCommitsController) amendTo(commit *models.Commit) error { func (self *LocalCommitsController) amendTo(commit *models.Commit) error {
if self.isSelectedHeadCommit() { if self.isSelectedHeadCommit() {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.AmendCommitTitle, Title: self.c.Tr.AmendCommitTitle,
Prompt: self.c.Tr.AmendCommitPrompt, Prompt: self.c.Tr.AmendCommitPrompt,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -692,9 +704,11 @@ func (self *LocalCommitsController) amendTo(commit *models.Commit) error {
}) })
}, },
}) })
return nil
} }
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.AmendCommitTitle, Title: self.c.Tr.AmendCommitTitle,
Prompt: self.c.Tr.AmendCommitPrompt, Prompt: self.c.Tr.AmendCommitPrompt,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -707,6 +721,8 @@ func (self *LocalCommitsController) amendTo(commit *models.Commit) error {
}) })
}, },
}) })
return nil
} }
func (self *LocalCommitsController) canAmendRange(commits []*models.Commit, start, end int) *types.DisabledReason { func (self *LocalCommitsController) canAmendRange(commits []*models.Commit, start, end int) *types.DisabledReason {
@ -761,7 +777,7 @@ func (self *LocalCommitsController) resetAuthor(start, end int) error {
} }
func (self *LocalCommitsController) setAuthor(start, end int) error { func (self *LocalCommitsController) setAuthor(start, end int) error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.SetAuthorPromptTitle, Title: self.c.Tr.SetAuthorPromptTitle,
FindSuggestionsFunc: self.c.Helpers().Suggestions.GetAuthorsSuggestionsFunc(), FindSuggestionsFunc: self.c.Helpers().Suggestions.GetAuthorsSuggestionsFunc(),
HandleConfirm: func(value string) error { HandleConfirm: func(value string) error {
@ -775,10 +791,12 @@ func (self *LocalCommitsController) setAuthor(start, end int) error {
}) })
}, },
}) })
return nil
} }
func (self *LocalCommitsController) addCoAuthor(start, end int) error { func (self *LocalCommitsController) addCoAuthor(start, end int) error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.AddCoAuthorPromptTitle, Title: self.c.Tr.AddCoAuthorPromptTitle,
FindSuggestionsFunc: self.c.Helpers().Suggestions.GetAuthorsSuggestionsFunc(), FindSuggestionsFunc: self.c.Helpers().Suggestions.GetAuthorsSuggestionsFunc(),
HandleConfirm: func(value string) error { HandleConfirm: func(value string) error {
@ -791,30 +809,34 @@ func (self *LocalCommitsController) addCoAuthor(start, end int) error {
}) })
}, },
}) })
return nil
} }
func (self *LocalCommitsController) revert(commit *models.Commit) error { func (self *LocalCommitsController) revert(commit *models.Commit) error {
if commit.IsMerge() { if commit.IsMerge() {
return self.createRevertMergeCommitMenu(commit) return self.createRevertMergeCommitMenu(commit)
} else {
return self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.Actions.RevertCommit,
Prompt: utils.ResolvePlaceholderString(
self.c.Tr.ConfirmRevertCommit,
map[string]string{
"selectedCommit": commit.ShortHash(),
}),
HandleConfirm: func() error {
self.c.LogAction(self.c.Tr.Actions.RevertCommit)
return self.c.WithWaitingStatusSync(self.c.Tr.RevertingStatus, func() error {
if err := self.c.Git().Commit.Revert(commit.Hash); err != nil {
return err
}
return self.afterRevertCommit()
})
},
})
} }
self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.Actions.RevertCommit,
Prompt: utils.ResolvePlaceholderString(
self.c.Tr.ConfirmRevertCommit,
map[string]string{
"selectedCommit": commit.ShortHash(),
}),
HandleConfirm: func() error {
self.c.LogAction(self.c.Tr.Actions.RevertCommit)
return self.c.WithWaitingStatusSync(self.c.Tr.RevertingStatus, func() error {
if err := self.c.Git().Commit.Revert(commit.Hash); err != nil {
return err
}
return self.afterRevertCommit()
})
},
})
return nil
} }
func (self *LocalCommitsController) createRevertMergeCommitMenu(commit *models.Commit) error { func (self *LocalCommitsController) createRevertMergeCommitMenu(commit *models.Commit) error {
@ -911,7 +933,7 @@ func (self *LocalCommitsController) createAmendCommit(commit *models.Commit, inc
commitMessage = helpers.TryRemoveHardLineBreaks(commitMessage, self.c.UserConfig().Git.Commit.AutoWrapWidth) commitMessage = helpers.TryRemoveHardLineBreaks(commitMessage, self.c.UserConfig().Git.Commit.AutoWrapWidth)
} }
originalSubject, _, _ := strings.Cut(commitMessage, "\n") originalSubject, _, _ := strings.Cut(commitMessage, "\n")
return self.c.Helpers().Commits.OpenCommitMessagePanel( self.c.Helpers().Commits.OpenCommitMessagePanel(
&helpers.OpenCommitMessagePanelOpts{ &helpers.OpenCommitMessagePanelOpts{
CommitIndex: self.context().GetSelectedLineIdx(), CommitIndex: self.context().GetSelectedLineIdx(),
InitialMessage: commitMessage, InitialMessage: commitMessage,
@ -932,6 +954,8 @@ func (self *LocalCommitsController) createAmendCommit(commit *models.Commit, inc
OnSwitchToEditor: nil, OnSwitchToEditor: nil,
}, },
) )
return nil
} }
func (self *LocalCommitsController) squashFixupCommits() error { func (self *LocalCommitsController) squashFixupCommits() error {
@ -1175,8 +1199,8 @@ func (self *LocalCommitsController) handleOpenLogMenu() error {
}) })
} }
func (self *LocalCommitsController) GetOnFocus() func(types.OnFocusOpts) error { func (self *LocalCommitsController) GetOnFocus() func(types.OnFocusOpts) {
return func(types.OnFocusOpts) error { return func(types.OnFocusOpts) {
context := self.context() context := self.context()
if context.GetSelectedLineIdx() > COMMIT_THRESHOLD && context.GetLimitCommits() { if context.GetSelectedLineIdx() > COMMIT_THRESHOLD && context.GetLimitCommits() {
context.SetLimitCommits(false) context.SetLimitCommits(false)
@ -1184,8 +1208,6 @@ func (self *LocalCommitsController) GetOnFocus() func(types.OnFocusOpts) error {
return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.COMMITS}}) return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.COMMITS}})
}) })
} }
return nil
} }
} }

View File

@ -59,13 +59,12 @@ func (self *MenuController) GetOnClick() func() error {
return self.withItemGraceful(self.press) return self.withItemGraceful(self.press)
} }
func (self *MenuController) GetOnFocus() func(types.OnFocusOpts) error { func (self *MenuController) GetOnFocus() func(types.OnFocusOpts) {
return func(types.OnFocusOpts) error { return func(types.OnFocusOpts) {
selectedMenuItem := self.context().GetSelected() selectedMenuItem := self.context().GetSelected()
if selectedMenuItem != nil { if selectedMenuItem != nil {
self.c.Views().Tooltip.SetContent(self.c.Helpers().Confirmation.TooltipForMenuItem(selectedMenuItem)) self.c.Views().Tooltip.SetContent(self.c.Helpers().Confirmation.TooltipForMenuItem(selectedMenuItem))
} }
return nil
} }
} }
@ -79,7 +78,8 @@ func (self *MenuController) close() error {
return nil return nil
} }
return self.c.Context().Pop() self.c.Context().Pop()
return nil
} }
func (self *MenuController) context() *context.MenuContext { func (self *MenuController) context() *context.MenuContext {

View File

@ -147,27 +147,21 @@ func (self *MergeConflictsController) GetMouseKeybindings(opts types.Keybindings
} }
} }
func (self *MergeConflictsController) GetOnFocus() func(types.OnFocusOpts) error { func (self *MergeConflictsController) GetOnFocus() func(types.OnFocusOpts) {
return func(types.OnFocusOpts) error { return func(types.OnFocusOpts) {
self.c.Views().MergeConflicts.Wrap = false self.c.Views().MergeConflicts.Wrap = false
if err := self.c.Helpers().MergeConflicts.Render(); err != nil { self.c.Helpers().MergeConflicts.Render()
return err
}
self.context().SetSelectedLineRange() self.context().SetSelectedLineRange()
return nil
} }
} }
func (self *MergeConflictsController) GetOnFocusLost() func(types.OnFocusLostOpts) error { func (self *MergeConflictsController) GetOnFocusLost() func(types.OnFocusLostOpts) {
return func(types.OnFocusLostOpts) error { return func(types.OnFocusLostOpts) {
self.context().SetUserScrolling(false) self.context().SetUserScrolling(false)
self.context().GetState().ResetConflictSelection() self.context().GetState().ResetConflictSelection()
self.c.Views().MergeConflicts.Wrap = true self.c.Views().MergeConflicts.Wrap = true
return nil
} }
} }
@ -194,7 +188,8 @@ func (self *MergeConflictsController) context() *context.MergeConflictsContext {
} }
func (self *MergeConflictsController) Escape() error { func (self *MergeConflictsController) Escape() error {
return self.c.Context().Pop() self.c.Context().Pop()
return nil
} }
func (self *MergeConflictsController) HandleEditFile() error { func (self *MergeConflictsController) HandleEditFile() error {
@ -331,7 +326,8 @@ func (self *MergeConflictsController) withRenderAndFocus(f func() error) func()
return err return err
} }
return self.context().RenderAndFocus() self.context().RenderAndFocus()
return nil
}) })
} }

View File

@ -62,24 +62,22 @@ func (self *PatchBuildingController) GetMouseKeybindings(opts types.KeybindingsO
return []*gocui.ViewMouseBinding{} return []*gocui.ViewMouseBinding{}
} }
func (self *PatchBuildingController) GetOnFocus() func(types.OnFocusOpts) error { func (self *PatchBuildingController) GetOnFocus() func(types.OnFocusOpts) {
return func(opts types.OnFocusOpts) error { return func(opts types.OnFocusOpts) {
// no need to change wrap on the secondary view because it can't be interacted with // no need to change wrap on the secondary view because it can't be interacted with
self.c.Views().PatchBuilding.Wrap = false self.c.Views().PatchBuilding.Wrap = false
return self.c.Helpers().PatchBuilding.RefreshPatchBuildingPanel(opts) self.c.Helpers().PatchBuilding.RefreshPatchBuildingPanel(opts)
} }
} }
func (self *PatchBuildingController) GetOnFocusLost() func(types.OnFocusLostOpts) error { func (self *PatchBuildingController) GetOnFocusLost() func(types.OnFocusLostOpts) {
return func(opts types.OnFocusLostOpts) error { return func(opts types.OnFocusLostOpts) {
self.c.Views().PatchBuilding.Wrap = true self.c.Views().PatchBuilding.Wrap = true
if self.c.Git().Patch.PatchBuilder.IsEmpty() { if self.c.Git().Patch.PatchBuilder.IsEmpty() {
self.c.Git().Patch.PatchBuilder.Reset() self.c.Git().Patch.PatchBuilder.Reset()
} }
return nil
} }
} }
@ -165,5 +163,6 @@ func (self *PatchBuildingController) Escape() error {
return self.c.PostRefreshUpdate(context) return self.c.PostRefreshUpdate(context)
} }
return self.c.Helpers().PatchBuilding.Escape() self.c.Helpers().PatchBuilding.Escape()
return nil
} }

View File

@ -150,10 +150,12 @@ func (self *PatchExplorerController) GetMouseKeybindings(opts types.KeybindingsO
return self.withRenderAndFocus(self.HandleMouseDown)() return self.withRenderAndFocus(self.HandleMouseDown)()
} }
return self.c.Context().Push(self.context, types.OnFocusOpts{ self.c.Context().Push(self.context, types.OnFocusOpts{
ClickedWindowName: self.context.GetWindowName(), ClickedWindowName: self.context.GetWindowName(),
ClickedViewLineIdx: opts.Y, ClickedViewLineIdx: opts.Y,
}) })
return nil
}, },
}, },
{ {
@ -300,7 +302,8 @@ func (self *PatchExplorerController) withRenderAndFocus(f func() error) func() e
return err return err
} }
return self.context.RenderAndFocus(self.isFocused()) self.context.RenderAndFocus(self.isFocused())
return nil
}) })
} }

View File

@ -26,26 +26,30 @@ func (self *QuitActions) quitAux() error {
} }
if self.c.UserConfig().ConfirmOnQuit { if self.c.UserConfig().ConfirmOnQuit {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: "", Title: "",
Prompt: self.c.Tr.ConfirmQuit, Prompt: self.c.Tr.ConfirmQuit,
HandleConfirm: func() error { HandleConfirm: func() error {
return gocui.ErrQuit return gocui.ErrQuit
}, },
}) })
return nil
} }
return gocui.ErrQuit return gocui.ErrQuit
} }
func (self *QuitActions) confirmQuitDuringUpdate() error { func (self *QuitActions) confirmQuitDuringUpdate() error {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.ConfirmQuitDuringUpdateTitle, Title: self.c.Tr.ConfirmQuitDuringUpdateTitle,
Prompt: self.c.Tr.ConfirmQuitDuringUpdate, Prompt: self.c.Tr.ConfirmQuitDuringUpdate,
HandleConfirm: func() error { HandleConfirm: func() error {
return gocui.ErrQuit return gocui.ErrQuit
}, },
}) })
return nil
} }
func (self *QuitActions) Escape() error { func (self *QuitActions) Escape() error {
@ -74,7 +78,8 @@ func (self *QuitActions) Escape() error {
parentContext := currentContext.GetParentContext() parentContext := currentContext.GetParentContext()
if parentContext != nil { if parentContext != nil {
// TODO: think about whether this should be marked as a return rather than adding to the stack // TODO: think about whether this should be marked as a return rather than adding to the stack
return self.c.Context().Push(parentContext) self.c.Context().Push(parentContext)
return nil
} }
for _, mode := range self.c.Helpers().Mode.Statuses() { for _, mode := range self.c.Helpers().Mode.Statuses() {

View File

@ -37,9 +37,9 @@ func (self *ReflogCommitsController) context() *context.ReflogCommitsContext {
return self.c.Contexts().ReflogCommits return self.c.Contexts().ReflogCommits
} }
func (self *ReflogCommitsController) GetOnRenderToMain() func() error { func (self *ReflogCommitsController) GetOnRenderToMain() func() {
return func() error { return func() {
return self.c.Helpers().Diff.WithDiffModeCheck(func() error { self.c.Helpers().Diff.WithDiffModeCheck(func() {
commit := self.context().GetSelected() commit := self.context().GetSelected()
var task types.UpdateTask var task types.UpdateTask
if commit == nil { if commit == nil {
@ -50,7 +50,7 @@ func (self *ReflogCommitsController) GetOnRenderToMain() func() error {
task = types.NewRunPtyTask(cmdObj.GetCmd()) task = types.NewRunPtyTask(cmdObj.GetCmd())
} }
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: self.c.MainViewPairs().Normal, Pair: self.c.MainViewPairs().Normal,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Title: "Reflog Entry", Title: "Reflog Entry",

View File

@ -105,9 +105,9 @@ func (self *RemoteBranchesController) GetKeybindings(opts types.KeybindingsOpts)
} }
} }
func (self *RemoteBranchesController) GetOnRenderToMain() func() error { func (self *RemoteBranchesController) GetOnRenderToMain() func() {
return func() error { return func() {
return self.c.Helpers().Diff.WithDiffModeCheck(func() error { self.c.Helpers().Diff.WithDiffModeCheck(func() {
var task types.UpdateTask var task types.UpdateTask
remoteBranch := self.context().GetSelected() remoteBranch := self.context().GetSelected()
if remoteBranch == nil { if remoteBranch == nil {
@ -117,7 +117,7 @@ func (self *RemoteBranchesController) GetOnRenderToMain() func() error {
task = types.NewRunCommandTask(cmdObj.GetCmd()) task = types.NewRunCommandTask(cmdObj.GetCmd())
} }
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: self.c.MainViewPairs().Normal, Pair: self.c.MainViewPairs().Normal,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Title: "Remote Branch", Title: "Remote Branch",
@ -172,7 +172,7 @@ func (self *RemoteBranchesController) setAsUpstream(selectedBranch *models.Remot
}, },
) )
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.SetUpstreamTitle, Title: self.c.Tr.SetUpstreamTitle,
Prompt: message, Prompt: message,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -184,6 +184,8 @@ func (self *RemoteBranchesController) setAsUpstream(selectedBranch *models.Remot
return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.BRANCHES, types.REMOTES}}) return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.BRANCHES, types.REMOTES}})
}, },
}) })
return nil
} }
func (self *RemoteBranchesController) newLocalBranch(selectedBranch *models.RemoteBranch) error { func (self *RemoteBranchesController) newLocalBranch(selectedBranch *models.RemoteBranch) error {

View File

@ -87,9 +87,9 @@ func (self *RemotesController) context() *context.RemotesContext {
return self.c.Contexts().Remotes return self.c.Contexts().Remotes
} }
func (self *RemotesController) GetOnRenderToMain() func() error { func (self *RemotesController) GetOnRenderToMain() func() {
return func() error { return func() {
return self.c.Helpers().Diff.WithDiffModeCheck(func() error { self.c.Helpers().Diff.WithDiffModeCheck(func() {
var task types.UpdateTask var task types.UpdateTask
remote := self.context().GetSelected() remote := self.context().GetSelected()
if remote == nil { if remote == nil {
@ -98,7 +98,7 @@ func (self *RemotesController) GetOnRenderToMain() func() error {
task = types.NewRenderStringTask(fmt.Sprintf("%s\nUrls:\n%s", style.FgGreen.Sprint(remote.Name), strings.Join(remote.Urls, "\n"))) task = types.NewRenderStringTask(fmt.Sprintf("%s\nUrls:\n%s", style.FgGreen.Sprint(remote.Name), strings.Join(remote.Urls, "\n")))
} }
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: self.c.MainViewPairs().Normal, Pair: self.c.MainViewPairs().Normal,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Title: "Remote", Title: "Remote",
@ -131,14 +131,15 @@ func (self *RemotesController) enter(remote *models.Remote) error {
return err return err
} }
return self.c.Context().Push(remoteBranchesContext) self.c.Context().Push(remoteBranchesContext)
return nil
} }
func (self *RemotesController) add() error { func (self *RemotesController) add() error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.NewRemoteName, Title: self.c.Tr.NewRemoteName,
HandleConfirm: func(remoteName string) error { HandleConfirm: func(remoteName string) error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.NewRemoteUrl, Title: self.c.Tr.NewRemoteUrl,
HandleConfirm: func(remoteUrl string) error { HandleConfirm: func(remoteUrl string) error {
self.c.LogAction(self.c.Tr.Actions.AddRemote) self.c.LogAction(self.c.Tr.Actions.AddRemote)
@ -168,12 +169,16 @@ func (self *RemotesController) add() error {
return self.fetch(self.c.Contexts().Remotes.GetSelected()) return self.fetch(self.c.Contexts().Remotes.GetSelected())
}, },
}) })
return nil
}, },
}) })
return nil
} }
func (self *RemotesController) remove(remote *models.Remote) error { func (self *RemotesController) remove(remote *models.Remote) error {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.RemoveRemote, Title: self.c.Tr.RemoveRemote,
Prompt: self.c.Tr.RemoveRemotePrompt + " '" + remote.Name + "'?", Prompt: self.c.Tr.RemoveRemotePrompt + " '" + remote.Name + "'?",
HandleConfirm: func() error { HandleConfirm: func() error {
@ -185,6 +190,8 @@ func (self *RemotesController) remove(remote *models.Remote) error {
return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.BRANCHES, types.REMOTES}}) return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.BRANCHES, types.REMOTES}})
}, },
}) })
return nil
} }
func (self *RemotesController) edit(remote *models.Remote) error { func (self *RemotesController) edit(remote *models.Remote) error {
@ -195,7 +202,7 @@ func (self *RemotesController) edit(remote *models.Remote) error {
}, },
) )
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: editNameMessage, Title: editNameMessage,
InitialContent: remote.Name, InitialContent: remote.Name,
HandleConfirm: func(updatedRemoteName string) error { HandleConfirm: func(updatedRemoteName string) error {
@ -219,7 +226,7 @@ func (self *RemotesController) edit(remote *models.Remote) error {
url = urls[0] url = urls[0]
} }
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: editUrlMessage, Title: editUrlMessage,
InitialContent: url, InitialContent: url,
HandleConfirm: func(updatedRemoteUrl string) error { HandleConfirm: func(updatedRemoteUrl string) error {
@ -230,8 +237,12 @@ func (self *RemotesController) edit(remote *models.Remote) error {
return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.BRANCHES, types.REMOTES}}) return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.BRANCHES, types.REMOTES}})
}, },
}) })
return nil
}, },
}) })
return nil
} }
func (self *RemotesController) fetch(remote *models.Remote) error { func (self *RemotesController) fetch(remote *models.Remote) error {

View File

@ -88,7 +88,8 @@ func (self *RenameSimilarityThresholdController) applyChange() error {
case context.FILES_CONTEXT_KEY: case context.FILES_CONTEXT_KEY:
return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.FILES}}) return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.FILES}})
default: default:
return currentContext.HandleRenderToMain() currentContext.HandleRenderToMain()
return nil
} }
} }

View File

@ -17,7 +17,8 @@ func (self *ScreenModeActions) Next() error {
), ),
) )
return self.rerenderViewsWithScreenModeDependentContent() self.rerenderViewsWithScreenModeDependentContent()
return nil
} }
func (self *ScreenModeActions) Prev() error { func (self *ScreenModeActions) Prev() error {
@ -28,31 +29,28 @@ func (self *ScreenModeActions) Prev() error {
), ),
) )
return self.rerenderViewsWithScreenModeDependentContent() self.rerenderViewsWithScreenModeDependentContent()
return nil
} }
// these views need to be re-rendered when the screen mode changes. The commits view, // these views need to be re-rendered when the screen mode changes. The commits view,
// for example, will show authorship information in half and full screen mode. // for example, will show authorship information in half and full screen mode.
func (self *ScreenModeActions) rerenderViewsWithScreenModeDependentContent() error { func (self *ScreenModeActions) rerenderViewsWithScreenModeDependentContent() {
for _, context := range self.c.Context().AllList() { for _, context := range self.c.Context().AllList() {
if context.NeedsRerenderOnWidthChange() == types.NEEDS_RERENDER_ON_WIDTH_CHANGE_WHEN_SCREEN_MODE_CHANGES { if context.NeedsRerenderOnWidthChange() == types.NEEDS_RERENDER_ON_WIDTH_CHANGE_WHEN_SCREEN_MODE_CHANGES {
if err := self.rerenderView(context.GetView()); err != nil { self.rerenderView(context.GetView())
return err
}
} }
} }
return nil
} }
func (self *ScreenModeActions) rerenderView(view *gocui.View) error { func (self *ScreenModeActions) rerenderView(view *gocui.View) {
context, ok := self.c.Helpers().View.ContextForView(view.Name()) context, ok := self.c.Helpers().View.ContextForView(view.Name())
if !ok { if !ok {
self.c.Log.Errorf("no context found for view %s", view.Name()) self.c.Log.Errorf("no context found for view %s", view.Name())
return nil return
} }
return context.HandleRender() context.HandleRender()
} }
func nextIntInCycle(sl []types.WindowMaximisation, current types.WindowMaximisation) types.WindowMaximisation { func nextIntInCycle(sl []types.WindowMaximisation, current types.WindowMaximisation) types.WindowMaximisation {

View File

@ -15,7 +15,7 @@ type ShellCommandAction struct {
} }
func (self *ShellCommandAction) Call() error { func (self *ShellCommandAction) Call() error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.ShellCommand, Title: self.c.Tr.ShellCommand,
FindSuggestionsFunc: self.GetShellCommandsHistorySuggestionsFunc(), FindSuggestionsFunc: self.GetShellCommandsHistorySuggestionsFunc(),
AllowEditSuggestion: true, AllowEditSuggestion: true,
@ -54,6 +54,8 @@ func (self *ShellCommandAction) Call() error {
return nil return nil
}, },
}) })
return nil
} }
func (self *ShellCommandAction) GetShellCommandsHistorySuggestionsFunc() func(string) []*types.Suggestion { func (self *ShellCommandAction) GetShellCommandsHistorySuggestionsFunc() func(string) []*types.Suggestion {

View File

@ -69,7 +69,8 @@ func (self *SideWindowController) previousSideWindow() error {
context := self.c.Helpers().Window.GetContextForWindow(newWindow) context := self.c.Helpers().Window.GetContextForWindow(newWindow)
return self.c.Context().Push(context) self.c.Context().Push(context)
return nil
} }
func (self *SideWindowController) nextSideWindow() error { func (self *SideWindowController) nextSideWindow() error {
@ -92,5 +93,6 @@ func (self *SideWindowController) nextSideWindow() error {
context := self.c.Helpers().Window.GetContextForWindow(newWindow) context := self.c.Helpers().Window.GetContextForWindow(newWindow)
return self.c.Context().Push(context) self.c.Context().Push(context)
return nil
} }

View File

@ -52,18 +52,16 @@ func (self *SnakeController) Context() types.Context {
return self.c.Contexts().Snake return self.c.Contexts().Snake
} }
func (self *SnakeController) GetOnFocus() func(types.OnFocusOpts) error { func (self *SnakeController) GetOnFocus() func(types.OnFocusOpts) {
return func(types.OnFocusOpts) error { return func(types.OnFocusOpts) {
self.c.Helpers().Snake.StartGame() self.c.Helpers().Snake.StartGame()
return nil
} }
} }
func (self *SnakeController) GetOnFocusLost() func(types.OnFocusLostOpts) error { func (self *SnakeController) GetOnFocusLost() func(types.OnFocusLostOpts) {
return func(types.OnFocusLostOpts) error { return func(types.OnFocusLostOpts) {
self.c.Helpers().Snake.ExitGame() self.c.Helpers().Snake.ExitGame()
self.c.Helpers().Window.MoveToTopOfWindow(self.c.Contexts().Submodules) self.c.Helpers().Window.MoveToTopOfWindow(self.c.Contexts().Submodules)
return nil
} }
} }
@ -75,5 +73,6 @@ func (self *SnakeController) SetDirection(direction snake.Direction) func() erro
} }
func (self *SnakeController) Escape() error { func (self *SnakeController) Escape() error {
return self.c.Context().Push(self.c.Contexts().Submodules) self.c.Context().Push(self.c.Contexts().Submodules)
return nil
} }

View File

@ -116,26 +116,25 @@ func (self *StagingController) GetMouseKeybindings(opts types.KeybindingsOpts) [
return []*gocui.ViewMouseBinding{} return []*gocui.ViewMouseBinding{}
} }
func (self *StagingController) GetOnFocus() func(types.OnFocusOpts) error { func (self *StagingController) GetOnFocus() func(types.OnFocusOpts) {
return func(opts types.OnFocusOpts) error { return func(opts types.OnFocusOpts) {
self.c.Views().Staging.Wrap = false self.c.Views().Staging.Wrap = false
self.c.Views().StagingSecondary.Wrap = false self.c.Views().StagingSecondary.Wrap = false
return self.c.Helpers().Staging.RefreshStagingPanel(opts) self.c.Helpers().Staging.RefreshStagingPanel(opts)
} }
} }
func (self *StagingController) GetOnFocusLost() func(types.OnFocusLostOpts) error { func (self *StagingController) GetOnFocusLost() func(types.OnFocusLostOpts) {
return func(opts types.OnFocusLostOpts) error { return func(opts types.OnFocusLostOpts) {
self.context.SetState(nil) self.context.SetState(nil)
if opts.NewContextKey != self.otherContext.GetKey() { if opts.NewContextKey != self.otherContext.GetKey() {
self.c.Views().Staging.Wrap = true self.c.Views().Staging.Wrap = true
self.c.Views().StagingSecondary.Wrap = true self.c.Views().StagingSecondary.Wrap = true
_ = self.c.Contexts().Staging.Render(false) self.c.Contexts().Staging.Render(false)
_ = self.c.Contexts().StagingSecondary.Render(false) self.c.Contexts().StagingSecondary.Render(false)
} }
return nil
} }
} }
@ -172,12 +171,13 @@ func (self *StagingController) Escape() error {
return self.c.PostRefreshUpdate(self.context) return self.c.PostRefreshUpdate(self.context)
} }
return self.c.Context().Pop() self.c.Context().Pop()
return nil
} }
func (self *StagingController) TogglePanel() error { func (self *StagingController) TogglePanel() error {
if self.otherContext.GetState() != nil { if self.otherContext.GetState() != nil {
return self.c.Context().Push(self.otherContext) self.c.Context().Push(self.otherContext)
} }
return nil return nil
@ -191,11 +191,13 @@ func (self *StagingController) DiscardSelection() error {
reset := func() error { return self.applySelectionAndRefresh(true) } reset := func() error { return self.applySelectionAndRefresh(true) }
if !self.staged && !self.c.UserConfig().Gui.SkipDiscardChangeWarning { if !self.staged && !self.c.UserConfig().Gui.SkipDiscardChangeWarning {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.DiscardChangeTitle, Title: self.c.Tr.DiscardChangeTitle,
Prompt: self.c.Tr.DiscardChangePrompt, Prompt: self.c.Tr.DiscardChangePrompt,
HandleConfirm: reset, HandleConfirm: reset,
}) })
return nil
} }
return reset() return reset()

View File

@ -74,9 +74,9 @@ func (self *StashController) GetKeybindings(opts types.KeybindingsOpts) []*types
return bindings return bindings
} }
func (self *StashController) GetOnRenderToMain() func() error { func (self *StashController) GetOnRenderToMain() func() {
return func() error { return func() {
return self.c.Helpers().Diff.WithDiffModeCheck(func() error { self.c.Helpers().Diff.WithDiffModeCheck(func() {
var task types.UpdateTask var task types.UpdateTask
stashEntry := self.context().GetSelected() stashEntry := self.context().GetSelected()
if stashEntry == nil { if stashEntry == nil {
@ -87,7 +87,7 @@ func (self *StashController) GetOnRenderToMain() func() error {
) )
} }
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: self.c.MainViewPairs().Normal, Pair: self.c.MainViewPairs().Normal,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Title: "Stash", Title: "Stash",
@ -118,13 +118,15 @@ func (self *StashController) handleStashApply(stashEntry *models.StashEntry) err
return apply() return apply()
} }
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.StashApply, Title: self.c.Tr.StashApply,
Prompt: self.c.Tr.SureApplyStashEntry, Prompt: self.c.Tr.SureApplyStashEntry,
HandleConfirm: func() error { HandleConfirm: func() error {
return apply() return apply()
}, },
}) })
return nil
} }
func (self *StashController) handleStashPop(stashEntry *models.StashEntry) error { func (self *StashController) handleStashPop(stashEntry *models.StashEntry) error {
@ -142,17 +144,19 @@ func (self *StashController) handleStashPop(stashEntry *models.StashEntry) error
return pop() return pop()
} }
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.StashPop, Title: self.c.Tr.StashPop,
Prompt: self.c.Tr.SurePopStashEntry, Prompt: self.c.Tr.SurePopStashEntry,
HandleConfirm: func() error { HandleConfirm: func() error {
return pop() return pop()
}, },
}) })
return nil
} }
func (self *StashController) handleStashDrop(stashEntry *models.StashEntry) error { func (self *StashController) handleStashDrop(stashEntry *models.StashEntry) error {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.StashDrop, Title: self.c.Tr.StashDrop,
Prompt: self.c.Tr.SureDropStashEntry, Prompt: self.c.Tr.SureDropStashEntry,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -165,6 +169,8 @@ func (self *StashController) handleStashDrop(stashEntry *models.StashEntry) erro
return nil return nil
}, },
}) })
return nil
} }
func (self *StashController) postStashRefresh() error { func (self *StashController) postStashRefresh() error {
@ -183,7 +189,7 @@ func (self *StashController) handleRenameStashEntry(stashEntry *models.StashEntr
}, },
) )
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: message, Title: message,
InitialContent: stashEntry.Name, InitialContent: stashEntry.Name,
HandleConfirm: func(response string) error { HandleConfirm: func(response string) error {
@ -198,4 +204,6 @@ func (self *StashController) handleRenameStashEntry(stashEntry *models.StashEntr
return nil return nil
}, },
}) })
return nil
} }

View File

@ -61,7 +61,7 @@ func (self *StatusController) GetKeybindings(opts types.KeybindingsOpts) []*type
}, },
{ {
Key: opts.GetKey(opts.Config.Status.AllBranchesLogGraph), Key: opts.GetKey(opts.Config.Status.AllBranchesLogGraph),
Handler: self.showAllBranchLogs, Handler: func() error { self.showAllBranchLogs(); return nil },
Description: self.c.Tr.AllBranchesLogGraph, Description: self.c.Tr.AllBranchesLogGraph,
}, },
} }
@ -79,15 +79,15 @@ func (self *StatusController) GetMouseKeybindings(opts types.KeybindingsOpts) []
} }
} }
func (self *StatusController) GetOnRenderToMain() func() error { func (self *StatusController) GetOnRenderToMain() func() {
return func() error { return func() {
switch self.c.UserConfig().Gui.StatusPanelView { switch self.c.UserConfig().Gui.StatusPanelView {
case "dashboard": case "dashboard":
return self.showDashboard() self.showDashboard()
case "allBranchesLog": case "allBranchesLog":
return self.showAllBranchLogs() self.showAllBranchLogs()
default: default:
return self.showDashboard() self.showDashboard()
} }
} }
} }
@ -104,9 +104,7 @@ func (self *StatusController) onClick(opts gocui.ViewMouseBindingOpts) error {
return nil return nil
} }
if err := self.c.Context().Push(self.Context()); err != nil { self.c.Context().Push(self.Context())
return err
}
upstreamStatus := utils.Decolorise(presentation.BranchStatus(currentBranch, types.ItemOperationNone, self.c.Tr, time.Now(), self.c.UserConfig())) upstreamStatus := utils.Decolorise(presentation.BranchStatus(currentBranch, types.ItemOperationNone, self.c.Tr, time.Now(), self.c.UserConfig()))
repoName := self.c.Git().RepoPaths.RepoName() repoName := self.c.Git().RepoPaths.RepoName()
@ -183,11 +181,11 @@ func (self *StatusController) editConfig() error {
}) })
} }
func (self *StatusController) showAllBranchLogs() error { func (self *StatusController) showAllBranchLogs() {
cmdObj := self.c.Git().Branch.AllBranchesLogCmdObj() cmdObj := self.c.Git().Branch.AllBranchesLogCmdObj()
task := types.NewRunPtyTask(cmdObj.GetCmd()) task := types.NewRunPtyTask(cmdObj.GetCmd())
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: self.c.MainViewPairs().Normal, Pair: self.c.MainViewPairs().Normal,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Title: self.c.Tr.LogTitle, Title: self.c.Tr.LogTitle,
@ -196,7 +194,7 @@ func (self *StatusController) showAllBranchLogs() error {
}) })
} }
func (self *StatusController) showDashboard() error { func (self *StatusController) showDashboard() {
versionStr := "master" versionStr := "master"
version, err := types.ParseVersionNumber(self.c.GetConfig().GetVersion()) version, err := types.ParseVersionNumber(self.c.GetConfig().GetVersion())
if err == nil { if err == nil {
@ -218,7 +216,7 @@ func (self *StatusController) showDashboard() error {
style.FgMagenta.Sprintf("Become a sponsor: %s", style.PrintSimpleHyperlink(constants.Links.Donate)), // caffeine ain't free style.FgMagenta.Sprintf("Become a sponsor: %s", style.PrintSimpleHyperlink(constants.Links.Donate)), // caffeine ain't free
}, "\n\n") + "\n" }, "\n\n") + "\n"
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: self.c.MainViewPairs().Normal, Pair: self.c.MainViewPairs().Normal,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Title: self.c.Tr.StatusTitle, Title: self.c.Tr.StatusTitle,

View File

@ -38,9 +38,9 @@ func (self *SubCommitsController) context() *context.SubCommitsContext {
return self.c.Contexts().SubCommits return self.c.Contexts().SubCommits
} }
func (self *SubCommitsController) GetOnRenderToMain() func() error { func (self *SubCommitsController) GetOnRenderToMain() func() {
return func() error { return func() {
return self.c.Helpers().Diff.WithDiffModeCheck(func() error { self.c.Helpers().Diff.WithDiffModeCheck(func() {
commit := self.context().GetSelected() commit := self.context().GetSelected()
var task types.UpdateTask var task types.UpdateTask
if commit == nil { if commit == nil {
@ -50,7 +50,7 @@ func (self *SubCommitsController) GetOnRenderToMain() func() error {
task = self.c.Helpers().Diff.GetUpdateTaskForRenderingCommitsDiff(commit, refRange) task = self.c.Helpers().Diff.GetUpdateTaskForRenderingCommitsDiff(commit, refRange)
} }
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: self.c.MainViewPairs().Normal, Pair: self.c.MainViewPairs().Normal,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Title: "Commit", Title: "Commit",
@ -62,8 +62,8 @@ func (self *SubCommitsController) GetOnRenderToMain() func() error {
} }
} }
func (self *SubCommitsController) GetOnFocus() func(types.OnFocusOpts) error { func (self *SubCommitsController) GetOnFocus() func(types.OnFocusOpts) {
return func(types.OnFocusOpts) error { return func(types.OnFocusOpts) {
context := self.context() context := self.context()
if context.GetSelectedLineIdx() > COMMIT_THRESHOLD && context.GetLimitCommits() { if context.GetSelectedLineIdx() > COMMIT_THRESHOLD && context.GetLimitCommits() {
context.SetLimitCommits(false) context.SetLimitCommits(false)
@ -71,7 +71,5 @@ func (self *SubCommitsController) GetOnFocus() func(types.OnFocusOpts) error {
return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.SUB_COMMITS}}) return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.SUB_COMMITS}})
}) })
} }
return nil
} }
} }

View File

@ -106,9 +106,9 @@ func (self *SubmodulesController) GetOnClick() func() error {
return self.withItemGraceful(self.enter) return self.withItemGraceful(self.enter)
} }
func (self *SubmodulesController) GetOnRenderToMain() func() error { func (self *SubmodulesController) GetOnRenderToMain() func() {
return func() error { return func() {
return self.c.Helpers().Diff.WithDiffModeCheck(func() error { self.c.Helpers().Diff.WithDiffModeCheck(func() {
var task types.UpdateTask var task types.UpdateTask
submodule := self.context().GetSelected() submodule := self.context().GetSelected()
if submodule == nil { if submodule == nil {
@ -130,7 +130,7 @@ func (self *SubmodulesController) GetOnRenderToMain() func() error {
} }
} }
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: self.c.MainViewPairs().Normal, Pair: self.c.MainViewPairs().Normal,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Title: "Submodule", Title: "Submodule",
@ -146,16 +146,16 @@ func (self *SubmodulesController) enter(submodule *models.SubmoduleConfig) error
} }
func (self *SubmodulesController) add() error { func (self *SubmodulesController) add() error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.NewSubmoduleUrl, Title: self.c.Tr.NewSubmoduleUrl,
HandleConfirm: func(submoduleUrl string) error { HandleConfirm: func(submoduleUrl string) error {
nameSuggestion := filepath.Base(strings.TrimSuffix(submoduleUrl, filepath.Ext(submoduleUrl))) nameSuggestion := filepath.Base(strings.TrimSuffix(submoduleUrl, filepath.Ext(submoduleUrl)))
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.NewSubmoduleName, Title: self.c.Tr.NewSubmoduleName,
InitialContent: nameSuggestion, InitialContent: nameSuggestion,
HandleConfirm: func(submoduleName string) error { HandleConfirm: func(submoduleName string) error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.NewSubmodulePath, Title: self.c.Tr.NewSubmodulePath,
InitialContent: submoduleName, InitialContent: submoduleName,
HandleConfirm: func(submodulePath string) error { HandleConfirm: func(submodulePath string) error {
@ -170,14 +170,20 @@ func (self *SubmodulesController) add() error {
}) })
}, },
}) })
return nil
}, },
}) })
return nil
}, },
}) })
return nil
} }
func (self *SubmodulesController) editURL(submodule *models.SubmoduleConfig) error { func (self *SubmodulesController) editURL(submodule *models.SubmoduleConfig) error {
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: fmt.Sprintf(self.c.Tr.UpdateSubmoduleUrl, submodule.FullName()), Title: fmt.Sprintf(self.c.Tr.UpdateSubmoduleUrl, submodule.FullName()),
InitialContent: submodule.Url, InitialContent: submodule.Url,
HandleConfirm: func(newUrl string) error { HandleConfirm: func(newUrl string) error {
@ -192,6 +198,8 @@ func (self *SubmodulesController) editURL(submodule *models.SubmoduleConfig) err
}) })
}, },
}) })
return nil
} }
func (self *SubmodulesController) init(submodule *models.SubmoduleConfig) error { func (self *SubmodulesController) init(submodule *models.SubmoduleConfig) error {
@ -270,7 +278,7 @@ func (self *SubmodulesController) update(submodule *models.SubmoduleConfig) erro
} }
func (self *SubmodulesController) remove(submodule *models.SubmoduleConfig) error { func (self *SubmodulesController) remove(submodule *models.SubmoduleConfig) error {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.RemoveSubmodule, Title: self.c.Tr.RemoveSubmodule,
Prompt: fmt.Sprintf(self.c.Tr.RemoveSubmodulePrompt, submodule.FullName()), Prompt: fmt.Sprintf(self.c.Tr.RemoveSubmodulePrompt, submodule.FullName()),
HandleConfirm: func() error { HandleConfirm: func() error {
@ -282,10 +290,13 @@ func (self *SubmodulesController) remove(submodule *models.SubmoduleConfig) erro
return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.SUBMODULES, types.FILES}}) return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.SUBMODULES, types.FILES}})
}, },
}) })
return nil
} }
func (self *SubmodulesController) easterEgg() error { func (self *SubmodulesController) easterEgg() error {
return self.c.Context().Push(self.c.Contexts().Snake) self.c.Context().Push(self.c.Contexts().Snake)
return nil
} }
func (self *SubmodulesController) context() *context.SubmodulesContext { func (self *SubmodulesController) context() *context.SubmodulesContext {

View File

@ -72,13 +72,13 @@ func (self *SuggestionsController) GetKeybindings(opts types.KeybindingsOpts) []
func (self *SuggestionsController) switchToConfirmation() error { func (self *SuggestionsController) switchToConfirmation() error {
self.c.Views().Suggestions.Subtitle = "" self.c.Views().Suggestions.Subtitle = ""
self.c.Views().Suggestions.Highlight = false self.c.Views().Suggestions.Highlight = false
return self.c.Context().Replace(self.c.Contexts().Confirmation) self.c.Context().Replace(self.c.Contexts().Confirmation)
return nil
} }
func (self *SuggestionsController) GetOnFocusLost() func(types.OnFocusLostOpts) error { func (self *SuggestionsController) GetOnFocusLost() func(types.OnFocusLostOpts) {
return func(types.OnFocusLostOpts) error { return func(types.OnFocusLostOpts) {
self.c.Helpers().Confirmation.DeactivateConfirmationPrompt() self.c.Helpers().Confirmation.DeactivateConfirmationPrompt()
return nil
} }
} }

View File

@ -91,7 +91,8 @@ func (self *SwitchToDiffFilesController) enter() error {
return err return err
} }
return self.c.Context().Push(commitFilesContext) self.c.Context().Push(commitFilesContext)
return nil
} }
func (self *SwitchToDiffFilesController) canEnter() *types.DisabledReason { func (self *SwitchToDiffFilesController) canEnter() *types.DisabledReason {

View File

@ -214,7 +214,7 @@ func (self *SyncController) pushAux(currentBranch *models.Branch, opts pushOpts)
if forcePushDisabled { if forcePushDisabled {
return errors.New(self.c.Tr.UpdatesRejectedAndForcePushDisabled) return errors.New(self.c.Tr.UpdatesRejectedAndForcePushDisabled)
} }
_ = self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.ForcePush, Title: self.c.Tr.ForcePush,
Prompt: self.forcePushPrompt(), Prompt: self.forcePushPrompt(),
HandleConfirm: func() error { HandleConfirm: func() error {
@ -238,7 +238,7 @@ func (self *SyncController) requestToForcePush(currentBranch *models.Branch, opt
return errors.New(self.c.Tr.ForcePushDisabled) return errors.New(self.c.Tr.ForcePushDisabled)
} }
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.ForcePush, Title: self.c.Tr.ForcePush,
Prompt: self.forcePushPrompt(), Prompt: self.forcePushPrompt(),
HandleConfirm: func() error { HandleConfirm: func() error {
@ -246,6 +246,8 @@ func (self *SyncController) requestToForcePush(currentBranch *models.Branch, opt
return self.pushAux(currentBranch, opts) return self.pushAux(currentBranch, opts)
}, },
}) })
return nil
} }
func (self *SyncController) forcePushPrompt() string { func (self *SyncController) forcePushPrompt() string {

View File

@ -87,9 +87,9 @@ func (self *TagsController) GetKeybindings(opts types.KeybindingsOpts) []*types.
return bindings return bindings
} }
func (self *TagsController) GetOnRenderToMain() func() error { func (self *TagsController) GetOnRenderToMain() func() {
return func() error { return func() {
return self.c.Helpers().Diff.WithDiffModeCheck(func() error { self.c.Helpers().Diff.WithDiffModeCheck(func() {
var task types.UpdateTask var task types.UpdateTask
tag := self.context().GetSelected() tag := self.context().GetSelected()
if tag == nil { if tag == nil {
@ -99,7 +99,7 @@ func (self *TagsController) GetOnRenderToMain() func() error {
task = types.NewRunCommandTask(cmdObj.GetCmd()) task = types.NewRunCommandTask(cmdObj.GetCmd())
} }
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: self.c.MainViewPairs().Normal, Pair: self.c.MainViewPairs().Normal,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Title: "Tag", Title: "Tag",
@ -115,7 +115,8 @@ func (self *TagsController) checkout(tag *models.Tag) error {
if err := self.c.Helpers().Refs.CheckoutRef(tag.FullRefName(), types.CheckoutRefOptions{}); err != nil { if err := self.c.Helpers().Refs.CheckoutRef(tag.FullRefName(), types.CheckoutRefOptions{}); err != nil {
return err return err
} }
return self.c.Context().Push(self.c.Contexts().Branches) self.c.Context().Push(self.c.Contexts().Branches)
return nil
} }
func (self *TagsController) localDelete(tag *models.Tag) error { func (self *TagsController) localDelete(tag *models.Tag) error {
@ -135,7 +136,7 @@ func (self *TagsController) remoteDelete(tag *models.Tag) error {
}, },
) )
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: title, Title: title,
InitialContent: "origin", InitialContent: "origin",
FindSuggestionsFunc: self.c.Helpers().Suggestions.GetRemoteSuggestionsFunc(), FindSuggestionsFunc: self.c.Helpers().Suggestions.GetRemoteSuggestionsFunc(),
@ -154,7 +155,7 @@ func (self *TagsController) remoteDelete(tag *models.Tag) error {
}, },
) )
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: confirmTitle, Title: confirmTitle,
Prompt: confirmPrompt, Prompt: confirmPrompt,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -168,8 +169,12 @@ func (self *TagsController) remoteDelete(tag *models.Tag) error {
}) })
}, },
}) })
return nil
}, },
}) })
return nil
} }
func (self *TagsController) delete(tag *models.Tag) error { func (self *TagsController) delete(tag *models.Tag) error {
@ -212,7 +217,7 @@ func (self *TagsController) push(tag *models.Tag) error {
}, },
) )
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: title, Title: title,
InitialContent: "origin", InitialContent: "origin",
FindSuggestionsFunc: self.c.Helpers().Suggestions.GetRemoteSuggestionsFunc(), FindSuggestionsFunc: self.c.Helpers().Suggestions.GetRemoteSuggestionsFunc(),
@ -223,7 +228,7 @@ func (self *TagsController) push(tag *models.Tag) error {
// Render again to remove the inline status: // Render again to remove the inline status:
self.c.OnUIThread(func() error { self.c.OnUIThread(func() error {
_ = self.c.Contexts().Tags.HandleRender() self.c.Contexts().Tags.HandleRender()
return nil return nil
}) })
@ -231,6 +236,8 @@ func (self *TagsController) push(tag *models.Tag) error {
}) })
}, },
}) })
return nil
} }
func (self *TagsController) createResetMenu(tag *models.Tag) error { func (self *TagsController) createResetMenu(tag *models.Tag) error {

View File

@ -28,5 +28,6 @@ func (self *ToggleWhitespaceAction) Call() error {
self.c.GetAppState().IgnoreWhitespaceInDiffView = !self.c.GetAppState().IgnoreWhitespaceInDiffView self.c.GetAppState().IgnoreWhitespaceInDiffView = !self.c.GetAppState().IgnoreWhitespaceInDiffView
self.c.SaveAppStateAndLogError() self.c.SaveAppStateAndLogError()
return self.c.Context().CurrentSide().HandleFocus(types.OnFocusOpts{}) self.c.Context().CurrentSide().HandleFocus(types.OnFocusOpts{})
return nil
} }

View File

@ -89,7 +89,7 @@ func (self *UndoController) reflogUndo() error {
switch action.kind { switch action.kind {
case COMMIT, REBASE: case COMMIT, REBASE:
return true, self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.Actions.Undo, Title: self.c.Tr.Actions.Undo,
Prompt: fmt.Sprintf(self.c.Tr.HardResetAutostashPrompt, action.from), Prompt: fmt.Sprintf(self.c.Tr.HardResetAutostashPrompt, action.from),
HandleConfirm: func() error { HandleConfirm: func() error {
@ -100,8 +100,10 @@ func (self *UndoController) reflogUndo() error {
}) })
}, },
}) })
return true, nil
case CHECKOUT: case CHECKOUT:
return true, self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.Actions.Undo, Title: self.c.Tr.Actions.Undo,
Prompt: fmt.Sprintf(self.c.Tr.CheckoutPrompt, action.from), Prompt: fmt.Sprintf(self.c.Tr.CheckoutPrompt, action.from),
HandleConfirm: func() error { HandleConfirm: func() error {
@ -112,6 +114,7 @@ func (self *UndoController) reflogUndo() error {
}) })
}, },
}) })
return true, nil
case CURRENT_REBASE: case CURRENT_REBASE:
// do nothing // do nothing
@ -140,7 +143,7 @@ func (self *UndoController) reflogRedo() error {
switch action.kind { switch action.kind {
case COMMIT, REBASE: case COMMIT, REBASE:
return true, self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.Actions.Redo, Title: self.c.Tr.Actions.Redo,
Prompt: fmt.Sprintf(self.c.Tr.HardResetAutostashPrompt, action.to), Prompt: fmt.Sprintf(self.c.Tr.HardResetAutostashPrompt, action.to),
HandleConfirm: func() error { HandleConfirm: func() error {
@ -151,9 +154,10 @@ func (self *UndoController) reflogRedo() error {
}) })
}, },
}) })
return true, nil
case CHECKOUT: case CHECKOUT:
return true, self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.Actions.Redo, Title: self.c.Tr.Actions.Redo,
Prompt: fmt.Sprintf(self.c.Tr.CheckoutPrompt, action.to), Prompt: fmt.Sprintf(self.c.Tr.CheckoutPrompt, action.to),
HandleConfirm: func() error { HandleConfirm: func() error {
@ -164,6 +168,8 @@ func (self *UndoController) reflogRedo() error {
}) })
}, },
}) })
return true, nil
case CURRENT_REBASE: case CURRENT_REBASE:
// do nothing // do nothing
} }
@ -242,7 +248,7 @@ func (self *UndoController) hardResetWithAutoStash(commitHash string, options ha
dirtyWorkingTree := self.c.Helpers().WorkingTree.IsWorkingTreeDirty() dirtyWorkingTree := self.c.Helpers().WorkingTree.IsWorkingTreeDirty()
if dirtyWorkingTree { if dirtyWorkingTree {
// offer to autostash changes // offer to autostash changes
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.AutoStashTitle, Title: self.c.Tr.AutoStashTitle,
Prompt: self.c.Tr.AutoStashPrompt, Prompt: self.c.Tr.AutoStashPrompt,
HandleConfirm: func() error { HandleConfirm: func() error {
@ -262,6 +268,7 @@ func (self *UndoController) hardResetWithAutoStash(commitHash string, options ha
}) })
}, },
}) })
return nil
} }
return self.c.WithWaitingStatus(options.WaitingStatus, func(gocui.Task) error { return self.c.WithWaitingStatus(options.WaitingStatus, func(gocui.Task) error {

View File

@ -188,7 +188,7 @@ func (self *FilesController) Explode(v *gocui.View, onDone func()) {
style := styles[(i*len(styles)/max)%len(styles)] style := styles[(i*len(styles)/max)%len(styles)]
coloredImage := style.Sprint(image) coloredImage := style.Sprint(image)
self.c.OnUIThread(func() error { self.c.OnUIThread(func() error {
_ = v.SetOrigin(0, 0) v.SetOrigin(0, 0)
v.SetContent(coloredImage) v.SetContent(coloredImage)
return nil return nil
}) })

View File

@ -75,8 +75,8 @@ func (self *WorktreesController) GetKeybindings(opts types.KeybindingsOpts) []*t
return bindings return bindings
} }
func (self *WorktreesController) GetOnRenderToMain() func() error { func (self *WorktreesController) GetOnRenderToMain() func() {
return func() error { return func() {
var task types.UpdateTask var task types.UpdateTask
worktree := self.context().GetSelected() worktree := self.context().GetSelected()
if worktree == nil { if worktree == nil {
@ -102,7 +102,7 @@ func (self *WorktreesController) GetOnRenderToMain() func() error {
task = types.NewRenderStringTask(builder.String()) task = types.NewRenderStringTask(builder.String())
} }
return self.c.RenderToMainViews(types.RefreshMainOpts{ self.c.RenderToMainViews(types.RefreshMainOpts{
Pair: self.c.MainViewPairs().Normal, Pair: self.c.MainViewPairs().Normal,
Main: &types.ViewUpdateOpts{ Main: &types.ViewUpdateOpts{
Title: self.c.Tr.WorktreeTitle, Title: self.c.Tr.WorktreeTitle,

View File

@ -17,9 +17,7 @@ func (gui *Gui) handleCreateExtrasMenuPanel() error {
OnPress: func() error { OnPress: func() error {
currentContext := gui.c.Context().CurrentStatic() currentContext := gui.c.Context().CurrentStatic()
if gui.c.State().GetShowExtrasWindow() && currentContext.GetKey() == context.COMMAND_LOG_CONTEXT_KEY { if gui.c.State().GetShowExtrasWindow() && currentContext.GetKey() == context.COMMAND_LOG_CONTEXT_KEY {
if err := gui.c.Context().Pop(); err != nil { gui.c.Context().Pop()
return err
}
} }
show := !gui.c.State().GetShowExtrasWindow() show := !gui.c.State().GetShowExtrasWindow()
gui.c.State().SetShowExtrasWindow(show) gui.c.State().SetShowExtrasWindow(show)
@ -40,7 +38,8 @@ func (gui *Gui) handleFocusCommandLog() error {
gui.c.State().SetShowExtrasWindow(true) gui.c.State().SetShowExtrasWindow(true)
// TODO: is this necessary? Can't I just call 'return from context'? // TODO: is this necessary? Can't I just call 'return from context'?
gui.State.Contexts.CommandLog.SetParentContext(gui.c.Context().CurrentSide()) gui.State.Contexts.CommandLog.SetParentContext(gui.c.Context().CurrentSide())
return gui.c.Context().Push(gui.State.Contexts.CommandLog) gui.c.Context().Push(gui.State.Contexts.CommandLog)
return nil
} }
func (gui *Gui) scrollUpExtra() error { func (gui *Gui) scrollUpExtra() error {

View File

@ -393,9 +393,7 @@ func (gui *Gui) onNewRepo(startArgs appTypes.StartArgs, contextKey types.Context
} }
} }
if err := gui.c.Context().Push(contextToPush); err != nil { gui.c.Context().Push(contextToPush)
return err
}
return nil return nil
} }
@ -507,10 +505,12 @@ func (gui *Gui) checkForChangedConfigsThatDontAutoReload(oldConfig *config.UserC
"configs": strings.Join(changedConfigs, "\n"), "configs": strings.Join(changedConfigs, "\n"),
}, },
) )
return gui.c.Confirm(types.ConfirmOpts{ gui.c.Confirm(types.ConfirmOpts{
Title: gui.c.Tr.NonReloadableConfigWarningTitle, Title: gui.c.Tr.NonReloadableConfigWarningTitle,
Prompt: message, Prompt: message,
}) })
return nil
} }
// resetState reuses the repo state from our repo state map, if the repo was // resetState reuses the repo state from our repo state map, if the repo was
@ -673,11 +673,11 @@ func NewGui(
gui.PopupHandler = popup.NewPopupHandler( gui.PopupHandler = popup.NewPopupHandler(
cmn, cmn,
func(ctx goContext.Context, opts types.CreatePopupPanelOpts) error { func(ctx goContext.Context, opts types.CreatePopupPanelOpts) {
return gui.helpers.Confirmation.CreatePopupPanel(ctx, opts) gui.helpers.Confirmation.CreatePopupPanel(ctx, opts)
}, },
func() error { return gui.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) }, func() error { return gui.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) },
func() error { return gui.State.ContextMgr.Pop() }, func() { gui.State.ContextMgr.Pop() },
func() types.Context { return gui.State.ContextMgr.Current() }, func() types.Context { return gui.State.ContextMgr.Current() },
gui.createMenu, gui.createMenu,
func(message string, f func(gocui.Task) error) { gui.helpers.AppStatus.WithWaitingStatus(message, f) }, func(message string, f func(gocui.Task) error) { gui.helpers.AppStatus.WithWaitingStatus(message, f) },
@ -1003,12 +1003,14 @@ func (gui *Gui) showIntroPopupMessage() {
return err return err
} }
return gui.c.Confirm(types.ConfirmOpts{ gui.c.Confirm(types.ConfirmOpts{
Title: "", Title: "",
Prompt: gui.c.Tr.IntroPopupMessage, Prompt: gui.c.Tr.IntroPopupMessage,
HandleConfirm: onConfirm, HandleConfirm: onConfirm,
HandleClose: onConfirm, HandleClose: onConfirm,
}) })
return nil
}) })
} }
@ -1068,12 +1070,13 @@ func (gui *Gui) showBreakingChangesMessage() {
return nil return nil
} }
return gui.c.Confirm(types.ConfirmOpts{ gui.c.Confirm(types.ConfirmOpts{
Title: gui.Tr.BreakingChangesTitle, Title: gui.Tr.BreakingChangesTitle,
Prompt: gui.Tr.BreakingChangesMessage + "\n\n" + message, Prompt: gui.Tr.BreakingChangesMessage + "\n\n" + message,
HandleConfirm: onConfirm, HandleConfirm: onConfirm,
HandleClose: onConfirm, HandleClose: onConfirm,
}) })
return nil
}) })
} }
} }

View File

@ -115,8 +115,8 @@ func (self *guiCommon) OnWorker(f func(gocui.Task) error) {
self.gui.onWorker(f) self.gui.onWorker(f)
} }
func (self *guiCommon) RenderToMainViews(opts types.RefreshMainOpts) error { func (self *guiCommon) RenderToMainViews(opts types.RefreshMainOpts) {
return self.gui.refreshMainViews(opts) self.gui.refreshMainViews(opts)
} }
func (self *guiCommon) MainViewPairs() types.MainViewPairs { func (self *guiCommon) MainViewPairs() types.MainViewPairs {

View File

@ -33,7 +33,7 @@ func (gui *Gui) outsideFilterMode(f func() error) func() error {
func (gui *Gui) validateNotInFilterMode() bool { func (gui *Gui) validateNotInFilterMode() bool {
if gui.State.Modes.Filtering.Active() { if gui.State.Modes.Filtering.Active() {
_ = gui.c.Confirm(types.ConfirmOpts{ gui.c.Confirm(types.ConfirmOpts{
Title: gui.c.Tr.MustExitFilterModeTitle, Title: gui.c.Tr.MustExitFilterModeTitle,
Prompt: gui.c.Tr.MustExitFilterModePrompt, Prompt: gui.c.Tr.MustExitFilterModePrompt,
HandleConfirm: gui.helpers.Mode.ExitFilterMode, HandleConfirm: gui.helpers.Mode.ExitFilterMode,

View File

@ -177,9 +177,7 @@ func (gui *Gui) layout(g *gocui.Gui) error {
} }
for _, context := range contextsToRerender { for _, context := range contextsToRerender {
if err := context.HandleRender(); err != nil { context.HandleRender()
return err
}
} }
// here is a good place log some stuff // here is a good place log some stuff
@ -225,9 +223,7 @@ func (gui *Gui) onInitialViewsCreationForRepo() error {
} }
initialContext := gui.c.Context().Current() initialContext := gui.c.Context().Current()
if err := gui.c.Context().Activate(initialContext, types.OnFocusOpts{}); err != nil { gui.c.Context().Activate(initialContext, types.OnFocusOpts{})
return err
}
return gui.loadNewRepo() return gui.loadNewRepo()
} }

View File

@ -58,7 +58,7 @@ func (gui *Gui) moveMainContextToTop(context types.Context) {
} }
} }
func (gui *Gui) RefreshMainView(opts *types.ViewUpdateOpts, context types.Context) error { func (gui *Gui) RefreshMainView(opts *types.ViewUpdateOpts, context types.Context) {
view := context.GetView() view := context.GetView()
if opts.Title != "" { if opts.Title != "" {
@ -69,10 +69,7 @@ func (gui *Gui) RefreshMainView(opts *types.ViewUpdateOpts, context types.Contex
if err := gui.runTaskForView(view, opts.Task); err != nil { if err := gui.runTaskForView(view, opts.Task); err != nil {
gui.c.Log.Error(err) gui.c.Log.Error(err)
return nil
} }
return nil
} }
func (gui *Gui) normalMainContextPair() types.MainContextPair { func (gui *Gui) normalMainContextPair() types.MainContextPair {
@ -112,27 +109,23 @@ func (gui *Gui) allMainContextPairs() []types.MainContextPair {
} }
} }
func (gui *Gui) refreshMainViews(opts types.RefreshMainOpts) error { func (gui *Gui) refreshMainViews(opts types.RefreshMainOpts) {
// need to reset scroll positions of all other main views // need to reset scroll positions of all other main views
for _, pair := range gui.allMainContextPairs() { for _, pair := range gui.allMainContextPairs() {
if pair.Main != opts.Pair.Main { if pair.Main != opts.Pair.Main {
_ = pair.Main.GetView().SetOrigin(0, 0) pair.Main.GetView().SetOrigin(0, 0)
} }
if pair.Secondary != nil && pair.Secondary != opts.Pair.Secondary { if pair.Secondary != nil && pair.Secondary != opts.Pair.Secondary {
_ = pair.Secondary.GetView().SetOrigin(0, 0) pair.Secondary.GetView().SetOrigin(0, 0)
} }
} }
if opts.Main != nil { if opts.Main != nil {
if err := gui.RefreshMainView(opts.Main, opts.Pair.Main); err != nil { gui.RefreshMainView(opts.Main, opts.Pair.Main)
return err
}
} }
if opts.Secondary != nil { if opts.Secondary != nil {
if err := gui.RefreshMainView(opts.Secondary, opts.Pair.Secondary); err != nil { gui.RefreshMainView(opts.Secondary, opts.Pair.Secondary)
return err
}
} else if opts.Pair.Secondary != nil { } else if opts.Pair.Secondary != nil {
opts.Pair.Secondary.GetView().Clear() opts.Pair.Secondary.GetView().Clear()
} }
@ -140,8 +133,6 @@ func (gui *Gui) refreshMainViews(opts types.RefreshMainOpts) error {
gui.moveMainContextPairToTop(opts.Pair) gui.moveMainContextPairToTop(opts.Pair)
gui.splitMainPanel(opts.Secondary != nil) gui.splitMainPanel(opts.Secondary != nil)
return nil
} }
func (gui *Gui) splitMainPanel(splitMainPanel bool) { func (gui *Gui) splitMainPanel(splitMainPanel bool) {

View File

@ -60,5 +60,6 @@ func (gui *Gui) createMenu(opts types.CreateMenuOptions) error {
_ = gui.c.PostRefreshUpdate(gui.State.Contexts.Menu) _ = gui.c.PostRefreshUpdate(gui.State.Contexts.Menu)
// TODO: ensure that if we're opened a menu from within a menu that it renders correctly // TODO: ensure that if we're opened a menu from within a menu that it renders correctly
return gui.c.Context().Push(gui.State.Contexts.Menu) gui.c.Context().Push(gui.State.Contexts.Menu)
return nil
} }

View File

@ -12,9 +12,9 @@ import (
type PopupHandler struct { type PopupHandler struct {
*common.Common *common.Common
createPopupPanelFn func(context.Context, types.CreatePopupPanelOpts) error createPopupPanelFn func(context.Context, types.CreatePopupPanelOpts)
onErrorFn func() error onErrorFn func() error
popContextFn func() error popContextFn func()
currentContextFn func() types.Context currentContextFn func() types.Context
createMenuFn func(types.CreateMenuOptions) error createMenuFn func(types.CreateMenuOptions) error
withWaitingStatusFn func(message string, f func(gocui.Task) error) withWaitingStatusFn func(message string, f func(gocui.Task) error)
@ -28,9 +28,9 @@ var _ types.IPopupHandler = &PopupHandler{}
func NewPopupHandler( func NewPopupHandler(
common *common.Common, common *common.Common,
createPopupPanelFn func(context.Context, types.CreatePopupPanelOpts) error, createPopupPanelFn func(context.Context, types.CreatePopupPanelOpts),
onErrorFn func() error, onErrorFn func() error,
popContextFn func() error, popContextFn func(),
currentContextFn func() types.Context, currentContextFn func() types.Context,
createMenuFn func(types.CreateMenuOptions) error, createMenuFn func(types.CreateMenuOptions) error,
withWaitingStatusFn func(message string, f func(gocui.Task) error), withWaitingStatusFn func(message string, f func(gocui.Task) error),
@ -86,15 +86,17 @@ func (self *PopupHandler) ErrorHandler(err error) error {
return err return err
} }
return self.Alert(self.Tr.Error, coloredMessage) self.Alert(self.Tr.Error, coloredMessage)
return nil
} }
func (self *PopupHandler) Alert(title string, message string) error { func (self *PopupHandler) Alert(title string, message string) {
return self.Confirm(types.ConfirmOpts{Title: title, Prompt: message}) self.Confirm(types.ConfirmOpts{Title: title, Prompt: message})
} }
func (self *PopupHandler) Confirm(opts types.ConfirmOpts) error { func (self *PopupHandler) Confirm(opts types.ConfirmOpts) {
return self.createPopupPanelFn(context.Background(), types.CreatePopupPanelOpts{ self.createPopupPanelFn(context.Background(), types.CreatePopupPanelOpts{
Title: opts.Title, Title: opts.Title,
Prompt: opts.Prompt, Prompt: opts.Prompt,
HandleConfirm: opts.HandleConfirm, HandleConfirm: opts.HandleConfirm,
@ -102,8 +104,8 @@ func (self *PopupHandler) Confirm(opts types.ConfirmOpts) error {
}) })
} }
func (self *PopupHandler) Prompt(opts types.PromptOpts) error { func (self *PopupHandler) Prompt(opts types.PromptOpts) {
return self.createPopupPanelFn(context.Background(), types.CreatePopupPanelOpts{ self.createPopupPanelFn(context.Background(), types.CreatePopupPanelOpts{
Title: opts.Title, Title: opts.Title,
Prompt: opts.InitialContent, Prompt: opts.InitialContent,
Editable: true, Editable: true,

View File

@ -118,7 +118,7 @@ func (self *HandlerCreator) inputPrompt(prompt *config.CustomCommandPrompt, wrap
return err return err
} }
return self.c.Prompt(types.PromptOpts{ self.c.Prompt(types.PromptOpts{
Title: prompt.Title, Title: prompt.Title,
InitialContent: prompt.InitialValue, InitialContent: prompt.InitialValue,
FindSuggestionsFunc: findSuggestionsFn, FindSuggestionsFunc: findSuggestionsFn,
@ -126,6 +126,8 @@ func (self *HandlerCreator) inputPrompt(prompt *config.CustomCommandPrompt, wrap
return wrappedF(str) return wrappedF(str)
}, },
}) })
return nil
} }
func (self *HandlerCreator) generateFindSuggestionsFunc(prompt *config.CustomCommandPrompt) (func(string) []*types.Suggestion, error) { func (self *HandlerCreator) generateFindSuggestionsFunc(prompt *config.CustomCommandPrompt) (func(string) []*types.Suggestion, error) {
@ -183,11 +185,13 @@ func (self *HandlerCreator) getPresetSuggestionsFn(preset string) (func(string)
} }
func (self *HandlerCreator) confirmPrompt(prompt *config.CustomCommandPrompt, handleConfirm func() error) error { func (self *HandlerCreator) confirmPrompt(prompt *config.CustomCommandPrompt, handleConfirm func() error) error {
return self.c.Confirm(types.ConfirmOpts{ self.c.Confirm(types.ConfirmOpts{
Title: prompt.Title, Title: prompt.Title,
Prompt: prompt.Body, Prompt: prompt.Body,
HandleConfirm: handleConfirm, HandleConfirm: handleConfirm,
}) })
return nil
} }
func (self *HandlerCreator) menuPrompt(prompt *config.CustomCommandPrompt, wrappedF func(string) error) error { func (self *HandlerCreator) menuPrompt(prompt *config.CustomCommandPrompt, wrappedF func(string) error) error {
@ -298,7 +302,7 @@ func (self *HandlerCreator) finalHandler(customCommand config.CustomCommand, ses
return err return err
} }
} }
return self.c.Alert(title, output) self.c.Alert(title, output)
} }
return nil return nil

View File

@ -67,7 +67,7 @@ func (gui *Gui) newStringTaskWithScroll(view *gocui.View, str string, originX in
f := func(tasks.TaskOpts) error { f := func(tasks.TaskOpts) error {
gui.c.SetViewContent(view, str) gui.c.SetViewContent(view, str)
_ = view.SetOrigin(originX, originY) view.SetOrigin(originX, originY)
return nil return nil
} }
@ -119,16 +119,13 @@ func (gui *Gui) getManager(view *gocui.View) *tasks.ViewBufferManager {
if linesHeight < originY { if linesHeight < originY {
newOriginY := linesHeight newOriginY := linesHeight
err := view.SetOrigin(0, newOriginY) view.SetOrigin(0, newOriginY)
if err != nil {
panic(err)
}
} }
view.FlushStaleCells() view.FlushStaleCells()
}, },
func() { func() {
_ = view.SetOrigin(0, 0) view.SetOrigin(0, 0)
}, },
func() gocui.Task { func() gocui.Task {
return gui.c.GocuiGui().NewTask() return gui.c.GocuiGui().NewTask()

View File

@ -45,7 +45,7 @@ type IGuiCommon interface {
// allows rendering to main views (i.e. the ones to the right of the side panel) // allows rendering to main views (i.e. the ones to the right of the side panel)
// in such a way that avoids concurrency issues when there are slow commands // in such a way that avoids concurrency issues when there are slow commands
// to display the output of // to display the output of
RenderToMainViews(opts RefreshMainOpts) error RenderToMainViews(opts RefreshMainOpts)
// used purely for the sake of RenderToMainViews to provide the pair of main views we want to render to // used purely for the sake of RenderToMainViews to provide the pair of main views we want to render to
MainViewPairs() MainViewPairs MainViewPairs() MainViewPairs
@ -120,11 +120,11 @@ type IPopupHandler interface {
// Shows a notification popup with the given title and message to the user. // Shows a notification popup with the given title and message to the user.
// //
// This is a convenience wrapper around Confirm(), thus the popup can be closed using both 'Enter' and 'ESC'. // This is a convenience wrapper around Confirm(), thus the popup can be closed using both 'Enter' and 'ESC'.
Alert(title string, message string) error Alert(title string, message string)
// Shows a popup asking the user for confirmation. // Shows a popup asking the user for confirmation.
Confirm(opts ConfirmOpts) error Confirm(opts ConfirmOpts)
// Shows a popup prompting the user for input. // Shows a popup prompting the user for input.
Prompt(opts PromptOpts) error Prompt(opts PromptOpts)
WithWaitingStatus(message string, f func(gocui.Task) error) error WithWaitingStatus(message string, f func(gocui.Task) error) error
WithWaitingStatusSync(message string, f func() error) error WithWaitingStatusSync(message string, f func() error) error
Menu(opts CreateMenuOptions) error Menu(opts CreateMenuOptions) error

View File

@ -95,18 +95,18 @@ type IBaseContext interface {
// We'll need to think of a better way to do this. // We'll need to think of a better way to do this.
AddOnClickFn(func() error) AddOnClickFn(func() error)
AddOnRenderToMainFn(func() error) AddOnRenderToMainFn(func())
AddOnFocusFn(func(OnFocusOpts) error) AddOnFocusFn(func(OnFocusOpts))
AddOnFocusLostFn(func(OnFocusLostOpts) error) AddOnFocusLostFn(func(OnFocusLostOpts))
} }
type Context interface { type Context interface {
IBaseContext IBaseContext
HandleFocus(opts OnFocusOpts) error HandleFocus(opts OnFocusOpts)
HandleFocusLost(opts OnFocusLostOpts) error HandleFocusLost(opts OnFocusLostOpts)
HandleRender() error HandleRender()
HandleRenderToMain() error HandleRenderToMain()
} }
type ISearchHistoryContext interface { type ISearchHistoryContext interface {
@ -177,11 +177,11 @@ type IPatchExplorerContext interface {
GetState() *patch_exploring.State GetState() *patch_exploring.State
SetState(*patch_exploring.State) SetState(*patch_exploring.State)
GetIncludedLineIndices() []int GetIncludedLineIndices() []int
RenderAndFocus(isFocused bool) error RenderAndFocus(isFocused bool)
Render(isFocused bool) error Render(isFocused bool)
Focus() error Focus()
GetContentToRender(isFocused bool) string GetContentToRender(isFocused bool) string
NavigateTo(isFocused bool, selectedLineIdx int) error NavigateTo(isFocused bool, selectedLineIdx int)
GetMutex() *deadlock.Mutex GetMutex() *deadlock.Mutex
IsPatchExplorerContext() // used for type switch IsPatchExplorerContext() // used for type switch
} }
@ -232,9 +232,9 @@ type HasKeybindings interface {
GetKeybindings(opts KeybindingsOpts) []*Binding GetKeybindings(opts KeybindingsOpts) []*Binding
GetMouseKeybindings(opts KeybindingsOpts) []*gocui.ViewMouseBinding GetMouseKeybindings(opts KeybindingsOpts) []*gocui.ViewMouseBinding
GetOnClick() func() error GetOnClick() func() error
GetOnRenderToMain() func() error GetOnRenderToMain() func()
GetOnFocus() func(OnFocusOpts) error GetOnFocus() func(OnFocusOpts)
GetOnFocusLost() func(OnFocusLostOpts) error GetOnFocusLost() func(OnFocusLostOpts)
} }
type IController interface { type IController interface {
@ -278,10 +278,10 @@ type ListItem interface {
} }
type IContextMgr interface { type IContextMgr interface {
Push(context Context, opts ...OnFocusOpts) error Push(context Context, opts ...OnFocusOpts)
Pop() error Pop()
Replace(context Context) error Replace(context Context)
Activate(context Context, opts OnFocusOpts) error Activate(context Context, opts OnFocusOpts)
Current() Context Current() Context
CurrentStatic() Context CurrentStatic() Context
CurrentSide() Context CurrentSide() Context

View File

@ -11,13 +11,8 @@ import (
) )
func (gui *Gui) resetViewOrigin(v *gocui.View) { func (gui *Gui) resetViewOrigin(v *gocui.View) {
if err := v.SetCursor(0, 0); err != nil { v.SetCursor(0, 0)
gui.Log.Error(err) v.SetOrigin(0, 0)
}
if err := v.SetOrigin(0, 0); err != nil {
gui.Log.Error(err)
}
} }
// Returns the number of lines that we should read initially from a cmd task so // Returns the number of lines that we should read initially from a cmd task so
@ -77,7 +72,8 @@ func (gui *Gui) onViewTabClick(windowName string, tabIndex int) error {
return nil return nil
} }
return gui.c.Context().Push(context) gui.c.Context().Push(context)
return nil
} }
func (gui *Gui) handleNextTab() error { func (gui *Gui) handleNextTab() error {
@ -136,14 +132,10 @@ func (gui *Gui) postRefreshUpdate(c types.Context) error {
gui.Log.Infof("postRefreshUpdate for %s took %s", c.GetKey(), time.Since(t)) gui.Log.Infof("postRefreshUpdate for %s took %s", c.GetKey(), time.Since(t))
}() }()
if err := c.HandleRender(); err != nil { c.HandleRender()
return err
}
if gui.currentViewName() == c.GetViewName() { if gui.currentViewName() == c.GetViewName() {
if err := c.HandleFocus(types.OnFocusOpts{}); err != nil { c.HandleFocus(types.OnFocusOpts{})
return err
}
} }
return nil return nil

View File

@ -325,8 +325,8 @@ func (g *Gui) SetView(name string, x0, y0, x1, y1 int, overlaps byte) (*View, er
newViewCursorX, newOriginX := updatedCursorAndOrigin(0, v.InnerWidth(), cursorX) newViewCursorX, newOriginX := updatedCursorAndOrigin(0, v.InnerWidth(), cursorX)
newViewCursorY, newOriginY := updatedCursorAndOrigin(0, v.InnerHeight(), cursorY) newViewCursorY, newOriginY := updatedCursorAndOrigin(0, v.InnerHeight(), cursorY)
_ = v.SetCursor(newViewCursorX, newViewCursorY) v.SetCursor(newViewCursorX, newViewCursorY)
_ = v.SetOrigin(newOriginX, newOriginY) v.SetOrigin(newOriginX, newOriginY)
} }
} }
@ -1204,9 +1204,7 @@ func (g *Gui) ForceRedrawViews(views ...*View) error {
} }
for _, v := range views { for _, v := range views {
if err := v.draw(); err != nil { v.draw()
return err
}
} }
Screen.Show() Screen.Show()
@ -1252,9 +1250,7 @@ func (g *Gui) draw(v *View) error {
Screen.HideCursor() Screen.HideCursor()
} }
if err := v.draw(); err != nil { v.draw()
return err
}
if v.Frame { if v.Frame {
var fgColor, bgColor, frameColor Attribute var fgColor, bgColor, frameColor Attribute
@ -1360,9 +1356,7 @@ func (g *Gui) onKey(ev *GocuiEvent) error {
} }
} }
if !IsMouseScrollKey(ev.Key) { if !IsMouseScrollKey(ev.Key) {
if err := v.SetCursor(newCx, newCy); err != nil { v.SetCursor(newCx, newCy)
return err
}
if v.Editable { if v.Editable {
v.TextArea.SetCursor2D(newX, newY) v.TextArea.SetCursor2D(newX, newY)

View File

@ -14,7 +14,6 @@ import (
"unicode/utf8" "unicode/utf8"
"github.com/gdamore/tcell/v2" "github.com/gdamore/tcell/v2"
"github.com/go-errors/errors"
"github.com/mattn/go-runewidth" "github.com/mattn/go-runewidth"
) )
@ -26,10 +25,6 @@ const (
RIGHT = 8 // view is overlapping at right edge RIGHT = 8 // view is overlapping at right edge
) )
// ErrInvalidPoint is returned when client passed invalid coordinates of a cell.
// Most likely client has passed negative coordinates of a cell.
var ErrInvalidPoint = errors.New("invalid point")
// A View is a window. It maintains its own internal buffer and cursor // A View is a window. It maintains its own internal buffer and cursor
// position. // position.
type View struct { type View struct {
@ -487,10 +482,10 @@ func (v *View) Name() string {
// setRune sets a rune at the given point relative to the view. It applies the // setRune sets a rune at the given point relative to the view. It applies the
// specified colors, taking into account if the cell must be highlighted. Also, // specified colors, taking into account if the cell must be highlighted. Also,
// it checks if the position is valid. // it checks if the position is valid.
func (v *View) setRune(x, y int, ch rune, fgColor, bgColor Attribute) error { func (v *View) setRune(x, y int, ch rune, fgColor, bgColor Attribute) {
maxX, maxY := v.Size() maxX, maxY := v.Size()
if x < 0 || x >= maxX || y < 0 || y >= maxY { if x < 0 || x >= maxX || y < 0 || y >= maxY {
return ErrInvalidPoint return
} }
if v.Mask != 0 { if v.Mask != 0 {
@ -498,27 +493,24 @@ func (v *View) setRune(x, y int, ch rune, fgColor, bgColor Attribute) error {
bgColor = v.BgColor bgColor = v.BgColor
ch = v.Mask ch = v.Mask
} else if v.Highlight { } else if v.Highlight {
var ( var ry, rcy int
ry, rcy int
err error
)
_, ry, err = v.realPosition(x, y) _, ry, ok := v.realPosition(x, y)
if err != nil { if !ok {
return err return
} }
_, rrcy, err := v.realPosition(v.cx, v.cy) _, rrcy, ok := v.realPosition(v.cx, v.cy)
// if error is not nil, then the cursor is out of bounds, which is fine // out of bounds is fine
if err == nil { if ok {
rcy = rrcy rcy = rrcy
} }
rangeSelectStart := rcy rangeSelectStart := rcy
rangeSelectEnd := rcy rangeSelectEnd := rcy
if v.rangeSelectStartY != -1 { if v.rangeSelectStartY != -1 {
_, realRangeSelectStart, err := v.realPosition(0, v.rangeSelectStartY-v.oy) _, realRangeSelectStart, ok := v.realPosition(0, v.rangeSelectStartY-v.oy)
if err != nil { if !ok {
return err return
} }
rangeSelectStart = min(realRangeSelectStart, rcy) rangeSelectStart = min(realRangeSelectStart, rcy)
@ -558,8 +550,6 @@ func (v *View) setRune(x, y int, ch rune, fgColor, bgColor Attribute) error {
} }
tcellSetCell(v.x0+x+1, v.y0+y+1, ch, fgColor, bgColor, v.outMode) tcellSetCell(v.x0+x+1, v.y0+y+1, ch, fgColor, bgColor, v.outMode)
return nil
} }
func min(a, b int) int { func min(a, b int) int {
@ -578,14 +568,13 @@ func max(a, b int) int {
// SetCursor sets the cursor position of the view at the given point, // SetCursor sets the cursor position of the view at the given point,
// relative to the view. It checks if the position is valid. // relative to the view. It checks if the position is valid.
func (v *View) SetCursor(x, y int) error { func (v *View) SetCursor(x, y int) {
maxX, maxY := v.Size() maxX, maxY := v.Size()
if x < 0 || x >= maxX || y < 0 || y >= maxY { if x < 0 || x >= maxX || y < 0 || y >= maxY {
return nil return
} }
v.cx = x v.cx = x
v.cy = y v.cy = y
return nil
} }
func (v *View) SetCursorX(x int) { func (v *View) SetCursorX(x int) {
@ -622,29 +611,30 @@ func (v *View) CursorY() int {
// it is linked with the origin point of view. It can be used to // it is linked with the origin point of view. It can be used to
// implement Horizontal and Vertical scrolling with just incrementing // implement Horizontal and Vertical scrolling with just incrementing
// or decrementing ox and oy. // or decrementing ox and oy.
func (v *View) SetOrigin(x, y int) error { func (v *View) SetOrigin(x, y int) {
if x < 0 || y < 0 {
return ErrInvalidPoint
}
v.ox = x
v.oy = y
return nil
}
func (v *View) SetOriginX(x int) error {
if x < 0 { if x < 0 {
return ErrInvalidPoint x = 0
} }
if y < 0 {
y = 0
}
v.ox = x v.ox = x
return nil v.oy = y
} }
func (v *View) SetOriginY(y int) error { func (v *View) SetOriginX(x int) {
if x < 0 {
x = 0
}
v.ox = x
}
func (v *View) SetOriginY(y int) {
if y < 0 { if y < 0 {
return ErrInvalidPoint y = 0
} }
v.oy = y v.oy = y
return nil
} }
// Origin returns the origin position of the view. // Origin returns the origin position of the view.
@ -662,13 +652,16 @@ func (v *View) OriginY() int {
// SetWritePos sets the write position of the view's internal buffer. // SetWritePos sets the write position of the view's internal buffer.
// So the next Write call would write directly to the specified position. // So the next Write call would write directly to the specified position.
func (v *View) SetWritePos(x, y int) error { func (v *View) SetWritePos(x, y int) {
if x < 0 || y < 0 { if x < 0 {
return ErrInvalidPoint x = 0
} }
if y < 0 {
y = 0
}
v.wx = x v.wx = x
v.wy = y v.wy = y
return nil
} }
// WritePos returns the current write position of the view's internal buffer. // WritePos returns the current write position of the view's internal buffer.
@ -678,14 +671,17 @@ func (v *View) WritePos() (x, y int) {
// SetReadPos sets the read position of the view's internal buffer. // SetReadPos sets the read position of the view's internal buffer.
// So the next Read call would read from the specified position. // So the next Read call would read from the specified position.
func (v *View) SetReadPos(x, y int) error { func (v *View) SetReadPos(x, y int) {
if x < 0 || y < 0 { if x < 0 {
return ErrInvalidPoint x = 0
} }
if y < 0 {
y = 0
}
v.readBuffer = nil v.readBuffer = nil
v.rx = x v.rx = x
v.ry = y v.ry = y
return nil
} }
// ReadPos returns the current read position of the view's internal buffer. // ReadPos returns the current read position of the view's internal buffer.
@ -992,16 +988,8 @@ func (v *View) FlushStaleCells() {
func (v *View) rewind() { func (v *View) rewind() {
v.ei.reset() v.ei.reset()
if err := v.SetReadPos(0, 0); err != nil { v.SetReadPos(0, 0)
// SetReadPos returns error only if x and y are negative v.SetWritePos(0, 0)
// we are passing 0, 0, thus no error should occur.
panic(err)
}
if err := v.SetWritePos(0, 0); err != nil {
// SetWritePos returns error only if x and y are negative
// we are passing 0, 0, thus no error should occur.
panic(err)
}
} }
func containsUpcaseChar(str string) bool { func containsUpcaseChar(str string) bool {
@ -1098,12 +1086,12 @@ func (v *View) IsTainted() bool {
} }
// draw re-draws the view's contents. // draw re-draws the view's contents.
func (v *View) draw() error { func (v *View) draw() {
v.writeMutex.Lock() v.writeMutex.Lock()
defer v.writeMutex.Unlock() defer v.writeMutex.Unlock()
if !v.Visible { if !v.Visible {
return nil return
} }
v.clearRunes() v.clearRunes()
@ -1112,7 +1100,7 @@ func (v *View) draw() error {
if v.Wrap { if v.Wrap {
if maxX == 0 { if maxX == 0 {
return nil return
} }
v.ox = 0 v.ox = 0
} }
@ -1125,7 +1113,7 @@ func (v *View) draw() error {
} }
if len(v.viewLines) == 0 { if len(v.viewLines) == 0 {
return nil return
} }
start := v.oy start := v.oy
@ -1189,9 +1177,7 @@ func (v *View) draw() error {
fgColor |= AttrUnderline fgColor |= AttrUnderline
} }
if err := v.setRune(x, y, c.chr, fgColor, bgColor); err != nil { v.setRune(x, y, c.chr, fgColor, bgColor)
return err
}
// Not sure why the previous code was here but it caused problems // Not sure why the previous code was here but it caused problems
// when typing wide characters in an editor // when typing wide characters in an editor
@ -1199,7 +1185,6 @@ func (v *View) draw() error {
cellIdx++ cellIdx++
} }
} }
return nil
} }
func (v *View) refreshViewLinesIfNeeded() { func (v *View) refreshViewLinesIfNeeded() {
@ -1268,16 +1253,16 @@ func (v *View) isHoveredHyperlink(x, y int) bool {
// realPosition returns the position in the internal buffer corresponding to the // realPosition returns the position in the internal buffer corresponding to the
// point (x, y) of the view. // point (x, y) of the view.
func (v *View) realPosition(vx, vy int) (x, y int, err error) { func (v *View) realPosition(vx, vy int) (x, y int, ok bool) {
vx = v.ox + vx vx = v.ox + vx
vy = v.oy + vy vy = v.oy + vy
if vx < 0 || vy < 0 { if vx < 0 || vy < 0 {
return 0, 0, ErrInvalidPoint return 0, 0, false
} }
if len(v.viewLines) == 0 { if len(v.viewLines) == 0 {
return vx, vy, nil return vx, vy, true
} }
if vy < len(v.viewLines) { if vy < len(v.viewLines) {
@ -1290,7 +1275,7 @@ func (v *View) realPosition(vx, vy int) (x, y int, err error) {
y = vline.linesY + vy - len(v.viewLines) + 1 y = vline.linesY + vy - len(v.viewLines) + 1
} }
return x, y, nil return x, y, true
} }
// clearRunes erases all the cells in the view. // clearRunes erases all the cells in the view.
@ -1366,29 +1351,29 @@ func (v *View) ViewBuffer() string {
// Line returns a string with the line of the view's internal buffer // Line returns a string with the line of the view's internal buffer
// at the position corresponding to the point (x, y). // at the position corresponding to the point (x, y).
func (v *View) Line(y int) (string, error) { func (v *View) Line(y int) (string, bool) {
_, y, err := v.realPosition(0, y) _, y, ok := v.realPosition(0, y)
if err != nil { if !ok {
return "", err return "", false
} }
if y < 0 || y >= len(v.lines) { if y < 0 || y >= len(v.lines) {
return "", ErrInvalidPoint return "", false
} }
return lineType(v.lines[y]).String(), nil return lineType(v.lines[y]).String(), true
} }
// Word returns a string with the word of the view's internal buffer // Word returns a string with the word of the view's internal buffer
// at the position corresponding to the point (x, y). // at the position corresponding to the point (x, y).
func (v *View) Word(x, y int) (string, error) { func (v *View) Word(x, y int) (string, bool) {
x, y, err := v.realPosition(x, y) x, y, ok := v.realPosition(x, y)
if err != nil { if !ok {
return "", err return "", false
} }
if x < 0 || y < 0 || y >= len(v.lines) || x >= len(v.lines[y]) { if x < 0 || y < 0 || y >= len(v.lines) || x >= len(v.lines[y]) {
return "", ErrInvalidPoint return "", false
} }
str := lineType(v.lines[y]).String() str := lineType(v.lines[y]).String()
@ -1405,7 +1390,7 @@ func (v *View) Word(x, y int) (string, error) {
} else { } else {
nr = nr + x nr = nr + x
} }
return str[nl:nr], nil return str[nl:nr], true
} }
// indexFunc allows to split lines by words taking into account spaces // indexFunc allows to split lines by words taking into account spaces
@ -1416,10 +1401,9 @@ func indexFunc(r rune) bool {
// SetHighlight toggles highlighting of separate lines, for custom lists // SetHighlight toggles highlighting of separate lines, for custom lists
// or multiple selection in views. // or multiple selection in views.
func (v *View) SetHighlight(y int, on bool) error { func (v *View) SetHighlight(y int, on bool) {
if y < 0 || y >= len(v.lines) { if y < 0 || y >= len(v.lines) {
err := ErrInvalidPoint return
return err
} }
line := v.lines[y] line := v.lines[y]
@ -1437,7 +1421,6 @@ func (v *View) SetHighlight(y int, on bool) error {
v.tainted = true v.tainted = true
v.lines[y] = cells v.lines[y] = cells
v.clearHover() v.clearHover()
return nil
} }
func lineWrap(line []cell, columns int) [][]cell { func lineWrap(line []cell, columns int) [][]cell {
@ -1620,8 +1603,8 @@ func (v *View) RenderTextArea() {
newViewCursorX, newOriginX := updatedCursorAndOrigin(prevOriginX, width, cursorX) newViewCursorX, newOriginX := updatedCursorAndOrigin(prevOriginX, width, cursorX)
newViewCursorY, newOriginY := updatedCursorAndOrigin(prevOriginY, height, cursorY) newViewCursorY, newOriginY := updatedCursorAndOrigin(prevOriginY, height, cursorY)
_ = v.SetCursor(newViewCursorX, newViewCursorY) v.SetCursor(newViewCursorX, newViewCursorY)
_ = v.SetOrigin(newOriginX, newOriginY) v.SetOrigin(newOriginX, newOriginY)
} }
func updatedCursorAndOrigin(prevOrigin int, size int, cursor int) (int, int) { func updatedCursorAndOrigin(prevOrigin int, size int, cursor int) (int, int) {
@ -1648,8 +1631,8 @@ func (v *View) ClearTextArea() {
defer v.writeMutex.Unlock() defer v.writeMutex.Unlock()
v.TextArea.Clear() v.TextArea.Clear()
_ = v.SetOrigin(0, 0) v.SetOrigin(0, 0)
_ = v.SetCursor(0, 0) v.SetCursor(0, 0)
} }
func (v *View) overwriteLines(y int, content string) { func (v *View) overwriteLines(y int, content string) {

19
vendor/golang.org/x/sys/cpu/cpu.go generated vendored
View File

@ -201,6 +201,25 @@ var S390X struct {
_ CacheLinePad _ CacheLinePad
} }
// RISCV64 contains the supported CPU features and performance characteristics for riscv64
// platforms. The booleans in RISCV64, with the exception of HasFastMisaligned, indicate
// the presence of RISC-V extensions.
//
// It is safe to assume that all the RV64G extensions are supported and so they are omitted from
// this structure. As riscv64 Go programs require at least RV64G, the code that populates
// this structure cannot run successfully if some of the RV64G extensions are missing.
// The struct is padded to avoid false sharing.
var RISCV64 struct {
_ CacheLinePad
HasFastMisaligned bool // Fast misaligned accesses
HasC bool // Compressed instruction-set extension
HasV bool // Vector extension compatible with RVV 1.0
HasZba bool // Address generation instructions extension
HasZbb bool // Basic bit-manipulation extension
HasZbs bool // Single-bit instructions extension
_ CacheLinePad
}
func init() { func init() {
archInit() archInit()
initOptions() initOptions()

View File

@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
//go:build linux && !arm && !arm64 && !mips64 && !mips64le && !ppc64 && !ppc64le && !s390x //go:build linux && !arm && !arm64 && !mips64 && !mips64le && !ppc64 && !ppc64le && !s390x && !riscv64
package cpu package cpu

137
vendor/golang.org/x/sys/cpu/cpu_linux_riscv64.go generated vendored Normal file
View File

@ -0,0 +1,137 @@
// Copyright 2024 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package cpu
import (
"syscall"
"unsafe"
)
// RISC-V extension discovery code for Linux. The approach here is to first try the riscv_hwprobe
// syscall falling back to HWCAP to check for the C extension if riscv_hwprobe is not available.
//
// A note on detection of the Vector extension using HWCAP.
//
// Support for the Vector extension version 1.0 was added to the Linux kernel in release 6.5.
// Support for the riscv_hwprobe syscall was added in 6.4. It follows that if the riscv_hwprobe
// syscall is not available then neither is the Vector extension (which needs kernel support).
// The riscv_hwprobe syscall should then be all we need to detect the Vector extension.
// However, some RISC-V board manufacturers ship boards with an older kernel on top of which
// they have back-ported various versions of the Vector extension patches but not the riscv_hwprobe
// patches. These kernels advertise support for the Vector extension using HWCAP. Falling
// back to HWCAP to detect the Vector extension, if riscv_hwprobe is not available, or simply not
// bothering with riscv_hwprobe at all and just using HWCAP may then seem like an attractive option.
//
// Unfortunately, simply checking the 'V' bit in AT_HWCAP will not work as this bit is used by
// RISC-V board and cloud instance providers to mean different things. The Lichee Pi 4A board
// and the Scaleway RV1 cloud instances use the 'V' bit to advertise their support for the unratified
// 0.7.1 version of the Vector Specification. The Banana Pi BPI-F3 and the CanMV-K230 board use
// it to advertise support for 1.0 of the Vector extension. Versions 0.7.1 and 1.0 of the Vector
// extension are binary incompatible. HWCAP can then not be used in isolation to populate the
// HasV field as this field indicates that the underlying CPU is compatible with RVV 1.0.
//
// There is a way at runtime to distinguish between versions 0.7.1 and 1.0 of the Vector
// specification by issuing a RVV 1.0 vsetvli instruction and checking the vill bit of the vtype
// register. This check would allow us to safely detect version 1.0 of the Vector extension
// with HWCAP, if riscv_hwprobe were not available. However, the check cannot
// be added until the assembler supports the Vector instructions.
//
// Note the riscv_hwprobe syscall does not suffer from these ambiguities by design as all of the
// extensions it advertises support for are explicitly versioned. It's also worth noting that
// the riscv_hwprobe syscall is the only way to detect multi-letter RISC-V extensions, e.g., Zba.
// These cannot be detected using HWCAP and so riscv_hwprobe must be used to detect the majority
// of RISC-V extensions.
//
// Please see https://docs.kernel.org/arch/riscv/hwprobe.html for more information.
// golang.org/x/sys/cpu is not allowed to depend on golang.org/x/sys/unix so we must
// reproduce the constants, types and functions needed to make the riscv_hwprobe syscall
// here.
const (
// Copied from golang.org/x/sys/unix/ztypes_linux_riscv64.go.
riscv_HWPROBE_KEY_IMA_EXT_0 = 0x4
riscv_HWPROBE_IMA_C = 0x2
riscv_HWPROBE_IMA_V = 0x4
riscv_HWPROBE_EXT_ZBA = 0x8
riscv_HWPROBE_EXT_ZBB = 0x10
riscv_HWPROBE_EXT_ZBS = 0x20
riscv_HWPROBE_KEY_CPUPERF_0 = 0x5
riscv_HWPROBE_MISALIGNED_FAST = 0x3
riscv_HWPROBE_MISALIGNED_MASK = 0x7
)
const (
// sys_RISCV_HWPROBE is copied from golang.org/x/sys/unix/zsysnum_linux_riscv64.go.
sys_RISCV_HWPROBE = 258
)
// riscvHWProbePairs is copied from golang.org/x/sys/unix/ztypes_linux_riscv64.go.
type riscvHWProbePairs struct {
key int64
value uint64
}
const (
// CPU features
hwcap_RISCV_ISA_C = 1 << ('C' - 'A')
)
func doinit() {
// A slice of key/value pair structures is passed to the RISCVHWProbe syscall. The key
// field should be initialised with one of the key constants defined above, e.g.,
// RISCV_HWPROBE_KEY_IMA_EXT_0. The syscall will set the value field to the appropriate value.
// If the kernel does not recognise a key it will set the key field to -1 and the value field to 0.
pairs := []riscvHWProbePairs{
{riscv_HWPROBE_KEY_IMA_EXT_0, 0},
{riscv_HWPROBE_KEY_CPUPERF_0, 0},
}
// This call only indicates that extensions are supported if they are implemented on all cores.
if riscvHWProbe(pairs, 0) {
if pairs[0].key != -1 {
v := uint(pairs[0].value)
RISCV64.HasC = isSet(v, riscv_HWPROBE_IMA_C)
RISCV64.HasV = isSet(v, riscv_HWPROBE_IMA_V)
RISCV64.HasZba = isSet(v, riscv_HWPROBE_EXT_ZBA)
RISCV64.HasZbb = isSet(v, riscv_HWPROBE_EXT_ZBB)
RISCV64.HasZbs = isSet(v, riscv_HWPROBE_EXT_ZBS)
}
if pairs[1].key != -1 {
v := pairs[1].value & riscv_HWPROBE_MISALIGNED_MASK
RISCV64.HasFastMisaligned = v == riscv_HWPROBE_MISALIGNED_FAST
}
}
// Let's double check with HWCAP if the C extension does not appear to be supported.
// This may happen if we're running on a kernel older than 6.4.
if !RISCV64.HasC {
RISCV64.HasC = isSet(hwCap, hwcap_RISCV_ISA_C)
}
}
func isSet(hwc uint, value uint) bool {
return hwc&value != 0
}
// riscvHWProbe is a simplified version of the generated wrapper function found in
// golang.org/x/sys/unix/zsyscall_linux_riscv64.go. We simplify it by removing the
// cpuCount and cpus parameters which we do not need. We always want to pass 0 for
// these parameters here so the kernel only reports the extensions that are present
// on all cores.
func riscvHWProbe(pairs []riscvHWProbePairs, flags uint) bool {
var _zero uintptr
var p0 unsafe.Pointer
if len(pairs) > 0 {
p0 = unsafe.Pointer(&pairs[0])
} else {
p0 = unsafe.Pointer(&_zero)
}
_, _, e1 := syscall.Syscall6(sys_RISCV_HWPROBE, uintptr(p0), uintptr(len(pairs)), uintptr(0), uintptr(0), uintptr(flags), 0)
return e1 == 0
}

View File

@ -8,4 +8,13 @@ package cpu
const cacheLineSize = 64 const cacheLineSize = 64
func initOptions() {} func initOptions() {
options = []option{
{Name: "fastmisaligned", Feature: &RISCV64.HasFastMisaligned},
{Name: "c", Feature: &RISCV64.HasC},
{Name: "v", Feature: &RISCV64.HasV},
{Name: "zba", Feature: &RISCV64.HasZba},
{Name: "zbb", Feature: &RISCV64.HasZbb},
{Name: "zbs", Feature: &RISCV64.HasZbs},
}
}

View File

@ -552,6 +552,7 @@ ccflags="$@"
$2 !~ /^RTC_VL_(ACCURACY|BACKUP|DATA)/ && $2 !~ /^RTC_VL_(ACCURACY|BACKUP|DATA)/ &&
$2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTC|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P|NETNSA)_/ || $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTC|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P|NETNSA)_/ ||
$2 ~ /^SOCK_|SK_DIAG_|SKNLGRP_$/ || $2 ~ /^SOCK_|SK_DIAG_|SKNLGRP_$/ ||
$2 ~ /^(CONNECT|SAE)_/ ||
$2 ~ /^FIORDCHK$/ || $2 ~ /^FIORDCHK$/ ||
$2 ~ /^SIOC/ || $2 ~ /^SIOC/ ||
$2 ~ /^TIOC/ || $2 ~ /^TIOC/ ||

View File

@ -566,6 +566,43 @@ func PthreadFchdir(fd int) (err error) {
return pthread_fchdir_np(fd) return pthread_fchdir_np(fd)
} }
// Connectx calls connectx(2) to initiate a connection on a socket.
//
// srcIf, srcAddr, and dstAddr are filled into a [SaEndpoints] struct and passed as the endpoints argument.
//
// - srcIf is the optional source interface index. 0 means unspecified.
// - srcAddr is the optional source address. nil means unspecified.
// - dstAddr is the destination address.
//
// On success, Connectx returns the number of bytes enqueued for transmission.
func Connectx(fd int, srcIf uint32, srcAddr, dstAddr Sockaddr, associd SaeAssocID, flags uint32, iov []Iovec, connid *SaeConnID) (n uintptr, err error) {
endpoints := SaEndpoints{
Srcif: srcIf,
}
if srcAddr != nil {
addrp, addrlen, err := srcAddr.sockaddr()
if err != nil {
return 0, err
}
endpoints.Srcaddr = (*RawSockaddr)(addrp)
endpoints.Srcaddrlen = uint32(addrlen)
}
if dstAddr != nil {
addrp, addrlen, err := dstAddr.sockaddr()
if err != nil {
return 0, err
}
endpoints.Dstaddr = (*RawSockaddr)(addrp)
endpoints.Dstaddrlen = uint32(addrlen)
}
err = connectx(fd, &endpoints, associd, flags, iov, &n, connid)
return
}
//sys connectx(fd int, endpoints *SaEndpoints, associd SaeAssocID, flags uint32, iov []Iovec, n *uintptr, connid *SaeConnID) (err error)
//sys sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) //sys sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error)
//sys shmat(id int, addr uintptr, flag int) (ret uintptr, err error) //sys shmat(id int, addr uintptr, flag int) (ret uintptr, err error)

View File

@ -11,6 +11,7 @@ package unix
int ioctl(int, unsigned long int, uintptr_t); int ioctl(int, unsigned long int, uintptr_t);
*/ */
import "C" import "C"
import "unsafe"
func ioctl(fd int, req uint, arg uintptr) (err error) { func ioctl(fd int, req uint, arg uintptr) (err error) {
r0, er := C.ioctl(C.int(fd), C.ulong(req), C.uintptr_t(arg)) r0, er := C.ioctl(C.int(fd), C.ulong(req), C.uintptr_t(arg))

Some files were not shown because too many files have changed in this diff Show More