fork of go-git with some jj specific features
at main 78 lines 2.3 kB view raw
1package commitgraph 2 3import ( 4 "github.com/go-git/go-git/v5/plumbing" 5) 6 7// MemoryIndex provides a way to build the commit-graph in memory 8// for later encoding to file. 9// 10// Deprecated: This package uses the wrong types for Generation and Index in CommitData. 11// Use the v2 package instead. 12type MemoryIndex struct { 13 commitData []*CommitData 14 indexMap map[plumbing.Hash]int 15} 16 17// NewMemoryIndex creates in-memory commit graph representation 18// 19// Deprecated: This package uses the wrong types for Generation and Index in CommitData. 20// Use the v2 package instead. 21func NewMemoryIndex() *MemoryIndex { 22 return &MemoryIndex{ 23 indexMap: make(map[plumbing.Hash]int), 24 } 25} 26 27// GetIndexByHash gets the index in the commit graph from commit hash, if available 28func (mi *MemoryIndex) GetIndexByHash(h plumbing.Hash) (int, error) { 29 i, ok := mi.indexMap[h] 30 if ok { 31 return i, nil 32 } 33 34 return 0, plumbing.ErrObjectNotFound 35} 36 37// GetCommitDataByIndex gets the commit node from the commit graph using index 38// obtained from child node, if available 39func (mi *MemoryIndex) GetCommitDataByIndex(i int) (*CommitData, error) { 40 if i >= len(mi.commitData) { 41 return nil, plumbing.ErrObjectNotFound 42 } 43 44 commitData := mi.commitData[i] 45 46 // Map parent hashes to parent indexes 47 if commitData.ParentIndexes == nil { 48 parentIndexes := make([]int, len(commitData.ParentHashes)) 49 for i, parentHash := range commitData.ParentHashes { 50 var err error 51 if parentIndexes[i], err = mi.GetIndexByHash(parentHash); err != nil { 52 return nil, err 53 } 54 } 55 commitData.ParentIndexes = parentIndexes 56 } 57 58 return commitData, nil 59} 60 61// Hashes returns all the hashes that are available in the index 62func (mi *MemoryIndex) Hashes() []plumbing.Hash { 63 hashes := make([]plumbing.Hash, 0, len(mi.indexMap)) 64 for k := range mi.indexMap { 65 hashes = append(hashes, k) 66 } 67 return hashes 68} 69 70// Add adds new node to the memory index 71func (mi *MemoryIndex) Add(hash plumbing.Hash, commitData *CommitData) { 72 // The parent indexes are calculated lazily in GetNodeByIndex 73 // which allows adding nodes out of order as long as all parents 74 // are eventually resolved 75 commitData.ParentIndexes = nil 76 mi.indexMap[hash] = len(mi.commitData) 77 mi.commitData = append(mi.commitData, commitData) 78}