From 9b32e99eb80d3912ecfef3303418e6dce8219a75 Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Thu, 9 Jan 2020 21:34:17 +1100 Subject: add reflog tab in commits panel --- pkg/gui/branches_panel.go | 6 ++- pkg/gui/commits_panel.go | 80 +++++++++++++++++++++++++++++++++------- pkg/gui/gui.go | 12 +++++- pkg/gui/keybindings.go | 48 ++++++++++++++++++++++-- pkg/gui/list_view.go | 12 ++++++ pkg/gui/reflog_panel.go | 76 ++++++++++++++++++++++++++++++++++++++ pkg/gui/remote_branches_panel.go | 6 ++- pkg/gui/remotes_panel.go | 6 ++- pkg/gui/tags_panel.go | 6 ++- 9 files changed, 226 insertions(+), 26 deletions(-) create mode 100644 pkg/gui/reflog_panel.go (limited to 'pkg/gui') diff --git a/pkg/gui/branches_panel.go b/pkg/gui/branches_panel.go index 985be932e..1bf408026 100644 --- a/pkg/gui/branches_panel.go +++ b/pkg/gui/branches_panel.go @@ -111,8 +111,10 @@ func (gui *Gui) renderLocalBranchesWithSelection() error { if err := gui.renderListPanel(branchesView, gui.State.Branches); err != nil { return err } - if err := gui.handleBranchSelect(gui.g, branchesView); err != nil { - return err + if gui.g.CurrentView() == branchesView && branchesView.Context == "local-branches" { + if err := gui.handleBranchSelect(gui.g, branchesView); err != nil { + return err + } } return nil diff --git a/pkg/gui/commits_panel.go b/pkg/gui/commits_panel.go index 3f82584c1..4144d9985 100644 --- a/pkg/gui/commits_panel.go +++ b/pkg/gui/commits_panel.go @@ -74,21 +74,18 @@ func (gui *Gui) refreshCommits(g *gocui.Gui) error { } gui.State.Commits = commits - gui.refreshSelectedLine(&gui.State.Panels.Commits.SelectedLine, len(gui.State.Commits)) - - isFocused := gui.g.CurrentView().Name() == "commits" - list, err := utils.RenderList(gui.State.Commits, isFocused) - if err != nil { - return err - } - - v := gui.getCommitsView() - v.Clear() - fmt.Fprint(v, list) + // doing this async because it shouldn't hold anything up + go func() { + if err := gui.refreshReflogCommits(); err != nil { + _ = gui.createErrorPanel(gui.g, err.Error()) + } + }() gui.refreshStatus(g) - if g.CurrentView() == v { - gui.handleCommitSelect(g, v) + if gui.getCommitsView().Context == "branch-commits" { + if err := gui.renderBranchCommitsWithSelection(); err != nil { + return err + } } if g.CurrentView() == gui.getCommitFilesView() || (g.CurrentView() == gui.getMainView() || gui.State.MainContext == "patch-building") { return gui.refreshCommitFilesView() @@ -622,3 +619,60 @@ func (gui *Gui) handleCheckoutCommit(g *gocui.Gui, v *gocui.View) error { return gui.handleCheckoutRef(commit.Sha) }, nil) } + +func (gui *Gui) renderBranchCommitsWithSelection() error { + commitsView := gui.getCommitsView() + + gui.refreshSelectedLine(&gui.State.Panels.Commits.SelectedLine, len(gui.State.Commits)) + if err := gui.renderListPanel(commitsView, gui.State.Commits); err != nil { + return err + } + if gui.g.CurrentView() == commitsView && commitsView.Context == "branch-commits" { + if err := gui.handleCommitSelect(gui.g, commitsView); err != nil { + return err + } + } + + return nil +} + +func (gui *Gui) onCommitsTabClick(tabIndex int) error { + contexts := []string{"branch-commits", "reflog-commits"} + commitsView := gui.getCommitsView() + commitsView.TabIndex = tabIndex + + return gui.switchCommitsPanelContext(contexts[tabIndex]) +} + +func (gui *Gui) switchCommitsPanelContext(context string) error { + commitsView := gui.getCommitsView() + commitsView.Context = context + + contextTabIndexMap := map[string]int{ + "branch-commits": 0, + "reflog-commits": 1, + } + + commitsView.TabIndex = contextTabIndexMap[context] + + switch context { + case "branch-commits": + return gui.renderBranchCommitsWithSelection() + case "reflog-commits": + return gui.renderReflogCommitsWithSelection() + } + + return nil +} + +func (gui *Gui) handleNextCommitsTab(g *gocui.Gui, v *gocui.View) error { + return gui.onCommitsTabClick( + utils.ModuloWithWrap(v.TabIndex+1, len(v.Tabs)), + ) +} + +func (gui *Gui) handlePrevCommitsTab(g *gocui.Gui, v *gocui.View) error { + return gui.onCommitsTabClick( + utils.ModuloWithWrap(v.TabIndex-1, len(v.Tabs)), + ) +} diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index 530c00383..9bfeae6c4 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -130,6 +130,10 @@ type commitPanelState struct { SpecificDiffMode bool } +type reflogCommitPanelState struct { + SelectedLine int +} + type stashPanelState struct { SelectedLine int } @@ -155,6 +159,7 @@ type panelStates struct { RemoteBranches *remoteBranchesState Tags *tagsPanelState Commits *commitPanelState + ReflogCommits *reflogCommitPanelState Stash *stashPanelState Menu *menuPanelState LineByLine *lineByLinePanelState @@ -169,6 +174,7 @@ type guiState struct { Commits []*commands.Commit StashEntries []*commands.StashEntry CommitFiles []*commands.CommitFile + ReflogCommits []*commands.Commit DiffEntries []*commands.Commit Remotes []*commands.Remote RemoteBranches []*commands.RemoteBranch @@ -207,6 +213,7 @@ func NewGui(log *logrus.Entry, gitCommand *commands.GitCommand, oSCommand *comma RemoteBranches: &remoteBranchesState{SelectedLine: -1}, Tags: &tagsPanelState{SelectedLine: -1}, Commits: &commitPanelState{SelectedLine: -1}, + ReflogCommits: &reflogCommitPanelState{SelectedLine: 0}, // TODO: might need to make -1 CommitFiles: &commitFilesPanelState{SelectedLine: -1}, Stash: &stashPanelState{SelectedLine: -1}, Menu: &menuPanelState{SelectedLine: 0}, @@ -523,6 +530,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { return err } commitsView.Title = gui.Tr.SLocalize("CommitsTitle") + commitsView.Tabs = []string{"Commits", "Reflog"} commitsView.FgColor = textColor } @@ -625,7 +633,8 @@ func (gui *Gui) layout(g *gocui.Gui) error { {view: branchesView, context: "local-branches", selectedLine: gui.State.Panels.Branches.SelectedLine, lineCount: len(gui.State.Branches)}, {view: branchesView, context: "remotes", selectedLine: gui.State.Panels.Remotes.SelectedLine, lineCount: len(gui.State.Remotes)}, {view: branchesView, context: "remote-branches", selectedLine: gui.State.Panels.RemoteBranches.SelectedLine, lineCount: len(gui.State.Remotes)}, - {view: commitsView, context: "", selectedLine: gui.State.Panels.Commits.SelectedLine, lineCount: len(gui.State.Commits)}, + {view: commitsView, context: "branch-commits", selectedLine: gui.State.Panels.Commits.SelectedLine, lineCount: len(gui.State.Commits)}, + {view: commitsView, context: "reflog-commits", selectedLine: gui.State.Panels.ReflogCommits.SelectedLine, lineCount: len(gui.State.ReflogCommits)}, {view: stashView, context: "", selectedLine: gui.State.Panels.Stash.SelectedLine, lineCount: len(gui.State.StashEntries)}, } @@ -657,6 +666,7 @@ func (gui *Gui) onInitialViewsCreation() error { } gui.getBranchesView().Context = "local-branches" + gui.getCommitsView().Context = "branch-commits" return gui.loadNewRepo() } diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index befef7d7c..932b01f03 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -571,13 +571,13 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "branches", - Key: gui.getKey("universal.nextBranchTab"), + Key: gui.getKey("universal.nextTab"), Modifier: gocui.ModNone, Handler: gui.handleNextBranchesTab, }, { ViewName: "branches", - Key: gui.getKey("universal.prevBranchTab"), + Key: gui.getKey("universal.prevTab"), Modifier: gocui.ModNone, Handler: gui.handlePrevBranchesTab, }, @@ -597,8 +597,21 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { Handler: gui.handleFetchRemote, Description: gui.Tr.SLocalize("fetchRemote"), }, + { + ViewName: "commits", + Key: gui.getKey("universal.nextTab"), + Modifier: gocui.ModNone, + Handler: gui.handleNextCommitsTab, + }, + { + ViewName: "commits", + Key: gui.getKey("universal.prevTab"), + Modifier: gocui.ModNone, + Handler: gui.handlePrevCommitsTab, + }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.squashDown"), Modifier: gocui.ModNone, Handler: gui.handleCommitSquashDown, @@ -606,6 +619,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.renameCommit"), Modifier: gocui.ModNone, Handler: gui.handleRenameCommit, @@ -613,6 +627,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.renameCommitWithEditor"), Modifier: gocui.ModNone, Handler: gui.handleRenameCommitEditor, @@ -620,6 +635,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.viewResetOptions"), Modifier: gocui.ModNone, Handler: gui.handleCreateCommitResetMenu, @@ -627,6 +643,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.markCommitAsFixup"), Modifier: gocui.ModNone, Handler: gui.handleCommitFixup, @@ -634,6 +651,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.createFixupCommit"), Modifier: gocui.ModNone, Handler: gui.handleCreateFixupCommit, @@ -641,6 +659,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.squashAboveCommits"), Modifier: gocui.ModNone, Handler: gui.handleSquashAllAboveFixupCommits, @@ -648,6 +667,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("universal.remove"), Modifier: gocui.ModNone, Handler: gui.handleCommitDelete, @@ -655,6 +675,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.moveDownCommit"), Modifier: gocui.ModNone, Handler: gui.handleCommitMoveDown, @@ -662,6 +683,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.moveUpCommit"), Modifier: gocui.ModNone, Handler: gui.handleCommitMoveUp, @@ -669,6 +691,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("universal.edit"), Modifier: gocui.ModNone, Handler: gui.handleCommitEdit, @@ -676,6 +699,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.amendToCommit"), Modifier: gocui.ModNone, Handler: gui.handleCommitAmendTo, @@ -683,6 +707,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.pickCommit"), Modifier: gocui.ModNone, Handler: gui.handleCommitPick, @@ -690,6 +715,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.revertCommit"), Modifier: gocui.ModNone, Handler: gui.handleCommitRevert, @@ -697,6 +723,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.cherryPickCopy"), Modifier: gocui.ModNone, Handler: gui.handleCopyCommit, @@ -704,6 +731,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.cherryPickCopyRange"), Modifier: gocui.ModNone, Handler: gui.handleCopyCommitRange, @@ -711,6 +739,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.pasteCommits"), Modifier: gocui.ModNone, Handler: gui.HandlePasteCommits, @@ -718,6 +747,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("universal.goInto"), Modifier: gocui.ModNone, Handler: gui.handleSwitchToCommitFilesPanel, @@ -725,6 +755,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.checkoutCommit"), Modifier: gocui.ModNone, Handler: gui.handleCheckoutCommit, @@ -732,6 +763,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.toggleDiffCommit"), Modifier: gocui.ModNone, Handler: gui.handleToggleDiffCommit, @@ -739,6 +771,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { }, { ViewName: "commits", + Contexts: []string{"branch-commits"}, Key: gui.getKey("commits.tagCommit"), Modifier: gocui.ModNone, Handler: gui.handleTagCommit, @@ -1335,8 +1368,15 @@ func (gui *Gui) keybindings(g *gocui.Gui) error { } } - if err := g.SetTabClickBinding("branches", gui.onBranchesTabClick); err != nil { - return err + tabClickBindings := map[string]func(int) error{ + "branches": gui.onBranchesTabClick, + "commits": gui.onCommitsTabClick, + } + + for viewName, binding := range tabClickBindings { + if err := g.SetTabClickBinding(viewName, binding); err != nil { + return err + } } return nil diff --git a/pkg/gui/list_view.go b/pkg/gui/list_view.go index 274976c4c..1c982cfa1 100644 --- a/pkg/gui/list_view.go +++ b/pkg/gui/list_view.go @@ -126,8 +126,10 @@ func (gui *Gui) getListViews() []*listView { gui: gui, rendersToMainView: true, }, + { viewName: "commits", + context: "branch-commits", getItemsLength: func() int { return len(gui.State.Commits) }, getSelectedLineIdxPtr: func() *int { return &gui.State.Panels.Commits.SelectedLine }, handleFocus: gui.handleCommitSelect, @@ -136,6 +138,16 @@ func (gui *Gui) getListViews() []*listView { gui: gui, rendersToMainView: true, }, + { + viewName: "commits", + context: "reflog-commits", + getItemsLength: func() int { return len(gui.State.ReflogCommits) }, + getSelectedLineIdxPtr: func() *int { return &gui.State.Panels.ReflogCommits.SelectedLine }, + handleFocus: gui.handleReflogCommitSelect, + handleItemSelect: gui.handleReflogCommitSelect, + gui: gui, + rendersToMainView: true, + }, { viewName: "stash", getItemsLength: func() int { return len(gui.State.StashEntries) }, diff --git a/pkg/gui/reflog_panel.go b/pkg/gui/reflog_panel.go new file mode 100644 index 000000000..968325c56 --- /dev/null +++ b/pkg/gui/reflog_panel.go @@ -0,0 +1,76 @@ +package gui + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands" +) + +// list panel functions + +func (gui *Gui) getSelectedReflogCommit() *commands.Commit { + selectedLine := gui.State.Panels.ReflogCommits.SelectedLine + if selectedLine == -1 || len(gui.State.ReflogCommits) == 0 { + return nil + } + + return gui.State.ReflogCommits[selectedLine] +} + +func (gui *Gui) handleReflogCommitSelect(g *gocui.Gui, v *gocui.View) error { + if gui.popupPanelFocused() { + return nil + } + + gui.State.SplitMainPanel = false + + if _, err := gui.g.SetCurrentView(v.Name()); err != nil { + return err + } + + gui.getMainView().Title = "Reflog Entry" + + commit := gui.getSelectedReflogCommit() + if commit == nil { + return gui.renderString(g, "main", "No reflog history") + } + if err := gui.focusPoint(0, gui.State.Panels.ReflogCommits.SelectedLine, len(gui.State.ReflogCommits), v); err != nil { + return err + } + + commitText, err := gui.GitCommand.Show(commit.Sha) + if err != nil { + return err + } + return gui.renderString(g, "main", commitText) +} + +func (gui *Gui) refreshReflogCommits() error { + commits, err := gui.GitCommand.GetReflogCommits() + if err != nil { + return gui.createErrorPanel(gui.g, err.Error()) + } + + gui.State.ReflogCommits = commits + + if gui.getCommitsView().Context == "reflog-commits" { + return gui.renderReflogCommitsWithSelection() + } + + return nil +} + +func (gui *Gui) renderReflogCommitsWithSelection() error { + commitsView := gui.getCommitsView() + + gui.refreshSelectedLine(&gui.State.Panels.ReflogCommits.SelectedLine, len(gui.State.ReflogCommits)) + if err := gui.renderListPanel(commitsView, gui.State.ReflogCommits); err != nil { + return err + } + if gui.g.CurrentView() == commitsView && commitsView.Context == "reflog-commits" { + if err := gui.handleReflogCommitSelect(gui.g, commitsView); err != nil { + return err + } + } + + return nil +} diff --git a/pkg/gui/remote_branches_panel.go b/pkg/gui/remote_branches_panel.go index 2de045e4d..4b8658df7 100644 --- a/pkg/gui/remote_branches_panel.go +++ b/pkg/gui/remote_branches_panel.go @@ -67,8 +67,10 @@ func (gui *Gui) renderRemoteBranchesWithSelection() error { if err := gui.renderListPanel(branchesView, gui.State.RemoteBranches); err != nil { return err } - if err := gui.handleRemoteBranchSelect(gui.g, branchesView); err != nil { - return err + if gui.g.CurrentView() == branchesView && branchesView.Context == "remote-branches" { + if err := gui.handleRemoteBranchSelect(gui.g, branchesView); err != nil { + return err + } } return nil diff --git a/pkg/gui/remotes_panel.go b/pkg/gui/remotes_panel.go index 6964bf108..a646462d9 100644 --- a/pkg/gui/remotes_panel.go +++ b/pkg/gui/remotes_panel.go @@ -83,8 +83,10 @@ func (gui *Gui) renderRemotesWithSelection() error { if err := gui.renderListPanel(branchesView, gui.State.Remotes); err != nil { return err } - if err := gui.handleRemoteSelect(gui.g, branchesView); err != nil { - return err + if gui.g.CurrentView() == branchesView && branchesView.Context == "remotes" { + if err := gui.handleRemoteSelect(gui.g, branchesView); err != nil { + return err + } } return nil diff --git a/pkg/gui/tags_panel.go b/pkg/gui/tags_panel.go index e287156ac..62777e237 100644 --- a/pkg/gui/tags_panel.go +++ b/pkg/gui/tags_panel.go @@ -78,8 +78,10 @@ func (gui *Gui) renderTagsWithSelection() error { if err := gui.renderListPanel(branchesView, gui.State.Tags); err != nil { return err } - if err := gui.handleTagSelect(gui.g, branchesView); err != nil { - return err + if gui.g.CurrentView() == branchesView && branchesView.Context == "tags" { + if err := gui.handleTagSelect(gui.g, branchesView); err != nil { + return err + } } return nil -- cgit v1.2.3