mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-01-10 04:07:18 +02:00
cd50c79ae4
There are two possible fixes for this bug, and they differ in behavior when rewording a commit. The one I chose here always splits at the first line feed, which means that for an improperly formatted commit message such as this one: This is a very long multi-line subject, which you shouldn't really use in git. And this is the body (we call it "description" in lazygit). we split after the first line instead of after the first paragraph. This is arguably not what the original author meant, but splitting after the first paragraph doesn't really work well in lazygit, because we would try to put both lines into the one-line subject field of the message panel, and you'd only see the second and not even know that there are more. The other potential fix would have been to join subject and description with two line feeds instead of one in JoinCommitMessageAndDescription; this would have fixed our bug in the same way, but would result in splitting the above message after the second line instead of the first. I think that's worse, so I decided for the first fix. While we're at it, simplify the code a little bit; strings.Cut is documented to return (s, "") when the separator is not found, so there's no need to do this on our side. We do have to trim spaces on the description now, to support the regular reword case where subject and body are separated by a blank line.
189 lines
4.8 KiB
Go
189 lines
4.8 KiB
Go
package helpers
|
|
|
|
import (
|
|
"path/filepath"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
|
"github.com/samber/lo"
|
|
)
|
|
|
|
type ICommitsHelper interface {
|
|
UpdateCommitPanelView(message string)
|
|
}
|
|
|
|
type CommitsHelper struct {
|
|
c *HelperCommon
|
|
|
|
getCommitSummary func() string
|
|
setCommitSummary func(string)
|
|
getCommitDescription func() string
|
|
setCommitDescription func(string)
|
|
}
|
|
|
|
var _ ICommitsHelper = &CommitsHelper{}
|
|
|
|
func NewCommitsHelper(
|
|
c *HelperCommon,
|
|
getCommitSummary func() string,
|
|
setCommitSummary func(string),
|
|
getCommitDescription func() string,
|
|
setCommitDescription func(string),
|
|
) *CommitsHelper {
|
|
return &CommitsHelper{
|
|
c: c,
|
|
getCommitSummary: getCommitSummary,
|
|
setCommitSummary: setCommitSummary,
|
|
getCommitDescription: getCommitDescription,
|
|
setCommitDescription: setCommitDescription,
|
|
}
|
|
}
|
|
|
|
func (self *CommitsHelper) SplitCommitMessageAndDescription(message string) (string, string) {
|
|
msg, description, _ := strings.Cut(message, "\n")
|
|
return msg, strings.TrimSpace(description)
|
|
}
|
|
|
|
func (self *CommitsHelper) SetMessageAndDescriptionInView(message string) {
|
|
summary, description := self.SplitCommitMessageAndDescription(message)
|
|
|
|
self.setCommitSummary(summary)
|
|
self.setCommitDescription(description)
|
|
self.c.Contexts().CommitMessage.RenderCommitLength()
|
|
}
|
|
|
|
func (self *CommitsHelper) JoinCommitMessageAndDescription() string {
|
|
if len(self.getCommitDescription()) == 0 {
|
|
return self.getCommitSummary()
|
|
}
|
|
return self.getCommitSummary() + "\n" + self.getCommitDescription()
|
|
}
|
|
|
|
func (self *CommitsHelper) SwitchToEditor() error {
|
|
if !self.c.Contexts().CommitMessage.CanSwitchToEditor() {
|
|
return nil
|
|
}
|
|
|
|
message := lo.Ternary(len(self.getCommitDescription()) == 0,
|
|
self.getCommitSummary(),
|
|
self.getCommitSummary()+"\n\n"+self.getCommitDescription())
|
|
filepath := filepath.Join(self.c.OS().GetTempDir(), self.c.Git().RepoPaths.RepoName(), time.Now().Format("Jan _2 15.04.05.000000000")+".msg")
|
|
err := self.c.OS().CreateFileWithContent(filepath, message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = self.CloseCommitMessagePanel()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return self.c.Contexts().CommitMessage.SwitchToEditor(filepath)
|
|
}
|
|
|
|
func (self *CommitsHelper) UpdateCommitPanelView(message string) {
|
|
if message != "" {
|
|
self.SetMessageAndDescriptionInView(message)
|
|
return
|
|
}
|
|
|
|
if self.c.Contexts().CommitMessage.GetPreserveMessage() {
|
|
preservedMessage := self.c.Contexts().CommitMessage.GetPreservedMessage()
|
|
self.SetMessageAndDescriptionInView(preservedMessage)
|
|
return
|
|
}
|
|
|
|
self.SetMessageAndDescriptionInView("")
|
|
}
|
|
|
|
type OpenCommitMessagePanelOpts struct {
|
|
CommitIndex int
|
|
SummaryTitle string
|
|
DescriptionTitle string
|
|
PreserveMessage bool
|
|
OnConfirm func(summary string, description string) error
|
|
OnSwitchToEditor func(string) error
|
|
InitialMessage string
|
|
}
|
|
|
|
func (self *CommitsHelper) OpenCommitMessagePanel(opts *OpenCommitMessagePanelOpts) error {
|
|
onConfirm := func(summary string, description string) error {
|
|
if err := self.CloseCommitMessagePanel(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return opts.OnConfirm(summary, description)
|
|
}
|
|
|
|
self.c.Contexts().CommitMessage.SetPanelState(
|
|
opts.CommitIndex,
|
|
opts.SummaryTitle,
|
|
opts.DescriptionTitle,
|
|
opts.PreserveMessage,
|
|
onConfirm,
|
|
opts.OnSwitchToEditor,
|
|
)
|
|
|
|
self.UpdateCommitPanelView(opts.InitialMessage)
|
|
|
|
return self.pushCommitMessageContexts()
|
|
}
|
|
|
|
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("")
|
|
}
|
|
}
|
|
|
|
func (self *CommitsHelper) HandleCommitConfirm() error {
|
|
summary, description := self.getCommitSummary(), self.getCommitDescription()
|
|
|
|
if summary == "" {
|
|
return self.c.ErrorMsg(self.c.Tr.CommitWithoutMessageErr)
|
|
}
|
|
|
|
err := self.c.Contexts().CommitMessage.OnConfirm(summary, description)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (self *CommitsHelper) CloseCommitMessagePanel() error {
|
|
if self.c.Contexts().CommitMessage.GetPreserveMessage() {
|
|
message := self.JoinCommitMessageAndDescription()
|
|
|
|
self.c.Contexts().CommitMessage.SetPreservedMessage(message)
|
|
} else {
|
|
self.SetMessageAndDescriptionInView("")
|
|
}
|
|
|
|
self.c.Contexts().CommitMessage.SetHistoryMessage("")
|
|
|
|
return self.PopCommitMessageContexts()
|
|
}
|
|
|
|
func (self *CommitsHelper) PopCommitMessageContexts() error {
|
|
return self.c.RemoveContexts(self.commitMessageContexts())
|
|
}
|
|
|
|
func (self *CommitsHelper) pushCommitMessageContexts() error {
|
|
for _, context := range self.commitMessageContexts() {
|
|
if err := self.c.PushContext(context); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (self *CommitsHelper) commitMessageContexts() []types.Context {
|
|
return []types.Context{
|
|
self.c.Contexts().CommitDescription,
|
|
self.c.Contexts().CommitMessage,
|
|
}
|
|
}
|