mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-04-19 12:12:42 +02:00
This commit introduces a new feature to the commit view, allowing users to filter commits based on the author's name or email address. Similar to the existing path filtering functionality, accessible through <c-s>, this feature allows users to filter the commit history by the currently selected commit's author if the commit view is focused, or by typing in the author's name or email address. This feature adds an entry to the filtering menu, to provide users with a familiar and intuitive experience
196 lines
6.5 KiB
Go
196 lines
6.5 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
|
|
filterAuthor 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 passing filterAuthor",
|
|
runner: oscommands.NewFakeRunner(t).
|
|
ExpectGitArgs([]string{"-c", "log.showSignature=false", "log", "-g", "--abbrev=40", "--format=%h%x00%ct%x00%gs%x00%p", "--author=John Doe <john@doe.com>"}, reflogOutput, nil),
|
|
|
|
lastReflogCommit: &models.Commit{
|
|
Sha: "c3c4b66b64c97ffeecde",
|
|
Name: "checkout: moving from B to A",
|
|
Status: models.StatusReflog,
|
|
UnixTimestamp: 1643150483,
|
|
Parents: []string{"51baa8c1"},
|
|
},
|
|
filterAuthor: "John Doe <john@doe.com>",
|
|
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, scenario.filterAuthor)
|
|
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()
|
|
})
|
|
}
|
|
}
|