summaryrefslogtreecommitdiffstats
path: root/pkg/gui
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2020-03-27 21:25:37 +1100
committerJesse Duffield <jessedduffield@gmail.com>2020-03-28 11:59:45 +1100
commitc1a4bd0482ab06279700fa95404131ef24a2297d (patch)
treef3c6a24a7a6cc482fe14f2001d704edefff59bc9 /pkg/gui
parentd0336fe16f3a365eb9bfff1086a4c02277e1f5dd (diff)
more smart refreshing
WIP WIP WIP WIP WIP fix how diff entries are handled WIP WIP WIP WIP WIP WIP
Diffstat (limited to 'pkg/gui')
-rw-r--r--pkg/gui/branches_panel.go7
-rw-r--r--pkg/gui/commits_panel.go48
-rw-r--r--pkg/gui/credentials_panel.go2
-rw-r--r--pkg/gui/gui.go4
-rw-r--r--pkg/gui/presentation/commits.go26
-rw-r--r--pkg/gui/tags_panel.go33
6 files changed, 60 insertions, 60 deletions
diff --git a/pkg/gui/branches_panel.go b/pkg/gui/branches_panel.go
index 996d3c7b2..1457d5138 100644
--- a/pkg/gui/branches_panel.go
+++ b/pkg/gui/branches_panel.go
@@ -358,7 +358,7 @@ func (gui *Gui) handleFastForward(g *gocui.Gui, v *gocui.View) error {
if err := gui.GitCommand.FastForward(branch.Name, remoteName, remoteBranchName); err != nil {
_ = gui.createErrorPanel(gui.g, err.Error())
}
- _ = gui.refreshCommits()
+ _ = gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []int{BRANCHES}})
}
_ = gui.closeConfirmationPrompt(gui.g, true)
@@ -453,6 +453,9 @@ func (gui *Gui) handleRenameBranch(g *gocui.Gui, v *gocui.View) error {
return nil
}
+ // TODO: find a way to not checkout the branch here if it's not the current branch (i.e. find some
+ // way to get it to show up in the reflog)
+
promptForNewName := func() error {
return gui.createPromptPanel(g, v, gui.Tr.SLocalize("NewBranchNamePrompt")+" "+branch.Name+":", "", func(g *gocui.Gui, v *gocui.View) error {
newName := gui.trimmedContent(v)
@@ -465,7 +468,7 @@ func (gui *Gui) handleRenameBranch(g *gocui.Gui, v *gocui.View) error {
return gui.createErrorPanel(gui.g, err.Error())
}
- return gui.refreshCommits()
+ return gui.refreshSidePanels(refreshOptions{mode: ASYNC})
})
}
diff --git a/pkg/gui/commits_panel.go b/pkg/gui/commits_panel.go
index 6b71b5a1b..83d883013 100644
--- a/pkg/gui/commits_panel.go
+++ b/pkg/gui/commits_panel.go
@@ -177,10 +177,8 @@ func (gui *Gui) handleRenameCommit(g *gocui.Gui, v *gocui.View) error {
if err := gui.GitCommand.RenameCommit(v.Buffer()); err != nil {
return gui.createErrorPanel(g, err.Error())
}
- if err := gui.refreshCommits(); err != nil {
- panic(err)
- }
- return gui.handleCommitSelect(g, v)
+
+ return gui.refreshSidePanels(refreshOptions{mode: ASYNC})
})
}
@@ -225,7 +223,9 @@ func (gui *Gui) handleMidRebaseCommand(action string) (bool, error) {
if err := gui.GitCommand.EditRebaseTodo(gui.State.Panels.Commits.SelectedLine, action); err != nil {
return false, gui.createErrorPanel(gui.g, err.Error())
}
- return true, gui.refreshCommits()
+ // TODO: consider doing this in a way that is less expensive. We don't actually
+ // need to reload all the commits, just the TODO commits.
+ return true, gui.refreshSidePanels(refreshOptions{scope: []int{COMMITS}})
}
func (gui *Gui) handleCommitDelete(g *gocui.Gui, v *gocui.View) error {
@@ -256,7 +256,7 @@ func (gui *Gui) handleCommitMoveDown(g *gocui.Gui, v *gocui.View) error {
return gui.createErrorPanel(gui.g, err.Error())
}
gui.State.Panels.Commits.SelectedLine++
- return gui.refreshCommits()
+ return gui.refreshSidePanels(refreshOptions{mode: BLOCK_UI, scope: []int{COMMITS, BRANCHES}})
}
return gui.WithWaitingStatus(gui.Tr.SLocalize("MovingStatus"), func() error {
@@ -279,7 +279,7 @@ func (gui *Gui) handleCommitMoveUp(g *gocui.Gui, v *gocui.View) error {
return gui.createErrorPanel(gui.g, err.Error())
}
gui.State.Panels.Commits.SelectedLine--
- return gui.refreshCommits()
+ return gui.refreshSidePanels(refreshOptions{mode: BLOCK_UI, scope: []int{COMMITS, BRANCHES}})
}
return gui.WithWaitingStatus(gui.Tr.SLocalize("MovingStatus"), func() error {
@@ -334,7 +334,7 @@ func (gui *Gui) handleCommitRevert(g *gocui.Gui, v *gocui.View) error {
return gui.createErrorPanel(gui.g, err.Error())
}
gui.State.Panels.Commits.SelectedLine++
- return gui.refreshCommits()
+ return gui.refreshSidePanels(refreshOptions{mode: BLOCK_UI, scope: []int{COMMITS, BRANCHES}})
}
func (gui *Gui) handleCopyCommit(g *gocui.Gui, v *gocui.View) error {
@@ -345,12 +345,12 @@ func (gui *Gui) handleCopyCommit(g *gocui.Gui, v *gocui.View) error {
for index, cherryPickedCommit := range gui.State.CherryPickedCommits {
if commit.Sha == cherryPickedCommit.Sha {
gui.State.CherryPickedCommits = append(gui.State.CherryPickedCommits[0:index], gui.State.CherryPickedCommits[index+1:]...)
- return gui.refreshCommits()
+ return gui.renderBranchCommitsWithSelection()
}
}
gui.addCommitToCherryPickedCommits(gui.State.Panels.Commits.SelectedLine)
- return gui.refreshCommits()
+ return gui.renderBranchCommitsWithSelection()
}
func (gui *Gui) cherryPickedCommitShaMap() map[string]bool {
@@ -428,10 +428,11 @@ func (gui *Gui) handleToggleDiffCommit(g *gocui.Gui, v *gocui.View) error {
if idx, has := gui.hasCommit(gui.State.DiffEntries, commit.Sha); has {
gui.State.DiffEntries = gui.unchooseCommit(gui.State.DiffEntries, idx)
} else {
- if len(gui.State.DiffEntries) == selectLimit {
- gui.State.DiffEntries = gui.unchooseCommit(gui.State.DiffEntries, 0)
+ if len(gui.State.DiffEntries) == 0 {
+ gui.State.DiffEntries = []*commands.Commit{commit}
+ } else {
+ gui.State.DiffEntries = append(gui.State.DiffEntries[:1], commit)
}
- gui.State.DiffEntries = append(gui.State.DiffEntries, commit)
}
gui.setDiffMode()
@@ -444,10 +445,9 @@ func (gui *Gui) handleToggleDiffCommit(g *gocui.Gui, v *gocui.View) error {
return gui.createErrorPanel(gui.g, err.Error())
}
- return gui.newStringTask("main", commitText)
+ gui.newStringTask("main", commitText)
}
-
- return nil
+ return gui.renderBranchCommitsWithSelection()
}
func (gui *Gui) setDiffMode() {
@@ -459,8 +459,6 @@ func (gui *Gui) setDiffMode() {
gui.State.Panels.Commits.SpecificDiffMode = false
v.Title = gui.Tr.SLocalize("CommitsTitle")
}
-
- _ = gui.refreshCommits()
}
func (gui *Gui) hasCommit(commits []*commands.Commit, target string) (int, bool) {
@@ -532,13 +530,7 @@ func (gui *Gui) handleCreateLightweightTag(commitSha string) error {
if err := gui.GitCommand.CreateLightweightTag(v.Buffer(), commitSha); err != nil {
return gui.createErrorPanel(g, err.Error())
}
- if err := gui.refreshCommits(); err != nil {
- return gui.createErrorPanel(g, err.Error())
- }
- if err := gui.refreshTags(); err != nil {
- return gui.createErrorPanel(g, err.Error())
- }
- return gui.handleCommitSelect(g, v)
+ return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []int{COMMITS, TAGS}})
})
}
@@ -557,7 +549,7 @@ func (gui *Gui) renderBranchCommitsWithSelection() error {
commitsView := gui.getCommitsView()
gui.refreshSelectedLine(&gui.State.Panels.Commits.SelectedLine, len(gui.State.Commits))
- displayStrings := presentation.GetCommitListDisplayStrings(gui.State.Commits, gui.State.ScreenMode != SCREEN_NORMAL, gui.cherryPickedCommitShaMap())
+ displayStrings := presentation.GetCommitListDisplayStrings(gui.State.Commits, gui.State.ScreenMode != SCREEN_NORMAL, gui.cherryPickedCommitShaMap(), gui.State.DiffEntries)
gui.renderDisplayStrings(commitsView, displayStrings)
if gui.g.CurrentView() == commitsView && commitsView.Context == "branch-commits" {
if err := gui.handleCommitSelect(gui.g, commitsView); err != nil {
@@ -644,7 +636,7 @@ func (gui *Gui) handleOpenSearchForCommitsPanel(g *gocui.Gui, v *gocui.View) err
// we usually lazyload these commits but now that we're searching we need to load them now
if gui.State.Panels.Commits.LimitCommits {
gui.State.Panels.Commits.LimitCommits = false
- if err := gui.refreshCommits(); err != nil {
+ if err := gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []int{COMMITS}}); err != nil {
return err
}
}
@@ -654,5 +646,5 @@ func (gui *Gui) handleOpenSearchForCommitsPanel(g *gocui.Gui, v *gocui.View) err
func (gui *Gui) handleResetCherryPick(g *gocui.Gui, v *gocui.View) error {
gui.State.CherryPickedCommits = []*commands.Commit{}
- return gui.refreshCommits()
+ return gui.renderBranchCommitsWithSelection()
}
diff --git a/pkg/gui/credentials_panel.go b/pkg/gui/credentials_panel.go
index 21c15ca92..468035fd8 100644
--- a/pkg/gui/credentials_panel.go
+++ b/pkg/gui/credentials_panel.go
@@ -57,7 +57,7 @@ func (gui *Gui) handleSubmitCredential(g *gocui.Gui, v *gocui.View) error {
if err != nil {
return err
}
- return gui.refreshCommits()
+ return gui.refreshSidePanels(refreshOptions{})
}
func (gui *Gui) handleCloseCredentialsView(g *gocui.Gui, v *gocui.View) error {
diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go
index 8c0a61e65..03a0be81a 100644
--- a/pkg/gui/gui.go
+++ b/pkg/gui/gui.go
@@ -922,9 +922,7 @@ 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)
}
- if err := gui.refreshCommits(); err != nil {
- return unamePassOpend, err
- }
+ gui.refreshSidePanels(refreshOptions{scope: []int{BRANCHES, COMMITS, REMOTES, TAGS}, mode: ASYNC})
return unamePassOpend, err
}
diff --git a/pkg/gui/presentation/commits.go b/pkg/gui/presentation/commits.go
index b54f928ac..d2aff9817 100644
--- a/pkg/gui/presentation/commits.go
+++ b/pkg/gui/presentation/commits.go
@@ -9,10 +9,10 @@ import (
"github.com/jesseduffield/lazygit/pkg/utils"
)
-func GetCommitListDisplayStrings(commits []*commands.Commit, fullDescription bool, cherryPickedCommitShaMap map[string]bool) [][]string {
+func GetCommitListDisplayStrings(commits []*commands.Commit, fullDescription bool, cherryPickedCommitShaMap map[string]bool, diffEntries []*commands.Commit) [][]string {
lines := make([][]string, len(commits))
- var displayFunc func(*commands.Commit, map[string]bool) []string
+ var displayFunc func(*commands.Commit, map[string]bool, []*commands.Commit) []string
if fullDescription {
displayFunc = getFullDescriptionDisplayStringsForCommit
} else {
@@ -20,13 +20,13 @@ func GetCommitListDisplayStrings(commits []*commands.Commit, fullDescription boo
}
for i := range commits {
- lines[i] = displayFunc(commits[i], cherryPickedCommitShaMap)
+ lines[i] = displayFunc(commits[i], cherryPickedCommitShaMap, diffEntries)
}
return lines
}
-func getFullDescriptionDisplayStringsForCommit(c *commands.Commit, cherryPickedCommitShaMap map[string]bool) []string {
+func getFullDescriptionDisplayStringsForCommit(c *commands.Commit, cherryPickedCommitShaMap map[string]bool, diffEntries []*commands.Commit) []string {
red := color.New(color.FgRed)
yellow := color.New(color.FgYellow)
green := color.New(color.FgGreen)
@@ -52,8 +52,6 @@ func getFullDescriptionDisplayStringsForCommit(c *commands.Commit, cherryPickedC
shaColor = blue
case "reflog":
shaColor = blue
- case "selected":
- shaColor = magenta
default:
shaColor = defaultColor
}
@@ -62,6 +60,12 @@ func getFullDescriptionDisplayStringsForCommit(c *commands.Commit, cherryPickedC
shaColor = copied
}
+ for _, entry := range diffEntries {
+ if c.Sha == entry.Sha {
+ shaColor = magenta
+ }
+ }
+
tagString := ""
secondColumnString := blue.Sprint(utils.UnixToDate(c.UnixTimestamp))
if c.Action != "" {
@@ -76,7 +80,7 @@ func getFullDescriptionDisplayStringsForCommit(c *commands.Commit, cherryPickedC
return []string{shaColor.Sprint(c.ShortSha()), secondColumnString, yellow.Sprint(truncatedAuthor), tagString + defaultColor.Sprint(c.Name)}
}
-func getDisplayStringsForCommit(c *commands.Commit, cherryPickedCommitShaMap map[string]bool) []string {
+func getDisplayStringsForCommit(c *commands.Commit, cherryPickedCommitShaMap map[string]bool, diffEntries []*commands.Commit) []string {
red := color.New(color.FgRed)
yellow := color.New(color.FgYellow)
green := color.New(color.FgGreen)
@@ -102,8 +106,6 @@ func getDisplayStringsForCommit(c *commands.Commit, cherryPickedCommitShaMap map
shaColor = blue
case "reflog":
shaColor = blue
- case "selected":
- shaColor = magenta
default:
shaColor = defaultColor
}
@@ -112,6 +114,12 @@ func getDisplayStringsForCommit(c *commands.Commit, cherryPickedCommitShaMap map
shaColor = copied
}
+ for _, entry := range diffEntries {
+ if c.Sha == entry.Sha {
+ shaColor = magenta
+ }
+ }
+
actionString := ""
tagString := ""
if c.Action != "" {
diff --git a/pkg/gui/tags_panel.go b/pkg/gui/tags_panel.go
index 78c3122cd..62f4c99fa 100644
--- a/pkg/gui/tags_panel.go
+++ b/pkg/gui/tags_panel.go
@@ -69,7 +69,7 @@ func (gui *Gui) renderTagsWithSelection() error {
gui.renderDisplayStrings(branchesView, displayStrings)
if gui.g.CurrentView() == branchesView && branchesView.Context == "tags" {
if err := gui.handleTagSelect(gui.g, branchesView); err != nil {
- return err
+ return gui.createErrorPanel(gui.g, err.Error())
}
}
@@ -104,13 +104,7 @@ func (gui *Gui) handleDeleteTag(g *gocui.Gui, v *gocui.View) error {
if err := gui.GitCommand.DeleteTag(tag.Name); err != nil {
return gui.createErrorPanel(gui.g, err.Error())
}
- if err := gui.refreshCommits(); err != nil {
- return gui.createErrorPanel(g, err.Error())
- }
- if err := gui.refreshTags(); err != nil {
- return gui.createErrorPanel(g, err.Error())
- }
- return nil
+ return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []int{COMMITS, TAGS}})
}, nil)
}
@@ -131,23 +125,28 @@ func (gui *Gui) handlePushTag(g *gocui.Gui, v *gocui.View) error {
if err := gui.GitCommand.PushTag(v.Buffer(), tag.Name); err != nil {
return gui.createErrorPanel(gui.g, err.Error())
}
- return gui.refreshTags()
+ return nil
})
}
func (gui *Gui) handleCreateTag(g *gocui.Gui, v *gocui.View) error {
return gui.createPromptPanel(gui.g, v, gui.Tr.SLocalize("CreateTagTitle"), "", func(g *gocui.Gui, v *gocui.View) error {
// leaving commit SHA blank so that we're just creating the tag for the current commit
- if err := gui.GitCommand.CreateLightweightTag(v.Buffer(), ""); err != nil {
+ tagName := v.Buffer()
+ if err := gui.GitCommand.CreateLightweightTag(tagName, ""); err != nil {
return gui.createErrorPanel(gui.g, err.Error())
}
- if err := gui.refreshCommits(); err != nil {
- return gui.createErrorPanel(g, err.Error())
- }
- if err := gui.refreshTags(); err != nil {
- return gui.createErrorPanel(g, err.Error())
- }
- return nil
+ return gui.refreshSidePanels(refreshOptions{scope: []int{COMMITS, TAGS}, then: func() {
+ // find the index of the tag and set that as the currently selected line
+ for i, tag := range gui.State.Tags {
+ if tag.Name == tagName {
+ gui.State.Panels.Tags.SelectedLine = i
+ gui.renderTagsWithSelection()
+ return
+ }
+ }
+ },
+ })
})
}