blob: d31bdf08064196f7cfe372c20983bd76d2f2b8f4 [file] [log] [blame]
package object
import (
"fmt"
"strings"
"gopkg.in/src-d/go-git.v4/plumbing"
"gopkg.in/src-d/go-git.v4/plumbing/storer"
. "gopkg.in/check.v1"
)
var _ = Suite(&filterCommitIterSuite{})
type filterCommitIterSuite struct {
BaseObjectsSuite
}
func commitsFromIter(iter CommitIter) ([]*Commit, error) {
var commits []*Commit
err := iter.ForEach(func(c *Commit) error {
commits = append(commits, c)
return nil
})
return commits, err
}
func assertHashes(c *C, commits []*Commit, hashes []string) {
if len(commits) != len(hashes) {
var expected []string
for _, c := range hashes {
expected = append(expected, c)
}
fmt.Println("expected:", strings.Join(expected, ", "))
var got []string
for _, c := range commits {
got = append(got, c.Hash.String())
}
fmt.Println(" got:", strings.Join(got, ", "))
}
c.Assert(commits, HasLen, len(hashes))
for i, commit := range commits {
c.Assert(hashes[i], Equals, commit.Hash.String())
}
}
func validIfCommit(ignored plumbing.Hash) CommitFilter {
return func(c *Commit) bool {
if c.Hash == ignored {
return true
}
return false
}
}
func not(filter CommitFilter) CommitFilter {
return func(c *Commit) bool {
return !filter(c)
}
}
/*
// TestCase history
* 6ecf0ef2c2dffb796033e5a02219af86ec6584e5 <- HEAD
|
| * e8d3ffab552895c19b9fcf7aa264d277cde33881
|/
* 918c48b83bd081e863dbe1b80f8998f058cd8294
|
* af2d6a6954d532f8ffb47615169c8fdf9d383a1a
|
* 1669dce138d9b841a518c64b10914d88f5e488ea
|\
| * a5b8b09e2f8fcb0bb99d3ccb0958157b40890d69 // isLimit
| |\
| | * b8e471f58bcbca63b07bda20e428190409c2db47 // ignored if isLimit is passed
| |/
* | 35e85108805c84807bc66a02d91535e1e24b38b9 // isValid; ignored if passed as !isValid
|/
* b029517f6300c2da0f4b651b8642506cd6aaf45d
*/
// TestFilterCommitIter asserts that FilterCommitIter returns all commits from
// history, but e8d3ffab552895c19b9fcf7aa264d277cde33881, that is not reachable
// from HEAD
func (s *filterCommitIterSuite) TestFilterCommitIter(c *C) {
from := s.commit(c, s.Fixture.Head)
commits, err := commitsFromIter(NewFilterCommitIter(from, nil, nil))
c.Assert(err, IsNil)
expected := []string{
"6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
"918c48b83bd081e863dbe1b80f8998f058cd8294",
"af2d6a6954d532f8ffb47615169c8fdf9d383a1a",
"1669dce138d9b841a518c64b10914d88f5e488ea",
"35e85108805c84807bc66a02d91535e1e24b38b9",
"a5b8b09e2f8fcb0bb99d3ccb0958157b40890d69",
"b029517f6300c2da0f4b651b8642506cd6aaf45d",
"b8e471f58bcbca63b07bda20e428190409c2db47",
}
assertHashes(c, commits, expected)
}
// TestFilterCommitIterWithValid asserts that FilterCommitIter returns only commits
// that matches the passed isValid filter; in this testcase, it was filtered out
// all commits but one from history
func (s *filterCommitIterSuite) TestFilterCommitIterWithValid(c *C) {
from := s.commit(c, s.Fixture.Head)
validIf := validIfCommit(plumbing.NewHash("35e85108805c84807bc66a02d91535e1e24b38b9"))
commits, err := commitsFromIter(NewFilterCommitIter(from, &validIf, nil))
c.Assert(err, IsNil)
expected := []string{
"35e85108805c84807bc66a02d91535e1e24b38b9",
}
assertHashes(c, commits, expected)
}
// that matches the passed isValid filter; in this testcase, it was filtered out
// only one commit from history
func (s *filterCommitIterSuite) TestFilterCommitIterWithInvalid(c *C) {
from := s.commit(c, s.Fixture.Head)
validIf := validIfCommit(plumbing.NewHash("35e85108805c84807bc66a02d91535e1e24b38b9"))
validIfNot := not(validIf)
commits, err := commitsFromIter(NewFilterCommitIter(from, &validIfNot, nil))
c.Assert(err, IsNil)
expected := []string{
"6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
"918c48b83bd081e863dbe1b80f8998f058cd8294",
"af2d6a6954d532f8ffb47615169c8fdf9d383a1a",
"1669dce138d9b841a518c64b10914d88f5e488ea",
"a5b8b09e2f8fcb0bb99d3ccb0958157b40890d69",
"b029517f6300c2da0f4b651b8642506cd6aaf45d",
"b8e471f58bcbca63b07bda20e428190409c2db47",
}
assertHashes(c, commits, expected)
}
// TestFilterCommitIterWithNoValidCommits asserts that FilterCommitIter returns
// no commits if the passed isValid filter does not allow any commit
func (s *filterCommitIterSuite) TestFilterCommitIterWithNoValidCommits(c *C) {
from := s.commit(c, s.Fixture.Head)
validIf := validIfCommit(plumbing.NewHash("THIS_COMMIT_DOES_NOT_EXIST"))
commits, err := commitsFromIter(NewFilterCommitIter(from, &validIf, nil))
c.Assert(err, IsNil)
c.Assert(commits, HasLen, 0)
}
// TestFilterCommitIterWithStopAt asserts that FilterCommitIter returns only commits
// are not beyond a isLimit filter
func (s *filterCommitIterSuite) TestFilterCommitIterWithStopAt(c *C) {
from := s.commit(c, s.Fixture.Head)
stopAtRule := validIfCommit(plumbing.NewHash("a5b8b09e2f8fcb0bb99d3ccb0958157b40890d69"))
commits, err := commitsFromIter(NewFilterCommitIter(from, nil, &stopAtRule))
c.Assert(err, IsNil)
expected := []string{
"6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
"918c48b83bd081e863dbe1b80f8998f058cd8294",
"af2d6a6954d532f8ffb47615169c8fdf9d383a1a",
"1669dce138d9b841a518c64b10914d88f5e488ea",
"35e85108805c84807bc66a02d91535e1e24b38b9",
"a5b8b09e2f8fcb0bb99d3ccb0958157b40890d69",
"b029517f6300c2da0f4b651b8642506cd6aaf45d",
}
assertHashes(c, commits, expected)
}
// TestFilterCommitIterWithStopAt asserts that FilterCommitIter works properly
// with isValid and isLimit filters
func (s *filterCommitIterSuite) TestFilterCommitIterWithInvalidAndStopAt(c *C) {
from := s.commit(c, s.Fixture.Head)
stopAtRule := validIfCommit(plumbing.NewHash("a5b8b09e2f8fcb0bb99d3ccb0958157b40890d69"))
validIf := validIfCommit(plumbing.NewHash("35e85108805c84807bc66a02d91535e1e24b38b9"))
validIfNot := not(validIf)
commits, err := commitsFromIter(NewFilterCommitIter(from, &validIfNot, &stopAtRule))
c.Assert(err, IsNil)
expected := []string{
"6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
"918c48b83bd081e863dbe1b80f8998f058cd8294",
"af2d6a6954d532f8ffb47615169c8fdf9d383a1a",
"1669dce138d9b841a518c64b10914d88f5e488ea",
"a5b8b09e2f8fcb0bb99d3ccb0958157b40890d69",
"b029517f6300c2da0f4b651b8642506cd6aaf45d",
}
assertHashes(c, commits, expected)
}
// TestIteratorForEachCallbackReturn that ForEach callback does not cause
// the ForEach to return an error if it returned an ErrStop
//
// - 6ecf0ef2c2dffb796033e5a02219af86ec6584e5
// - 918c48b83bd081e863dbe1b80f8998f058cd8294 //<- stop
// - af2d6a6954d532f8ffb47615169c8fdf9d383a1a
// - 1669dce138d9b841a518c64b10914d88f5e488ea //<- err
// - 35e85108805c84807bc66a02d91535e1e24b38b9
// - a5b8b09e2f8fcb0bb99d3ccb0958157b40890d69
// - b029517f6300c2da0f4b651b8642506cd6aaf45d
// - b8e471f58bcbca63b07bda20e428190409c2db47
func (s *filterCommitIterSuite) TestIteratorForEachCallbackReturn(c *C) {
var visited []*Commit
errUnexpected := fmt.Errorf("Could not continue")
cb := func(c *Commit) error {
switch c.Hash {
case plumbing.NewHash("918c48b83bd081e863dbe1b80f8998f058cd8294"):
return storer.ErrStop
case plumbing.NewHash("1669dce138d9b841a518c64b10914d88f5e488ea"):
return errUnexpected
}
visited = append(visited, c)
return nil
}
from := s.commit(c, s.Fixture.Head)
iter := NewFilterCommitIter(from, nil, nil)
err := iter.ForEach(cb)
c.Assert(err, IsNil)
expected := []string{
"6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
}
assertHashes(c, visited, expected)
err = iter.ForEach(cb)
c.Assert(err, Equals, errUnexpected)
expected = []string{
"6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
"af2d6a6954d532f8ffb47615169c8fdf9d383a1a",
}
assertHashes(c, visited, expected)
err = iter.ForEach(cb)
c.Assert(err, IsNil)
expected = []string{
"6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
"af2d6a6954d532f8ffb47615169c8fdf9d383a1a",
"35e85108805c84807bc66a02d91535e1e24b38b9",
"a5b8b09e2f8fcb0bb99d3ccb0958157b40890d69",
"b029517f6300c2da0f4b651b8642506cd6aaf45d",
"b8e471f58bcbca63b07bda20e428190409c2db47",
}
assertHashes(c, visited, expected)
}