summaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorskanehira <sho19921005@gmail.com>2019-03-23 22:46:08 +0900
committerJesse Duffield <jessedduffield@gmail.com>2019-04-06 13:02:20 +1100
commitc350cdba4337fa8961e5fbe16e70d73fae7ccc20 (patch)
treed0445a56f0d964f6d50f200042851ec8b3c02e7f /pkg
parent1a933eaa731e910cc22e361b93cba8fd5603016f (diff)
add feature of display diff between specific commits #397
Diffstat (limited to 'pkg')
-rw-r--r--pkg/commands/commit.go10
-rw-r--r--pkg/commands/git.go6
-rw-r--r--pkg/gui/commits_panel.go66
-rw-r--r--pkg/gui/gui.go5
-rw-r--r--pkg/gui/keybindings.go6
-rw-r--r--pkg/i18n/dutch.go6
-rw-r--r--pkg/i18n/english.go6
-rw-r--r--pkg/i18n/polish.go6
8 files changed, 109 insertions, 2 deletions
diff --git a/pkg/commands/commit.go b/pkg/commands/commit.go
index 4253a5495..8f23ca001 100644
--- a/pkg/commands/commit.go
+++ b/pkg/commands/commit.go
@@ -13,6 +13,7 @@ type Commit struct {
DisplayString string
Action string // one of "", "pick", "edit", "squash", "reword", "drop", "fixup"
Copied bool // to know if this commit is ready to be cherry-picked somewhere
+ Selected bool
}
// GetDisplayStrings is a function.
@@ -52,5 +53,12 @@ func (c *Commit) GetDisplayStrings(isFocused bool) []string {
actionString = cyan.Sprint(utils.WithPadding(c.Action, 7)) + " "
}
- return []string{shaColor.Sprint(c.Sha), actionString + white.Sprint(c.Name)}
+ name := ""
+ if c.Selected {
+ name = color.New(color.FgMagenta).Sprint(c.Name)
+ } else {
+ name = white.Sprint(c.Name)
+ }
+
+ return []string{shaColor.Sprint(c.Sha), actionString + name}
}
diff --git a/pkg/commands/git.go b/pkg/commands/git.go
index 1b798990c..afd18dee7 100644
--- a/pkg/commands/git.go
+++ b/pkg/commands/git.go
@@ -910,3 +910,9 @@ func (c *GitCommand) ResetHardHead() error {
func (c *GitCommand) ResetSoftHead() error {
return c.OSCommand.RunCommand("git reset --soft HEAD")
}
+
+// DiffCommits show diff between commits
+func (c *GitCommand) DiffCommits(sha1, sha2 string) (string, error) {
+ cmd := fmt.Sprintf("git diff --color %s %s", sha1, sha2)
+ return c.OSCommand.RunCommandWithOutput(cmd)
+}
diff --git a/pkg/gui/commits_panel.go b/pkg/gui/commits_panel.go
index 1bd8be4a1..0d3dd6e84 100644
--- a/pkg/gui/commits_panel.go
+++ b/pkg/gui/commits_panel.go
@@ -39,6 +39,12 @@ func (gui *Gui) handleCommitSelect(g *gocui.Gui, v *gocui.View) error {
if err := gui.focusPoint(0, gui.State.Panels.Commits.SelectedLine, len(gui.State.Commits), v); err != nil {
return err
}
+
+ // if specific diff mode is on, don't show diff
+ if gui.State.Panels.Commits.SpecificDiffMode {
+ return nil
+ }
+
commitText, err := gui.GitCommand.Show(commit.Sha)
if err != nil {
return err
@@ -56,6 +62,13 @@ func (gui *Gui) refreshCommits(g *gocui.Gui) error {
if err != nil {
return err
}
+
+ for _, commit := range commits {
+ if _, has := gui.State.DiffEntries[commit.Sha]; has {
+ commit.Selected = true
+ }
+ }
+
gui.State.Commits = commits
gui.refreshSelectedLine(&gui.State.Panels.Commits.SelectedLine, len(gui.State.Commits))
@@ -448,3 +461,56 @@ func (gui *Gui) handleSwitchToCommitFilesPanel(g *gocui.Gui, v *gocui.View) erro
return gui.switchFocus(g, v, gui.getCommitFilesView())
}
+
+func (gui *Gui) handleToggleDiffCommit(g *gocui.Gui, v *gocui.View) error {
+ selectLimit := 2
+
+ // get selected commit
+ commit := gui.getSelectedCommit(g)
+ if commit == nil {
+ return gui.renderString(g, "main", gui.Tr.SLocalize("NoCommitsThisBranch"))
+ }
+
+ // if already selected commit delete
+ if _, has := gui.State.DiffEntries[commit.Sha]; has {
+ delete(gui.State.DiffEntries, commit.Sha)
+ gui.setDiffMode()
+ } else {
+ if len(gui.State.DiffEntries) == selectLimit {
+ return gui.createErrorPanel(gui.g, "you have already selected two commit, please deselect one of two")
+ }
+ gui.State.DiffEntries[commit.Sha] = commit
+ gui.setDiffMode()
+ }
+
+ // if selected tow commits, display diff between
+ if len(gui.State.DiffEntries) == selectLimit {
+ var entries []string
+ for _, entry := range gui.State.DiffEntries {
+ entries = append(entries, entry.Sha)
+ }
+
+ commitText, err := gui.GitCommand.DiffCommits(entries[0], entries[1])
+
+ if err != nil {
+ return gui.createErrorPanel(gui.g, err.Error())
+ }
+
+ return gui.renderString(g, "main", commitText)
+ }
+
+ return nil
+}
+
+func (gui *Gui) setDiffMode() {
+ v := gui.getCommitsView()
+ if len(gui.State.DiffEntries) != 0 {
+ gui.State.Panels.Commits.SpecificDiffMode = true
+ v.Title = gui.Tr.SLocalize("CommitsDiffTitle")
+ } else {
+ gui.State.Panels.Commits.SpecificDiffMode = false
+ v.Title = gui.Tr.SLocalize("CommitsTitle")
+ }
+
+ gui.refreshCommits(gui.g)
+}
diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go
index 07d51e2bc..f6cdd093d 100644
--- a/pkg/gui/gui.go
+++ b/pkg/gui/gui.go
@@ -103,7 +103,8 @@ type branchPanelState struct {
}
type commitPanelState struct {
- SelectedLine int
+ SelectedLine int
+ SpecificDiffMode bool
}
type stashPanelState struct {
@@ -135,6 +136,7 @@ type guiState struct {
Commits []*commands.Commit
StashEntries []*commands.StashEntry
CommitFiles []*commands.CommitFile
+ DiffEntries map[string]*commands.Commit
MenuItemCount int // can't store the actual list because it's of interface{} type
PreviousView string
Platform commands.Platform
@@ -154,6 +156,7 @@ func NewGui(log *logrus.Entry, gitCommand *commands.GitCommand, oSCommand *comma
Commits: make([]*commands.Commit, 0),
CherryPickedCommits: make([]*commands.Commit, 0),
StashEntries: make([]*commands.StashEntry, 0),
+ DiffEntries: make(map[string]*commands.Commit),
Platform: *oSCommand.Platform,
Panels: &panelStates{
Files: &filePanelState{SelectedLine: -1},
diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go
index 518575550..28a60d473 100644
--- a/pkg/gui/keybindings.go
+++ b/pkg/gui/keybindings.go
@@ -389,6 +389,12 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
Handler: gui.handleSwitchToCommitFilesPanel,
Description: gui.Tr.SLocalize("viewCommitFiles"),
}, {
+ ViewName: "commits",
+ Key: gocui.KeySpace,
+ Modifier: gocui.ModNone,
+ Handler: gui.handleToggleDiffCommit,
+ Description: gui.Tr.SLocalize("CommitsDiff"),
+ }, {
ViewName: "stash",
Key: gocui.KeySpace,
Modifier: gocui.ModNone,
diff --git a/pkg/i18n/dutch.go b/pkg/i18n/dutch.go
index 8e0f6ce3b..c87f93c9b 100644
--- a/pkg/i18n/dutch.go
+++ b/pkg/i18n/dutch.go
@@ -29,6 +29,12 @@ func addDutch(i18nObject *i18n.Bundle) error {
ID: "CommitsTitle",
Other: "Commits",
}, &i18n.Message{
+ ID: "CommitsDiffTitle",
+ Other: "Commits(specific diff mode)",
+ }, &i18n.Message{
+ ID: "CommitsDiff",
+ Other: "diff specific commits",
+ }, &i18n.Message{
ID: "StashTitle",
Other: "Stash",
}, &i18n.Message{
diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go
index 397c262a2..c5fd61924 100644
--- a/pkg/i18n/english.go
+++ b/pkg/i18n/english.go
@@ -37,6 +37,12 @@ func addEnglish(i18nObject *i18n.Bundle) error {
ID: "CommitsTitle",
Other: "Commits",
}, &i18n.Message{
+ ID: "CommitsDiffTitle",
+ Other: "Commits(specific diff mode)",
+ }, &i18n.Message{
+ ID: "CommitsDiff",
+ Other: "diff specific commits",
+ }, &i18n.Message{
ID: "StashTitle",
Other: "Stash",
}, &i18n.Message{
diff --git a/pkg/i18n/polish.go b/pkg/i18n/polish.go
index e6d09eafb..cf9d7abf5 100644
--- a/pkg/i18n/polish.go
+++ b/pkg/i18n/polish.go
@@ -27,6 +27,12 @@ func addPolish(i18nObject *i18n.Bundle) error {
ID: "CommitsTitle",
Other: "Commity",
}, &i18n.Message{
+ ID: "CommitsDiffTitle",
+ Other: "Commits(specific diff mode)",
+ }, &i18n.Message{
+ ID: "CommitsDiff",
+ Other: "diff specific commits",
+ }, &i18n.Message{
ID: "StashTitle",
Other: "Schowek",
}, &i18n.Message{