diff --git a/main.go b/main.go index 3963fa2b4..308d83a4e 100644 --- a/main.go +++ b/main.go @@ -4,7 +4,6 @@ import ( "fmt" "log" "os" - "path/filepath" "runtime" "github.com/go-errors/errors" @@ -20,11 +19,6 @@ var ( buildSource = "unknown" ) -func projectPath(path string) string { - gopath := os.Getenv("GOPATH") - return filepath.FromSlash(gopath + "/src/github.com/jesseduffield/lazygit/" + path) -} - func main() { flaggy.DefaultParser.ShowVersionWithVersionFlag = false diff --git a/pkg/commands/branch_list_builder.go b/pkg/commands/branch_list_builder.go index cb4920585..26864d944 100644 --- a/pkg/commands/branch_list_builder.go +++ b/pkg/commands/branch_list_builder.go @@ -73,7 +73,7 @@ func (b *BranchListBuilder) obtainSafeBranches() []*Branch { if err != nil { panic(err) } - bIter.ForEach(func(b *plumbing.Reference) error { + _ = bIter.ForEach(func(b *plumbing.Reference) error { name := b.Name().Short() branches = append(branches, &Branch{Name: name}) return nil @@ -93,7 +93,7 @@ func (b *BranchListBuilder) appendNewBranches(finalBranches, newBranches, existi func sanitisedReflogName(reflogBranch *Branch, safeBranches []*Branch) string { for _, safeBranch := range safeBranches { - if strings.ToLower(safeBranch.Name) == strings.ToLower(reflogBranch.Name) { + if strings.EqualFold(safeBranch.Name, reflogBranch.Name) { return safeBranch.Name } } @@ -125,7 +125,7 @@ func (b *BranchListBuilder) Build() []*Branch { func branchIncluded(branchName string, branches []*Branch) bool { for _, existingBranch := range branches { - if strings.ToLower(existingBranch.Name) == strings.ToLower(branchName) { + if strings.EqualFold(existingBranch.Name, branchName) { return true } } diff --git a/pkg/commands/git_test.go b/pkg/commands/git_test.go index 779e31f68..99ab351fa 100644 --- a/pkg/commands/git_test.go +++ b/pkg/commands/git_test.go @@ -2130,7 +2130,7 @@ func TestGitCommandSkipEditorCommand(t *testing.T) { ) }) - cmd.RunSkipEditorCommand("true") + _ = cmd.RunSkipEditorCommand("true") } func TestFindDotGitDir(t *testing.T) { diff --git a/pkg/gui/app_status_manager.go b/pkg/gui/app_status_manager.go index 431486ee9..ed8f0c935 100644 --- a/pkg/gui/app_status_manager.go +++ b/pkg/gui/app_status_manager.go @@ -66,9 +66,7 @@ func (gui *Gui) WithWaitingStatus(name string, f func() error) error { if appStatus == "" { return } - if err := gui.renderString(gui.g, "appStatus", appStatus); err != nil { - gui.Log.Warn(err) - } + gui.renderString(gui.g, "appStatus", appStatus) } }() diff --git a/pkg/gui/branches_panel.go b/pkg/gui/branches_panel.go index 44cd9415b..caac8e218 100644 --- a/pkg/gui/branches_panel.go +++ b/pkg/gui/branches_panel.go @@ -40,9 +40,7 @@ func (gui *Gui) handleBranchSelect(g *gocui.Gui, v *gocui.View) error { return gui.newStringTask("main", gui.Tr.SLocalize("NoBranchesThisRepo")) } branch := gui.getSelectedBranch() - if err := gui.focusPoint(0, gui.State.Panels.Branches.SelectedLine, len(gui.State.Branches), v); err != nil { - return err - } + v.FocusPoint(0, gui.State.Panels.Branches.SelectedLine) if err := gui.RenderSelectedBranchUpstreamDifferences(); err != nil { return err } @@ -161,7 +159,7 @@ func (gui *Gui) handleForceCheckout(g *gocui.Gui, v *gocui.View) error { title := gui.Tr.SLocalize("ForceCheckoutBranch") return gui.createConfirmationPanel(g, v, true, title, message, func(g *gocui.Gui, v *gocui.View) error { if err := gui.GitCommand.Checkout(branch.Name, true); err != nil { - gui.createErrorPanel(g, err.Error()) + _ = gui.createErrorPanel(g, err.Error()) } return gui.refreshSidePanels(g) }, nil) @@ -205,10 +203,9 @@ func (gui *Gui) handleCheckoutRef(ref string) error { } func (gui *Gui) handleCheckoutByName(g *gocui.Gui, v *gocui.View) error { - gui.createPromptPanel(g, v, gui.Tr.SLocalize("BranchName")+":", "", func(g *gocui.Gui, v *gocui.View) error { + return gui.createPromptPanel(g, v, gui.Tr.SLocalize("BranchName")+":", "", func(g *gocui.Gui, v *gocui.View) error { return gui.handleCheckoutRef(gui.trimmedContent(v)) }) - return nil } func (gui *Gui) getCheckedOutBranch() *commands.Branch { @@ -230,24 +227,21 @@ func (gui *Gui) handleNewBranch(g *gocui.Gui, v *gocui.View) error { "branchName": branch.Name, }, ) - gui.createPromptPanel(g, v, message, "", func(g *gocui.Gui, v *gocui.View) error { + return gui.createPromptPanel(g, v, message, "", func(g *gocui.Gui, v *gocui.View) error { if err := gui.GitCommand.NewBranch(gui.trimmedContent(v), branch.Name); err != nil { return gui.createErrorPanel(g, err.Error()) } - gui.refreshSidePanels(g) + if err := gui.refreshSidePanels(g); err != nil { + return gui.createErrorPanel(g, err.Error()) + } return gui.handleBranchSelect(g, v) }) - return nil } func (gui *Gui) handleDeleteBranch(g *gocui.Gui, v *gocui.View) error { return gui.deleteBranch(g, v, false) } -func (gui *Gui) handleForceDeleteBranch(g *gocui.Gui, v *gocui.View) error { - return gui.deleteBranch(g, v, true) -} - func (gui *Gui) deleteBranch(g *gocui.Gui, v *gocui.View, force bool) error { selectedBranch := gui.getSelectedBranch() if selectedBranch == nil { @@ -400,7 +394,9 @@ func (gui *Gui) onBranchesTabClick(tabIndex int) error { func (gui *Gui) switchBranchesPanelContext(context string) error { branchesView := gui.getBranchesView() branchesView.Context = context - gui.onSearchEscape() + if err := gui.onSearchEscape(); err != nil { + return err + } contextTabIndexMap := map[string]int{ "local-branches": 0, diff --git a/pkg/gui/commit_files_panel.go b/pkg/gui/commit_files_panel.go index 5fa7a4683..cafc4f95b 100644 --- a/pkg/gui/commit_files_panel.go +++ b/pkg/gui/commit_files_panel.go @@ -36,16 +36,15 @@ func (gui *Gui) handleCommitFileSelect(g *gocui.Gui, v *gocui.View) error { commitFile := gui.getSelectedCommitFile(g) if commitFile == nil { - return gui.renderString(g, "commitFiles", gui.Tr.SLocalize("NoCommiteFiles")) + gui.renderString(g, "commitFiles", gui.Tr.SLocalize("NoCommiteFiles")) + return nil } if err := gui.refreshSecondaryPatchPanel(); err != nil { return err } - if err := gui.focusPoint(0, gui.State.Panels.CommitFiles.SelectedLine, len(gui.State.CommitFiles), v); err != nil { - return err - } + v.FocusPoint(0, gui.State.Panels.CommitFiles.SelectedLine) cmd := gui.OSCommand.ExecutableFromString( gui.GitCommand.ShowCommitFileCmdStr(commitFile.Sha, commitFile.Name, false), @@ -132,7 +131,8 @@ func (gui *Gui) handleToggleFileForPatch(g *gocui.Gui, v *gocui.View) error { commitFile := gui.getSelectedCommitFile(g) if commitFile == nil { - return gui.renderString(g, "commitFiles", gui.Tr.SLocalize("NoCommiteFiles")) + gui.renderString(g, "commitFiles", gui.Tr.SLocalize("NoCommiteFiles")) + return nil } toggleTheFile := func() error { @@ -187,7 +187,8 @@ func (gui *Gui) enterCommitFile(selectedLineIdx int) error { commitFile := gui.getSelectedCommitFile(gui.g) if commitFile == nil { - return gui.renderString(gui.g, "commitFiles", gui.Tr.SLocalize("NoCommiteFiles")) + gui.renderString(gui.g, "commitFiles", gui.Tr.SLocalize("NoCommiteFiles")) + return nil } enterTheFile := func(selectedLineIdx int) error { diff --git a/pkg/gui/commit_message_panel.go b/pkg/gui/commit_message_panel.go index 8d2d02524..ea65dc9cf 100644 --- a/pkg/gui/commit_message_panel.go +++ b/pkg/gui/commit_message_panel.go @@ -52,7 +52,7 @@ func (gui *Gui) handleCommitConfirm(g *gocui.Gui, v *gocui.View) error { } func (gui *Gui) handleCommitClose(g *gocui.Gui, v *gocui.View) error { - g.SetViewOnBottom("commitMessage") + _, _ = g.SetViewOnBottom("commitMessage") return gui.switchFocus(g, v, gui.getFilesView()) } @@ -68,7 +68,8 @@ func (gui *Gui) handleCommitFocused(g *gocui.Gui, v *gocui.View) error { "keyBindConfirm": "enter", }, ) - return gui.renderString(g, "options", message) + gui.renderString(g, "options", message) + return nil } func (gui *Gui) getBufferLength(view *gocui.View) string { diff --git a/pkg/gui/commits_panel.go b/pkg/gui/commits_panel.go index 0c901d085..8baa5c9e5 100644 --- a/pkg/gui/commits_panel.go +++ b/pkg/gui/commits_panel.go @@ -3,8 +3,6 @@ package gui import ( "strconv" - "github.com/go-errors/errors" - "github.com/jesseduffield/gocui" "github.com/jesseduffield/lazygit/pkg/commands" "github.com/jesseduffield/lazygit/pkg/gui/presentation" @@ -55,9 +53,7 @@ func (gui *Gui) handleCommitSelect(g *gocui.Gui, v *gocui.View) error { return gui.newStringTask("main", gui.Tr.SLocalize("NoCommitsThisBranch")) } - if err := gui.focusPoint(0, gui.State.Panels.Commits.SelectedLine, len(gui.State.Commits), v); err != nil { - return err - } + v.FocusPoint(0, gui.State.Panels.Commits.SelectedLine) // if specific diff mode is on, don't show diff if gui.State.Panels.Commits.SpecificDiffMode { @@ -77,7 +73,7 @@ func (gui *Gui) handleCommitSelect(g *gocui.Gui, v *gocui.View) error { func (gui *Gui) refreshCommits(g *gocui.Gui) error { g.Update(func(*gocui.Gui) error { // I think this is here for the sake of some kind of rebasing thing - gui.refreshStatus(g) + _ = gui.refreshStatus(g) if err := gui.refreshCommitsWithLimit(); err != nil { return err @@ -121,28 +117,6 @@ func (gui *Gui) refreshCommitsWithLimit() error { // specific functions -func (gui *Gui) handleResetToCommit(g *gocui.Gui, commitView *gocui.View) error { - return gui.createConfirmationPanel(g, commitView, true, gui.Tr.SLocalize("ResetToCommit"), gui.Tr.SLocalize("SureResetThisCommit"), func(g *gocui.Gui, v *gocui.View) error { - commit := gui.getSelectedCommit(g) - if commit == nil { - panic(errors.New(gui.Tr.SLocalize("NoCommitsThisBranch"))) - } - - if err := gui.GitCommand.ResetToCommit(commit.Sha, "mixed"); err != nil { - return gui.createErrorPanel(g, err.Error()) - } - if err := gui.refreshCommits(g); err != nil { - panic(err) - } - if err := gui.refreshFiles(); err != nil { - panic(err) - } - gui.resetOrigin(commitView) - gui.State.Panels.Commits.SelectedLine = 0 - return gui.handleCommitSelect(g, commitView) - }, nil) -} - func (gui *Gui) handleCommitSquashDown(g *gocui.Gui, v *gocui.View) error { if len(gui.State.Commits) <= 1 { return gui.createErrorPanel(g, gui.Tr.SLocalize("YouNoCommitsToSquash")) @@ -156,23 +130,12 @@ func (gui *Gui) handleCommitSquashDown(g *gocui.Gui, v *gocui.View) error { return nil } - gui.createConfirmationPanel(g, v, true, gui.Tr.SLocalize("Squash"), gui.Tr.SLocalize("SureSquashThisCommit"), func(g *gocui.Gui, v *gocui.View) error { + return gui.createConfirmationPanel(g, v, true, gui.Tr.SLocalize("Squash"), gui.Tr.SLocalize("SureSquashThisCommit"), func(g *gocui.Gui, v *gocui.View) error { return gui.WithWaitingStatus(gui.Tr.SLocalize("SquashingStatus"), func() error { err := gui.GitCommand.InteractiveRebase(gui.State.Commits, gui.State.Panels.Commits.SelectedLine, "squash") return gui.handleGenericMergeCommandResult(err) }) }, nil) - return nil -} - -// TODO: move to files panel -func (gui *Gui) anyUnStagedChanges(files []*commands.File) bool { - for _, file := range files { - if file.Tracked && file.HasUnstagedChanges { - return true - } - } - return false } func (gui *Gui) handleCommitFixup(g *gocui.Gui, v *gocui.View) error { @@ -188,13 +151,12 @@ func (gui *Gui) handleCommitFixup(g *gocui.Gui, v *gocui.View) error { return nil } - gui.createConfirmationPanel(g, v, true, gui.Tr.SLocalize("Fixup"), gui.Tr.SLocalize("SureFixupThisCommit"), func(g *gocui.Gui, v *gocui.View) error { + return gui.createConfirmationPanel(g, v, true, gui.Tr.SLocalize("Fixup"), gui.Tr.SLocalize("SureFixupThisCommit"), func(g *gocui.Gui, v *gocui.View) error { return gui.WithWaitingStatus(gui.Tr.SLocalize("FixingStatus"), func() error { err := gui.GitCommand.InteractiveRebase(gui.State.Commits, gui.State.Panels.Commits.SelectedLine, "fixup") return gui.handleGenericMergeCommandResult(err) }) }, nil) - return nil } func (gui *Gui) handleRenameCommit(g *gocui.Gui, v *gocui.View) error { @@ -264,21 +226,6 @@ func (gui *Gui) handleMidRebaseCommand(action string) (bool, error) { return true, gui.refreshCommits(gui.g) } -// handleMoveTodoDown like handleMidRebaseCommand but for moving an item up in the todo list -func (gui *Gui) handleMoveTodoDown(index int) (bool, error) { - selectedCommit := gui.State.Commits[index] - if selectedCommit.Status != "rebasing" { - return false, nil - } - if gui.State.Commits[index+1].Status != "rebasing" { - return true, nil - } - if err := gui.GitCommand.MoveTodoDown(index); err != nil { - return true, gui.createErrorPanel(gui.g, err.Error()) - } - return true, gui.refreshCommits(gui.g) -} - func (gui *Gui) handleCommitDelete(g *gocui.Gui, v *gocui.View) error { applied, err := gui.handleMidRebaseCommand("drop") if err != nil { @@ -504,7 +451,7 @@ func (gui *Gui) setDiffMode() { v.Title = gui.Tr.SLocalize("CommitsTitle") } - gui.refreshCommits(gui.g) + _ = gui.refreshCommits(gui.g) } func (gui *Gui) hasCommit(commits []*commands.Commit, target string) (int, bool) { @@ -623,7 +570,9 @@ func (gui *Gui) onCommitsTabClick(tabIndex int) error { func (gui *Gui) switchCommitsPanelContext(context string) error { commitsView := gui.getCommitsView() commitsView.Context = context - gui.onSearchEscape() + if err := gui.onSearchEscape(); err != nil { + return err + } contextTabIndexMap := map[string]int{ "branch-commits": 0, diff --git a/pkg/gui/confirmation_panel.go b/pkg/gui/confirmation_panel.go index efb5a34d8..755d13f96 100644 --- a/pkg/gui/confirmation_panel.go +++ b/pkg/gui/confirmation_panel.go @@ -122,9 +122,7 @@ func (gui *Gui) createPopupPanel(g *gocui.Gui, currentView *gocui.View, title, p }() } - if err := gui.renderString(g, "confirmation", prompt); err != nil { - return err - } + gui.renderString(g, "confirmation", prompt) return gui.setKeyBindings(g, handleConfirm, handleClose, returnFocusOnClose) }) return nil @@ -151,19 +149,13 @@ func (gui *Gui) setKeyBindings(g *gocui.Gui, handleConfirm, handleClose func(*go "keyBindConfirm": "enter", }, ) - if err := gui.renderString(g, "options", actions); err != nil { - return err - } + gui.renderString(g, "options", actions) if err := g.SetKeybinding("confirmation", nil, gocui.KeyEnter, gocui.ModNone, gui.wrappedConfirmationFunction(handleConfirm, returnFocusOnClose)); err != nil { return err } return g.SetKeybinding("confirmation", nil, gocui.KeyEsc, gocui.ModNone, gui.wrappedConfirmationFunction(handleClose, returnFocusOnClose)) } -func (gui *Gui) createMessagePanel(g *gocui.Gui, currentView *gocui.View, title, prompt string) error { - return gui.createPopupPanel(g, currentView, title, prompt, false, true, false, nil, nil) -} - // 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, diff --git a/pkg/gui/context.go b/pkg/gui/context.go index 53b884cc7..bf3ec2778 100644 --- a/pkg/gui/context.go +++ b/pkg/gui/context.go @@ -16,5 +16,4 @@ func (gui *Gui) changeMainViewsContext(context string) { } gui.State.MainContext = context - return } diff --git a/pkg/gui/credentials_panel.go b/pkg/gui/credentials_panel.go index ff35ce57c..aa2caecfa 100644 --- a/pkg/gui/credentials_panel.go +++ b/pkg/gui/credentials_panel.go @@ -82,7 +82,8 @@ func (gui *Gui) handleCredentialsViewFocused(g *gocui.Gui, v *gocui.View) error "keyBindConfirm": "enter", }, ) - return gui.renderString(g, "options", message) + gui.renderString(g, "options", message) + return nil } // HandleCredentialsPopup handles the views after executing a command that might ask for credentials diff --git a/pkg/gui/file_watching.go b/pkg/gui/file_watching.go index 3a9532116..47d426c87 100644 --- a/pkg/gui/file_watching.go +++ b/pkg/gui/file_watching.go @@ -23,11 +23,13 @@ type fileWatcher struct { } func NewFileWatcher(log *logrus.Entry) *fileWatcher { - watcher, err := fsnotify.NewWatcher() - log.Error(err) + // TODO: get this going again, and ensure we don't see any crashes from it return &fileWatcher{ Disabled: true, } + + watcher, err := fsnotify.NewWatcher() + if err != nil { log.Error(err) return &fileWatcher{ diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go index 6bd2c7076..0b761bff7 100644 --- a/pkg/gui/files_panel.go +++ b/pkg/gui/files_panel.go @@ -37,9 +37,7 @@ func (gui *Gui) selectFile(alreadySelected bool) error { return gui.newStringTask("main", gui.Tr.SLocalize("NoChangedFiles")) } - if err := gui.focusPoint(0, gui.State.Panels.Files.SelectedLine, len(gui.State.Files), gui.getFilesView()); err != nil { - return err - } + gui.getFilesView().FocusPoint(0, gui.State.Panels.Files.SelectedLine) if file.HasInlineMergeConflicts { gui.getMainView().Title = gui.Tr.SLocalize("MergeConflictsTitle") @@ -188,9 +186,12 @@ func (gui *Gui) handleFilePress(g *gocui.Gui, v *gocui.View) error { } if file.HasUnstagedChanges { - gui.GitCommand.StageFile(file.Name) + err = gui.GitCommand.StageFile(file.Name) } else { - gui.GitCommand.UnStageFile(file.Name, file.Tracked) + err = gui.GitCommand.UnStageFile(file.Name, file.Tracked) + } + if err != nil { + return gui.createErrorPanel(gui.g, err.Error()) } if err := gui.refreshFiles(); err != nil { @@ -268,9 +269,7 @@ func (gui *Gui) handleWIPCommitPress(g *gocui.Gui, filesView *gocui.View) error return gui.createErrorPanel(gui.g, gui.Tr.SLocalize("SkipHookPrefixNotConfigured")) } - if err := gui.renderString(g, "commitMessage", skipHookPreifx); err != nil { - return err - } + gui.renderString(g, "commitMessage", skipHookPreifx) if err := gui.getCommitMessageView().SetCursor(len(skipHookPreifx), 0); err != nil { return err } @@ -284,8 +283,14 @@ func (gui *Gui) handleCommitPress(g *gocui.Gui, filesView *gocui.View) error { } commitMessageView := gui.getCommitMessageView() g.Update(func(g *gocui.Gui) error { - g.SetViewOnTop("commitMessage") - gui.switchFocus(g, filesView, commitMessageView) + if _, err := g.SetViewOnTop("commitMessage"); err != nil { + return err + } + + if err := gui.switchFocus(g, filesView, commitMessageView); err != nil { + return err + } + gui.RenderCommitLength() return nil }) @@ -509,15 +514,6 @@ func (gui *Gui) handleSwitchToMerge(g *gocui.Gui, v *gocui.View) error { return gui.refreshMergePanel() } -func (gui *Gui) handleAbortMerge(g *gocui.Gui, v *gocui.View) error { - if err := gui.GitCommand.AbortMerge(); err != nil { - return gui.createErrorPanel(g, err.Error()) - } - gui.createMessagePanel(g, v, "", gui.Tr.SLocalize("MergeAborted")) - gui.refreshStatus(g) - return gui.refreshFiles() -} - func (gui *Gui) openFile(filename string) error { if err := gui.OSCommand.OpenFile(filename); err != nil { return gui.createErrorPanel(gui.g, err.Error()) diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index db3787f7c..4321cc11b 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -81,7 +81,7 @@ type Gui struct { GitCommand *commands.GitCommand OSCommand *commands.OSCommand SubProcess *exec.Cmd - State guiState + State *guiState Config config.AppConfigurer Tr *i18n.Localizer Errors SentinelErrors @@ -221,7 +221,7 @@ type guiState struct { // NewGui builds a new gui handler func NewGui(log *logrus.Entry, gitCommand *commands.GitCommand, oSCommand *commands.OSCommand, tr *i18n.Localizer, config config.AppConfigurer, updater *updates.Updater) (*Gui, error) { - initialState := guiState{ + initialState := &guiState{ Files: make([]*commands.File, 0), PreviousView: "files", Commits: make([]*commands.Commit, 0), @@ -381,7 +381,9 @@ func (gui *Gui) onFocusLost(v *gocui.View, newView *gocui.View) error { return nil } if v.IsSearching() && newView.Name() != "search" { - gui.onSearchEscape() + if err := gui.onSearchEscape(); err != nil { + return err + } } switch v.Name() { case "branches": @@ -518,7 +520,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { } _, _ = g.SetViewOnBottom("limit") - g.DeleteView("limit") + _ = g.DeleteView("limit") sidePanelWidthRatio := gui.Config.GetUserConfig().GetFloat64("gui.sidePanelWidth") @@ -538,7 +540,6 @@ func (gui *Gui) layout(g *gocui.Gui) error { } } - panelSplitX := width - 1 mainPanelLeft := leftSideWidth + 1 mainPanelRight := width - 1 secondaryPanelLeft := width - 1 @@ -547,7 +548,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { if gui.State.SplitMainPanel { if gui.State.ScreenMode == SCREEN_FULL { mainPanelLeft = 0 - panelSplitX = width/2 - 4 + panelSplitX := width/2 - 4 mainPanelRight = panelSplitX secondaryPanelLeft = panelSplitX + 1 } else if width < 220 { @@ -558,7 +559,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { units := 5 leftSideWidth = width / units mainPanelLeft = leftSideWidth + 1 - panelSplitX = (1 + ((units - 1) / 2)) * width / units + panelSplitX := (1 + ((units - 1) / 2)) * width / units mainPanelRight = panelSplitX secondaryPanelLeft = panelSplitX + 1 } @@ -693,7 +694,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { if err.Error() != "unknown view" { return err } - g.SetViewOnBottom("commitMessage") + _, _ = g.SetViewOnBottom("commitMessage") commitMessageView.Title = gui.Tr.SLocalize("CommitMessage") commitMessageView.FgColor = textColor commitMessageView.Editable = true @@ -765,9 +766,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { v.BgColor = gocui.ColorDefault v.FgColor = gocui.ColorGreen v.Frame = false - if err := gui.renderString(g, "information", information); err != nil { - return err - } + gui.renderString(g, "information", information) // doing this here because it'll only happen once if err := gui.onInitialViewsCreation(); err != nil { @@ -812,9 +811,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { continue } // check if the selected line is now out of view and if so refocus it - if err := gui.focusPoint(0, listView.selectedLine, listView.lineCount, listView.view); err != nil { - return err - } + listView.view.FocusPoint(0, listView.selectedLine) } mainViewWidth, mainViewHeight := gui.getMainView().Size() @@ -909,7 +906,10 @@ func (gui *Gui) fetch(g *gocui.Gui, v *gocui.View, canAskForCredentials bool) (u _ = gui.createConfirmationPanel(g, v, true, gui.Tr.SLocalize("Error"), coloredMessage, close, close) } - gui.refreshStatus(g) + if err := gui.refreshStatus(g); err != nil { + return unamePassOpend, err + } + return unamePassOpend, err } @@ -918,7 +918,7 @@ func (gui *Gui) renderGlobalOptions() error { fmt.Sprintf("%s/%s", gui.getKeyDisplay("universal.scrollUpMain"), gui.getKeyDisplay("universal.scrollDownMain")): gui.Tr.SLocalize("scroll"), fmt.Sprintf("%s %s %s %s", gui.getKeyDisplay("universal.prevBlock"), gui.getKeyDisplay("universal.nextBlock"), gui.getKeyDisplay("universal.prevItem"), gui.getKeyDisplay("universal.nextItem")): gui.Tr.SLocalize("navigate"), fmt.Sprintf("%s/%s", gui.getKeyDisplay("universal.return"), gui.getKeyDisplay("universal.quit")): gui.Tr.SLocalize("close"), - fmt.Sprintf("%s", gui.getKeyDisplay("universal.optionMenu")): gui.Tr.SLocalize("menu"), + gui.getKeyDisplay("universal.optionMenu"): gui.Tr.SLocalize("menu"), "1-5": gui.Tr.SLocalize("jump"), }) } diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index ee673839c..dfc2513fa 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -162,15 +162,15 @@ func (gui *Gui) getKeyDisplay(name string) string { func GetKeyDisplay(key interface{}) string { keyInt := 0 - switch key.(type) { + switch key := key.(type) { case rune: - keyInt = int(key.(rune)) + keyInt = int(key) case gocui.Key: - value, ok := keyMapReversed[key.(gocui.Key)] + value, ok := keyMapReversed[key] if ok { return value } - keyInt = int(key.(gocui.Key)) + keyInt = int(key) } return string(keyInt) diff --git a/pkg/gui/line_by_line_panel.go b/pkg/gui/line_by_line_panel.go index 4a0f1258d..0b5171cb1 100644 --- a/pkg/gui/line_by_line_panel.go +++ b/pkg/gui/line_by_line_panel.go @@ -88,7 +88,8 @@ func (gui *Gui) refreshLineByLinePanel(diff string, secondaryDiff string, second } gui.g.Update(func(*gocui.Gui) error { - return gui.setViewContent(gui.g, gui.getSecondaryView(), secondaryPatchParser.Render(-1, -1, nil)) + gui.setViewContent(gui.g, gui.getSecondaryView(), secondaryPatchParser.Render(-1, -1, nil)) + return nil }) return false, nil @@ -241,7 +242,8 @@ func (gui *Gui) refreshMainView() error { mainView.Wrap = false gui.g.Update(func(*gocui.Gui) error { - return gui.setViewContent(gui.g, gui.getMainView(), colorDiff) + gui.setViewContent(gui.g, gui.getMainView(), colorDiff) + return nil }) return nil diff --git a/pkg/gui/menu_panel.go b/pkg/gui/menu_panel.go index da511f6b2..8f7734c25 100644 --- a/pkg/gui/menu_panel.go +++ b/pkg/gui/menu_panel.go @@ -17,7 +17,8 @@ type menuItem struct { // list panel functions func (gui *Gui) handleMenuSelect(g *gocui.Gui, v *gocui.View) error { - return gui.focusPoint(0, gui.State.Panels.Menu.SelectedLine, gui.State.MenuItemCount, v) + v.FocusPoint(0, gui.State.Panels.Menu.SelectedLine) + return nil } // specific functions diff --git a/pkg/gui/merge_panel.go b/pkg/gui/merge_panel.go index 5e6272f38..89e83b2d9 100644 --- a/pkg/gui/merge_panel.go +++ b/pkg/gui/merge_panel.go @@ -151,13 +151,19 @@ func (gui *Gui) handlePopFileSnapshot(g *gocui.Gui, v *gocui.View) error { if err != nil { return err } - ioutil.WriteFile(gitFile.Name, []byte(prevContent), 0644) + if err := ioutil.WriteFile(gitFile.Name, []byte(prevContent), 0644); err != nil { + return err + } + return gui.refreshMergePanel() } func (gui *Gui) handlePickHunk(g *gocui.Gui, v *gocui.View) error { conflict := gui.State.Panels.Merging.Conflicts[gui.State.Panels.Merging.ConflictIndex] - gui.pushFileSnapshot(g) + if err := gui.pushFileSnapshot(g); err != nil { + return err + } + pick := "bottom" if gui.State.Panels.Merging.ConflictTop { pick = "top" @@ -178,7 +184,9 @@ func (gui *Gui) handlePickHunk(g *gocui.Gui, v *gocui.View) error { func (gui *Gui) handlePickBothHunks(g *gocui.Gui, v *gocui.View) error { conflict := gui.State.Panels.Merging.Conflicts[gui.State.Panels.Merging.ConflictIndex] - gui.pushFileSnapshot(g) + if err := gui.pushFileSnapshot(g); err != nil { + return err + } err := gui.resolveConflict(g, conflict, "both") if err != nil { panic(err) @@ -215,9 +223,7 @@ func (gui *Gui) refreshMergePanel() error { mainView := gui.getMainView() mainView.Wrap = false - if err := gui.setViewContent(gui.g, mainView, content); err != nil { - return err - } + gui.setViewContent(gui.g, mainView, content) gui.Log.Warn("scrolling to conflict") if err := gui.scrollToConflict(gui.g); err != nil { return err diff --git a/pkg/gui/patch_building_panel.go b/pkg/gui/patch_building_panel.go index f4e2eea1d..17f7ad2cb 100644 --- a/pkg/gui/patch_building_panel.go +++ b/pkg/gui/patch_building_panel.go @@ -18,7 +18,8 @@ func (gui *Gui) refreshPatchBuildingPanel(selectedLineIdx int) error { // get diff from commit file that's currently selected commitFile := gui.getSelectedCommitFile(gui.g) if commitFile == nil { - return gui.renderString(gui.g, "commitFiles", gui.Tr.SLocalize("NoCommiteFiles")) + gui.renderString(gui.g, "commitFiles", gui.Tr.SLocalize("NoCommiteFiles")) + return nil } diff, err := gui.GitCommand.ShowCommitFile(commitFile.Sha, commitFile.Name, true) @@ -57,7 +58,8 @@ func (gui *Gui) handleToggleSelectionForPatch(g *gocui.Gui, v *gocui.View) error // add range of lines to those set for the file commitFile := gui.getSelectedCommitFile(gui.g) if commitFile == nil { - return gui.renderString(gui.g, "commitFiles", gui.Tr.SLocalize("NoCommiteFiles")) + gui.renderString(gui.g, "commitFiles", gui.Tr.SLocalize("NoCommiteFiles")) + return nil } toggleFunc(commitFile.Name, state.FirstLineIdx, state.LastLineIdx) @@ -92,7 +94,8 @@ func (gui *Gui) refreshSecondaryPatchPanel() error { secondaryView.Wrap = false gui.g.Update(func(*gocui.Gui) error { - return gui.setViewContent(gui.g, gui.getSecondaryView(), gui.GitCommand.PatchManager.RenderAggregatedPatchColored(false)) + gui.setViewContent(gui.g, gui.getSecondaryView(), gui.GitCommand.PatchManager.RenderAggregatedPatchColored(false)) + return nil }) } else { gui.State.SplitMainPanel = false diff --git a/pkg/gui/rebase_options_panel.go b/pkg/gui/rebase_options_panel.go index 2187cef58..a4ba8e35a 100644 --- a/pkg/gui/rebase_options_panel.go +++ b/pkg/gui/rebase_options_panel.go @@ -17,11 +17,11 @@ func (gui *Gui) handleCreateRebaseOptionsMenu(g *gocui.Gui, v *gocui.View) error menuItems := make([]*menuItem, len(options)) for i, option := range options { // note to self. Never, EVER, close over loop variables in a function - innerOption := option + option := option menuItems[i] = &menuItem{ - displayString: innerOption, + displayString: option, onPress: func() error { - return gui.genericMergeCommand(innerOption) + return gui.genericMergeCommand(option) }, } } diff --git a/pkg/gui/reflog_panel.go b/pkg/gui/reflog_panel.go index 1837e2f7d..1d7151201 100644 --- a/pkg/gui/reflog_panel.go +++ b/pkg/gui/reflog_panel.go @@ -34,9 +34,7 @@ func (gui *Gui) handleReflogCommitSelect(g *gocui.Gui, v *gocui.View) error { if commit == nil { return gui.newStringTask("main", "No reflog history") } - if err := gui.focusPoint(0, gui.State.Panels.ReflogCommits.SelectedLine, len(gui.State.ReflogCommits), v); err != nil { - return err - } + v.FocusPoint(0, gui.State.Panels.ReflogCommits.SelectedLine) cmd := gui.OSCommand.ExecutableFromString( gui.GitCommand.ShowCmdStr(commit.Sha), diff --git a/pkg/gui/remote_branches_panel.go b/pkg/gui/remote_branches_panel.go index 33cd0075e..48aa62b5b 100644 --- a/pkg/gui/remote_branches_panel.go +++ b/pkg/gui/remote_branches_panel.go @@ -38,10 +38,7 @@ func (gui *Gui) handleRemoteBranchSelect(g *gocui.Gui, v *gocui.View) error { return gui.newStringTask("main", "No branches for this remote") } - gui.focusPoint(0, gui.State.Panels.Menu.SelectedLine, gui.State.MenuItemCount, v) - if err := gui.focusPoint(0, gui.State.Panels.RemoteBranches.SelectedLine, len(gui.State.RemoteBranches), v); err != nil { - return err - } + v.FocusPoint(0, gui.State.Panels.RemoteBranches.SelectedLine) branchName := fmt.Sprintf("%s/%s", remote.Name, remoteBranch.Name) diff --git a/pkg/gui/remotes_panel.go b/pkg/gui/remotes_panel.go index a5bbfeff7..149084869 100644 --- a/pkg/gui/remotes_panel.go +++ b/pkg/gui/remotes_panel.go @@ -39,9 +39,7 @@ func (gui *Gui) handleRemoteSelect(g *gocui.Gui, v *gocui.View) error { if remote == nil { return gui.newStringTask("main", "No remotes") } - if err := gui.focusPoint(0, gui.State.Panels.Remotes.SelectedLine, len(gui.State.Remotes), v); err != nil { - return err - } + v.FocusPoint(0, gui.State.Panels.Remotes.SelectedLine) return gui.newStringTask("main", fmt.Sprintf("%s\nUrls:\n%s", utils.ColoredString(remote.Name, color.FgGreen), strings.Join(remote.Urls, "\n"))) } diff --git a/pkg/gui/reset_menu_panel.go b/pkg/gui/reset_menu_panel.go index 44c33e035..5e9cc0068 100644 --- a/pkg/gui/reset_menu_panel.go +++ b/pkg/gui/reset_menu_panel.go @@ -23,7 +23,10 @@ func (gui *Gui) createResetMenu(ref string) error { return gui.createErrorPanel(gui.g, err.Error()) } - gui.switchCommitsPanelContext("branch-commits") + if err := gui.switchCommitsPanelContext("branch-commits"); err != nil { + return err + } + gui.State.Panels.Commits.SelectedLine = 0 gui.State.Panels.ReflogCommits.SelectedLine = 0 diff --git a/pkg/gui/searching.go b/pkg/gui/searching.go index a4fd191b0..228ae35be 100644 --- a/pkg/gui/searching.go +++ b/pkg/gui/searching.go @@ -12,14 +12,19 @@ func (gui *Gui) handleOpenSearch(g *gocui.Gui, v *gocui.View) error { gui.State.Searching.isSearching = true gui.State.Searching.view = v gui.renderString(gui.g, "search", "") - gui.switchFocus(gui.g, v, gui.getSearchView()) + if err := gui.switchFocus(gui.g, v, gui.getSearchView()); err != nil { + return err + } return nil } func (gui *Gui) handleSearch(g *gocui.Gui, v *gocui.View) error { gui.State.Searching.searchString = gui.getSearchView().Buffer() - gui.switchFocus(gui.g, nil, gui.State.Searching.view) + if err := gui.switchFocus(gui.g, nil, gui.State.Searching.view); err != nil { + return err + } + if err := gui.State.Searching.view.Search(gui.State.Searching.searchString); err != nil { return err } @@ -85,7 +90,5 @@ func (gui *Gui) handleSearchEscape(g *gocui.Gui, v *gocui.View) error { return err } - gui.onSearchEscape() - - return nil + return gui.onSearchEscape() } diff --git a/pkg/gui/staging_panel.go b/pkg/gui/staging_panel.go index 3de1d9b32..08a39cb90 100644 --- a/pkg/gui/staging_panel.go +++ b/pkg/gui/staging_panel.go @@ -159,11 +159,3 @@ func (gui *Gui) applySelection(reverse bool) error { } return nil } - -func (gui *Gui) handleMouseDownSecondaryWhileStaging(g *gocui.Gui, v *gocui.View) error { - state := gui.State.Panels.LineByLine - - state.SecondaryFocused = !state.SecondaryFocused - - return gui.refreshStagingPanel(false, -1) -} diff --git a/pkg/gui/stash_panel.go b/pkg/gui/stash_panel.go index 92d84df9f..8a8994fdb 100644 --- a/pkg/gui/stash_panel.go +++ b/pkg/gui/stash_panel.go @@ -34,9 +34,7 @@ func (gui *Gui) handleStashEntrySelect(g *gocui.Gui, v *gocui.View) error { if stashEntry == nil { return gui.newStringTask("main", gui.Tr.SLocalize("NoStashEntries")) } - if err := gui.focusPoint(0, gui.State.Panels.Stash.SelectedLine, len(gui.State.StashEntries), v); err != nil { - return err - } + v.FocusPoint(0, gui.State.Panels.Stash.SelectedLine) cmd := gui.OSCommand.ExecutableFromString( gui.GitCommand.ShowStashEntryCmdStr(stashEntry.Index), @@ -97,9 +95,11 @@ func (gui *Gui) stashDo(g *gocui.Gui, v *gocui.View, method string) error { return gui.createErrorPanel(g, errorMessage) } if err := gui.GitCommand.StashDo(stashEntry.Index, method); err != nil { - gui.createErrorPanel(g, err.Error()) + return gui.createErrorPanel(g, err.Error()) + } + if err := gui.refreshStashEntries(g); err != nil { + return err } - gui.refreshStashEntries(g) return gui.refreshFiles() } @@ -109,9 +109,11 @@ func (gui *Gui) handleStashSave(stashFunc func(message string) error) error { } return gui.createPromptPanel(gui.g, gui.getFilesView(), gui.Tr.SLocalize("StashChanges"), "", func(g *gocui.Gui, v *gocui.View) error { if err := stashFunc(gui.trimmedContent(v)); err != nil { - gui.createErrorPanel(g, err.Error()) + return gui.createErrorPanel(g, err.Error()) + } + if err := gui.refreshStashEntries(g); err != nil { + return err } - gui.refreshStashEntries(g) return gui.refreshFiles() }) } diff --git a/pkg/gui/tags_panel.go b/pkg/gui/tags_panel.go index daa53b40e..719f0f848 100644 --- a/pkg/gui/tags_panel.go +++ b/pkg/gui/tags_panel.go @@ -34,9 +34,7 @@ func (gui *Gui) handleTagSelect(g *gocui.Gui, v *gocui.View) error { if tag == nil { return gui.newStringTask("main", "No tags") } - if err := gui.focusPoint(0, gui.State.Panels.Tags.SelectedLine, len(gui.State.Tags), v); err != nil { - return err - } + v.FocusPoint(0, gui.State.Panels.Tags.SelectedLine) cmd := gui.OSCommand.ExecutableFromString( gui.GitCommand.GetBranchGraphCmdStr(tag.Name), @@ -57,7 +55,7 @@ func (gui *Gui) refreshTags() error { gui.State.Tags = tags if gui.getBranchesView().Context == "tags" { - gui.renderTagsWithSelection() + return gui.renderTagsWithSelection() } return nil diff --git a/pkg/gui/tasks_adapter.go b/pkg/gui/tasks_adapter.go index 198c11e34..f9ca49fff 100644 --- a/pkg/gui/tasks_adapter.go +++ b/pkg/gui/tasks_adapter.go @@ -59,7 +59,8 @@ func (gui *Gui) newStringTask(viewName string, str string) error { manager := gui.getManager(view) f := func(stop chan struct{}) error { - return gui.renderString(gui.g, viewName, str) + gui.renderString(gui.g, viewName, str) + return nil } if err := manager.NewTask(f); err != nil { diff --git a/pkg/gui/updates.go b/pkg/gui/updates.go index 3ed06f7e4..32280b117 100644 --- a/pkg/gui/updates.go +++ b/pkg/gui/updates.go @@ -47,9 +47,7 @@ func (gui *Gui) startUpdating(newVersion string) { func (gui *Gui) onUpdateFinish(err error) error { gui.State.Updating = false gui.statusManager.removeStatus("updating") - if err := gui.renderString(gui.g, "appStatus", ""); err != nil { - return err - } + gui.renderString(gui.g, "appStatus", "") if err != nil { return gui.createErrorPanel(gui.g, "Update failed: "+err.Error()) } diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go index a41b481b9..4d9fbb36e 100644 --- a/pkg/gui/view_helpers.go +++ b/pkg/gui/view_helpers.go @@ -218,25 +218,18 @@ func (gui *Gui) resetOrigin(v *gocui.View) error { return v.SetOrigin(0, 0) } -// if the cursor down past the last item, move it to the last line -func (gui *Gui) focusPoint(cx int, cy int, lineCount int, v *gocui.View) error { - v.FocusPoint(cx, cy) - return nil -} - func (gui *Gui) cleanString(s string) string { output := string(bom.Clean([]byte(s))) return utils.NormalizeLinefeeds(output) } -func (gui *Gui) setViewContent(g *gocui.Gui, v *gocui.View, s string) error { +func (gui *Gui) setViewContent(g *gocui.Gui, v *gocui.View, s string) { v.Clear() fmt.Fprint(v, gui.cleanString(s)) - return nil } // renderString resets the origin of a view and sets its content -func (gui *Gui) renderString(g *gocui.Gui, viewName, s string) error { +func (gui *Gui) renderString(g *gocui.Gui, viewName, s string) { g.Update(func(*gocui.Gui) error { v, err := g.View(viewName) if err != nil { @@ -248,9 +241,9 @@ func (gui *Gui) renderString(g *gocui.Gui, viewName, s string) error { if err := v.SetCursor(0, 0); err != nil { return err } - return gui.setViewContent(gui.g, v, s) + gui.setViewContent(gui.g, v, s) + return nil }) - return nil } func (gui *Gui) optionsMapToString(optionsMap map[string]string) string { @@ -263,7 +256,8 @@ func (gui *Gui) optionsMapToString(optionsMap map[string]string) string { } func (gui *Gui) renderOptionsMap(optionsMap map[string]string) error { - return gui.renderString(gui.g, "options", gui.optionsMapToString(optionsMap)) + gui.renderString(gui.g, "options", gui.optionsMapToString(optionsMap)) + return nil } // TODO: refactor properly @@ -349,22 +343,6 @@ func (gui *Gui) resizePopupPanel(g *gocui.Gui, v *gocui.View) error { return err } -// generalFocusLine takes a lineNumber to focus, and a bottomLine to ensure we can see -func (gui *Gui) generalFocusLine(lineNumber int, bottomLine int, v *gocui.View) error { - _, height := v.Size() - overScroll := bottomLine - height + 1 - if overScroll < 0 { - overScroll = 0 - } - if err := v.SetOrigin(0, overScroll); err != nil { - return err - } - if err := v.SetCursor(0, lineNumber-overScroll); err != nil { - return err - } - return nil -} - func (gui *Gui) changeSelectedLine(line *int, total int, change int) { // TODO: find out why we're doing this if *line == -1 { @@ -409,11 +387,6 @@ func (gui *Gui) renderPanelOptions() error { return gui.renderGlobalOptions() } -func (gui *Gui) handleFocusView(g *gocui.Gui, v *gocui.View) error { - _, err := gui.g.SetCurrentView(v.Name()) - return err -} - func (gui *Gui) isPopupPanel(viewName string) bool { return viewName == "commitMessage" || viewName == "credentials" || viewName == "confirmation" || viewName == "menu" } diff --git a/pkg/tasks/tasks.go b/pkg/tasks/tasks.go index 853c45fe9..388269de0 100644 --- a/pkg/tasks/tasks.go +++ b/pkg/tasks/tasks.go @@ -23,7 +23,6 @@ type Task struct { type ViewBufferManager struct { writer io.Writer - waitingTask *Task currentTask *Task waitingMutex sync.Mutex taskIDMutex sync.Mutex @@ -79,7 +78,7 @@ func (m *ViewBufferManager) NewCmdTask(r io.Reader, cmd *exec.Cmd, linesToRead i loadingMutex.Lock() if !loaded { m.beforeStart() - m.writer.Write([]byte("loading...")) + _, _ = m.writer.Write([]byte("loading...")) m.refreshView() } loadingMutex.Unlock() @@ -111,7 +110,7 @@ func (m *ViewBufferManager) NewCmdTask(r io.Reader, cmd *exec.Cmd, linesToRead i m.refreshView() break outer } - m.writer.Write(append(scanner.Bytes(), []byte("\n")...)) + _, _ = m.writer.Write(append(scanner.Bytes(), []byte("\n")...)) } m.refreshView() case <-stop: @@ -223,5 +222,4 @@ func (t *Task) Stop() { <-t.notifyStopped t.Log.Info("received notifystopped message") t.stopped = true - return } diff --git a/pkg/utils/utils_test.go b/pkg/utils/utils_test.go index 82df3e94a..0e11a028c 100644 --- a/pkg/utils/utils_test.go +++ b/pkg/utils/utils_test.go @@ -196,8 +196,6 @@ func TestDisplayArraysAligned(t *testing.T) { } } -type myStruct struct{} - // TestGetPaddedDisplayStrings is a function. func TestGetPaddedDisplayStrings(t *testing.T) { type scenario struct { diff --git a/scripts/generate_cheatsheet.go b/scripts/generate_cheatsheet.go index c5afdf5e9..1cfa3aab6 100644 --- a/scripts/generate_cheatsheet.go +++ b/scripts/generate_cheatsheet.go @@ -83,9 +83,7 @@ func getBindingSections(mApp *app.App) []*bindingSection { if len(binding.Contexts) == 0 { contexts = append(contexts, "") } else { - for _, context := range binding.Contexts { - contexts = append(contexts, context) - } + contexts = append(contexts, binding.Contexts...) } for _, context := range contexts {