diff --git a/pkg/gui/controllers/commit_message_controller.go b/pkg/gui/controllers/commit_message_controller.go index b0318e8a4..929e647f3 100644 --- a/pkg/gui/controllers/commit_message_controller.go +++ b/pkg/gui/controllers/commit_message_controller.go @@ -91,8 +91,10 @@ func (self *CommitMessageController) handleCommitIndexChange(value int) error { newIndex := currentIndex + value if newIndex == context.NoCommitIndex { self.context().SetSelectedIndex(newIndex) - self.c.Helpers().Commits.SetMessageAndDescriptionInView("") + self.c.Helpers().Commits.SetMessageAndDescriptionInView(self.context().GetHistoryMessage()) return nil + } else if currentIndex == context.NoCommitIndex { + self.context().SetHistoryMessage(self.c.Helpers().Commits.JoinCommitMessageAndDescription()) } validCommit, err := self.setCommitMessageAtIndex(newIndex) diff --git a/pkg/gui/controllers/helpers/commits_helper.go b/pkg/gui/controllers/helpers/commits_helper.go index ce1b3a9e2..262f970de 100644 --- a/pkg/gui/controllers/helpers/commits_helper.go +++ b/pkg/gui/controllers/helpers/commits_helper.go @@ -55,7 +55,7 @@ func (self *CommitsHelper) SetMessageAndDescriptionInView(message string) { self.c.Contexts().CommitMessage.RenderCommitLength() } -func (self *CommitsHelper) joinCommitMessageAndDescription() string { +func (self *CommitsHelper) JoinCommitMessageAndDescription() string { if len(self.getCommitDescription()) == 0 { return self.getCommitSummary() } @@ -106,7 +106,7 @@ func (self *CommitsHelper) OnCommitSuccess() { } func (self *CommitsHelper) HandleCommitConfirm() error { - fullMessage := self.joinCommitMessageAndDescription() + fullMessage := self.JoinCommitMessageAndDescription() if fullMessage == "" { return self.c.ErrorMsg(self.c.Tr.CommitWithoutMessageErr) @@ -122,16 +122,19 @@ func (self *CommitsHelper) HandleCommitConfirm() error { func (self *CommitsHelper) CloseCommitMessagePanel() error { if self.c.Contexts().CommitMessage.GetPreserveMessage() { - message := self.joinCommitMessageAndDescription() + message := self.JoinCommitMessageAndDescription() self.c.Contexts().CommitMessage.SetPreservedMessage(message) } else { self.SetMessageAndDescriptionInView("") } - return self.EscapeCommitsPanel() + + self.c.Contexts().CommitMessage.SetHistoryMessage("") + + return self.PopCommitMessageContexts() } -func (self *CommitsHelper) EscapeCommitsPanel() error { +func (self *CommitsHelper) PopCommitMessageContexts() error { return self.c.RemoveContexts(self.commitMessageContexts()) } diff --git a/pkg/gui/controllers/helpers/working_tree_helper.go b/pkg/gui/controllers/helpers/working_tree_helper.go index e78c8edf5..2679310f9 100644 --- a/pkg/gui/controllers/helpers/working_tree_helper.go +++ b/pkg/gui/controllers/helpers/working_tree_helper.go @@ -111,7 +111,7 @@ func (self *WorkingTreeHelper) HandleCommitPressWithMessage(initialMessage strin func (self *WorkingTreeHelper) handleCommit(message string) error { cmdObj := self.c.Git().Commit.CommitCmdObj(message) self.c.LogAction(self.c.Tr.Actions.Commit) - _ = self.commitsHelper.EscapeCommitsPanel() + _ = self.commitsHelper.PopCommitMessageContexts() return self.gpgHelper.WithGpgHandling(cmdObj, self.c.Tr.CommittingStatus, func() error { self.commitsHelper.OnCommitSuccess() return nil diff --git a/pkg/gui/controllers/local_commits_controller.go b/pkg/gui/controllers/local_commits_controller.go index 7e7a22365..7ac6e8671 100644 --- a/pkg/gui/controllers/local_commits_controller.go +++ b/pkg/gui/controllers/local_commits_controller.go @@ -279,7 +279,7 @@ func (self *LocalCommitsController) handleReword(message string) error { return self.c.Error(err) } self.c.Helpers().Commits.OnCommitSuccess() - _ = self.c.Helpers().Commits.EscapeCommitsPanel() + _ = self.c.Helpers().Commits.PopCommitMessageContexts() return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) } diff --git a/pkg/integration/tests/commit/history.go b/pkg/integration/tests/commit/history.go new file mode 100644 index 000000000..9938ae35a --- /dev/null +++ b/pkg/integration/tests/commit/history.go @@ -0,0 +1,53 @@ +package commit + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var History = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Cycling through commit message history in the commit message panel", + ExtraCmdArgs: "", + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *Shell) { + shell.EmptyCommit("initial commit") + shell.EmptyCommit("commit 2") + shell.EmptyCommit("commit 3") + + shell.CreateFile("myfile", "myfile content") + }, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + t.Views().Files(). + IsFocused(). + PressPrimaryAction(). // stage file + Press(keys.Files.CommitChanges) + + t.ExpectPopup().CommitMessagePanel(). + InitialText(Equals("")). + Type("my commit message"). + SelectPreviousMessage(). + Content(Equals("commit 3")). + SelectPreviousMessage(). + Content(Equals("commit 2")). + SelectPreviousMessage(). + Content(Equals("initial commit")). + SelectPreviousMessage(). + Content(Equals("initial commit")). // we hit the end + SelectNextMessage(). + Content(Equals("commit 2")). + SelectNextMessage(). + Content(Equals("commit 3")). + SelectNextMessage(). + Content(Equals("my commit message")). + SelectNextMessage(). + Content(Equals("my commit message")). // we hit the beginning + Type(" with extra added"). + Confirm() + + t.Views().Commits(). + TopLines( + Contains("my commit message with extra added").IsSelected(), + ) + }, +}) diff --git a/pkg/integration/tests/commit/history_complex.go b/pkg/integration/tests/commit/history_complex.go new file mode 100644 index 000000000..e88da4416 --- /dev/null +++ b/pkg/integration/tests/commit/history_complex.go @@ -0,0 +1,59 @@ +package commit + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var HistoryComplex = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "More complex flow for cycling commit message history", + ExtraCmdArgs: "", + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *Shell) { + shell.EmptyCommit("initial commit") + shell.EmptyCommit("commit 2") + shell.EmptyCommit("commit 3") + + shell.CreateFileAndAdd("myfile", "myfile content") + }, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + // We're going to start a new commit message, + // then leave and try to reword a commit, then + // come back to original message and confirm we haven't lost our message. + // This shows that we're storing the preserved message for a new commit separately + // to the message when cycling history. + + t.Views().Files(). + IsFocused(). + Press(keys.Files.CommitChanges) + + t.ExpectPopup().CommitMessagePanel(). + InitialText(Equals("")). + Type("my commit message"). + Cancel() + + t.Views().Commits(). + Focus(). + SelectedLine(Contains("commit 3")). + Press(keys.Commits.RenameCommit) + + t.ExpectPopup().CommitMessagePanel(). + InitialText(Equals("commit 3")). + SelectNextMessage(). + Content(Equals("")). + Type("reworded message"). + SelectPreviousMessage(). + Content(Equals("commit 3")). + SelectNextMessage(). + Content(Equals("reworded message")). + Cancel() + + t.Views().Files(). + Focus(). + Press(keys.Files.CommitChanges) + + t.ExpectPopup().CommitMessagePanel(). + InitialText(Equals("my commit message")) + }, +}) diff --git a/pkg/integration/tests/test_list.go b/pkg/integration/tests/test_list.go index 10838c008..8c1d75c6e 100644 --- a/pkg/integration/tests/test_list.go +++ b/pkg/integration/tests/test_list.go @@ -49,6 +49,8 @@ var tests = []*components.IntegrationTest{ commit.CommitMultiline, commit.CreateTag, commit.DiscardOldFileChange, + commit.History, + commit.HistoryComplex, commit.NewBranch, commit.ResetAuthor, commit.Revert,