1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-01-08 04:04:22 +02:00

lazyload commits

This commit is contained in:
Jesse Duffield 2020-01-11 18:23:35 +11:00
parent d647a96ed5
commit 282f08df36
4 changed files with 50 additions and 24 deletions

View File

@ -46,7 +46,7 @@ func NewCommitListBuilder(log *logrus.Entry, gitCommand *GitCommand, osCommand *
} }
// GetCommits obtains the commits of the current branch // GetCommits obtains the commits of the current branch
func (c *CommitListBuilder) GetCommits() ([]*Commit, error) { func (c *CommitListBuilder) GetCommits(limit bool) ([]*Commit, error) {
commits := []*Commit{} commits := []*Commit{}
var rebasingCommits []*Commit var rebasingCommits []*Commit
rebaseMode, err := c.GitCommand.RebaseMode() rebaseMode, err := c.GitCommand.RebaseMode()
@ -65,7 +65,7 @@ func (c *CommitListBuilder) GetCommits() ([]*Commit, error) {
} }
unpushedCommits := c.getUnpushedCommits() unpushedCommits := c.getUnpushedCommits()
log := c.getLog() log := c.getLog(limit)
// now we can split it up and turn it into commits // now we can split it up and turn it into commits
for _, line := range utils.SplitLines(log) { for _, line := range utils.SplitLines(log) {
@ -281,12 +281,15 @@ func (c *CommitListBuilder) getUnpushedCommits() map[string]bool {
return pushables return pushables
} }
// getLog gets the git log (currently limited to 30 commits for performance // getLog gets the git log.
// until we work out lazy loading func (c *CommitListBuilder) getLog(limit bool) string {
func (c *CommitListBuilder) getLog() string { limitFlag := ""
// currently limiting to 30 for performance reasons if limit {
// TODO: add lazyloading when you scroll down limitFlag = "-30"
result, err := c.OSCommand.RunCommandWithOutput("git log --oneline -30") }
c.Log.Warn(fmt.Sprintf("git log --oneline %s", limitFlag))
result, err := c.OSCommand.RunCommandWithOutput(fmt.Sprintf("git log --oneline %s", limitFlag))
if err != nil { if err != nil {
// assume if there is an error there are no commits yet for this branch // assume if there is an error there are no commits yet for this branch
return "" return ""

View File

@ -188,7 +188,7 @@ func TestCommitListBuilderGetLog(t *testing.T) {
t.Run(s.testName, func(t *testing.T) { t.Run(s.testName, func(t *testing.T) {
c := NewDummyCommitListBuilder() c := NewDummyCommitListBuilder()
c.OSCommand.SetCommand(s.command) c.OSCommand.SetCommand(s.command)
s.test(c.getLog()) s.test(c.getLog(true))
}) })
} }
} }
@ -312,7 +312,7 @@ func TestCommitListBuilderGetCommits(t *testing.T) {
t.Run(s.testName, func(t *testing.T) { t.Run(s.testName, func(t *testing.T) {
c := NewDummyCommitListBuilder() c := NewDummyCommitListBuilder()
c.OSCommand.SetCommand(s.command) c.OSCommand.SetCommand(s.command)
s.test(c.GetCommits()) s.test(c.GetCommits(true))
}) })
} }
} }

View File

