From 03a7e32694216ae4e7b3150a0f6305a960a7980d Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Fri, 17 Aug 2018 22:25:53 +1000 Subject: [PATCH 1/4] support filenames that match branchnames --- pkg/commands/git.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pkg/commands/git.go b/pkg/commands/git.go index 3349e4860..7e81790e6 100644 --- a/pkg/commands/git.go +++ b/pkg/commands/git.go @@ -481,15 +481,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) From bd91b9e1e9fdc8cd199d105118ce13f94e6b5fe5 Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Fri, 17 Aug 2018 22:46:10 +1000 Subject: [PATCH 2/4] add test repo for all the kinds of files that show up when diffing --- test/repos/lots_of_diffs.sh | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100755 test/repos/lots_of_diffs.sh diff --git a/test/repos/lots_of_diffs.sh b/test/repos/lots_of_diffs.sh new file mode 100755 index 000000000..0cdec0cdc --- /dev/null +++ b/test/repos/lots_of_diffs.sh @@ -0,0 +1,32 @@ +#!/bin/bash +set -ex; rm -rf repo; mkdir repo; cd repo + +git init + +echo "deleted1" > deleted1 +echo "deleted2" > deleted2 +echo "modified1" > modified1 +echo "modified2" > modified2 +echo "renamed" > renamed1 + +git add . +git commit -m "files to delete" +rm deleted1 +rm deleted2 + +rm renamed1 +echo "renamed" > renamed2 +echo "more" >> modified1 +echo "more" >> modified2 +echo "untracked1" > untracked1 +echo "untracked2" > untracked2 +echo "blah" > "file with space1" +echo "blah" > "file with space2" +echo "same name as branch" > master + +git add deleted1 +git add modified1 +git add untracked1 +git add "file with space2" +git add renamed1 +git add renamed2 \ No newline at end of file From cd9eada0c6b3fdb68519467807bf2c8e6eb521bd Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Sun, 19 Aug 2018 14:48:39 +1000 Subject: [PATCH 3/4] add test for variety of potential git diff situations --- pkg/commands/git_test.go | 126 ++++++++++++++++++++++++++++++++++++ pkg/test/test.go | 25 +++++++ pkg/utils/utils.go | 9 +++ test/repos/lots_of_diffs.sh | 42 ++++++------ 4 files changed, 181 insertions(+), 21 deletions(-) create mode 100644 pkg/commands/git_test.go create mode 100644 pkg/test/test.go 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/lots_of_diffs.sh b/test/repos/lots_of_diffs.sh index 0cdec0cdc..d91734a3a 100755 --- a/test/repos/lots_of_diffs.sh +++ b/test/repos/lots_of_diffs.sh @@ -3,30 +3,30 @@ set -ex; rm -rf repo; mkdir repo; cd repo git init -echo "deleted1" > deleted1 -echo "deleted2" > deleted2 -echo "modified1" > modified1 -echo "modified2" > modified2 -echo "renamed" > renamed1 +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 deleted1 -rm deleted2 +rm deleted_staged +rm deleted_unstaged -rm renamed1 -echo "renamed" > renamed2 -echo "more" >> modified1 -echo "more" >> modified2 -echo "untracked1" > untracked1 -echo "untracked2" > untracked2 -echo "blah" > "file with space1" -echo "blah" > "file with space2" +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 deleted1 -git add modified1 -git add untracked1 -git add "file with space2" -git add renamed1 -git add renamed2 \ No newline at end of file +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 From 6978785ccfdf6605501e1b36d2a4bc9635a89b99 Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Sun, 19 Aug 2018 14:52:08 +1000 Subject: [PATCH 4/4] add user email and config to test repo generators --- test/repos/case_insensitive_checkouts.sh | 3 +++ test/repos/gpg.sh | 3 +++ test/repos/lots_of_commits.sh | 3 +++ test/repos/lots_of_diffs.sh | 3 +++ test/repos/merge_conflict.sh | 3 +++ test/repos/pre_commit_hook.sh | 3 +++ test/repos/unicode_characters.sh | 3 +++ 7 files changed, 21 insertions(+) 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 index d91734a3a..08c743f35 100755 --- a/test/repos/lots_of_diffs.sh +++ b/test/repos/lots_of_diffs.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" + echo "deleted" > deleted_staged echo "deleted_unstaged" > deleted_unstaged 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