diff --git a/pkg/gui/context/sub_commits_context.go b/pkg/gui/context/sub_commits_context.go index 4070f0390..5fdea8e6d 100644 --- a/pkg/gui/context/sub_commits_context.go +++ b/pkg/gui/context/sub_commits_context.go @@ -30,7 +30,8 @@ func NewSubCommitsContext( ) *SubCommitsContext { viewModel := &SubCommitsViewModel{ BasicViewModel: NewBasicViewModel(getModel), - refName: "", + ref: nil, + limitCommits: true, } return &SubCommitsContext{ @@ -60,12 +61,18 @@ func NewSubCommitsContext( type SubCommitsViewModel struct { // name of the ref that the sub-commits are shown for - refName string + ref types.Ref *BasicViewModel[*models.Commit] + + limitCommits bool } -func (self *SubCommitsViewModel) SetRefName(refName string) { - self.refName = refName +func (self *SubCommitsViewModel) SetRef(ref types.Ref) { + self.ref = ref +} + +func (self *SubCommitsViewModel) GetRef() types.Ref { + return self.ref } func (self *SubCommitsContext) GetSelectedItemId() string { @@ -94,5 +101,13 @@ func (self *SubCommitsContext) GetCommits() []*models.Commit { } func (self *SubCommitsContext) Title() string { - return fmt.Sprintf(self.c.Tr.SubCommitsDynamicTitle, utils.TruncateWithEllipsis(self.refName, 50)) + return fmt.Sprintf(self.c.Tr.SubCommitsDynamicTitle, utils.TruncateWithEllipsis(self.ref.RefName(), 50)) +} + +func (self *SubCommitsContext) SetLimitCommits(value bool) { + self.limitCommits = value +} + +func (self *SubCommitsContext) GetLimitCommits() bool { + return self.limitCommits } diff --git a/pkg/gui/controllers.go b/pkg/gui/controllers.go index d7f6647c7..80b7d9e80 100644 --- a/pkg/gui/controllers.go +++ b/pkg/gui/controllers.go @@ -133,7 +133,12 @@ func (gui *Gui) resetControllers() { patchBuildingController := controllers.NewPatchBuildingController(common) snakeController := controllers.NewSnakeController(common, func() *snake.Game { return gui.snakeGame }) - setSubCommits := func(commits []*models.Commit) { gui.State.Model.SubCommits = commits } + setSubCommits := func(commits []*models.Commit) { + gui.Mutexes.SubCommitsMutex.Lock() + defer gui.Mutexes.SubCommitsMutex.Unlock() + + gui.State.Model.SubCommits = commits + } for _, context := range []controllers.CanSwitchToSubCommits{ gui.State.Contexts.Branches, diff --git a/pkg/gui/controllers/switch_to_sub_commits_controller.go b/pkg/gui/controllers/switch_to_sub_commits_controller.go index dfc538ee8..2e9d25e09 100644 --- a/pkg/gui/controllers/switch_to_sub_commits_controller.go +++ b/pkg/gui/controllers/switch_to_sub_commits_controller.go @@ -75,7 +75,8 @@ func (self *SwitchToSubCommitsController) viewCommits() error { self.contexts.SubCommits.SetParentContext(self.context) self.contexts.SubCommits.SetWindowName(self.context.GetWindowName()) self.contexts.SubCommits.SetTitleRef(ref.Description()) - self.contexts.SubCommits.SetRefName(ref.RefName()) + self.contexts.SubCommits.SetRef(ref) + self.contexts.SubCommits.SetLimitCommits(true) err = self.c.PostRefreshUpdate(self.contexts.SubCommits) if err != nil { diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index bcc3400e3..3dcf146dc 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -380,6 +380,7 @@ func NewGui( RefreshingStatusMutex: &deadlock.Mutex{}, SyncMutex: &deadlock.Mutex{}, LocalCommitsMutex: &deadlock.Mutex{}, + SubCommitsMutex: &deadlock.Mutex{}, SubprocessMutex: &deadlock.Mutex{}, PopupMutex: &deadlock.Mutex{}, PtyMutex: &deadlock.Mutex{}, diff --git a/pkg/gui/list_context_config.go b/pkg/gui/list_context_config.go index 71308f90d..a6cc8c42b 100644 --- a/pkg/gui/list_context_config.go +++ b/pkg/gui/list_context_config.go @@ -173,7 +173,7 @@ func (gui *Gui) subCommitsListContext() *context.SubCommitsContext { false, ) }, - nil, + OnFocusWrapper(gui.onSubCommitFocus), gui.withDiffModeCheck(gui.subCommitsRenderToMain), nil, gui.c, diff --git a/pkg/gui/refresh.go b/pkg/gui/refresh.go index 7f7dc4829..9ee5ea0bd 100644 --- a/pkg/gui/refresh.go +++ b/pkg/gui/refresh.go @@ -722,3 +722,25 @@ func (gui *Gui) refreshMergePanel(isFocused bool) error { }, }) } + +func (gui *Gui) refreshSubCommitsWithLimit() error { + gui.Mutexes.SubCommitsMutex.Lock() + defer gui.Mutexes.SubCommitsMutex.Unlock() + + context := gui.State.Contexts.SubCommits + + commits, err := gui.git.Loaders.CommitLoader.GetCommits( + git_commands.GetCommitsOptions{ + Limit: context.GetLimitCommits(), + FilterPath: gui.State.Modes.Filtering.GetPath(), + IncludeRebaseCommits: false, + RefName: context.GetRef().FullRefName(), + }, + ) + if err != nil { + return err + } + gui.State.Model.SubCommits = commits + + return gui.c.PostRefreshUpdate(gui.State.Contexts.SubCommits) +} diff --git a/pkg/gui/sub_commits_panel.go b/pkg/gui/sub_commits_panel.go index f68678008..bcc63bbb7 100644 --- a/pkg/gui/sub_commits_panel.go +++ b/pkg/gui/sub_commits_panel.go @@ -1,9 +1,26 @@ package gui -import "github.com/jesseduffield/lazygit/pkg/gui/types" +import ( + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) // list panel functions +func (gui *Gui) onSubCommitFocus() error { + context := gui.State.Contexts.SubCommits + if context.GetSelectedLineIdx() > COMMIT_THRESHOLD && context.GetLimitCommits() { + context.SetLimitCommits(false) + go utils.Safe(func() { + if err := gui.refreshSubCommitsWithLimit(); err != nil { + _ = gui.c.Error(err) + } + }) + } + + return nil +} + func (gui *Gui) subCommitsRenderToMain() error { commit := gui.State.Contexts.SubCommits.GetSelected() var task types.UpdateTask diff --git a/pkg/gui/types/common.go b/pkg/gui/types/common.go index a55ead4da..aeb1da4c0 100644 --- a/pkg/gui/types/common.go +++ b/pkg/gui/types/common.go @@ -171,6 +171,7 @@ type Mutexes struct { RefreshingStatusMutex *deadlock.Mutex SyncMutex *deadlock.Mutex LocalCommitsMutex *deadlock.Mutex + SubCommitsMutex *deadlock.Mutex SubprocessMutex *deadlock.Mutex PopupMutex *deadlock.Mutex PtyMutex *deadlock.Mutex