summaryrefslogtreecommitdiffstats
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
parent1a933eaa731e910cc22e361b93cba8fd5603016f (diff)
add feature of display diff between specific commits #397
-rw-r--r--docs/keybindings/Keybindings_en.md32
-rw-r--r--docs/keybindings/Keybindings_nl.md6
-rw-r--r--docs/keybindings/Keybindings_pl.md6
-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
11 files changed, 131 insertions, 24 deletions
diff --git a/docs/keybindings/Keybindings_en.md b/docs/keybindings/Keybindings_en.md
index 9d9d1471e..3f393610d 100644
--- a/docs/keybindings/Keybindings_en.md
+++ b/docs/keybindings/Keybindings_en.md
@@ -25,16 +25,15 @@
<kbd>A</kbd>: amend last commit
<kbd>C</kbd>: commit changes using git editor
<kbd>space</kbd>: toggle staged
- <kbd>d</kbd>: delete if untracked / checkout if tracked
+ <kbd>d</kbd>: view 'discard changes' options
<kbd>e</kbd>: edit file
<kbd>o</kbd>: open file
<kbd>i</kbd>: add to .gitignore
<kbd>r</kbd>: refresh files
<kbd>S</kbd>: stash files
- <kbd>s</kbd>: soft reset to last commit
<kbd>a</kbd>: stage/unstage all
<kbd>t</kbd>: add patch
- <kbd>D</kbd>: reset hard and remove untracked files
+ <kbd>D</kbd>: view reset options
<kbd>enter</kbd>: stage individual hunks/lines
<kbd>f</kbd>: fetch
</pre>
@@ -72,6 +71,7 @@
<kbd>C</kbd>: copy commit range (cherry-pick)
<kbd>v</kbd>: paste commits (cherry-pick)
<kbd>enter</kbd>: view commit's files
+ <kbd>space</kbd>: diff specific commits
</pre>
## Stash
@@ -91,19 +91,6 @@
<kbd>o</kbd>: open file
</pre>
-## Main (Merging)
-
-<pre>
- <kbd>esc</kbd>: return to files panel
- <kbd>space</kbd>: pick hunk
- <kbd>b</kbd>: pick both hunks
- <kbd>◄</kbd>: select previous conflict
- <kbd>►</kbd>: select next conflict
- <kbd>▲</kbd>: select top hunk
- <kbd>▼</kbd>: select bottom hunk
- <kbd>z</kbd>: undo
-</pre>
-
## Main (Normal)
<pre>
@@ -122,3 +109,16 @@
<kbd>space</kbd>: stage line
<kbd>a</kbd>: stage hunk
</pre>
+
+## Main (Merging)
+
+<pre>
+ <kbd>esc</kbd>: return to files panel
+ <kbd>space</kbd>: pick hunk
+ <kbd>b</kbd>: pick both hunks
+ <kbd>◄</kbd>: select previous conflict
+ <kbd>►</kbd>: select next conflict
+ <kbd>▲</kbd>: select top hunk
+ <kbd>▼</kbd>: select bottom hunk
+ <kbd>z</kbd>: undo
+</pre>
diff --git a/docs/keybindings/Keybindings_nl.md b/docs/keybindings/Keybindings_nl.md
index dfa45df2c..3b5f250ec 100644
--- a/docs/keybindings/Keybindings_nl.md
+++ b/docs/keybindings/Keybindings_nl.md
@@ -25,16 +25,15 @@
<kbd>A</kbd>: wijzig laatste commit
<kbd>C</kbd>: commit veranderingen met de git editor
<kbd>space</kbd>: toggle staged
- <kbd>d</kbd>: Verwijder als untracked / uitchecken wordt gevolgd (ga weg)
+ <kbd>d</kbd>: view 'discard changes' options
<kbd>e</kbd>: verander bestand
<kbd>o</kbd>: open bestand
<kbd>i</kbd>: voeg toe aan .gitignore
<kbd>r</kbd>: refresh bestanden
<kbd>S</kbd>: stash-bestanden
- <kbd>s</kbd>: soft reset to last commit
<kbd>a</kbd>: toggle staged alle
<kbd>t</kbd>: bewerkingen toevoegen
- <kbd>D</kbd>: harde reset and verwijderen ongevolgde bestanden
+ <kbd>D</kbd>: view reset options
<kbd>enter</kbd>: stage individuele hunks/lijnen
<kbd>f</kbd>: fetch
</pre>
@@ -72,6 +71,7 @@
<kbd>C</kbd>: copy commit range (cherry-pick)
<kbd>v</kbd>: paste commits (cherry-pick)
<kbd>enter</kbd>: view commit's files
+ <kbd>space</kbd>: diff specific commits
</pre>
## Stash
diff --git a/docs/keybindings/Keybindings_pl.md b/docs/keybindings/Keybindings_pl.md
index 9e60e9657..f4394af58 100644
--- a/docs/keybindings/Keybindings_pl.md
+++ b/docs/keybindings/Keybindings_pl.md
@@ -25,16 +25,15 @@
<kbd>A</kbd>: zmień ostatnie zatwierdzenie
<kbd>C</kbd>: commituj zmiany używając edytora z gita
<kbd>space</kbd>: przełącz zatwierdzenie
- <kbd>d</kbd>: usuń jeśli nie śledzony / przełącz jeśli śledzony
+ <kbd>d</kbd>: view 'discard changes' options
<kbd>e</kbd>: edytuj plik
<kbd>o</kbd>: otwórz plik
<kbd>i</kbd>: dodaj do .gitignore
<kbd>r</kbd>: odśwież pliki
<kbd>S</kbd>: przechowaj pliki
- <kbd>s</kbd>: soft reset to last commit
<kbd>a</kbd>: przełącz wszystkie zatwierdzenia
<kbd>t</kbd>: dodaj łatkę
- <kbd>D</kbd>: zresetuj twardo i usuń niepotwierdzone pliki
+ <kbd>D</kbd>: view reset options
<kbd>enter</kbd>: zatwierdź pojedyncze linie
<kbd>f</kbd>: fetch
</pre>
@@ -72,6 +71,7 @@
<kbd>C</kbd>: copy commit range (cherry-pick)
<kbd>v</kbd>: paste commits (cherry-pick)
<kbd>enter</kbd>: view commit's files
+ <kbd>space</kbd>: diff specific commits
</pre>
## Schowek
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{