From 30be50b641dbe594d7968e79536028f22beee1b0 Mon Sep 17 00:00:00 2001 From: Ryooooooga Date: Sat, 26 Mar 2022 22:03:32 +0900 Subject: add `Commit.ParentRefName()` --- pkg/commands/loaders/commits.go | 7 ++++++- pkg/commands/loaders/reflog_commits.go | 13 ++++++++++--- pkg/commands/loaders/reflog_commits_test.go | 29 +++++++++++++++++++---------- pkg/commands/models/commit.go | 14 ++++++++++++++ 4 files changed, 49 insertions(+), 14 deletions(-) (limited to 'pkg') diff --git a/pkg/commands/loaders/commits.go b/pkg/commands/loaders/commits.go index ae4455df5..fd6ce64a8 100644 --- a/pkg/commands/loaders/commits.go +++ b/pkg/commands/loaders/commits.go @@ -178,6 +178,11 @@ func (self *CommitLoader) extractCommitFromLine(line string) *models.Commit { unitTimestampInt, _ := strconv.Atoi(unixTimestamp) + parents := []string{} + if len(parentHashes) > 0 { + parents = strings.Split(parentHashes, " ") + } + return &models.Commit{ Sha: sha, Name: message, @@ -185,7 +190,7 @@ func (self *CommitLoader) extractCommitFromLine(line string) *models.Commit { ExtraInfo: extraInfo, UnixTimestamp: int64(unitTimestampInt), Author: author, - Parents: strings.Split(parentHashes, " "), + Parents: parents, } } diff --git a/pkg/commands/loaders/reflog_commits.go b/pkg/commands/loaders/reflog_commits.go index 56c1c71f9..56d10b9f3 100644 --- a/pkg/commands/loaders/reflog_commits.go +++ b/pkg/commands/loaders/reflog_commits.go @@ -32,21 +32,28 @@ func (self *ReflogCommitLoader) GetReflogCommits(lastReflogCommit *models.Commit filterPathArg = fmt.Sprintf(" --follow -- %s", self.cmd.Quote(filterPath)) } - cmdObj := self.cmd.New(fmt.Sprintf(`git log -g --abbrev=40 --format="%s"%s`, "%h%x00%ct%x00%gs", filterPathArg)).DontLog() + cmdObj := self.cmd.New(fmt.Sprintf(`git log -g --abbrev=40 --format="%s"%s`, "%h%x00%ct%x00%gs%x00%p", filterPathArg)).DontLog() onlyObtainedNewReflogCommits := false err := cmdObj.RunAndProcessLines(func(line string) (bool, error) { - fields := strings.SplitN(line, "\x00", 3) - if len(fields) <= 2 { + fields := strings.SplitN(line, "\x00", 4) + if len(fields) <= 3 { return false, nil } unixTimestamp, _ := strconv.Atoi(fields[1]) + parentHashes := fields[3] + parents := []string{} + if len(parentHashes) > 0 { + parents = strings.Split(parentHashes, " ") + } + commit := &models.Commit{ Sha: fields[0], Name: fields[2], UnixTimestamp: int64(unixTimestamp), Status: "reflog", + Parents: parents, } // note that the unix timestamp here is the timestamp of the COMMIT, not the reflog entry itself, diff --git a/pkg/commands/loaders/reflog_commits_test.go b/pkg/commands/loaders/reflog_commits_test.go index bb93caba5..f8d5bff36 100644 --- a/pkg/commands/loaders/reflog_commits_test.go +++ b/pkg/commands/loaders/reflog_commits_test.go @@ -12,11 +12,11 @@ import ( "github.com/stretchr/testify/assert" ) -var reflogOutput = strings.Replace(`c3c4b66b64c97ffeecde|1643150483|checkout: moving from A to B -c3c4b66b64c97ffeecde|1643150483|checkout: moving from B to A -c3c4b66b64c97ffeecde|1643150483|checkout: moving from A to B -c3c4b66b64c97ffeecde|1643150483|checkout: moving from master to A -f4ddf2f0d4be4ccc7efa|1643149435|checkout: moving from A to master +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) { @@ -34,7 +34,7 @@ func TestGetReflogCommits(t *testing.T) { { testName: "no reflog entries", runner: oscommands.NewFakeRunner(t). - Expect(`git log -g --abbrev=40 --format="%h%x00%ct%x00%gs"`, "", nil), + Expect(`git log -g --abbrev=40 --format="%h%x00%ct%x00%gs%x00%p"`, "", nil), lastReflogCommit: nil, expectedCommits: []*models.Commit{}, @@ -44,7 +44,7 @@ func TestGetReflogCommits(t *testing.T) { { testName: "some reflog entries", runner: oscommands.NewFakeRunner(t). - Expect(`git log -g --abbrev=40 --format="%h%x00%ct%x00%gs"`, reflogOutput, nil), + Expect(`git log -g --abbrev=40 --format="%h%x00%ct%x00%gs%x00%p"`, reflogOutput, nil), lastReflogCommit: nil, expectedCommits: []*models.Commit{ @@ -53,30 +53,35 @@ func TestGetReflogCommits(t *testing.T) { Name: "checkout: moving from A to B", Status: "reflog", UnixTimestamp: 1643150483, + Parents: []string{"51baa8c1"}, }, { Sha: "c3c4b66b64c97ffeecde", Name: "checkout: moving from B to A", Status: "reflog", UnixTimestamp: 1643150483, + Parents: []string{"51baa8c1"}, }, { Sha: "c3c4b66b64c97ffeecde", Name: "checkout: moving from A to B", Status: "reflog", UnixTimestamp: 1643150483, + Parents: []string{"51baa8c1"}, }, { Sha: "c3c4b66b64c97ffeecde", Name: "checkout: moving from master to A", Status: "reflog", UnixTimestamp: 1643150483, + Parents: []string{"51baa8c1"}, }, { Sha: "f4ddf2f0d4be4ccc7efa", Name: "checkout: moving from A to master", Status: "reflog", UnixTimestamp: 1643149435, + Parents: []string{"51baa8c1"}, }, }, expectedOnlyObtainedNew: false, @@ -85,13 +90,14 @@ func TestGetReflogCommits(t *testing.T) { { testName: "some reflog entries where last commit is given", runner: oscommands.NewFakeRunner(t). - Expect(`git log -g --abbrev=40 --format="%h%x00%ct%x00%gs"`, reflogOutput, nil), + Expect(`git 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: "reflog", UnixTimestamp: 1643150483, + Parents: []string{"51baa8c1"}, }, expectedCommits: []*models.Commit{ { @@ -99,6 +105,7 @@ func TestGetReflogCommits(t *testing.T) { Name: "checkout: moving from A to B", Status: "reflog", UnixTimestamp: 1643150483, + Parents: []string{"51baa8c1"}, }, }, expectedOnlyObtainedNew: true, @@ -107,13 +114,14 @@ func TestGetReflogCommits(t *testing.T) { { testName: "when passing filterPath", runner: oscommands.NewFakeRunner(t). - Expect(`git log -g --abbrev=40 --format="%h%x00%ct%x00%gs" --follow -- "path"`, reflogOutput, nil), + Expect(`git 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: "reflog", UnixTimestamp: 1643150483, + Parents: []string{"51baa8c1"}, }, filterPath: "path", expectedCommits: []*models.Commit{ @@ -122,6 +130,7 @@ func TestGetReflogCommits(t *testing.T) { Name: "checkout: moving from A to B", Status: "reflog", UnixTimestamp: 1643150483, + Parents: []string{"51baa8c1"}, }, }, expectedOnlyObtainedNew: true, @@ -130,7 +139,7 @@ func TestGetReflogCommits(t *testing.T) { { testName: "when command returns error", runner: oscommands.NewFakeRunner(t). - Expect(`git log -g --abbrev=40 --format="%h%x00%ct%x00%gs"`, "", errors.New("haha")), + Expect(`git log -g --abbrev=40 --format="%h%x00%ct%x00%gs%x00%p"`, "", errors.New("haha")), lastReflogCommit: nil, filterPath: "", diff --git a/pkg/commands/models/commit.go b/pkg/commands/models/commit.go index 9f9184f2e..da992f65a 100644 --- a/pkg/commands/models/commit.go +++ b/pkg/commands/models/commit.go @@ -6,6 +6,9 @@ import ( "github.com/jesseduffield/lazygit/pkg/utils" ) +// Special commit hash for empty tree object +const EmptyTreeCommitHash = "4b825dc642cb6eb9a060e54bf8d69288fbee4904" + // Commit : A git commit type Commit struct { Sha string @@ -29,6 +32,17 @@ func (c *Commit) RefName() string { return c.Sha } +func (c *Commit) ParentRefName() string { + if c.IsFirstCommit() { + return EmptyTreeCommitHash + } + return c.RefName() + "^" +} + +func (c *Commit) IsFirstCommit() bool { + return len(c.Parents) == 0 +} + func (c *Commit) ID() string { return c.RefName() } -- cgit v1.2.3