diff --git a/pkg/gui/context/commit_message_context.go b/pkg/gui/context/commit_message_context.go index aa70e60b8..531625156 100644 --- a/pkg/gui/context/commit_message_context.go +++ b/pkg/gui/context/commit_message_context.go @@ -1,6 +1,8 @@ package context import ( + "os" + "path/filepath" "strconv" "strings" @@ -8,8 +10,11 @@ import ( "github.com/jesseduffield/lazygit/pkg/gui/keybindings" "github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/spf13/afero" ) +const PreservedCommitMessageFileName = "LAZYGIT_PENDING_COMMIT" + type CommitMessageContext struct { c *ContextCommon types.Context @@ -33,8 +38,6 @@ type CommitMessageViewModel struct { // we remember the initial message so that we can tell whether we should preserve // the message; if it's still identical to the initial message, we don't initialMessage string - // the full preserved message (combined summary and description) - preservedMessage string // invoked when pressing enter in the commit message panel onConfirm func(string, string) error // invoked when pressing the switch-to-editor key binding @@ -75,16 +78,51 @@ func (self *CommitMessageContext) GetSelectedIndex() int { return self.viewModel.selectedindex } +func (self *CommitMessageContext) GetPreservedMessagePath() string { + return filepath.Join(self.c.Git().RepoPaths.WorktreeGitDirPath(), PreservedCommitMessageFileName) +} + func (self *CommitMessageContext) GetPreserveMessage() bool { return self.viewModel.preserveMessage } -func (self *CommitMessageContext) GetPreservedMessage() string { - return self.viewModel.preservedMessage +func (self *CommitMessageContext) getPreservedMessage() (string, error) { + buf, err := afero.ReadFile(self.c.Fs, self.GetPreservedMessagePath()) + if os.IsNotExist(err) { + return "", nil + } + if err != nil { + return "", err + } + return string(buf), nil } -func (self *CommitMessageContext) SetPreservedMessage(message string) { - self.viewModel.preservedMessage = message +func (self *CommitMessageContext) GetPreservedMessageAndLogError() string { + msg, err := self.getPreservedMessage() + if err != nil { + self.c.Log.Errorf("error when retrieving persisted commit message: %v", err) + } + return msg +} + +func (self *CommitMessageContext) setPreservedMessage(message string) error { + preservedFilePath := self.GetPreservedMessagePath() + + if len(message) == 0 { + err := self.c.Fs.Remove(preservedFilePath) + if os.IsNotExist(err) { + return nil + } + return err + } + + return afero.WriteFile(self.c.Fs, preservedFilePath, []byte(message), 0o644) +} + +func (self *CommitMessageContext) SetPreservedMessageAndLogError(message string) { + if err := self.setPreservedMessage(message); err != nil { + self.c.Log.Errorf("error when persisting commit message: %v", err) + } } func (self *CommitMessageContext) GetInitialMessage() string { diff --git a/pkg/gui/controllers/helpers/commits_helper.go b/pkg/gui/controllers/helpers/commits_helper.go index e66071b4d..9c89da706 100644 --- a/pkg/gui/controllers/helpers/commits_helper.go +++ b/pkg/gui/controllers/helpers/commits_helper.go @@ -113,7 +113,7 @@ func (self *CommitsHelper) UpdateCommitPanelView(message string) { } if self.c.Contexts().CommitMessage.GetPreserveMessage() { - preservedMessage := self.c.Contexts().CommitMessage.GetPreservedMessage() + preservedMessage := self.c.Contexts().CommitMessage.GetPreservedMessageAndLogError() self.SetMessageAndDescriptionInView(preservedMessage) return } @@ -156,7 +156,7 @@ func (self *CommitsHelper) OpenCommitMessagePanel(opts *OpenCommitMessagePanelOp func (self *CommitsHelper) OnCommitSuccess() { // if we have a preserved message we want to clear it on success if self.c.Contexts().CommitMessage.GetPreserveMessage() { - self.c.Contexts().CommitMessage.SetPreservedMessage("") + self.c.Contexts().CommitMessage.SetPreservedMessageAndLogError("") } } @@ -179,7 +179,7 @@ func (self *CommitsHelper) CloseCommitMessagePanel() { if self.c.Contexts().CommitMessage.GetPreserveMessage() { message := self.JoinCommitMessageAndUnwrappedDescription() if message != self.c.Contexts().CommitMessage.GetInitialMessage() { - self.c.Contexts().CommitMessage.SetPreservedMessage(message) + self.c.Contexts().CommitMessage.SetPreservedMessageAndLogError(message) } } else { self.SetMessageAndDescriptionInView("") diff --git a/pkg/gui/controllers/helpers/working_tree_helper.go b/pkg/gui/controllers/helpers/working_tree_helper.go index f010205f5..6f6e0eaab 100644 --- a/pkg/gui/controllers/helpers/working_tree_helper.go +++ b/pkg/gui/controllers/helpers/working_tree_helper.go @@ -149,7 +149,7 @@ func (self *WorkingTreeHelper) HandleWIPCommitPress() error { } func (self *WorkingTreeHelper) HandleCommitPress() error { - message := self.c.Contexts().CommitMessage.GetPreservedMessage() + message := self.c.Contexts().CommitMessage.GetPreservedMessageAndLogError() if message == "" { commitPrefixConfig := self.commitPrefixConfigForRepo()