Skip to content

Commit

Permalink
Add command to open git difftool
Browse files Browse the repository at this point in the history
  • Loading branch information
stefanhaller committed Dec 22, 2023
1 parent 1b9ec88 commit da03ab2
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 0 deletions.
11 changes: 11 additions & 0 deletions pkg/commands/git_commands/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"strings"

"github.com/go-errors/errors"
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
"github.com/jesseduffield/lazygit/pkg/config"
"github.com/jesseduffield/lazygit/pkg/utils"
)
Expand Down Expand Up @@ -164,3 +165,13 @@ func (self *FileCommands) guessDefaultEditor() string {

return editor
}

func (self *FileCommands) OpenDiffToolCmdObj(fromCommit string, toCommit string, reverse bool, filename string, isDirectory bool) oscommands.ICmdObj {
return self.cmd.New(NewGitCmd("difftool").
Arg("--no-prompt").
ArgIf(isDirectory, "--dir-diff").
Arg(fromCommit, toCommit).
ArgIf(reverse, "-R").
Arg("--", filename).
ToArgv())
}
13 changes: 13 additions & 0 deletions pkg/commands/git_commands/working_tree.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,19 @@ func NewWorkingTreeCommands(
}
}

func (self *WorkingTreeCommands) OpenDiffToolCmdObj(
fromCommit string, reverse bool, filename string, isDirectory bool, staged bool,
) oscommands.ICmdObj {
return self.cmd.New(NewGitCmd("difftool").
Arg("--no-prompt").
ArgIf(isDirectory, "--dir-diff").
ArgIf(staged, "--cached").
ArgIf(len(fromCommit) > 0, fromCommit).
ArgIf(reverse, "-R").
Arg("--", filename).
ToArgv())
}

func (self *WorkingTreeCommands) OpenMergeToolCmdObj() oscommands.ICmdObj {
return self.cmd.New(NewGitCmd("mergetool").ToArgv())
}
Expand Down
2 changes: 2 additions & 0 deletions pkg/config/user_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,7 @@ type KeybindingUniversalConfig struct {
ToggleWhitespaceInDiffView string `yaml:"toggleWhitespaceInDiffView"`
IncreaseContextInDiffView string `yaml:"increaseContextInDiffView"`
DecreaseContextInDiffView string `yaml:"decreaseContextInDiffView"`
OpenDiffTool string `yaml:"openDiffTool"`
}

