diff --git a/pkg/commands/git.go b/pkg/commands/git.go index 94c3c3e1c..95a60e8a6 100644 --- a/pkg/commands/git.go +++ b/pkg/commands/git.go @@ -486,15 +486,11 @@ func (c *GitCommand) Diff(file File) string { // if the file is staged and has spaces in it, it comes pre-quoted fileName = c.OSCommand.Quote(fileName) } - deletedArg := "" - if file.Deleted { - deletedArg = "--" - } - trackedArg := "" + trackedArg := "--" if !file.Tracked && !file.HasStagedChanges { trackedArg = "--no-index /dev/null" } - command := fmt.Sprintf("%s %s %s %s %s", "git diff --color ", cachedArg, deletedArg, trackedArg, fileName) + command := fmt.Sprintf("%s %s %s %s", "git diff --color ", 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 new file mode 100644 index 000000000..1cd9901b3 --- /dev/null +++ b/pkg/commands/git_test.go @@ -0,0 +1,126 @@ +package commands + +import ( + "io/ioutil" + "strings" + "testing" + + "github.com/Sirupsen/logrus" + "github.com/jesseduffield/lazygit/pkg/test" +) + +func getDummyLog() *logrus.Logger { + log := logrus.New() + log.Out = ioutil.Discard + return log +} + +func getDummyOSCommand() *OSCommand { + return &OSCommand{ + Log: getDummyLog(), + Platform: getPlatform(), + } +} + +func getDummyGitCommand() *GitCommand { + return &GitCommand{ + Log: getDummyLog(), + OSCommand: getDummyOSCommand(), + } +} + +func TestDiff(t *testing.T) { + gitCommand := getDummyGitCommand() + if err := test.GenerateRepo("lots_of_diffs.sh"); err != nil { + t.Error(err.Error()) + } + 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", + }, + { + Name: "modified_staged", + HasStagedChanges: false, + HasUnstagedChanges: true, + Tracked: true, + Deleted: false, + HasMergeConflicts: false, + DisplayString: " M modified_staged", + }, + { + Name: "renamed_before -> renamed_after", + HasStagedChanges: true, + HasUnstagedChanges: false, + Tracked: true, + Deleted: false, + HasMergeConflicts: false, + DisplayString: "R renamed_before -> renamed_after", + }, + { + Name: "untracked_unstaged", + HasStagedChanges: false, + HasUnstagedChanges: true, + Tracked: false, + Deleted: false, + HasMergeConflicts: false, + DisplayString: "?? untracked_unstaged", + }, + { + Name: "untracked_staged", + HasStagedChanges: true, + HasUnstagedChanges: false, + Tracked: false, + Deleted: false, + HasMergeConflicts: false, + DisplayString: "A untracked_staged", + }, + { + Name: "master", + HasStagedChanges: false, + HasUnstagedChanges: true, + Tracked: false, + Deleted: false, + HasMergeConflicts: false, + DisplayString: "?? master", + }, + } + for _, file := range files { + content := gitCommand.Diff(file) + if strings.Contains(content, "error") { + t.Error("Error: diff test failed. File: " + file.Name + ", " + content) + } + } +} diff --git a/pkg/test/test.go b/pkg/test/test.go new file mode 100644 index 000000000..7bdbd4c10 --- /dev/null +++ b/pkg/test/test.go @@ -0,0 +1,25 @@ +package test + +import ( + "errors" + "os" + "os/exec" + + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// GenerateRepo generates a repo from test/repos and changes the directory to be +// inside the newly made repo +func GenerateRepo(filename string) error { + testPath := utils.GetProjectRoot() + "/test/repos/" + if err := os.Chdir(testPath); err != nil { + return err + } + if output, err := exec.Command("bash", filename).CombinedOutput(); err != nil { + return errors.New(string(output)) + } + if err := os.Chdir(testPath + "repo"); err != nil { + return err + } + return nil +} diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index 68438246a..6172bcb54 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -4,6 +4,7 @@ import ( "fmt" "log" "os" + "path" "path/filepath" "strings" @@ -63,3 +64,11 @@ func TrimTrailingNewline(str string) string { } return str } + +// GetProjectRoot returns the path to the root of the project. Only to be used +// in testing contexts, as with binaries it's unlikely this path will exist on +// the machine +func GetProjectRoot() string { + gp := os.Getenv("GOPATH") + return path.Join(gp, "src/github.com/jesseduffield/lazygit") +} diff --git a/test/repos/case_insensitive_checkouts.sh b/test/repos/case_insensitive_checkouts.sh index 23997a670..1a2b83403 100755 --- a/test/repos/case_insensitive_checkouts.sh +++ b/test/repos/case_insensitive_checkouts.sh @@ -2,6 +2,9 @@ set -ex; rm -rf repo; mkdir repo; cd repo git init +git config user.email "test@example.com" +git config user.name "Lazygit Tester" + touch foo git add foo diff --git a/test/repos/gpg.sh b/test/repos/gpg.sh index 719c6467b..646f785b1 100755 --- a/test/repos/gpg.sh +++ b/test/repos/gpg.sh @@ -2,6 +2,9 @@ set -ex; rm -rf repo; mkdir repo; cd repo git init +git config user.email "test@example.com" +git config user.name "Lazygit Tester" + git config gpg.program $(which gpg) git config user.signingkey E304229F # test key diff --git a/test/repos/lots_of_commits.sh b/test/repos/lots_of_commits.sh index 7c271f751..ad55864c3 100755 --- a/test/repos/lots_of_commits.sh +++ b/test/repos/lots_of_commits.sh @@ -2,6 +2,9 @@ set -ex; rm -rf repo; mkdir repo; cd repo git init +git config user.email "test@example.com" +git config user.name "Lazygit Tester" + i=2 end=100 diff --git a/test/repos/lots_of_diffs.sh b/test/repos/lots_of_diffs.sh new file mode 100755 index 000000000..08c743f35 --- /dev/null +++ b/test/repos/lots_of_diffs.sh @@ -0,0 +1,35 @@ +#!/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/test/repos/merge_conflict.sh b/test/repos/merge_conflict.sh index 8ba234203..51e4c1ce6 100755 --- a/test/repos/merge_conflict.sh +++ b/test/repos/merge_conflict.sh @@ -2,6 +2,9 @@ set -ex; rm -rf repo; mkdir repo; cd repo git init +git config user.email "test@example.com" +git config user.name "Lazygit Tester" + function add_spacing { for i in {1..60} diff --git a/test/repos/pre_commit_hook.sh b/test/repos/pre_commit_hook.sh index 1c24bf19f..f1b76b56a 100755 --- a/test/repos/pre_commit_hook.sh +++ b/test/repos/pre_commit_hook.sh @@ -2,6 +2,9 @@ set -ex; rm -rf repo; mkdir repo; cd repo git init +git config user.email "test@example.com" +git config user.name "Lazygit Tester" + cp ../extras/pre-commit .git/hooks/pre-commit chmod +x .git/hooks/pre-commit diff --git a/test/repos/unicode_characters.sh b/test/repos/unicode_characters.sh index 69ac5e622..fc4cddf1b 100755 --- a/test/repos/unicode_characters.sh +++ b/test/repos/unicode_characters.sh @@ -2,6 +2,9 @@ set -ex; rm -rf repo; mkdir repo; cd repo git init +git config user.email "test@example.com" +git config user.name "Lazygit Tester" + # Add some ansi, unicode, zero width joiner caracters cat <> charstest.txt