summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2018-09-25 20:11:36 +1000
committerJesse Duffield <jessedduffield@gmail.com>2018-09-25 20:11:36 +1000
commit0d33a746ba679a2ca23066aa9bea3305506aae14 (patch)
tree5d6ceaa5334f421fa72cfa1214e19985ae9cfdb2
parentf3fc98a3d03756ec94bcad955eda268fddb3613a (diff)
parent17d7bcdeafe35d60dd4ebb553a6c46a716e5df92 (diff)
Merge branch 'feature/informative-commit-colors' of https://github.com/jesseduffield/lazygit into feature/informative-commit-colors
-rw-r--r--Gopkg.lock4
-rw-r--r--README.md5
-rw-r--r--go.mod2
-rw-r--r--pkg/commands/git.go12
-rw-r--r--pkg/commands/git_test.go179
-rw-r--r--pkg/gui/commit_message_panel.go4
-rw-r--r--pkg/gui/commits_panel.go5
-rw-r--r--pkg/gui/status_panel.go19
-rw-r--r--pkg/gui/view_helpers.go13
-rw-r--r--pkg/utils/utils.go10
-rw-r--r--pkg/utils/utils_test.go35
-rwxr-xr-xtest/repos/lots_of_diffs.sh35
-rw-r--r--vendor/github.com/jesseduffield/gocui/view.go4
13 files changed, 188 insertions, 139 deletions
diff --git a/Gopkg.lock b/Gopkg.lock
index 540b26052..4b84d6537 100644
--- a/Gopkg.lock
+++ b/Gopkg.lock
@@ -189,11 +189,11 @@
[[projects]]
branch = "master"
- digest = "1:d6df25dee1274e63c25f84c257bc504359f975dedb791eec7a5b51992146bb76"
+ digest = "1:66bb9b4a5abb704642fccba52a84a7f7feef2d9623f87b700e52a6695044723f"
name = "github.com/jesseduffield/gocui"
packages = ["."]
pruneopts = "NUT"
- revision = "4fca348422d8b6136e801b222858204a35ee369a"
+ revision = "03e26ff3f1de2c1bc2205113c3aba661312eee00"
[[projects]]
branch = "master"
diff --git a/README.md b/README.md
index 4f40e8f8e..e20de5900 100644
--- a/README.md
+++ b/README.md
@@ -121,6 +121,11 @@ For contributor discussion about things not better discussed here in the repo, j
[![Slack](/docs/resources/slack_rgb.png)](https://join.slack.com/t/lazygit/shared_invite/enQtNDE3MjIwNTYyMDA0LTM3Yjk3NzdiYzhhNTA1YjM4Y2M4MWNmNDBkOTI0YTE4YjQ1ZmI2YWRhZTgwNjg2YzhhYjg3NDBlMmQyMTI5N2M)
+## Donate
+If you would like to support the development of lazygit, please donate
+
+[![Donate](https://d1iczxrky3cnb2.cloudfront.net/button-medium-blue.png)](https://donorbox.org/lazygit)
+
## Work in progress
This is still a work in progress so there's still bugs to iron out and as this
is my first project in Go the code could no doubt use an increase in quality,
diff --git a/go.mod b/go.mod
index 61692f46e..bfa4f7cf4 100644
--- a/go.mod
+++ b/go.mod
@@ -18,7 +18,7 @@ require (
github.com/heroku/rollrus v0.0.0-20180515183152-fc0cef2ff331
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99
github.com/jesseduffield/go-getter v0.0.0-20180822080847-906e15686e63
- github.com/jesseduffield/gocui v0.0.0-20180919095827-4fca348422d8
+ github.com/jesseduffield/gocui v0.0.0-20180921065632-03e26ff3f1de
github.com/jesseduffield/termbox-go v0.0.0-20180919093808-1e272ff78dcb
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8
github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1
diff --git a/pkg/commands/git.go b/pkg/commands/git.go
index 0bfbc36a7..4d132237f 100644
--- a/pkg/commands/git.go
+++ b/pkg/commands/git.go
@@ -543,26 +543,22 @@ func (c *GitCommand) Ignore(filename string) error {
}
// Show shows the diff of a commit
-func (c *GitCommand) Show(sha string) string {
- result, err := c.OSCommand.RunCommandWithOutput("git show --color " + sha)
- if err != nil {
- panic(err)
- }
- return result
+func (c *GitCommand) Show(sha string) (string, error) {
+ return c.OSCommand.RunCommandWithOutput(fmt.Sprintf("git show --color %s", sha))
}
// Diff returns the diff of a file
func (c *GitCommand) Diff(file *File) string {
cachedArg := ""
+ trackedArg := "--"
fileName := c.OSCommand.Quote(file.Name)
if file.HasStagedChanges && !file.HasUnstagedChanges {
cachedArg = "--cached"
}
- trackedArg := "--"
if !file.Tracked && !file.HasStagedChanges {
trackedArg = "--no-index /dev/null"
}
- command := fmt.Sprintf("%s %s %s %s", "git diff --color ", cachedArg, trackedArg, fileName)
+ command := fmt.Sprintf("git diff --color %s %s %s", cachedArg, trackedArg, fileName)
// for now we assume an error means the file was deleted
s, _ := c.OSCommand.RunCommandWithOutput(command)
diff --git a/pkg/commands/git_test.go b/pkg/commands/git_test.go
index e5faa707b..5a331ea18 100644
--- a/pkg/commands/git_test.go
+++ b/pkg/commands/git_test.go
@@ -9,7 +9,6 @@ import (
"time"
"github.com/jesseduffield/lazygit/pkg/i18n"
- "github.com/jesseduffield/lazygit/pkg/test"
"github.com/sirupsen/logrus"
"github.com/stretchr/testify/assert"
gogit "gopkg.in/src-d/go-git.v4"
@@ -1421,6 +1420,19 @@ func TestGitCommandRemoveFile(t *testing.T) {
}
}
+func TestGitCommandShow(t *testing.T) {
+ gitCmd := newDummyGitCommand()
+ gitCmd.OSCommand.command = func(cmd string, args ...string) *exec.Cmd {
+ assert.EqualValues(t, "git", cmd)
+ assert.EqualValues(t, []string{"show", "--color", "456abcde"}, args)
+
+ return exec.Command("echo")
+ }
+
+ _, err := gitCmd.Show("456abcde")
+ assert.NoError(t, err)
+}
+
func TestGitCommandCheckout(t *testing.T) {
type scenario struct {
testName string
@@ -1569,97 +1581,106 @@ func TestGitCommandGetCommits(t *testing.T) {
}
}
-func TestGitCommandDiff(t *testing.T) {
- gitCommand := newDummyGitCommand()
- assert.NoError(t, test.GenerateRepo("lots_of_diffs.sh"))
+func TestGitCommandGetLog(t *testing.T) {
+ type scenario struct {
+ testName string
+ command func(string, ...string) *exec.Cmd
+ test func(string)
+ }
- files := []*File{
- {
- Name: "deleted_staged",
- HasStagedChanges: false,
- HasUnstagedChanges: true,
- Tracked: true,
- Deleted: true,
- HasMergeConflicts: false,
- DisplayString: " D deleted_staged",
- },
- {
- Name: "file with space staged",
- HasStagedChanges: true,
- HasUnstagedChanges: false,
- Tracked: false,
- Deleted: false,
- HasMergeConflicts: false,
- DisplayString: "A \"file with space staged\"",
- },
- {
- Name: "file with space unstaged",
- HasStagedChanges: false,
- HasUnstagedChanges: true,
- Tracked: false,
- Deleted: false,
- HasMergeConflicts: false,
- DisplayString: "?? file with space unstaged",
- },
- {
- Name: "modified_unstaged",
- HasStagedChanges: true,
- HasUnstagedChanges: false,
- Tracked: true,
- Deleted: false,
- HasMergeConflicts: false,
- DisplayString: "M modified_unstaged",
- },
+ scenarios := []scenario{
{
- Name: "modified_staged",
- HasStagedChanges: false,
- HasUnstagedChanges: true,
- Tracked: true,
- Deleted: false,
- HasMergeConflicts: false,
- DisplayString: " M modified_staged",
+ "Retrieves logs",
+ func(cmd string, args ...string) *exec.Cmd {
+ assert.EqualValues(t, "git", cmd)
+ assert.EqualValues(t, []string{"log", "--oneline", "-30"}, args)
+
+ return exec.Command("echo", "6f0b32f commands/git : add GetCommits tests refactor\n9d9d775 circle : remove new line")
+ },
+ func(output string) {
+ assert.EqualValues(t, "6f0b32f commands/git : add GetCommits tests refactor\n9d9d775 circle : remove new line\n", output)
+ },
},
{
- Name: "renamed_before -> renamed_after",
- HasStagedChanges: true,
- HasUnstagedChanges: false,
- Tracked: true,
- Deleted: false,
- HasMergeConflicts: false,
- DisplayString: "R renamed_before -> renamed_after",
+ "An error occurred when retrieving logs",
+ func(cmd string, args ...string) *exec.Cmd {
+ assert.EqualValues(t, "git", cmd)
+ assert.EqualValues(t, []string{"log", "--oneline", "-30"}, args)
+ return exec.Command("test")
+ },
+ func(output string) {
+ assert.Empty(t, output)
+ },
},
+ }
+
+ for _, s := range scenarios {
+ t.Run(s.testName, func(t *testing.T) {
+ gitCmd := newDummyGitCommand()
+ gitCmd.OSCommand.command = s.command
+ s.test(gitCmd.GetLog())
+ })
+ }
+}
+
+func TestGitCommandDiff(t *testing.T) {
+ type scenario struct {
+ testName string
+ command func(string, ...string) *exec.Cmd
+ file *File
+ }
+
+ scenarios := []scenario{
{
- Name: "untracked_unstaged",
- HasStagedChanges: false,
- HasUnstagedChanges: true,
- Tracked: false,
- Deleted: false,
- HasMergeConflicts: false,
- DisplayString: "?? untracked_unstaged",
+ "Default case",
+ func(cmd string, args ...string) *exec.Cmd {
+ assert.EqualValues(t, "git", cmd)
+ assert.EqualValues(t, []string{"diff", "--color", "--", "test.txt"}, args)
+
+ return exec.Command("echo")
+ },
+ &File{
+ Name: "test.txt",
+ HasStagedChanges: false,
+ Tracked: true,
+ },
},
{
- Name: "untracked_staged",
- HasStagedChanges: true,
- HasUnstagedChanges: false,
- Tracked: false,
- Deleted: false,
- HasMergeConflicts: false,
- DisplayString: "A untracked_staged",
+ "All changes staged",
+ func(cmd string, args ...string) *exec.Cmd {
+ assert.EqualValues(t, "git", cmd)
+ assert.EqualValues(t, []string{"diff", "--color", "--cached", "--", "test.txt"}, args)
+
+ return exec.Command("echo")
+ },
+ &File{
+ Name: "test.txt",
+ HasStagedChanges: true,
+ HasUnstagedChanges: false,
+ Tracked: true,
+ },
},
{
- Name: "master",
- HasStagedChanges: false,
- HasUnstagedChanges: true,
- Tracked: false,
- Deleted: false,
- HasMergeConflicts: false,
- DisplayString: "?? master",
+ "File not tracked and file has no staged changes",
+ func(cmd string, args ...string) *exec.Cmd {
+ assert.EqualValues(t, "git", cmd)
+ assert.EqualValues(t, []string{"diff", "--color", "--no-index", "/dev/null", "test.txt"}, args)
+
+ return exec.Command("echo")
+ },
+ &File{
+ Name: "test.txt",
+ HasStagedChanges: false,
+ Tracked: false,
+ },
},
}
- for _, file := range files {
- t.Run(file.Name, func(t *testing.T) {
- assert.NotContains(t, gitCommand.Diff(file), "error")
+ for _, s := range scenarios {
+ t.Run(s.testName, func(t *testing.T) {
+ gitCmd := newDummyGitCommand()
+ gitCmd.OSCommand.command = s.command
+ gitCmd.Diff(s.file)
})
}
}
diff --git a/pkg/gui/commit_message_panel.go b/pkg/gui/commit_message_panel.go
index e23c47da0..74e02be90 100644
--- a/pkg/gui/commit_message_panel.go
+++ b/pkg/gui/commit_message_panel.go
@@ -37,6 +37,10 @@ func (gui *Gui) handleCommitClose(g *gocui.Gui, v *gocui.View) error {
}
func (gui *Gui) handleCommitFocused(g *gocui.Gui, v *gocui.View) error {
+ if _, err := g.SetViewOnTop("commitMessage"); err != nil {
+ return err
+ }
+
message := gui.Tr.TemplateLocalize(
"CloseConfirm",
Teml{
diff --git a/pkg/gui/commits_panel.go b/pkg/gui/commits_panel.go
index a86401ebf..ee7f191a7 100644
--- a/pkg/gui/commits_panel.go
+++ b/pkg/gui/commits_panel.go
@@ -74,7 +74,10 @@ func (gui *Gui) handleCommitSelect(g *gocui.Gui, v *gocui.View) error {
}
return gui.renderString(g, "main", gui.Tr.SLocalize("NoCommitsThisBranch"))
}
- commitText := gui.GitCommand.Show(commit.Sha)
+ commitText, err := gui.GitCommand.Show(commit.Sha)
+ if err != nil {
+ return err
+ }
return gui.renderString(g, "main", commitText)
}
diff --git a/pkg/gui/status_panel.go b/pkg/gui/status_panel.go
index 6948e9678..89b3e997e 100644
--- a/pkg/gui/status_panel.go
+++ b/pkg/gui/status_panel.go
@@ -2,6 +2,7 @@ package gui
import (
"fmt"
+ "strings"
"github.com/fatih/color"
"github.com/jesseduffield/gocui"
@@ -51,14 +52,16 @@ func (gui *Gui) handleCheckForUpdate(g *gocui.Gui, v *gocui.View) error {
}
func (gui *Gui) handleStatusSelect(g *gocui.Gui, v *gocui.View) error {
- dashboardString := fmt.Sprintf(
- "%s\n\n%s\n\n%s\n\n%s\n\n%s",
- lazygitTitle(),
- "Keybindings: https://github.com/jesseduffield/lazygit/blob/master/docs/Keybindings.md",
- "Config Options: https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md",
- "Tutorial: https://www.youtube.com/watch?v=VDXvbHZYeKY",
- "Raise an Issue: https://github.com/jesseduffield/lazygit/issues",
- )
+ dashboardString := strings.Join(
+ []string{
+ lazygitTitle(),
+ "Copyright (c) 2018 Jesse Duffield",
+ "Keybindings: https://github.com/jesseduffield/lazygit/blob/master/docs/Keybindings.md",
+ "Config Options: https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md",
+ "Tutorial: https://www.youtube.com/watch?v=VDXvbHZYeKY",
+ "Raise an Issue: https://github.com/jesseduffield/lazygit/issues",
+ "Buy Jesse a coffee: https://donorbox.org/lazygit",
+ }, "\n\n")
if err := gui.renderString(g, "main", dashboardString); err != nil {
return err
diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go
index 5178bd4d9..6c3e5505c 100644
--- a/pkg/gui/view_helpers.go
+++ b/pkg/gui/view_helpers.go
@@ -133,8 +133,15 @@ func (gui *Gui) switchFocus(g *gocui.Gui, oldView, newView *gocui.View) error {
},
)
gui.Log.Info(message)
- gui.State.PreviousView = oldView.Name()
+
+ // second class panels should never have focus restored to them because
+ // once they lose focus they are effectively 'destroyed'
+ secondClassPanels := []string{"confirmation", "menu"}
+ if !utils.IncludesString(secondClassPanels, oldView.Name()) {
+ gui.State.PreviousView = oldView.Name()
+ }
}
+
newView.Highlight = true
message := gui.Tr.TemplateLocalize(
"newFocusedViewIs",
@@ -183,7 +190,7 @@ func (gui *Gui) cursorDown(g *gocui.Gui, v *gocui.View) error {
}
cx, cy := v.Cursor()
ox, oy := v.Origin()
- ly := len(v.BufferLines()) - 1
+ ly := v.LinesHeight() - 1
_, height := v.Size()
maxY := height - 1
@@ -219,7 +226,7 @@ func (gui *Gui) correctCursor(v *gocui.View) error {
ox, oy := v.Origin()
_, height := v.Size()
maxY := height - 1
- ly := len(v.BufferLines()) - 1
+ ly := v.LinesHeight() - 1
if oy+cy <= ly {
return nil
}
diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go
index aef653c50..8e481b3a4 100644
--- a/pkg/utils/utils.go
+++ b/pkg/utils/utils.go
@@ -204,3 +204,13 @@ func getDisplayStringArrays(displayables []Displayable) [][]string {
}
return stringArrays
}
+
+// IncludesString if the list contains the string
+func IncludesString(list []string, a string) bool {
+ for _, b := range list {
+ if b == a {
+ return true
+ }
+ }
+ return false
+}
diff --git a/pkg/utils/utils_test.go b/pkg/utils/utils_test.go
index 918031512..21e1d5031 100644
--- a/pkg/utils/utils_test.go
+++ b/pkg/utils/utils_test.go
@@ -376,3 +376,38 @@ func TestMin(t *testing.T) {
assert.EqualValues(t, s.expected, Min(s.a, s.b))
}
}
+
+func TestIncludesString(t *testing.T) {
+ type scenario struct {
+ list []string
+ element string
+ expected bool
+ }
+
+ scenarios := []scenario{
+ {
+ []string{"a", "b"},
+ "a",
+ true,
+ },
+ {
+ []string{"a", "b"},
+ "c",
+ false,
+ },
+ {
+ []string{"a", "b"},
+ "",
+ false,
+ },
+ {
+ []string{""},
+ "",
+ true,
+ },
+ }
+
+ for _, s := range scenarios {
+ assert.EqualValues(t, s.expected, IncludesString(s.list, s.element))
+ }
+}
diff --git a/test/repos/lots_of_diffs.sh b/test/repos/lots_of_diffs.sh
deleted file mode 100755
index 08c743f35..000000000
--- a/test/repos/lots_of_diffs.sh
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/bin/bash
-set -ex; rm -rf repo; mkdir repo; cd repo
-
-git init
-git config user.email "test@example.com"
-git config user.name "Lazygit Tester"
-
-
-echo "deleted" > deleted_staged
-echo "deleted_unstaged" > deleted_unstaged
-echo "modified_staged" > modified_staged
-echo "modified_unstaged" > modified_unstaged
-echo "renamed" > renamed_before
-
-git add .
-git commit -m "files to delete"
-rm deleted_staged
-rm deleted_unstaged
-
-rm renamed_before
-echo "renamed" > renamed_after
-echo "more" >> modified_staged
-echo "more" >> modified_unstaged
-echo "untracked_staged" > untracked_staged
-echo "untracked_unstaged" > untracked_unstaged
-echo "blah" > "file with space staged"
-echo "blah" > "file with space unstaged"
-echo "same name as branch" > master
-
-git add deleted_staged
-git add modified_staged
-git add untracked_staged
-git add "file with space staged"
-git add renamed_before
-git add renamed_after \ No newline at end of file
diff --git a/vendor/github.com/jesseduffield/gocui/view.go b/vendor/github.com/jesseduffield/gocui/view.go
index 46b86ec2a..939d1bdfa 100644
--- a/vendor/github.com/jesseduffield/gocui/view.go
+++ b/vendor/github.com/jesseduffield/gocui/view.go
@@ -447,8 +447,8 @@ func (v *View) ViewBufferLines() []string {
return lines
}
-func (v *View) ViewLinesHeight() int {
- return len(v.viewLines)
+func (v *View) LinesHeight() int {
+ return len(v.lines)
}
// ViewBuffer returns a string with the contents of the view's buffer that is