1package commitgraph
2
3import (
4 "path"
5 "testing"
6
7 "github.com/go-git/go-git/v5/plumbing"
8 "github.com/go-git/go-git/v5/plumbing/cache"
9 commitgraph "github.com/go-git/go-git/v5/plumbing/format/commitgraph/v2"
10 "github.com/go-git/go-git/v5/plumbing/format/packfile"
11 "github.com/go-git/go-git/v5/storage/filesystem"
12 "github.com/stretchr/testify/suite"
13
14 fixtures "github.com/go-git/go-git-fixtures/v4"
15)
16
17type CommitNodeFixtureSuite struct {
18 fixtures.Suite
19}
20
21type CommitNodeSuite struct {
22 suite.Suite
23 CommitNodeFixtureSuite
24}
25
26func TestCommitNodeSuite(t *testing.T) {
27 suite.Run(t, new(CommitNodeSuite))
28}
29
30func unpackRepository(f *fixtures.Fixture) *filesystem.Storage {
31 storer := filesystem.NewStorage(f.DotGit(), cache.NewObjectLRUDefault())
32 p := f.Packfile()
33 defer p.Close()
34 packfile.UpdateObjectStorage(storer, p)
35 return storer
36}
37
38func testWalker(s *CommitNodeSuite, nodeIndex CommitNodeIndex) {
39 head, err := nodeIndex.Get(plumbing.NewHash("b9d69064b190e7aedccf84731ca1d917871f8a1c"))
40 s.NoError(err)
41
42 iter := NewCommitNodeIterCTime(
43 head,
44 nil,
45 nil,
46 )
47
48 var commits []CommitNode
49 iter.ForEach(func(c CommitNode) error {
50 commits = append(commits, c)
51 return nil
52 })
53
54 s.Len(commits, 9)
55
56 expected := []string{
57 "b9d69064b190e7aedccf84731ca1d917871f8a1c",
58 "6f6c5d2be7852c782be1dd13e36496dd7ad39560",
59 "a45273fe2d63300e1962a9e26a6b15c276cd7082",
60 "c0edf780dd0da6a65a7a49a86032fcf8a0c2d467",
61 "bb13916df33ed23004c3ce9ed3b8487528e655c1",
62 "03d2c021ff68954cf3ef0a36825e194a4b98f981",
63 "ce275064ad67d51e99f026084e20827901a8361c",
64 "e713b52d7e13807e87a002e812041f248db3f643",
65 "347c91919944a68e9413581a1bc15519550a3afe",
66 }
67 for i, commit := range commits {
68 s.Equal(expected[i], commit.ID().String())
69 }
70}
71
72func testParents(s *CommitNodeSuite, nodeIndex CommitNodeIndex) {
73 merge3, err := nodeIndex.Get(plumbing.NewHash("6f6c5d2be7852c782be1dd13e36496dd7ad39560"))
74 s.NoError(err)
75
76 var parents []CommitNode
77 merge3.ParentNodes().ForEach(func(c CommitNode) error {
78 parents = append(parents, c)
79 return nil
80 })
81
82 s.Len(parents, 3)
83
84 expected := []string{
85 "ce275064ad67d51e99f026084e20827901a8361c",
86 "bb13916df33ed23004c3ce9ed3b8487528e655c1",
87 "a45273fe2d63300e1962a9e26a6b15c276cd7082",
88 }
89 for i, parent := range parents {
90 s.Equal(expected[i], parent.ID().String())
91 }
92}
93
94func testCommitAndTree(s *CommitNodeSuite, nodeIndex CommitNodeIndex) {
95 merge3node, err := nodeIndex.Get(plumbing.NewHash("6f6c5d2be7852c782be1dd13e36496dd7ad39560"))
96 s.NoError(err)
97 merge3commit, err := merge3node.Commit()
98 s.NoError(err)
99 s.Equal(merge3commit.ID().String(), merge3node.ID().String())
100 tree, err := merge3node.Tree()
101 s.NoError(err)
102 s.Equal(merge3commit.TreeHash.String(), tree.ID().String())
103}
104
105func (s *CommitNodeSuite) TestObjectGraph() {
106 f := fixtures.ByTag("commit-graph").One()
107 storer := unpackRepository(f)
108
109 nodeIndex := NewObjectCommitNodeIndex(storer)
110 testWalker(s, nodeIndex)
111 testParents(s, nodeIndex)
112 testCommitAndTree(s, nodeIndex)
113}
114
115func (s *CommitNodeSuite) TestCommitGraph() {
116 f := fixtures.ByTag("commit-graph").One()
117 storer := unpackRepository(f)
118 reader, err := storer.Filesystem().Open(path.Join("objects", "info", "commit-graph"))
119 s.NoError(err)
120 defer reader.Close()
121 index, err := commitgraph.OpenFileIndex(reader)
122 s.NoError(err)
123 defer index.Close()
124
125 nodeIndex := NewGraphCommitNodeIndex(index, storer)
126 testWalker(s, nodeIndex)
127 testParents(s, nodeIndex)
128 testCommitAndTree(s, nodeIndex)
129}
130
131func (s *CommitNodeSuite) TestMixedGraph() {
132 f := fixtures.ByTag("commit-graph").One()
133 storer := unpackRepository(f)
134
135 // Take the commit-graph file and copy it to memory index without the last commit
136 reader, err := storer.Filesystem().Open(path.Join("objects", "info", "commit-graph"))
137 s.NoError(err)
138 defer reader.Close()
139 fileIndex, err := commitgraph.OpenFileIndex(reader)
140 s.NoError(err)
141 defer fileIndex.Close()
142
143 memoryIndex := commitgraph.NewMemoryIndex()
144 defer memoryIndex.Close()
145
146 for i, hash := range fileIndex.Hashes() {
147 if hash.String() != "b9d69064b190e7aedccf84731ca1d917871f8a1c" {
148 node, err := fileIndex.GetCommitDataByIndex(uint32(i))
149 s.NoError(err)
150 memoryIndex.Add(hash, node)
151 }
152 }
153
154 nodeIndex := NewGraphCommitNodeIndex(memoryIndex, storer)
155 testWalker(s, nodeIndex)
156 testParents(s, nodeIndex)
157 testCommitAndTree(s, nodeIndex)
158}