summaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorRyooooooga <eial5q265e5@gmail.com>2022-03-26 22:03:32 +0900
committerJesse Duffield <jessedduffield@gmail.com>2022-04-02 17:04:42 +1100
commit30be50b641dbe594d7968e79536028f22beee1b0 (patch)
tree3366984909742fd0cd1997f4a923910df266cd42 /pkg
parent99ecc1cfdff9a29a8cfa1bf21cb80c082bee212b (diff)
add `Commit.ParentRefName()`
Diffstat (limited to 'pkg')
-rw-r--r--pkg/commands/loaders/commits.go7
-rw-r--r--pkg/commands/loaders/reflog_commits.go13
-rw-r--r--pkg/commands/loaders/reflog_commits_test.go29
-rw-r--r--pkg/commands/models/commit.go14
4 files changed, 49 insertions, 14 deletions
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()
}