forked from gitea/gitea
99 lines
2.9 KiB
Go
99 lines
2.9 KiB
Go
|
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() {
|
||
|
}
|