type KeybindingStatusConfig struct {
Expand Down Expand Up @@ -743,6 +744,7 @@ func GetDefaultConfig() *UserConfig {
ToggleWhitespaceInDiffView: "<c-w>",
IncreaseContextInDiffView: "}",
DecreaseContextInDiffView: "{",
OpenDiffTool: "<c-t>",
},
Status: KeybindingStatusConfig{
CheckForUpdate: "u",
Expand Down
13 changes: 13 additions & 0 deletions pkg/gui/controllers/basic_commits_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,11 @@ func (self *BasicCommitsController) GetKeybindings(opts types.KeybindingsOpts) [
Handler: self.c.Helpers().CherryPick.Reset,
Description: self.c.Tr.ResetCherryPick,
},
{
Key: opts.GetKey(opts.Config.Universal.OpenDiffTool),
Handler: self.checkSelected(self.openDiffTool),
Description: self.c.Tr.OpenDiffTool,
},
}

return bindings
Expand Down Expand Up @@ -251,3 +256,11 @@ func (self *BasicCommitsController) copy(commit *models.Commit) error {
func (self *BasicCommitsController) copyRange(*models.Commit) error {
return self.c.Helpers().CherryPick.CopyRange(self.context.GetSelectedLineIdx(), self.context.GetCommits(), self.context)
}

func (self *BasicCommitsController) openDiffTool(commit *models.Commit) error {
to := commit.RefName()
from, reverse := self.c.Modes().Diffing.GetFromAndReverseArgsForDiff(commit.ParentRefName())
_, err := self.c.RunSubprocess(self.c.Git().File.OpenDiffToolCmdObj(
from, to, reverse, ".", true))
return err
}
14 changes: 14 additions & 0 deletions pkg/gui/controllers/commits_files_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ func (self *CommitFilesController) GetKeybindings(opts types.KeybindingsOpts) []
Handler: self.checkSelected(self.edit),
Description: self.c.Tr.EditFile,
},
{
Key: opts.GetKey(opts.Config.Universal.OpenDiffTool),
Handler: self.checkSelected(self.openDiffTool),
Description: self.c.Tr.OpenDiffTool,
},
{
Key: opts.GetKey(opts.Config.Universal.Select),
Handler: self.checkSelected(self.toggleForPatch),
Expand Down Expand Up @@ -201,6 +206,15 @@ func (self *CommitFilesController) edit(node *filetree.CommitFileNode) error {
return self.c.Helpers().Files.EditFile(node.GetPath())
}

func (self *CommitFilesController) openDiffTool(node *filetree.CommitFileNode) error {
ref := self.context().GetRef()
to := ref.RefName()
from, reverse := self.c.Modes().Diffing.GetFromAndReverseArgsForDiff(ref.ParentRefName())
_, err := self.c.RunSubprocess(self.c.Git().File.OpenDiffToolCmdObj(
from, to, reverse, node.GetPath(), !node.IsFile()))
return err
}

func (self *CommitFilesController) toggleForPatch(node *filetree.CommitFileNode) error {
toggle := func() error {
return self.c.WithWaitingStatus(self.c.Tr.UpdatingPatch, func(gocui.Task) error {
Expand Down
18 changes: 18 additions & 0 deletions pkg/gui/controllers/files_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,11 @@ func (self *FilesController) GetKeybindings(opts types.KeybindingsOpts) []*types
Handler: self.toggleTreeView,
Description: self.c.Tr.ToggleTreeView,
},
{
Key: opts.GetKey(opts.Config.Universal.OpenDiffTool),
Handler: self.checkSelectedFileNode(self.openDiffTool),
Description: self.c.Tr.OpenDiffTool,
},
{
Key: opts.GetKey(opts.Config.Files.OpenMergeTool),
Handler: self.c.Helpers().WorkingTree.OpenMergeTool,
Expand Down Expand Up @@ -684,6 +689,19 @@ func (self *FilesController) Open() error {
return self.c.Helpers().Files.OpenFile(node.GetPath())
}

func (self *FilesController) openDiffTool(node *filetree.FileNode) error {
fromCommit := ""
reverse := false
if self.c.Modes().Diffing.Active() {
fromCommit = self.c.Modes().Diffing.Ref
reverse = self.c.Modes().Diffing.Reverse
}
return self.c.RunSubprocessAndRefresh(
self.c.Git().WorkingTree.OpenDiffToolCmdObj(
fromCommit, reverse, node.Path, !node.IsFile(), !node.GetHasUnstagedChanges()),
)
}

func (self *FilesController) switchToMerge() error {
file := self.getSelectedFile()
if file == nil {
Expand Down
4 changes: 4 additions & 0 deletions pkg/i18n/english.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ type TranslationSet struct {
ToggleStaged string
ToggleStagedAll string
ToggleTreeView string
OpenDiffTool string
OpenMergeTool string
Refresh string
Push string
Expand Down Expand Up @@ -776,6 +777,7 @@ type Actions struct {
Undo string
Redo string
CopyPullRequestURL string
OpenDiffTool string
OpenMergeTool string
OpenCommitInBrowser string
OpenPullRequest string
Expand Down Expand Up @@ -856,6 +858,7 @@ func EnglishTranslationSet() TranslationSet {
ToggleStaged: "Toggle staged",
ToggleStagedAll: "Stage/unstage all",
ToggleTreeView: "Toggle file tree view",
OpenDiffTool: "Open external diff tool (git difftool)",
OpenMergeTool: "Open external merge tool (git mergetool)",
Refresh: "Refresh",
Push: "Push",
Expand Down Expand Up @@ -1546,6 +1549,7 @@ func EnglishTranslationSet() TranslationSet {
Undo: "Undo",
Redo: "Redo",
CopyPullRequestURL: "Copy pull request URL",
OpenDiffTool: "Open diff tool",
OpenMergeTool: "Open merge tool",
OpenCommitInBrowser: "Open commit in browser",
OpenPullRequest: "Open pull request in browser",
Expand Down

0 comments on commit da03ab2

Please sign in to comment.