mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-05-21 22:43:27 +02:00
Merge branch 'hotfix/cursor-positioning' into feature/recent-repos
This commit is contained in:
commit
baa9eff318
@ -3,7 +3,6 @@ jobs:
|
|||||||
build:
|
build:
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/golang:1.11
|
- image: circleci/golang:1.11
|
||||||
|
|
||||||
working_directory: /go/src/github.com/jesseduffield/lazygit
|
working_directory: /go/src/github.com/jesseduffield/lazygit
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
@ -29,7 +28,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
- restore_cache:
|
- restore_cache:
|
||||||
keys:
|
keys:
|
||||||
- pkg-cache-{{ checksum "Gopkg.lock" }}-v2
|
- pkg-cache-{{ checksum "Gopkg.lock" }}-v3
|
||||||
- run:
|
- run:
|
||||||
name: Run tests
|
name: Run tests
|
||||||
command: |
|
command: |
|
||||||
@ -44,7 +43,7 @@ jobs:
|
|||||||
command: |
|
command: |
|
||||||
bash <(curl -s https://codecov.io/bash)
|
bash <(curl -s https://codecov.io/bash)
|
||||||
- save_cache:
|
- save_cache:
|
||||||
key: pkg-cache-{{ checksum "Gopkg.lock" }}-v2
|
key: pkg-cache-{{ checksum "Gopkg.lock" }}-v3
|
||||||
paths:
|
paths:
|
||||||
- ~/.cache/go-build
|
- ~/.cache/go-build
|
||||||
|
|
||||||
|
@ -65,6 +65,7 @@ type GitCommand struct {
|
|||||||
Tr *i18n.Localizer
|
Tr *i18n.Localizer
|
||||||
getGlobalGitConfig func(string) (string, error)
|
getGlobalGitConfig func(string) (string, error)
|
||||||
getLocalGitConfig func(string) (string, error)
|
getLocalGitConfig func(string) (string, error)
|
||||||
|
removeFile func(string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGitCommand it runs git commands
|
// NewGitCommand it runs git commands
|
||||||
@ -231,13 +232,18 @@ func (c *GitCommand) UpstreamDifferenceCount() (string, string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetCommitsToPush Returns the sha's of the commits that have not yet been pushed
|
// GetCommitsToPush Returns the sha's of the commits that have not yet been pushed
|
||||||
// to the remote branch of the current branch
|
// to the remote branch of the current branch, a map is returned to ease look up
|
||||||
func (c *GitCommand) GetCommitsToPush() []string {
|
func (c *GitCommand) GetCommitsToPush() map[string]bool {
|
||||||
pushables, err := c.OSCommand.RunCommandWithOutput("git rev-list @{u}..head --abbrev-commit")
|
pushables := map[string]bool{}
|
||||||
|
o, err := c.OSCommand.RunCommandWithOutput("git rev-list @{u}..head --abbrev-commit")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return []string{}
|
return pushables
|
||||||
}
|
}
|
||||||
return utils.SplitLines(pushables)
|
for _, p := range utils.SplitLines(o) {
|
||||||
|
pushables[p] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
return pushables
|
||||||
}
|
}
|
||||||
|
|
||||||
// RenameCommit renames the topmost commit with the given name
|
// RenameCommit renames the topmost commit with the given name
|
||||||
@ -410,15 +416,15 @@ func (c *GitCommand) IsInMergeState() (bool, error) {
|
|||||||
func (c *GitCommand) RemoveFile(file *File) error {
|
func (c *GitCommand) RemoveFile(file *File) error {
|
||||||
// if the file isn't tracked, we assume you want to delete it
|
// if the file isn't tracked, we assume you want to delete it
|
||||||
if file.HasStagedChanges {
|
if file.HasStagedChanges {
|
||||||
if err := c.OSCommand.RunCommand("git reset -- " + file.Name); err != nil {
|
if err := c.OSCommand.RunCommand(fmt.Sprintf("git reset -- %s", file.Name)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !file.Tracked {
|
if !file.Tracked {
|
||||||
return os.RemoveAll(file.Name)
|
return c.removeFile(file.Name)
|
||||||
}
|
}
|
||||||
// if the file is tracked, we assume you want to just check it out
|
// if the file is tracked, we assume you want to just check it out
|
||||||
return c.OSCommand.RunCommand("git checkout -- " + file.Name)
|
return c.OSCommand.RunCommand(fmt.Sprintf("git checkout -- %s", file.Name))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checkout checks out a branch, with --force if you set the force arg to true
|
// Checkout checks out a branch, with --force if you set the force arg to true
|
||||||
@ -427,7 +433,7 @@ func (c *GitCommand) Checkout(branch string, force bool) error {
|
|||||||
if force {
|
if force {
|
||||||
forceArg = "--force "
|
forceArg = "--force "
|
||||||
}
|
}
|
||||||
return c.OSCommand.RunCommand("git checkout " + forceArg + branch)
|
return c.OSCommand.RunCommand(fmt.Sprintf("git checkout %s %s", forceArg, branch))
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddPatch prepares a subprocess for adding a patch by patch
|
// AddPatch prepares a subprocess for adding a patch by patch
|
||||||
@ -450,16 +456,7 @@ func (c *GitCommand) PrepareCommitAmendSubProcess() *exec.Cmd {
|
|||||||
// Currently it limits the result to 100 commits, but when we get async stuff
|
// Currently it limits the result to 100 commits, but when we get async stuff
|
||||||
// working we can do lazy loading
|
// working we can do lazy loading
|
||||||
func (c *GitCommand) GetBranchGraph(branchName string) (string, error) {
|
func (c *GitCommand) GetBranchGraph(branchName string) (string, error) {
|
||||||
return c.OSCommand.RunCommandWithOutput("git log --graph --color --abbrev-commit --decorate --date=relative --pretty=medium -100 " + branchName)
|
return c.OSCommand.RunCommandWithOutput(fmt.Sprintf("git log --graph --color --abbrev-commit --decorate --date=relative --pretty=medium -100 %s", branchName))
|
||||||
}
|
|
||||||
|
|
||||||
func includesString(list []string, a string) bool {
|
|
||||||
for _, b := range list {
|
|
||||||
if b == a {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetCommits obtains the commits of the current branch
|
// GetCommits obtains the commits of the current branch
|
||||||
@ -468,11 +465,10 @@ func (c *GitCommand) GetCommits() []*Commit {
|
|||||||
log := c.GetLog()
|
log := c.GetLog()
|
||||||
commits := []*Commit{}
|
commits := []*Commit{}
|
||||||
// now we can split it up and turn it into commits
|
// now we can split it up and turn it into commits
|
||||||
lines := utils.SplitLines(log)
|
for _, line := range utils.SplitLines(log) {
|
||||||
for _, line := range lines {
|
|
||||||
splitLine := strings.Split(line, " ")
|
splitLine := strings.Split(line, " ")
|
||||||
sha := splitLine[0]
|
sha := splitLine[0]
|
||||||
pushed := includesString(pushables, sha)
|
_, pushed := pushables[sha]
|
||||||
commits = append(commits, &Commit{
|
commits = append(commits, &Commit{
|
||||||
Sha: sha,
|
Sha: sha,
|
||||||
Name: strings.Join(splitLine[1:], " "),
|
Name: strings.Join(splitLine[1:], " "),
|
||||||
@ -493,6 +489,7 @@ func (c *GitCommand) GetLog() string {
|
|||||||
// assume if there is an error there are no commits yet for this branch
|
// assume if there is an error there are no commits yet for this branch
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,6 +61,7 @@ func newDummyGitCommand() *GitCommand {
|
|||||||
Tr: i18n.NewLocalizer(newDummyLog()),
|
Tr: i18n.NewLocalizer(newDummyLog()),
|
||||||
getGlobalGitConfig: func(string) (string, error) { return "", nil },
|
getGlobalGitConfig: func(string) (string, error) { return "", nil },
|
||||||
getLocalGitConfig: func(string) (string, error) { return "", nil },
|
getLocalGitConfig: func(string) (string, error) { return "", nil },
|
||||||
|
removeFile: func(string) error { return nil },
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -551,7 +552,7 @@ func TestGitCommandUpstreamDifferentCount(t *testing.T) {
|
|||||||
{
|
{
|
||||||
"Can't retrieve pushable count",
|
"Can't retrieve pushable count",
|
||||||
func(string, ...string) *exec.Cmd {
|
func(string, ...string) *exec.Cmd {
|
||||||
return exec.Command("exit", "1")
|
return exec.Command("test")
|
||||||
},
|
},
|
||||||
func(pushableCount string, pullableCount string) {
|
func(pushableCount string, pullableCount string) {
|
||||||
assert.EqualValues(t, "?", pushableCount)
|
assert.EqualValues(t, "?", pushableCount)
|
||||||
@ -562,7 +563,7 @@ func TestGitCommandUpstreamDifferentCount(t *testing.T) {
|
|||||||
"Can't retrieve pullable count",
|
"Can't retrieve pullable count",
|
||||||
func(cmd string, args ...string) *exec.Cmd {
|
func(cmd string, args ...string) *exec.Cmd {
|
||||||
if args[1] == "head..@{u}" {
|
if args[1] == "head..@{u}" {
|
||||||
return exec.Command("exit", "1")
|
return exec.Command("test")
|
||||||
}
|
}
|
||||||
|
|
||||||
return exec.Command("echo")
|
return exec.Command("echo")
|
||||||
@ -601,17 +602,17 @@ func TestGitCommandGetCommitsToPush(t *testing.T) {
|
|||||||
type scenario struct {
|
type scenario struct {
|
||||||
testName string
|
testName string
|
||||||
command func(string, ...string) *exec.Cmd
|
command func(string, ...string) *exec.Cmd
|
||||||
test func([]string)
|
test func(map[string]bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
scenarios := []scenario{
|
scenarios := []scenario{
|
||||||
{
|
{
|
||||||
"Can't retrieve pushable commits",
|
"Can't retrieve pushable commits",
|
||||||
func(string, ...string) *exec.Cmd {
|
func(string, ...string) *exec.Cmd {
|
||||||
return exec.Command("exit", "1")
|
return exec.Command("test")
|
||||||
},
|
},
|
||||||
func(pushables []string) {
|
func(pushables map[string]bool) {
|
||||||
assert.EqualValues(t, []string{}, pushables)
|
assert.EqualValues(t, map[string]bool{}, pushables)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -619,9 +620,9 @@ func TestGitCommandGetCommitsToPush(t *testing.T) {
|
|||||||
func(cmd string, args ...string) *exec.Cmd {
|
func(cmd string, args ...string) *exec.Cmd {
|
||||||
return exec.Command("echo", "8a2bb0e\n78976bc")
|
return exec.Command("echo", "8a2bb0e\n78976bc")
|
||||||
},
|
},
|
||||||
func(pushables []string) {
|
func(pushables map[string]bool) {
|
||||||
assert.Len(t, pushables, 2)
|
assert.Len(t, pushables, 2)
|
||||||
assert.EqualValues(t, []string{"8a2bb0e", "78976bc"}, pushables)
|
assert.EqualValues(t, map[string]bool{"8a2bb0e": true, "78976bc": true}, pushables)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -872,7 +873,7 @@ func TestGitCommandCommit(t *testing.T) {
|
|||||||
assert.EqualValues(t, "git", cmd)
|
assert.EqualValues(t, "git", cmd)
|
||||||
assert.EqualValues(t, []string{"commit", "-m", "test"}, args)
|
assert.EqualValues(t, []string{"commit", "-m", "test"}, args)
|
||||||
|
|
||||||
return exec.Command("exit", "1")
|
return exec.Command("test")
|
||||||
},
|
},
|
||||||
func(string) (string, error) {
|
func(string) (string, error) {
|
||||||
return "false", nil
|
return "false", nil
|
||||||
@ -935,7 +936,7 @@ func TestGitCommandPush(t *testing.T) {
|
|||||||
assert.EqualValues(t, "git", cmd)
|
assert.EqualValues(t, "git", cmd)
|
||||||
assert.EqualValues(t, []string{"push", "-u", "origin", "test"}, args)
|
assert.EqualValues(t, []string{"push", "-u", "origin", "test"}, args)
|
||||||
|
|
||||||
return exec.Command("exit", "1")
|
return exec.Command("test")
|
||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
func(err error) {
|
func(err error) {
|
||||||
@ -967,7 +968,7 @@ func TestGitCommandSquashPreviousTwoCommits(t *testing.T) {
|
|||||||
assert.EqualValues(t, "git", cmd)
|
assert.EqualValues(t, "git", cmd)
|
||||||
assert.EqualValues(t, []string{"reset", "--soft", "HEAD^"}, args)
|
assert.EqualValues(t, []string{"reset", "--soft", "HEAD^"}, args)
|
||||||
|
|
||||||
return exec.Command("exit", "1")
|
return exec.Command("test")
|
||||||
},
|
},
|
||||||
func(err error) {
|
func(err error) {
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
@ -983,7 +984,7 @@ func TestGitCommandSquashPreviousTwoCommits(t *testing.T) {
|
|||||||
assert.EqualValues(t, "git", cmd)
|
assert.EqualValues(t, "git", cmd)
|
||||||
assert.EqualValues(t, []string{"commit", "--amend", "-m", "test"}, args)
|
assert.EqualValues(t, []string{"commit", "--amend", "-m", "test"}, args)
|
||||||
|
|
||||||
return exec.Command("exit", "1")
|
return exec.Command("test")
|
||||||
},
|
},
|
||||||
func(err error) {
|
func(err error) {
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
@ -1031,7 +1032,7 @@ func TestGitCommandSquashFixupCommit(t *testing.T) {
|
|||||||
return func(cmd string, args ...string) *exec.Cmd {
|
return func(cmd string, args ...string) *exec.Cmd {
|
||||||
cmdsCalled = append(cmdsCalled, args)
|
cmdsCalled = append(cmdsCalled, args)
|
||||||
if len(args) > 0 && args[0] == "checkout" {
|
if len(args) > 0 && args[0] == "checkout" {
|
||||||
return exec.Command("exit", "1")
|
return exec.Command("test")
|
||||||
}
|
}
|
||||||
|
|
||||||
return exec.Command("echo")
|
return exec.Command("echo")
|
||||||
@ -1165,7 +1166,7 @@ func TestGitCommandIsInMergeState(t *testing.T) {
|
|||||||
assert.EqualValues(t, "git", cmd)
|
assert.EqualValues(t, "git", cmd)
|
||||||
assert.EqualValues(t, []string{"status", "--untracked-files=all"}, args)
|
assert.EqualValues(t, []string{"status", "--untracked-files=all"}, args)
|
||||||
|
|
||||||
return exec.Command("exit", "1")
|
return exec.Command("test")
|
||||||
},
|
},
|
||||||
func(isInMergeState bool, err error) {
|
func(isInMergeState bool, err error) {
|
||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
@ -1219,6 +1220,339 @@ func TestGitCommandIsInMergeState(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGitCommandRemoveFile(t *testing.T) {
|
||||||
|
type scenario struct {
|
||||||
|
testName string
|
||||||
|
command func() (func(string, ...string) *exec.Cmd, *[][]string)
|
||||||
|
test func(*[][]string, error)
|
||||||
|
file File
|
||||||
|
removeFile func(string) error
|
||||||
|
}
|
||||||
|
|
||||||
|
scenarios := []scenario{
|
||||||
|
{
|
||||||
|
"An error occurred when resetting",
|
||||||
|
func() (func(string, ...string) *exec.Cmd, *[][]string) {
|
||||||
|
cmdsCalled := [][]string{}
|
||||||
|
return func(cmd string, args ...string) *exec.Cmd {
|
||||||
|
cmdsCalled = append(cmdsCalled, args)
|
||||||
|
|
||||||
|
return exec.Command("test")
|
||||||
|
}, &cmdsCalled
|
||||||
|
},
|
||||||
|
func(cmdsCalled *[][]string, err error) {
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.Len(t, *cmdsCalled, 1)
|
||||||
|
assert.EqualValues(t, *cmdsCalled, [][]string{
|
||||||
|
{"reset", "--", "test"},
|
||||||
|
})
|
||||||
|
},
|
||||||
|
File{
|
||||||
|
Name: "test",
|
||||||
|
HasStagedChanges: true,
|
||||||
|
},
|
||||||
|
func(string) error {
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"An error occurred when removing file",
|
||||||
|
func() (func(string, ...string) *exec.Cmd, *[][]string) {
|
||||||
|
cmdsCalled := [][]string{}
|
||||||
|
return func(cmd string, args ...string) *exec.Cmd {
|
||||||
|
cmdsCalled = append(cmdsCalled, args)
|
||||||
|
|
||||||
|
return exec.Command("test")
|
||||||
|
}, &cmdsCalled
|
||||||
|
},
|
||||||
|
func(cmdsCalled *[][]string, err error) {
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.EqualError(t, err, "an error occurred when removing file")
|
||||||
|
assert.Len(t, *cmdsCalled, 0)
|
||||||
|
},
|
||||||
|
File{
|
||||||
|
Name: "test",
|
||||||
|
Tracked: false,
|
||||||
|
},
|
||||||
|
func(string) error {
|
||||||
|
return fmt.Errorf("an error occurred when removing file")
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"An error occurred with checkout",
|
||||||
|
func() (func(string, ...string) *exec.Cmd, *[][]string) {
|
||||||
|
cmdsCalled := [][]string{}
|
||||||
|
return func(cmd string, args ...string) *exec.Cmd {
|
||||||
|
cmdsCalled = append(cmdsCalled, args)
|
||||||
|
|
||||||
|
return exec.Command("test")
|
||||||
|
}, &cmdsCalled
|
||||||
|
},
|
||||||
|
func(cmdsCalled *[][]string, err error) {
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.Len(t, *cmdsCalled, 1)
|
||||||
|
assert.EqualValues(t, *cmdsCalled, [][]string{
|
||||||
|
{"checkout", "--", "test"},
|
||||||
|
})
|
||||||
|
},
|
||||||
|
File{
|
||||||
|
Name: "test",
|
||||||
|
Tracked: true,
|
||||||
|
HasStagedChanges: false,
|
||||||
|
},
|
||||||
|
func(string) error {
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Checkout only",
|
||||||
|
func() (func(string, ...string) *exec.Cmd, *[][]string) {
|
||||||
|
cmdsCalled := [][]string{}
|
||||||
|
return func(cmd string, args ...string) *exec.Cmd {
|
||||||
|
cmdsCalled = append(cmdsCalled, args)
|
||||||
|
|
||||||
|
return exec.Command("echo")
|
||||||
|
}, &cmdsCalled
|
||||||
|
},
|
||||||
|
func(cmdsCalled *[][]string, err error) {
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Len(t, *cmdsCalled, 1)
|
||||||
|
assert.EqualValues(t, *cmdsCalled, [][]string{
|
||||||
|
{"checkout", "--", "test"},
|
||||||
|
})
|
||||||
|
},
|
||||||
|
File{
|
||||||
|
Name: "test",
|
||||||
|
Tracked: true,
|
||||||
|
HasStagedChanges: false,
|
||||||
|
},
|
||||||
|
func(string) error {
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Reset and checkout",
|
||||||
|
func() (func(string, ...string) *exec.Cmd, *[][]string) {
|
||||||
|
cmdsCalled := [][]string{}
|
||||||
|
return func(cmd string, args ...string) *exec.Cmd {
|
||||||
|
cmdsCalled = append(cmdsCalled, args)
|
||||||
|
|
||||||
|
return exec.Command("echo")
|
||||||
|
}, &cmdsCalled
|
||||||
|
},
|
||||||
|
func(cmdsCalled *[][]string, err error) {
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Len(t, *cmdsCalled, 2)
|
||||||
|
assert.EqualValues(t, *cmdsCalled, [][]string{
|
||||||
|
{"reset", "--", "test"},
|
||||||
|
{"checkout", "--", "test"},
|
||||||
|
})
|
||||||
|
},
|
||||||
|
File{
|
||||||
|
Name: "test",
|
||||||
|
Tracked: true,
|
||||||
|
HasStagedChanges: true,
|
||||||
|
},
|
||||||
|
func(string) error {
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Reset and remove",
|
||||||
|
func() (func(string, ...string) *exec.Cmd, *[][]string) {
|
||||||
|
cmdsCalled := [][]string{}
|
||||||
|
return func(cmd string, args ...string) *exec.Cmd {
|
||||||
|
cmdsCalled = append(cmdsCalled, args)
|
||||||
|
|
||||||
|
return exec.Command("echo")
|
||||||
|
}, &cmdsCalled
|
||||||
|
},
|
||||||
|
func(cmdsCalled *[][]string, err error) {
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Len(t, *cmdsCalled, 1)
|
||||||
|
assert.EqualValues(t, *cmdsCalled, [][]string{
|
||||||
|
{"reset", "--", "test"},
|
||||||
|
})
|
||||||
|
},
|
||||||
|
File{
|
||||||
|
Name: "test",
|
||||||
|
Tracked: false,
|
||||||
|
HasStagedChanges: true,
|
||||||
|
},
|
||||||
|
func(filename string) error {
|
||||||
|
assert.Equal(t, "test", filename)
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Remove only",
|
||||||
|
func() (func(string, ...string) *exec.Cmd, *[][]string) {
|
||||||
|
cmdsCalled := [][]string{}
|
||||||
|
return func(cmd string, args ...string) *exec.Cmd {
|
||||||
|
cmdsCalled = append(cmdsCalled, args)
|
||||||
|
|
||||||
|
return exec.Command("echo")
|
||||||
|
}, &cmdsCalled
|
||||||
|
},
|
||||||
|
func(cmdsCalled *[][]string, err error) {
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Len(t, *cmdsCalled, 0)
|
||||||
|
},
|
||||||
|
File{
|
||||||
|
Name: "test",
|
||||||
|
Tracked: false,
|
||||||
|
HasStagedChanges: false,
|
||||||
|
},
|
||||||
|
func(filename string) error {
|
||||||
|
assert.Equal(t, "test", filename)
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, s := range scenarios {
|
||||||
|
t.Run(s.testName, func(t *testing.T) {
|
||||||
|
var cmdsCalled *[][]string
|
||||||
|
gitCmd := newDummyGitCommand()
|
||||||
|
gitCmd.OSCommand.command, cmdsCalled = s.command()
|
||||||
|
gitCmd.removeFile = s.removeFile
|
||||||
|
s.test(cmdsCalled, gitCmd.RemoveFile(s.file))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGitCommandCheckout(t *testing.T) {
|
||||||
|
type scenario struct {
|
||||||
|
testName string
|
||||||
|
command func(string, ...string) *exec.Cmd
|
||||||
|
test func(error)
|
||||||
|
force bool
|
||||||
|
}
|
||||||
|
|
||||||
|
scenarios := []scenario{
|
||||||
|
{
|
||||||
|
"Checkout",
|
||||||
|
func(cmd string, args ...string) *exec.Cmd {
|
||||||
|
assert.EqualValues(t, "git", cmd)
|
||||||
|
assert.EqualValues(t, []string{"checkout", "test"}, args)
|
||||||
|
|
||||||
|
return exec.Command("echo")
|
||||||
|
},
|
||||||
|
func(err error) {
|
||||||
|
assert.NoError(t, err)
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Checkout forced",
|
||||||
|
func(cmd string, args ...string) *exec.Cmd {
|
||||||
|
assert.EqualValues(t, "git", cmd)
|
||||||
|
assert.EqualValues(t, []string{"checkout", "--force", "test"}, args)
|
||||||
|
|
||||||
|
return exec.Command("echo")
|
||||||
|
},
|
||||||
|
func(err error) {
|
||||||
|
assert.NoError(t, err)
|
||||||
|
},
|
||||||
|
true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, s := range scenarios {
|
||||||
|
t.Run(s.testName, func(t *testing.T) {
|
||||||
|
gitCmd := newDummyGitCommand()
|
||||||
|
gitCmd.OSCommand.command = s.command
|
||||||
|
s.test(gitCmd.Checkout("test", s.force))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGitCommandGetBranchGraph(t *testing.T) {
|
||||||
|
gitCmd := newDummyGitCommand()
|
||||||
|
gitCmd.OSCommand.command = func(cmd string, args ...string) *exec.Cmd {
|
||||||
|
assert.EqualValues(t, "git", cmd)
|
||||||
|
assert.EqualValues(t, []string{"log", "--graph", "--color", "--abbrev-commit", "--decorate", "--date=relative", "--pretty=medium", "-100", "test"}, args)
|
||||||
|
|
||||||
|
return exec.Command("echo")
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := gitCmd.GetBranchGraph("test")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGitCommandGetCommits(t *testing.T) {
|
||||||
|
type scenario struct {
|
||||||
|
testName string
|
||||||
|
command func(string, ...string) *exec.Cmd
|
||||||
|
test func([]Commit)
|
||||||
|
}
|
||||||
|
|
||||||
|
scenarios := []scenario{
|
||||||
|
{
|
||||||
|
"No data found",
|
||||||
|
func(cmd string, args ...string) *exec.Cmd {
|
||||||
|
assert.EqualValues(t, "git", cmd)
|
||||||
|
|
||||||
|
switch args[0] {
|
||||||
|
case "rev-list":
|
||||||
|
assert.EqualValues(t, []string{"rev-list", "@{u}..head", "--abbrev-commit"}, args)
|
||||||
|
return exec.Command("echo")
|
||||||
|
case "log":
|
||||||
|
assert.EqualValues(t, []string{"log", "--oneline", "-30"}, args)
|
||||||
|
return exec.Command("echo")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
func(commits []Commit) {
|
||||||
|
assert.Len(t, commits, 0)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GetCommits returns 2 commits, 1 pushed the other not",
|
||||||
|
func(cmd string, args ...string) *exec.Cmd {
|
||||||
|
assert.EqualValues(t, "git", cmd)
|
||||||
|
|
||||||
|
switch args[0] {
|
||||||
|
case "rev-list":
|
||||||
|
assert.EqualValues(t, []string{"rev-list", "@{u}..head", "--abbrev-commit"}, args)
|
||||||
|
return exec.Command("echo", "8a2bb0e")
|
||||||
|
case "log":
|
||||||
|
assert.EqualValues(t, []string{"log", "--oneline", "-30"}, args)
|
||||||
|
return exec.Command("echo", "8a2bb0e commit 1\n78976bc commit 2")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
func(commits []Commit) {
|
||||||
|
assert.Len(t, commits, 2)
|
||||||
|
assert.EqualValues(t, []Commit{
|
||||||
|
{
|
||||||
|
Sha: "8a2bb0e",
|
||||||
|
Name: "commit 1",
|
||||||
|
Pushed: true,
|
||||||
|
DisplayString: "8a2bb0e commit 1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Sha: "78976bc",
|
||||||
|
Name: "commit 2",
|
||||||
|
Pushed: false,
|
||||||
|
DisplayString: "78976bc commit 2",
|
||||||
|
},
|
||||||
|
}, commits)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, s := range scenarios {
|
||||||
|
t.Run(s.testName, func(t *testing.T) {
|
||||||
|
gitCmd := newDummyGitCommand()
|
||||||
|
gitCmd.OSCommand.command = s.command
|
||||||
|
s.test(gitCmd.GetCommits())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestGitCommandDiff(t *testing.T) {
|
func TestGitCommandDiff(t *testing.T) {
|
||||||
gitCommand := newDummyGitCommand()
|
gitCommand := newDummyGitCommand()
|
||||||
assert.NoError(t, test.GenerateRepo("lots_of_diffs.sh"))
|
assert.NoError(t, test.GenerateRepo("lots_of_diffs.sh"))
|
||||||
|
@ -141,7 +141,6 @@ func (gui *Gui) handleRenameCommit(g *gocui.Gui, v *gocui.View) error {
|
|||||||
}
|
}
|
||||||
return gui.handleCommitSelect(g, v)
|
return gui.handleCommitSelect(g, v)
|
||||||
})
|
})
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) handleRenameCommitEditor(g *gocui.Gui, v *gocui.View) error {
|
func (gui *Gui) handleRenameCommitEditor(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user