|
- package commitgraph
-
- import (
- "io"
- "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"
- )
-
- // CommitNode is generic interface encapsulating a lightweight commit object retrieved
- // from CommitNodeIndex
- type CommitNode interface {
- // ID returns the Commit object id referenced by the commit graph node.
- ID() plumbing.Hash
- // Tree returns the Tree referenced by the commit graph node.
- Tree() (*object.Tree, error)
- // CommitTime returns the Commiter.When time of the Commit referenced by the commit graph node.
- CommitTime() time.Time
- // NumParents returns the number of parents in a commit.
- NumParents() int
- // ParentNodes return a CommitNodeIter for parents of specified node.
- ParentNodes() CommitNodeIter
- // ParentNode returns the ith parent of a commit.
- ParentNode(i int) (CommitNode, error)
- // ParentHashes returns hashes of the parent commits for a specified node
- ParentHashes() []plumbing.Hash
- // Generation returns the generation of the commit for reachability analysis.
- // Objects with newer generation are not reachable from objects of older generation.
- Generation() uint64
- // Commit returns the full commit object from the node
- Commit() (*object.Commit, error)
- }
-
- // CommitNodeIndex is generic interface encapsulating an index of CommitNode objects
- type CommitNodeIndex interface {
- // Get returns a commit node from a commit hash
- Get(hash plumbing.Hash) (CommitNode, error)
- }
-
- // CommitNodeIter is a generic closable interface for iterating over commit nodes.
- type CommitNodeIter interface {
- Next() (CommitNode, error)
- ForEach(func(CommitNode) error) error
- Close()
- }
-
- // parentCommitNodeIter provides an iterator for parent commits from associated CommitNodeIndex.
- type parentCommitNodeIter struct {
- node CommitNode
- i int
- }
-
- func newParentgraphCommitNodeIter(node CommitNode) CommitNodeIter {
- return &parentCommitNodeIter{node, 0}
- }
-
- // Next moves the iterator to the next commit and returns a pointer to it. If
- // there are no more commits, it returns io.EOF.
- func (iter *parentCommitNodeIter) Next() (CommitNode, error) {
- obj, err := iter.node.ParentNode(iter.i)
- if err == object.ErrParentNotFound {
- return nil, io.EOF
- }
- if err == nil {
- iter.i++
- }
-
- return obj, err
- }
-
- // ForEach call the cb function for each commit contained on this iter until
- // an error appends or the end of the iter is reached. If ErrStop is sent
- // the iteration is stopped but no error is returned. The iterator is closed.
- func (iter *parentCommitNodeIter) ForEach(cb func(CommitNode) error) error {
- for {
- obj, err := iter.Next()
- if err != nil {
- if err == io.EOF {
- return nil
- }
-
- return err
- }
-
- if err := cb(obj); err != nil {
- if err == storer.ErrStop {
- return nil
- }
-
- return err
- }
- }
- }
-
- func (iter *parentCommitNodeIter) Close() {
- }
|