1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-05-19 22:33:16 +02:00

Implement reboot-resistant commit message persistence

This commit is contained in:
AzraelSec 2025-01-21 00:39:24 +01:00 committed by Stefan Haller
parent fcf30caf40
commit a32be7e9fa
3 changed files with 48 additions and 10 deletions

View File

@ -1,6 +1,8 @@
package context package context
import ( import (
"os"
"path/filepath"
"strconv" "strconv"
"strings" "strings"
@ -8,8 +10,11 @@ import (
"github.com/jesseduffield/lazygit/pkg/gui/keybindings" "github.com/jesseduffield/lazygit/pkg/gui/keybindings"
"github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/jesseduffield/lazygit/pkg/gui/types"
"github.com/jesseduffield/lazygit/pkg/utils" "github.com/jesseduffield/lazygit/pkg/utils"
"github.com/spf13/afero"
) )
const PreservedCommitMessageFileName = "LAZYGIT_PENDING_COMMIT"
type CommitMessageContext struct { type CommitMessageContext struct {
c *ContextCommon c *ContextCommon
types.Context types.Context
@ -33,8 +38,6 @@ type CommitMessageViewModel struct {
// we remember the initial message so that we can tell whether we should preserve // 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 // the message; if it's still identical to the initial message, we don't
initialMessage string initialMessage string
// the full preserved message (combined summary and description)
preservedMessage string
// invoked when pressing enter in the commit message panel // invoked when pressing enter in the commit message panel
onConfirm func(string, string) error onConfirm func(string, string) error
// invoked when pressing the switch-to-editor key binding // invoked when pressing the switch-to-editor key binding
@ -75,16 +78,51 @@ func (self *CommitMessageContext) GetSelectedIndex() int {
return self.viewModel.selectedindex return self.viewModel.selectedindex
} }
func (self *CommitMessageContext) GetPreservedMessagePath() string {
return filepath.Join(self.c.Git().RepoPaths.WorktreeGitDirPath(), PreservedCommitMessageFileName)
}
func (self *CommitMessageContext) GetPreserveMessage() bool { func (self *CommitMessageContext) GetPreserveMessage() bool {
return self.viewModel.preserveMessage return self.viewModel.preserveMessage
} }
func (self *CommitMessageContext) GetPreservedMessage() string { func (self *CommitMessageContext) getPreservedMessage() (string, error) {
return self.viewModel.preservedMessage 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) { func (self *CommitMessageContext) GetPreservedMessageAndLogError() string {
self.viewModel.preservedMessage = message 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 { func (self *CommitMessageContext) GetInitialMessage() string {

View File

@ -113,7 +113,7 @@ func (self *CommitsHelper) UpdateCommitPanelView(message string) {
} }
if self.c.Contexts().CommitMessage.GetPreserveMessage() { if self.c.Contexts().CommitMessage.GetPreserveMessage() {
preservedMessage := self.c.Contexts().CommitMessage.GetPreservedMessage() preservedMessage := self.c.Contexts().CommitMessage.GetPreservedMessageAndLogError()
self.SetMessageAndDescriptionInView(preservedMessage) self.SetMessageAndDescriptionInView(preservedMessage)
return return
} }
@ -156,7 +156,7 @@ func (self *CommitsHelper) OpenCommitMessagePanel(opts *OpenCommitMessagePanelOp
func (self *CommitsHelper) OnCommitSuccess() { func (self *CommitsHelper) OnCommitSuccess() {
// if we have a preserved message we want to clear it on success // if we have a preserved message we want to clear it on success
if self.c.Contexts().CommitMessage.GetPreserveMessage() { 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() { if self.c.Contexts().CommitMessage.GetPreserveMessage() {
message := self.JoinCommitMessageAndUnwrappedDescription() message := self.JoinCommitMessageAndUnwrappedDescription()
if message != self.c.Contexts().CommitMessage.GetInitialMessage() { if message != self.c.Contexts().CommitMessage.GetInitialMessage() {
self.c.Contexts().CommitMessage.SetPreservedMessage(message) self.c.Contexts().CommitMessage.SetPreservedMessageAndLogError(message)
} }
} else { } else {
self.SetMessageAndDescriptionInView("") self.SetMessageAndDescriptionInView("")

View File

@ -149,7 +149,7 @@ func (self *WorkingTreeHelper) HandleWIPCommitPress() error {
} }
func (self *WorkingTreeHelper) HandleCommitPress() error { func (self *WorkingTreeHelper) HandleCommitPress() error {
message := self.c.Contexts().CommitMessage.GetPreservedMessage() message := self.c.Contexts().CommitMessage.GetPreservedMessageAndLogError()
if message == "" { if message == "" {
commitPrefixConfig := self.commitPrefixConfigForRepo() commitPrefixConfig := self.commitPrefixConfigForRepo()