mirror of
https://github.com/jesseduffield/lazygit.git
synced 2024-12-12 11:15:00 +02:00
63dc07fded
By constructing an arg vector manually, we no longer need to quote arguments Mandate that args must be passed when building a command Now you need to provide an args array when building a command. There are a handful of places where we need to deal with a string, such as with user-defined custom commands, and for those we now require that at the callsite they use str.ToArgv to do that. I don't want to provide a method out of the box for it because I want to discourage its use. For some reason we were invoking a command through a shell when amending a commit, and I don't believe we needed to do that as there was nothing user- supplied about the command. So I've switched to using a regular command out- side the shell there
170 lines
5.6 KiB
Go
170 lines
5.6 KiB
Go
package git_commands
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
|
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
|
|
"github.com/jesseduffield/lazygit/pkg/utils"
|
|
"github.com/sanity-io/litter"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
var reflogOutput = strings.Replace(`c3c4b66b64c97ffeecde|1643150483|checkout: moving from A to B|51baa8c1
|
|
c3c4b66b64c97ffeecde|1643150483|checkout: moving from B to A|51baa8c1
|
|
c3c4b66b64c97ffeecde|1643150483|checkout: moving from A to B|51baa8c1
|
|
c3c4b66b64c97ffeecde|1643150483|checkout: moving from master to A|51baa8c1
|
|
f4ddf2f0d4be4ccc7efa|1643149435|checkout: moving from A to master|51baa8c1
|
|
`, "|", "\x00", -1)
|
|
|
|
func TestGetReflogCommits(t *testing.T) {
|
|
type scenario struct {
|
|
testName string
|
|
runner *oscommands.FakeCmdObjRunner
|
|
lastReflogCommit *models.Commit
|
|
filterPath string
|
|
expectedCommits []*models.Commit
|
|
expectedOnlyObtainedNew bool
|
|
expectedError error
|
|
}
|
|
|
|
scenarios := []scenario{
|
|
{
|
|
testName: "no reflog entries",
|
|
runner: oscommands.NewFakeRunner(t).
|
|
ExpectGitArgs([]string{"-c", "log.showSignature=false", "log", "-g", "--abbrev=40", "--format=%h%x00%ct%x00%gs%x00%p"}, "", nil),
|
|
|
|
lastReflogCommit: nil,
|
|
expectedCommits: []*models.Commit{},
|
|
expectedOnlyObtainedNew: false,
|
|
expectedError: nil,
|
|
},
|
|
{
|
|
testName: "some reflog entries",
|
|
runner: oscommands.NewFakeRunner(t).
|
|
ExpectGitArgs([]string{"-c", "log.showSignature=false", "log", "-g", "--abbrev=40", "--format=%h%x00%ct%x00%gs%x00%p"}, reflogOutput, nil),
|
|
|
|
lastReflogCommit: nil,
|
|
expectedCommits: []*models.Commit{
|
|
{
|
|
Sha: "c3c4b66b64c97ffeecde",
|
|
Name: "checkout: moving from A to B",
|
|
Status: models.StatusReflog,
|
|
UnixTimestamp: 1643150483,
|
|
Parents: []string{"51baa8c1"},
|
|
},
|
|
{
|
|
Sha: "c3c4b66b64c97ffeecde",
|
|
Name: "checkout: moving from B to A",
|
|
Status: models.StatusReflog,
|
|
UnixTimestamp: 1643150483,
|
|
Parents: []string{"51baa8c1"},
|
|
},
|
|
{
|
|
Sha: "c3c4b66b64c97ffeecde",
|
|
Name: "checkout: moving from A to B",
|
|
Status: models.StatusReflog,
|
|
UnixTimestamp: 1643150483,
|
|
Parents: []string{"51baa8c1"},
|
|
},
|
|
{
|
|
Sha: "c3c4b66b64c97ffeecde",
|
|
Name: "checkout: moving from master to A",
|
|
Status: models.StatusReflog,
|
|
UnixTimestamp: 1643150483,
|
|
Parents: []string{"51baa8c1"},
|
|
},
|
|
{
|
|
Sha: "f4ddf2f0d4be4ccc7efa",
|
|
Name: "checkout: moving from A to master",
|
|
Status: models.StatusReflog,
|
|
UnixTimestamp: 1643149435,
|
|
Parents: []string{"51baa8c1"},
|
|
},
|
|
},
|
|
expectedOnlyObtainedNew: false,
|
|
expectedError: nil,
|
|
},
|
|
{
|
|
testName: "some reflog entries where last commit is given",
|
|
runner: oscommands.NewFakeRunner(t).
|
|
ExpectGitArgs([]string{"-c", "log.showSignature=false", "log", "-g", "--abbrev=40", "--format=%h%x00%ct%x00%gs%x00%p"}, reflogOutput, nil),
|
|
|
|
lastReflogCommit: &models.Commit{
|
|
Sha: "c3c4b66b64c97ffeecde",
|
|
Name: "checkout: moving from B to A",
|
|
Status: models.StatusReflog,
|
|
UnixTimestamp: 1643150483,
|
|
Parents: []string{"51baa8c1"},
|
|
},
|
|
expectedCommits: []*models.Commit{
|
|
{
|
|
Sha: "c3c4b66b64c97ffeecde",
|
|
Name: "checkout: moving from A to B",
|
|
Status: models.StatusReflog,
|
|
UnixTimestamp: 1643150483,
|
|
Parents: []string{"51baa8c1"},
|
|
},
|
|
},
|
|
expectedOnlyObtainedNew: true,
|
|
expectedError: nil,
|
|
},
|
|
{
|
|
testName: "when passing filterPath",
|
|
runner: oscommands.NewFakeRunner(t).
|
|
ExpectGitArgs([]string{"-c", "log.showSignature=false", "log", "-g", "--abbrev=40", "--format=%h%x00%ct%x00%gs%x00%p", "--follow", "--", "path"}, reflogOutput, nil),
|
|
|
|
lastReflogCommit: &models.Commit{
|
|
Sha: "c3c4b66b64c97ffeecde",
|
|
Name: "checkout: moving from B to A",
|
|
Status: models.StatusReflog,
|
|
UnixTimestamp: 1643150483,
|
|
Parents: []string{"51baa8c1"},
|
|
},
|
|
filterPath: "path",
|
|
expectedCommits: []*models.Commit{
|
|
{
|
|
Sha: "c3c4b66b64c97ffeecde",
|
|
Name: "checkout: moving from A to B",
|
|
Status: models.StatusReflog,
|
|
UnixTimestamp: 1643150483,
|
|
Parents: []string{"51baa8c1"},
|
|
},
|
|
},
|
|
expectedOnlyObtainedNew: true,
|
|
expectedError: nil,
|
|
},
|
|
{
|
|
testName: "when command returns error",
|
|
runner: oscommands.NewFakeRunner(t).
|
|
ExpectGitArgs([]string{"-c", "log.showSignature=false", "log", "-g", "--abbrev=40", "--format=%h%x00%ct%x00%gs%x00%p"}, "", errors.New("haha")),
|
|
|
|
lastReflogCommit: nil,
|
|
filterPath: "",
|
|
expectedCommits: nil,
|
|
expectedOnlyObtainedNew: false,
|
|
expectedError: errors.New("haha"),
|
|
},
|
|
}
|
|
|
|
for _, scenario := range scenarios {
|
|
scenario := scenario
|
|
t.Run(scenario.testName, func(t *testing.T) {
|
|
builder := &ReflogCommitLoader{
|
|
Common: utils.NewDummyCommon(),
|
|
cmd: oscommands.NewDummyCmdObjBuilder(scenario.runner),
|
|
}
|
|
|
|
commits, onlyObtainednew, err := builder.GetReflogCommits(scenario.lastReflogCommit, scenario.filterPath)
|
|
assert.Equal(t, scenario.expectedOnlyObtainedNew, onlyObtainednew)
|
|
assert.Equal(t, scenario.expectedError, err)
|
|
t.Logf("actual commits: \n%s", litter.Sdump(commits))
|
|
assert.Equal(t, scenario.expectedCommits, commits)
|
|
|
|
scenario.runner.CheckForMissingCalls()
|
|
})
|
|
}
|
|
}
|