MCPcopy
hub / github.com/go-git/go-git / GetCommitDataByIndex

Method GetCommitDataByIndex

plumbing/format/commitgraph/v2/file.go:227–332  ·  view source on GitHub ↗

GetCommitDataByIndex returns the commit data for the given index in the commit-graph.

(idx uint32)

Source from the content-addressed store, hash-verified

225
226// GetCommitDataByIndex returns the commit data for the given index in the commit-graph.
227func (fi *fileIndex) GetCommitDataByIndex(idx uint32) (*CommitData, error) {
228 if idx < fi.minimumNumberOfHashes {
229 if fi.parent != nil {
230 data, err := fi.parent.GetCommitDataByIndex(idx)
231 if err != nil {
232 return nil, err
233 }
234 return data, nil
235 }
236
237 return nil, plumbing.ErrObjectNotFound
238 }
239 idx -= fi.minimumNumberOfHashes
240 if idx >= fi.fanout[0xff] {
241 return nil, plumbing.ErrObjectNotFound
242 }
243
244 offset := fi.offsets[CommitDataChunk] + int64(idx)*(hash.Size+szCommitData)
245 commitDataReader := io.NewSectionReader(fi.reader, offset, hash.Size+szCommitData)
246
247 treeHash, err := binary.ReadHash(commitDataReader)
248 if err != nil {
249 return nil, err
250 }
251 parent1, err := binary.ReadUint32(commitDataReader)
252 if err != nil {
253 return nil, err
254 }
255 parent2, err := binary.ReadUint32(commitDataReader)
256 if err != nil {
257 return nil, err
258 }
259 genAndTime, err := binary.ReadUint64(commitDataReader)
260 if err != nil {
261 return nil, err
262 }
263
264 var parentIndexes []uint32
265 if parent2&parentOctopusUsed == parentOctopusUsed {
266 // Octopus merge - Look-up the extra parents from the extra edge list
267 // The extra edge list is a list of uint32s, each of which is an index into the Commit Data table, terminated by a index with the most significant bit on.
268 parentIndexes = []uint32{parent1 & parentOctopusMask}
269 offset := fi.offsets[ExtraEdgeListChunk] + szUint32*int64(parent2&parentOctopusMask)
270 buf := make([]byte, szUint32)
271 for {
272 _, err := fi.reader.ReadAt(buf, offset)
273 if err != nil {
274 return nil, err
275 }
276
277 parent := encbin.BigEndian.Uint32(buf)
278 offset += szUint32
279 parentIndexes = append(parentIndexes, parent&parentOctopusMask)
280 if parent&parentLast == parentLast {
281 break
282 }
283 }
284 } else if parent2 != parentNone {

Callers

nothing calls this directly

Calls 5

getHashesFromIndexesMethod · 0.95
ReadHashFunction · 0.92
ReadUint32Function · 0.92
ReadUint64Function · 0.92
GetCommitDataByIndexMethod · 0.65

Tested by

no test coverage detected