1package commitgraph_test
2
3import (
4 "os"
5 "testing"
6
7 "github.com/go-git/go-billy/v5"
8 "github.com/go-git/go-billy/v5/util"
9 "github.com/go-git/go-git/v5/plumbing"
10 "github.com/go-git/go-git/v5/plumbing/format/commitgraph"
11 "github.com/stretchr/testify/suite"
12
13 fixtures "github.com/go-git/go-git-fixtures/v4"
14)
15
16type CommitgraphFixtureSuite struct {
17 fixtures.Suite
18}
19
20type CommitgraphSuite struct {
21 suite.Suite
22 CommitgraphFixtureSuite
23}
24
25func TestCommitgraphSuite(t *testing.T) {
26 suite.Run(t, new(CommitgraphSuite))
27}
28
29func testDecodeHelper(s *CommitgraphSuite, fs billy.Filesystem, path string) {
30 reader, err := fs.Open(path)
31 s.NoError(err)
32 defer reader.Close()
33 index, err := commitgraph.OpenFileIndex(reader)
34 s.NoError(err)
35
36 // Root commit
37 nodeIndex, err := index.GetIndexByHash(plumbing.NewHash("347c91919944a68e9413581a1bc15519550a3afe"))
38 s.NoError(err)
39 commitData, err := index.GetCommitDataByIndex(nodeIndex)
40 s.NoError(err)
41 s.Len(commitData.ParentIndexes, 0)
42 s.Len(commitData.ParentHashes, 0)
43
44 // Regular commit
45 nodeIndex, err = index.GetIndexByHash(plumbing.NewHash("e713b52d7e13807e87a002e812041f248db3f643"))
46 s.NoError(err)
47 commitData, err = index.GetCommitDataByIndex(nodeIndex)
48 s.NoError(err)
49 s.Len(commitData.ParentIndexes, 1)
50 s.Len(commitData.ParentHashes, 1)
51 s.Equal("347c91919944a68e9413581a1bc15519550a3afe", commitData.ParentHashes[0].String())
52
53 // Merge commit
54 nodeIndex, err = index.GetIndexByHash(plumbing.NewHash("b29328491a0682c259bcce28741eac71f3499f7d"))
55 s.NoError(err)
56 commitData, err = index.GetCommitDataByIndex(nodeIndex)
57 s.NoError(err)
58 s.Len(commitData.ParentIndexes, 2)
59 s.Len(commitData.ParentHashes, 2)
60 s.Equal("e713b52d7e13807e87a002e812041f248db3f643", commitData.ParentHashes[0].String())
61 s.Equal("03d2c021ff68954cf3ef0a36825e194a4b98f981", commitData.ParentHashes[1].String())
62
63 // Octopus merge commit
64 nodeIndex, err = index.GetIndexByHash(plumbing.NewHash("6f6c5d2be7852c782be1dd13e36496dd7ad39560"))
65 s.NoError(err)
66 commitData, err = index.GetCommitDataByIndex(nodeIndex)
67 s.NoError(err)
68 s.Len(commitData.ParentIndexes, 3)
69 s.Len(commitData.ParentHashes, 3)
70 s.Equal("ce275064ad67d51e99f026084e20827901a8361c", commitData.ParentHashes[0].String())
71 s.Equal("bb13916df33ed23004c3ce9ed3b8487528e655c1", commitData.ParentHashes[1].String())
72 s.Equal("a45273fe2d63300e1962a9e26a6b15c276cd7082", commitData.ParentHashes[2].String())
73
74 // Check all hashes
75 hashes := index.Hashes()
76 s.Len(hashes, 11)
77 s.Equal("03d2c021ff68954cf3ef0a36825e194a4b98f981", hashes[0].String())
78 s.Equal("e713b52d7e13807e87a002e812041f248db3f643", hashes[10].String())
79}
80
81func (s *CommitgraphSuite) TestDecode() {
82 for _, f := range fixtures.ByTag("commit-graph") {
83 dotgit := f.DotGit()
84 testDecodeHelper(s, dotgit, dotgit.Join("objects", "info", "commit-graph"))
85 }
86}
87
88func (s *CommitgraphSuite) TestReencode() {
89 for _, f := range fixtures.ByTag("commit-graph") {
90 dotgit := f.DotGit()
91
92 reader, err := dotgit.Open(dotgit.Join("objects", "info", "commit-graph"))
93 s.NoError(err)
94 defer reader.Close()
95 index, err := commitgraph.OpenFileIndex(reader)
96 s.NoError(err)
97
98 writer, err := util.TempFile(dotgit, "", "commit-graph")
99 s.NoError(err)
100 tmpName := writer.Name()
101 defer os.Remove(tmpName)
102
103 encoder := commitgraph.NewEncoder(writer)
104 err = encoder.Encode(index)
105 s.NoError(err)
106 writer.Close()
107
108 testDecodeHelper(s, dotgit, tmpName)
109 }
110}
111
112func (s *CommitgraphSuite) TestReencodeInMemory() {
113 for _, f := range fixtures.ByTag("commit-graph") {
114 dotgit := f.DotGit()
115
116 reader, err := dotgit.Open(dotgit.Join("objects", "info", "commit-graph"))
117 s.NoError(err)
118 index, err := commitgraph.OpenFileIndex(reader)
119 s.NoError(err)
120 memoryIndex := commitgraph.NewMemoryIndex()
121 for i, hash := range index.Hashes() {
122 commitData, err := index.GetCommitDataByIndex(i)
123 s.NoError(err)
124 memoryIndex.Add(hash, commitData)
125 }
126 reader.Close()
127
128 writer, err := util.TempFile(dotgit, "", "commit-graph")
129 s.NoError(err)
130 tmpName := writer.Name()
131 defer os.Remove(tmpName)
132
133 encoder := commitgraph.NewEncoder(writer)
134 err = encoder.Encode(memoryIndex)
135 s.NoError(err)
136 writer.Close()
137
138 testDecodeHelper(s, dotgit, tmpName)
139 }
140}