mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-05-11 12:25:47 +02:00
Store Commit.Hash by pointer (kept in a pool of hashes)
This in itself is not an improvement, because hashes are unique (they are shared between real commits and rebase todos, but there are so few of those that it doesn't matter). However, it becomes an improvement once we also store parent hashes in the same pool; but the real motivation for this change is to also reuse the hash pointers in Pipe objects later in the branch. This will be a big win because in a merge-heavy git repo there are many more Pipe instances than commits.
This commit is contained in:
parent
1037371a44
commit
e27bc15bbd
15 changed files with 119 additions and 74 deletions
|
@ -219,9 +219,11 @@ func TestRenderCommitGraph(t *testing.T) {
|
|||
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
hashPool := &utils.StringPool{}
|
||||
|
||||
getStyle := func(c *models.Commit) style.TextStyle { return style.FgDefault }
|
||||
commits := lo.Map(test.commitOpts,
|
||||
func(opts models.NewCommitOpts, _ int) *models.Commit { return models.NewCommit(opts) })
|
||||
func(opts models.NewCommitOpts, _ int) *models.Commit { return models.NewCommit(hashPool, opts) })
|
||||
lines := RenderCommitGraph(commits, "blah", getStyle)
|
||||
|
||||
trimmedExpectedOutput := ""
|
||||
|
@ -254,6 +256,8 @@ func TestRenderPipeSet(t *testing.T) {
|
|||
magenta := style.FgMagenta
|
||||
nothing := style.Nothing
|
||||
|
||||
hashPool := &utils.StringPool{}
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
pipes []*Pipe
|
||||
|
@ -268,7 +272,7 @@ func TestRenderPipeSet(t *testing.T) {
|
|||
{fromPos: 0, toPos: 0, fromHash: "a", toHash: "b", kind: TERMINATES, style: cyan},
|
||||
{fromPos: 0, toPos: 0, fromHash: "b", toHash: "c", kind: STARTS, style: green},
|
||||
},
|
||||
prevCommit: models.NewCommit(models.NewCommitOpts{Hash: "a"}),
|
||||
prevCommit: models.NewCommit(hashPool, models.NewCommitOpts{Hash: "a"}),
|
||||
expectedStr: "◯",
|
||||
expectedStyles: []style.TextStyle{green},
|
||||
},
|
||||
|
@ -278,7 +282,7 @@ func TestRenderPipeSet(t *testing.T) {
|
|||
{fromPos: 0, toPos: 0, fromHash: "a", toHash: "selected", kind: TERMINATES, style: cyan},
|
||||
{fromPos: 0, toPos: 0, fromHash: "selected", toHash: "c", kind: STARTS, style: green},
|
||||
},
|
||||
prevCommit: models.NewCommit(models.NewCommitOpts{Hash: "a"}),
|
||||
prevCommit: models.NewCommit(hashPool, models.NewCommitOpts{Hash: "a"}),
|
||||
expectedStr: "◯",
|
||||
expectedStyles: []style.TextStyle{highlightStyle},
|
||||
},
|
||||
|
@ -290,7 +294,7 @@ func TestRenderPipeSet(t *testing.T) {
|
|||
{fromPos: 0, toPos: 0, fromHash: "selected", toHash: "d", kind: STARTS, style: green},
|
||||
{fromPos: 0, toPos: 1, fromHash: "selected", toHash: "e", kind: STARTS, style: green},
|
||||
},
|
||||
prevCommit: models.NewCommit(models.NewCommitOpts{Hash: "a"}),
|
||||
prevCommit: models.NewCommit(hashPool, models.NewCommitOpts{Hash: "a"}),
|
||||
expectedStr: "⏣─╮",
|
||||
expectedStyles: []style.TextStyle{
|
||||
highlightStyle, highlightStyle, highlightStyle,
|
||||
|
@ -304,7 +308,7 @@ func TestRenderPipeSet(t *testing.T) {
|
|||
{fromPos: 0, toPos: 0, fromHash: "b", toHash: "d", kind: STARTS, style: green},
|
||||
{fromPos: 0, toPos: 1, fromHash: "b", toHash: "e", kind: STARTS, style: green},
|
||||
},
|
||||
prevCommit: models.NewCommit(models.NewCommitOpts{Hash: "a"}),
|
||||
prevCommit: models.NewCommit(hashPool, models.NewCommitOpts{Hash: "a"}),
|
||||
expectedStr: "⏣─│",
|
||||
expectedStyles: []style.TextStyle{
|
||||
green, green, magenta,
|
||||
|
@ -319,7 +323,7 @@ func TestRenderPipeSet(t *testing.T) {
|
|||
{fromPos: 3, toPos: 0, fromHash: "e1", toHash: "a2", kind: TERMINATES, style: green},
|
||||
{fromPos: 0, toPos: 2, fromHash: "a2", toHash: "c3", kind: STARTS, style: yellow},
|
||||
},
|
||||
prevCommit: models.NewCommit(models.NewCommitOpts{Hash: "a1"}),
|
||||
prevCommit: models.NewCommit(hashPool, models.NewCommitOpts{Hash: "a1"}),
|
||||
expectedStr: "⏣─│─┬─╯",
|
||||
expectedStyles: []style.TextStyle{
|
||||
yellow, yellow, magenta, yellow, yellow, green, green,
|
||||
|
@ -334,7 +338,7 @@ func TestRenderPipeSet(t *testing.T) {
|
|||
{fromPos: 3, toPos: 0, fromHash: "e1", toHash: "selected", kind: TERMINATES, style: green},
|
||||
{fromPos: 0, toPos: 2, fromHash: "selected", toHash: "c3", kind: STARTS, style: yellow},
|
||||
},
|
||||
prevCommit: models.NewCommit(models.NewCommitOpts{Hash: "a1"}),
|
||||
prevCommit: models.NewCommit(hashPool, models.NewCommitOpts{Hash: "a1"}),
|
||||
expectedStr: "⏣───╮ ╯",
|
||||
expectedStyles: []style.TextStyle{
|
||||
highlightStyle, highlightStyle, highlightStyle, highlightStyle, highlightStyle, nothing, green,
|
||||
|
@ -348,7 +352,7 @@ func TestRenderPipeSet(t *testing.T) {
|
|||
{fromPos: 1, toPos: 0, fromHash: "b1", toHash: "a2", kind: TERMINATES, style: magenta},
|
||||
{fromPos: 2, toPos: 0, fromHash: "c1", toHash: "a2", kind: TERMINATES, style: green},
|
||||
},
|
||||
prevCommit: models.NewCommit(models.NewCommitOpts{Hash: "a1"}),
|
||||
prevCommit: models.NewCommit(hashPool, models.NewCommitOpts{Hash: "a1"}),
|
||||
expectedStr: "◯─┴─╯",
|
||||
expectedStyles: []style.TextStyle{
|
||||
yellow, magenta, magenta, green, green,
|
||||
|
@ -363,7 +367,7 @@ func TestRenderPipeSet(t *testing.T) {
|
|||
{fromPos: 1, toPos: 1, fromHash: "b1", toHash: "b3", kind: CONTINUES, style: magenta},
|
||||
{fromPos: 2, toPos: 2, fromHash: "c1", toHash: "c3", kind: CONTINUES, style: green},
|
||||
},
|
||||
prevCommit: models.NewCommit(models.NewCommitOpts{Hash: "a1"}),
|
||||
prevCommit: models.NewCommit(hashPool, models.NewCommitOpts{Hash: "a1"}),
|
||||
expectedStr: "⏣─│─│─╮",
|
||||
expectedStyles: []style.TextStyle{
|
||||
yellow, yellow, magenta, yellow, green, yellow, yellow,
|
||||
|
@ -378,7 +382,7 @@ func TestRenderPipeSet(t *testing.T) {
|
|||
{fromPos: 1, toPos: 1, fromHash: "b1", toHash: "a2", kind: CONTINUES, style: green},
|
||||
{fromPos: 2, toPos: 0, fromHash: "c1", toHash: "a2", kind: TERMINATES, style: magenta},
|
||||
},
|
||||
prevCommit: models.NewCommit(models.NewCommitOpts{Hash: "a1"}),
|
||||
prevCommit: models.NewCommit(hashPool, models.NewCommitOpts{Hash: "a1"}),
|
||||
expectedStr: "⏣─│─╯",
|
||||
expectedStyles: []style.TextStyle{
|
||||
yellow, yellow, green, magenta, magenta,
|
||||
|
@ -393,7 +397,7 @@ func TestRenderPipeSet(t *testing.T) {
|
|||
{fromPos: 2, toPos: 2, fromHash: "c1", toHash: "c3", kind: CONTINUES, style: green},
|
||||
{fromPos: 3, toPos: 0, fromHash: "d1", toHash: "a2", kind: TERMINATES, style: magenta},
|
||||
},
|
||||
prevCommit: models.NewCommit(models.NewCommitOpts{Hash: "a1"}),
|
||||
prevCommit: models.NewCommit(hashPool, models.NewCommitOpts{Hash: "a1"}),
|
||||
expectedStr: "⏣─┬─│─╯",
|
||||
expectedStyles: []style.TextStyle{
|
||||
yellow, yellow, yellow, magenta, green, magenta, magenta,
|
||||
|
@ -405,7 +409,7 @@ func TestRenderPipeSet(t *testing.T) {
|
|||
{fromPos: 0, toPos: 0, fromHash: "selected", toHash: "a2", kind: TERMINATES, style: red},
|
||||
{fromPos: 0, toPos: 0, fromHash: "a2", toHash: "a3", kind: STARTS, style: yellow},
|
||||
},
|
||||
prevCommit: models.NewCommit(models.NewCommitOpts{Hash: "selected"}),
|
||||
prevCommit: models.NewCommit(hashPool, models.NewCommitOpts{Hash: "selected"}),
|
||||
expectedStr: "◯",
|
||||
expectedStyles: []style.TextStyle{
|
||||
yellow,
|
||||
|
@ -417,7 +421,7 @@ func TestRenderPipeSet(t *testing.T) {
|
|||
{fromPos: 0, toPos: 0, fromHash: "selected", toHash: "a2", kind: TERMINATES, style: red},
|
||||
{fromPos: 1, toPos: 1, fromHash: "selected", toHash: "b3", kind: CONTINUES, style: red},
|
||||
},
|
||||
prevCommit: models.NewCommit(models.NewCommitOpts{Hash: "selected"}),
|
||||
prevCommit: models.NewCommit(hashPool, models.NewCommitOpts{Hash: "selected"}),
|
||||
expectedStr: "◯ │",
|
||||
expectedStyles: []style.TextStyle{
|
||||
highlightStyle, nothing, highlightStyle,
|
||||
|
@ -430,7 +434,7 @@ func TestRenderPipeSet(t *testing.T) {
|
|||
{fromPos: 1, toPos: 1, fromHash: "z1", toHash: "z3", kind: CONTINUES, style: green},
|
||||
{fromPos: 2, toPos: 2, fromHash: "selected", toHash: "b3", kind: CONTINUES, style: red},
|
||||
},
|
||||
prevCommit: models.NewCommit(models.NewCommitOpts{Hash: "selected"}),
|
||||
prevCommit: models.NewCommit(hashPool, models.NewCommitOpts{Hash: "selected"}),
|
||||
expectedStr: "◯ │ │",
|
||||
expectedStyles: []style.TextStyle{
|
||||
highlightStyle, nothing, green, nothing, highlightStyle,
|
||||
|
@ -444,7 +448,7 @@ func TestRenderPipeSet(t *testing.T) {
|
|||
{fromPos: 0, toPos: 1, fromHash: "a2", toHash: "b3", kind: STARTS, style: green},
|
||||
{fromPos: 1, toPos: 0, fromHash: "selected", toHash: "a2", kind: TERMINATES, style: yellow},
|
||||
},
|
||||
prevCommit: models.NewCommit(models.NewCommitOpts{Hash: "selected"}),
|
||||
prevCommit: models.NewCommit(hashPool, models.NewCommitOpts{Hash: "selected"}),
|
||||
expectedStr: "⏣─╯",
|
||||
expectedStyles: []style.TextStyle{
|
||||
highlightStyle, highlightStyle, highlightStyle,
|
||||
|
@ -477,6 +481,8 @@ func TestRenderPipeSet(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestGetNextPipes(t *testing.T) {
|
||||
hashPool := &utils.StringPool{}
|
||||
|
||||
tests := []struct {
|
||||
prevPipes []*Pipe
|
||||
commit *models.Commit
|
||||
|
@ -486,7 +492,7 @@ func TestGetNextPipes(t *testing.T) {
|
|||
prevPipes: []*Pipe{
|
||||
{fromPos: 0, toPos: 0, fromHash: "a", toHash: "b", kind: STARTS, style: style.FgDefault},
|
||||
},
|
||||
commit: models.NewCommit(models.NewCommitOpts{
|
||||
commit: models.NewCommit(hashPool, models.NewCommitOpts{
|
||||
Hash: "b",
|
||||
Parents: []string{"c"},
|
||||
}),
|
||||
|
@ -501,7 +507,7 @@ func TestGetNextPipes(t *testing.T) {
|
|||
{fromPos: 0, toPos: 0, fromHash: "b", toHash: "c", kind: STARTS, style: style.FgDefault},
|
||||
{fromPos: 0, toPos: 1, fromHash: "b", toHash: "d", kind: STARTS, style: style.FgDefault},
|
||||
},
|
||||
commit: models.NewCommit(models.NewCommitOpts{
|
||||
commit: models.NewCommit(hashPool, models.NewCommitOpts{
|
||||
Hash: "d",
|
||||
Parents: []string{"e"},
|
||||
}),
|
||||
|
@ -515,7 +521,7 @@ func TestGetNextPipes(t *testing.T) {
|
|||
prevPipes: []*Pipe{
|
||||
{fromPos: 0, toPos: 0, fromHash: "a", toHash: "root", kind: TERMINATES, style: style.FgDefault},
|
||||
},
|
||||
commit: models.NewCommit(models.NewCommitOpts{
|
||||
commit: models.NewCommit(hashPool, models.NewCommitOpts{
|
||||
Hash: "root",
|
||||
Parents: []string{},
|
||||
}),
|
||||
|
@ -557,8 +563,10 @@ func BenchmarkRenderCommitGraph(b *testing.B) {
|
|||
}
|
||||
|
||||
func generateCommits(count int) []*models.Commit {
|
||||
hashPool := &utils.StringPool{}
|
||||
|
||||
rnd := rand.New(rand.NewSource(1234))
|
||||
pool := []*models.Commit{models.NewCommit(models.NewCommitOpts{Hash: "a", AuthorName: "A"})}
|
||||
pool := []*models.Commit{models.NewCommit(hashPool, models.NewCommitOpts{Hash: "a", AuthorName: "A"})}
|
||||
commits := make([]*models.Commit, 0, count)
|
||||
authorPool := []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
|
||||
for len(commits) < count {
|
||||
|
@ -575,7 +583,7 @@ func generateCommits(count int) []*models.Commit {
|
|||
if reuseParent {
|
||||
newParent = pool[j]
|
||||
} else {
|
||||
newParent = models.NewCommit(models.NewCommitOpts{
|
||||
newParent = models.NewCommit(hashPool, models.NewCommitOpts{
|
||||
Hash: fmt.Sprintf("%s%d", currentCommit.Hash(), j),
|
||||
AuthorName: authorPool[rnd.Intn(len(authorPool))],
|
||||
})
|
||||
|
@ -584,7 +592,7 @@ func generateCommits(count int) []*models.Commit {
|
|||
parentHashes = append(parentHashes, newParent.Hash())
|
||||
}
|
||||
|
||||
changedCommit := models.NewCommit(models.NewCommitOpts{
|
||||
changedCommit := models.NewCommit(hashPool, models.NewCommitOpts{
|
||||
Hash: currentCommit.Hash(),
|
||||
AuthorName: currentCommit.AuthorName,
|
||||
Parents: parentHashes,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue