mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-06-19 00:28:03 +02:00
Construct arg vector manually rather than parse string
By constructing an arg vector manually, we no longer need to quote arguments Mandate that args must be passed when building a command Now you need to provide an args array when building a command. There are a handful of places where we need to deal with a string, such as with user-defined custom commands, and for those we now require that at the callsite they use str.ToArgv to do that. I don't want to provide a method out of the box for it because I want to discourage its use. For some reason we were invoking a command through a shell when amending a commit, and I don't believe we needed to do that as there was nothing user- supplied about the command. So I've switched to using a regular command out- side the shell there
This commit is contained in:
@ -1,8 +1,6 @@
|
||||
package helpers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/jesseduffield/lazygit/pkg/gui/context"
|
||||
"github.com/jesseduffield/lazygit/pkg/gui/modes/diffing"
|
||||
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
||||
@ -19,27 +17,29 @@ func NewDiffHelper(c *HelperCommon) *DiffHelper {
|
||||
}
|
||||
}
|
||||
|
||||
func (self *DiffHelper) DiffStr() string {
|
||||
output := self.c.Modes().Diffing.Ref
|
||||
func (self *DiffHelper) DiffArgs() []string {
|
||||
output := []string{self.c.Modes().Diffing.Ref}
|
||||
|
||||
right := self.currentDiffTerminal()
|
||||
if right != "" {
|
||||
output += " " + right
|
||||
output = append(output, right)
|
||||
}
|
||||
|
||||
if self.c.Modes().Diffing.Reverse {
|
||||
output += " -R"
|
||||
output = append(output, "-R")
|
||||
}
|
||||
|
||||
if self.c.State().GetIgnoreWhitespaceInDiffView() {
|
||||
output += " --ignore-all-space"
|
||||
output = append(output, "--ignore-all-space")
|
||||
}
|
||||
|
||||
output = append(output, "--")
|
||||
|
||||
file := self.currentlySelectedFilename()
|
||||
if file != "" {
|
||||
output += " -- " + file
|
||||
output = append(output, file)
|
||||
} else if self.c.Modes().Filtering.Active() {
|
||||
output += " -- " + self.c.Modes().Filtering.GetPath()
|
||||
output = append(output, self.c.Modes().Filtering.GetPath())
|
||||
}
|
||||
|
||||
return output
|
||||
@ -51,9 +51,7 @@ func (self *DiffHelper) ExitDiffMode() error {
|
||||
}
|
||||
|
||||
func (self *DiffHelper) RenderDiff() error {
|
||||
cmdObj := self.c.OS().Cmd.New(
|
||||
fmt.Sprintf("git diff --submodule --no-ext-diff --color %s", self.DiffStr()),
|
||||
)
|
||||
cmdObj := self.c.Git().Diff.DiffCmdObj(self.DiffArgs())
|
||||
task := types.NewRunPtyTask(cmdObj.GetCmd())
|
||||
|
||||
return self.c.RenderToMainViews(types.RefreshMainOpts{
|
||||
|
@ -21,11 +21,10 @@ func NewGpgHelper(c *HelperCommon) *GpgHelper {
|
||||
// WithWaitingStatus we get stuck there and can't return to lazygit. We could
|
||||
// fix this bug, or just stop running subprocesses from within there, given that
|
||||
// we don't need to see a loading status if we're in a subprocess.
|
||||
// TODO: we shouldn't need to use a shell here, but looks like that NewShell function contains some windows specific quoting stuff. We should centralise that.
|
||||
func (self *GpgHelper) WithGpgHandling(cmdObj oscommands.ICmdObj, waitingStatus string, onSuccess func() error) error {
|
||||
useSubprocess := self.c.Git().Config.UsingGpg()
|
||||
if useSubprocess {
|
||||
success, err := self.c.RunSubprocess(self.c.OS().Cmd.NewShell(cmdObj.ToString()))
|
||||
success, err := self.c.RunSubprocess(cmdObj)
|
||||
if success && onSuccess != nil {
|
||||
if err := onSuccess(); err != nil {
|
||||
return err
|
||||
@ -42,8 +41,6 @@ func (self *GpgHelper) WithGpgHandling(cmdObj oscommands.ICmdObj, waitingStatus
|
||||
}
|
||||
|
||||
func (self *GpgHelper) runAndStream(cmdObj oscommands.ICmdObj, waitingStatus string, onSuccess func() error) error {
|
||||
cmdObj = self.c.OS().Cmd.NewShell(cmdObj.ToString())
|
||||
|
||||
return self.c.WithWaitingStatus(waitingStatus, func() error {
|
||||
if err := cmdObj.StreamOutput().Run(); err != nil {
|
||||
_ = self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
|
||||
|
@ -2,6 +2,7 @@ package helpers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/jesseduffield/generics/slices"
|
||||
"github.com/jesseduffield/lazygit/pkg/commands/types/enums"
|
||||
@ -53,7 +54,7 @@ func (self *ModeHelper) Statuses() []ModeStatus {
|
||||
fmt.Sprintf(
|
||||
"%s %s",
|
||||
self.c.Tr.LcShowingGitDiff,
|
||||
"git diff "+self.diffHelper.DiffStr(),
|
||||
"git diff "+strings.Join(self.diffHelper.DiffArgs(), " "),
|
||||
),
|
||||
style.FgMagenta,
|
||||
)
|
||||
|
@ -288,7 +288,7 @@ func (self *LocalCommitsController) doRewordEditor() error {
|
||||
self.c.LogAction(self.c.Tr.Actions.RewordCommit)
|
||||
|
||||
if self.isHeadCommit() {
|
||||
return self.c.RunSubprocessAndRefresh(self.c.OS().Cmd.New("git commit --allow-empty --amend --only"))
|
||||
return self.c.RunSubprocessAndRefresh(self.c.Git().Commit.RewordLastCommitInEditorCmdObj())
|
||||
}
|
||||
|
||||
subProcess, err := self.c.Git().Rebase.RewordCommitInEditor(
|
||||
|
Reference in New Issue
Block a user