diff options
-rw-r--r-- | docs/keybindings/Keybindings_en.md | 32 | ||||
-rw-r--r-- | docs/keybindings/Keybindings_nl.md | 6 | ||||
-rw-r--r-- | docs/keybindings/Keybindings_pl.md | 6 | ||||
-rw-r--r-- | pkg/commands/commit.go | 10 | ||||
-rw-r--r-- | pkg/commands/git.go | 6 | ||||
-rw-r--r-- | pkg/gui/commits_panel.go | 66 | ||||
-rw-r--r-- | pkg/gui/gui.go | 5 | ||||
-rw-r--r-- | pkg/gui/keybindings.go | 6 | ||||
-rw-r--r-- | pkg/i18n/dutch.go | 6 | ||||
-rw-r--r-- | pkg/i18n/english.go | 6 | ||||
-rw-r--r-- | pkg/i18n/polish.go | 6 |
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{ |