fork of go-git with some jj specific features
at main 4.3 kB view raw
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}