package commitgraph import ( "math" "time" "gopkg.in/src-d/go-git.v4/plumbing" "gopkg.in/src-d/go-git.v4/plumbing/object" "gopkg.in/src-d/go-git.v4/plumbing/storer" ) // objectCommitNode is a representation of Commit as presented in the GIT object format. // // objectCommitNode implements the CommitNode interface. type objectCommitNode struct { nodeIndex CommitNodeIndex commit *object.Commit } // NewObjectCommitNodeIndex returns CommitNodeIndex implementation that uses // only object storage to load the nodes func NewObjectCommitNodeIndex(s storer.EncodedObjectStorer) CommitNodeIndex { return &objectCommitNodeIndex{s} } func (oci *objectCommitNodeIndex) Get(hash plumbing.Hash) (CommitNode, error) { commit, err := object.GetCommit(oci.s, hash) if err != nil { return nil, err } return &objectCommitNode{ nodeIndex: oci, commit: commit, }, nil } // objectCommitNodeIndex is an index that can load CommitNode objects only from the // object store. // // objectCommitNodeIndex implements the CommitNodeIndex interface type objectCommitNodeIndex struct { s storer.EncodedObjectStorer } func (c *objectCommitNode) CommitTime() time.Time { return c.commit.Committer.When } func (c *objectCommitNode) ID() plumbing.Hash { return c.commit.ID() } func (c *objectCommitNode) Tree() (*object.Tree, error) { return c.commit.Tree() } func (c *objectCommitNode) NumParents() int { return c.commit.NumParents() } func (c *objectCommitNode) ParentNodes() CommitNodeIter { return newParentgraphCommitNodeIter(c) } func (c *objectCommitNode) ParentNode(i int) (CommitNode, error) { if i < 0 || i >= len(c.commit.ParentHashes) { return nil, object.ErrParentNotFound } // Note: It's necessary to go through CommitNodeIndex here to ensure // that if the commit-graph file covers only part of the history we // start using it when that part is reached. return c.nodeIndex.Get(c.commit.ParentHashes[i]) } func (c *objectCommitNode) ParentHashes() []plumbing.Hash { return c.commit.ParentHashes } func (c *objectCommitNode) Generation() uint64 { // Commit nodes representing objects outside of the commit graph can never // be reached by objects from the commit-graph thus we return the highest // possible value. return math.MaxUint64 } func (c *objectCommitNode) Commit() (*object.Commit, error) { return c.commit, nil }