@ -37,6 +37,16 @@ func (gui *Gui) handleCommitSelect(g *gocui.Gui, v *gocui.View) error {
return err return err
} }
state := gui.State.Panels.Commits
if state.SelectedLine > 20 && state.LimitCommits {
state.LimitCommits = false
go func() {
if err := gui.refreshCommitsWithLimit(); err != nil {
_ = gui.createErrorPanel(gui.g, err.Error())
}
}()
}
gui.getMainView().Title = "Patch" gui.getMainView().Title = "Patch"
gui.getSecondaryView().Title = "Custom Patch" gui.getSecondaryView().Title = "Custom Patch"
gui.State.Panels.LineByLine = nil gui.State.Panels.LineByLine = nil
@ -64,15 +74,12 @@ func (gui *Gui) handleCommitSelect(g *gocui.Gui, v *gocui.View) error {
func (gui *Gui) refreshCommits(g *gocui.Gui) error { func (gui *Gui) refreshCommits(g *gocui.Gui) error {
g.Update(func(*gocui.Gui) error { g.Update(func(*gocui.Gui) error {
builder, err := commands.NewCommitListBuilder(gui.Log, gui.GitCommand, gui.OSCommand, gui.Tr, gui.State.CherryPickedCommits, gui.State.DiffEntries) // I think this is here for the sake of some kind of rebasing thing
if err != nil { gui.refreshStatus(g)
if err := gui.refreshCommitsWithLimit(); err != nil {
return err return err
} }
commits, err := builder.GetCommits()
if err != nil {
return err
}
gui.State.Commits = commits
// doing this async because it shouldn't hold anything up // doing this async because it shouldn't hold anything up
go func() { go func() {
@ -81,12 +88,6 @@ func (gui *Gui) refreshCommits(g *gocui.Gui) error {
} }
}() }()
gui.refreshStatus(g)
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") { if g.CurrentView() == gui.getCommitFilesView() || (g.CurrentView() == gui.getMainView() || gui.State.MainContext == "patch-building") {
return gui.refreshCommitFilesView() return gui.refreshCommitFilesView()
} }
@ -95,6 +96,27 @@ func (gui *Gui) refreshCommits(g *gocui.Gui) error {
return nil return nil
} }
func (gui *Gui) refreshCommitsWithLimit() error {
builder, err := commands.NewCommitListBuilder(gui.Log, gui.GitCommand, gui.OSCommand, gui.Tr, gui.State.CherryPickedCommits, gui.State.DiffEntries)
if err != nil {
return err
}
commits, err := builder.GetCommits(gui.State.Panels.Commits.LimitCommits)
if err != nil {
return err
}
gui.State.Commits = commits
if gui.getCommitsView().Context == "branch-commits" {
if err := gui.renderBranchCommitsWithSelection(); err != nil {
return err
}
}
return nil
}
// specific functions // specific functions
func (gui *Gui) handleResetToCommit(g *gocui.Gui, commitView *gocui.View) error { func (gui *Gui) handleResetToCommit(g *gocui.Gui, commitView *gocui.View) error {

View File

@ -128,6 +128,7 @@ type tagsPanelState struct {
type commitPanelState struct { type commitPanelState struct {
SelectedLine int SelectedLine int
SpecificDiffMode bool SpecificDiffMode bool
LimitCommits bool
} }
type reflogCommitPanelState struct { type reflogCommitPanelState struct {
@ -212,7 +213,7 @@ func NewGui(log *logrus.Entry, gitCommand *commands.GitCommand, oSCommand *comma
Remotes: &remotePanelState{SelectedLine: 0}, Remotes: &remotePanelState{SelectedLine: 0},
RemoteBranches: &remoteBranchesState{SelectedLine: -1}, RemoteBranches: &remoteBranchesState{SelectedLine: -1},
Tags: &tagsPanelState{SelectedLine: -1}, Tags: &tagsPanelState{SelectedLine: -1},
Commits: &commitPanelState{SelectedLine: -1}, Commits: &commitPanelState{SelectedLine: -1, LimitCommits: true},
ReflogCommits: &reflogCommitPanelState{SelectedLine: 0}, // TODO: might need to make -1 ReflogCommits: &reflogCommitPanelState{SelectedLine: 0}, // TODO: might need to make -1
CommitFiles: &commitFilesPanelState{SelectedLine: -1}, CommitFiles: &commitFilesPanelState{SelectedLine: -1},
Stash: &stashPanelState{SelectedLine: -1}, Stash: &stashPanelState{SelectedLine: -1},