From c1a4bd0482ab06279700fa95404131ef24a2297d Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Fri, 27 Mar 2020 21:25:37 +1100 Subject: more smart refreshing WIP WIP WIP WIP WIP fix how diff entries are handled WIP WIP WIP WIP WIP WIP --- pkg/gui/branches_panel.go | 7 ++++-- pkg/gui/commits_panel.go | 48 +++++++++++++++++------------------------ pkg/gui/credentials_panel.go | 2 +- pkg/gui/gui.go | 4 +--- pkg/gui/presentation/commits.go | 26 ++++++++++++++-------- pkg/gui/tags_panel.go | 33 ++++++++++++++-------------- 6 files changed, 60 insertions(+), 60 deletions(-) (limited to 'pkg/gui') 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 + } + } + }, + }) }) } -- cgit v1.2.3