summaryrefslogtreecommitdiffstats
path: root/pkg/gui
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2020-01-09 21:34:17 +1100
committerJesse Duffield <jessedduffield@gmail.com>2020-01-09 22:36:07 +1100
commit9b32e99eb80d3912ecfef3303418e6dce8219a75 (patch)
tree0d0b526703132dfcf64dd47bbc8598fdfdcd7525 /pkg/gui
parent79e696d8a747edc3bf1b9ddbd8dcd5038ec7d7ba (diff)
add reflog tab in commits panel
Diffstat (limited to 'pkg/gui')
-rw-r--r--pkg/gui/branches_panel.go6
-rw-r--r--pkg/gui/commits_panel.go80
-rw-r--r--pkg/gui/gui.go12
-rw-r--r--pkg/gui/keybindings.go48
-rw-r--r--pkg/gui/list_view.go12
-rw-r--r--pkg/gui/reflog_panel.go76
-rw-r--r--pkg/gui/remote_branches_panel.go6
-rw-r--r--pkg/gui/remotes_panel.go6
-rw-r--r--pkg/gui/tags_panel.go6
9 files changed, 226 insertions, 26 deletions
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,
},
@@ -598,7 +598,20 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
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,
@@ -137,6 +139,16 @@ func (gui *Gui) getListViews() []*listView {
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) },
getSelectedLineIdxPtr: func() *int { return &gui.State.Panels.Stash.SelectedLine },
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