summaryrefslogtreecommitdiffstats
path: root/pkg/gui
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2018-12-16 17:05:34 +1100
committerJesse Duffield <jessedduffield@gmail.com>2018-12-16 17:28:04 +1100
commit4886b8350e0af56fd1d634c99e0f7502f23b9289 (patch)
tree860e1bb69071d918dcbd0e9083d893eef56b4142 /pkg/gui
parentaf26b5f3e0779fb218bb77506fbcd7da964942fe (diff)
always hide rather than delete the credentials view, and don't log on error in case there is a user password in the error
Diffstat (limited to 'pkg/gui')
-rw-r--r--pkg/gui/commit_message_panel.go8
-rw-r--r--pkg/gui/confirmation_panel.go34
-rw-r--r--pkg/gui/view_helpers.go7
3 files changed, 28 insertions, 21 deletions
diff --git a/pkg/gui/commit_message_panel.go b/pkg/gui/commit_message_panel.go
index 8f14cf6e1..71f18e1f0 100644
--- a/pkg/gui/commit_message_panel.go
+++ b/pkg/gui/commit_message_panel.go
@@ -65,11 +65,7 @@ func (gui *Gui) waitForPassUname(g *gocui.Gui, currentView *gocui.View, passOrUn
credentialsView.Mask = '*'
}
g.Update(func(g *gocui.Gui) error {
- _, err := g.SetViewOnTop("credentials")
- if err != nil {
- return err
- }
- err = gui.switchFocus(g, currentView, credentialsView)
+ err := gui.switchFocus(g, currentView, credentialsView)
if err != nil {
return err
}
@@ -124,7 +120,7 @@ func (gui *Gui) handlePushClose(g *gocui.Gui, v *gocui.View) error {
return gui.switchFocus(g, nil, gui.getFilesView(g))
}
-func (gui *Gui) handlePushFocused(g *gocui.Gui, v *gocui.View) error {
+func (gui *Gui) handleCredentialsViewFocused(g *gocui.Gui, v *gocui.View) error {
if _, err := g.SetViewOnTop("credentials"); err != nil {
return err
}
diff --git a/pkg/gui/confirmation_panel.go b/pkg/gui/confirmation_panel.go
index 99455a30c..cdb01466a 100644
--- a/pkg/gui/confirmation_panel.go
+++ b/pkg/gui/confirmation_panel.go
@@ -89,6 +89,7 @@ func (gui *Gui) onNewPopupPanel() {
_, _ = gui.g.SetViewOnBottom("credentials")
}
+// it is very important that within this function we never include the original prompt in any error messages, because it may contain e.g. a user password
func (gui *Gui) createConfirmationPanel(g *gocui.Gui, currentView *gocui.View, title, prompt string, handleConfirm, handleClose func(*gocui.Gui, *gocui.View) error) error {
gui.onNewPopupPanel()
g.Update(func(g *gocui.Gui) error {
@@ -138,18 +139,27 @@ func (gui *Gui) createMessagePanel(g *gocui.Gui, currentView *gocui.View, title,
return gui.createConfirmationPanel(g, currentView, title, prompt, nil, nil)
}
-func (gui *Gui) createErrorPanel(g *gocui.Gui, message string) error {
- go func() {
- // when reporting is switched on this log call sometimes introduces
- // a delay on the error panel popping up. Here I'm adding a second wait
- // so that the error is logged while the user is reading the error message
- time.Sleep(time.Second)
- gui.Log.Error(message)
- }()
-
- // gui.Log.WithField("staging", "staging").Info("creating confirmation panel")
- currentView := g.CurrentView()
+// createSpecificErrorPanel allows you to create an error popup, specifying the
+// view to be focused when the user closes the popup, and a boolean specifying
+// whether we will log the error. If the message may include a user password,
+// this function is to be used over the more generic createErrorPanel, with
+// willLog set to false
+func (gui *Gui) createSpecificErrorPanel(message string, nextView *gocui.View, willLog bool) error {
+ if willLog {
+ go func() {
+ // when reporting is switched on this log call sometimes introduces
+ // a delay on the error panel popping up. Here I'm adding a second wait
+ // so that the error is logged while the user is reading the error message
+ time.Sleep(time.Second)
+ gui.Log.Error(message)
+ }()
+ }
+
colorFunction := color.New(color.FgRed).SprintFunc()
coloredMessage := colorFunction(strings.TrimSpace(message))
- return gui.createConfirmationPanel(g, currentView, gui.Tr.SLocalize("Error"), coloredMessage, nil, nil)
+ return gui.createConfirmationPanel(gui.g, nextView, gui.Tr.SLocalize("Error"), coloredMessage, nil, nil)
+}
+
+func (gui *Gui) createErrorPanel(g *gocui.Gui, message string) error {
+ return gui.createSpecificErrorPanel(message, g.CurrentView(), true)
}
diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go
index 883773926..4befe1e0d 100644
--- a/pkg/gui/view_helpers.go
+++ b/pkg/gui/view_helpers.go
@@ -102,7 +102,7 @@ func (gui *Gui) newLineFocused(g *gocui.Gui, v *gocui.View) error {
case "commitMessage":
return gui.handleCommitFocused(g, v)
case "credentials":
- return gui.handlePushFocused(g, v)
+ return gui.handleCredentialsViewFocused(g, v)
case "main":
// TODO: pull this out into a 'view focused' function
gui.refreshMergePanel(g)
@@ -316,14 +316,15 @@ func (gui *Gui) resizeCurrentPopupPanel(g *gocui.Gui) error {
// HandleCredentialsPopup handles the views after executing a command that might ask for credentials
func (gui *Gui) HandleCredentialsPopup(g *gocui.Gui, popupOpened bool, cmdErr error) {
if popupOpened {
- _ = g.DeleteView("credentials")
+ _, _ = gui.g.SetViewOnBottom("credentials")
}
if cmdErr != nil {
errMessage := cmdErr.Error()
if strings.Contains(errMessage, "exit status 128") {
errMessage = gui.Tr.SLocalize("PassUnameWrong")
}
- _ = gui.createErrorPanel(g, errMessage)
+ // we are not logging this error because it may contain a password
+ _ = gui.createSpecificErrorPanel(errMessage, gui.getFilesView(gui.g), false)
} else {
_ = gui.closeConfirmationPrompt(g)
_ = gui.refreshSidePanels(g)