diff options
author | Máximo Cuadros <mcuadros@gmail.com> | 2020-03-10 00:02:14 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-10 00:02:14 +0100 |
commit | eef67789e846acc85e1ed2af2760d6716b2a9f07 (patch) | |
tree | b3578068aca7e71d27fda254d919e6e0ad9e90ba /plumbing/object | |
parent | 87d3d897d903af9cdd5cf500fd36d3533235fc02 (diff) | |
parent | 027dadf289dcf974405d283d13d5a856b0988b38 (diff) | |
download | go-git-eef67789e846acc85e1ed2af2760d6716b2a9f07.tar.gz |
Merge pull request #3 from go-git/pr-1248
git.LogOptions: add `PathFilter func(string) bool`
Diffstat (limited to 'plumbing/object')
-rw-r--r-- | plumbing/object/commit_walker_path.go (renamed from plumbing/object/commit_walker_file.go) | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/plumbing/object/commit_walker_file.go b/plumbing/object/commit_walker_path.go index b73e4ce..6a49fd1 100644 --- a/plumbing/object/commit_walker_file.go +++ b/plumbing/object/commit_walker_path.go @@ -8,27 +8,39 @@ import ( "gopkg.in/src-d/go-git.v4/plumbing/storer" ) -type commitFileIter struct { - fileName string +type commitPathIter struct { + pathFilter func(string) bool sourceIter CommitIter currentCommit *Commit checkParent bool } -// NewCommitFileIterFromIter returns a commit iterator which performs diffTree between +// NewCommitPathIterFromIter returns a commit iterator which performs diffTree between // successive trees returned from the commit iterator from the argument. The purpose of this is // to find the commits that explain how the files that match the path came to be. // If checkParent is true then the function double checks if potential parent (next commit in a path) // is one of the parents in the tree (it's used by `git log --all`). -func NewCommitFileIterFromIter(fileName string, commitIter CommitIter, checkParent bool) CommitIter { - iterator := new(commitFileIter) +// pathFilter is a function that takes path of file as argument and returns true if we want it +func NewCommitPathIterFromIter(pathFilter func(string) bool, commitIter CommitIter, checkParent bool) CommitIter { + iterator := new(commitPathIter) iterator.sourceIter = commitIter - iterator.fileName = fileName + iterator.pathFilter = pathFilter iterator.checkParent = checkParent return iterator } -func (c *commitFileIter) Next() (*Commit, error) { +// this function is kept for compatibilty, can be replaced with NewCommitPathIterFromIter +func NewCommitFileIterFromIter(fileName string, commitIter CommitIter, checkParent bool) CommitIter { + return NewCommitPathIterFromIter( + func(path string) bool { + return path == fileName + }, + commitIter, + checkParent, + ) +} + +func (c *commitPathIter) Next() (*Commit, error) { if c.currentCommit == nil { var err error c.currentCommit, err = c.sourceIter.Next() @@ -45,7 +57,7 @@ func (c *commitFileIter) Next() (*Commit, error) { return commit, commitErr } -func (c *commitFileIter) getNextFileCommit() (*Commit, error) { +func (c *commitPathIter) getNextFileCommit() (*Commit, error) { for { // Parent-commit can be nil if the current-commit is the initial commit parentCommit, parentCommitErr := c.sourceIter.Next() @@ -96,9 +108,9 @@ func (c *commitFileIter) getNextFileCommit() (*Commit, error) { } } -func (c *commitFileIter) hasFileChange(changes Changes, parent *Commit) bool { +func (c *commitPathIter) hasFileChange(changes Changes, parent *Commit) bool { for _, change := range changes { - if change.name() != c.fileName { + if !c.pathFilter(change.name()) { continue } @@ -125,7 +137,7 @@ func isParentHash(hash plumbing.Hash, commit *Commit) bool { return false } -func (c *commitFileIter) ForEach(cb func(*Commit) error) error { +func (c *commitPathIter) ForEach(cb func(*Commit) error) error { for { commit, nextErr := c.Next() if nextErr == io.EOF { @@ -144,6 +156,6 @@ func (c *commitFileIter) ForEach(cb func(*Commit) error) error { return nil } -func (c *commitFileIter) Close() { +func (c *commitPathIter) Close() { c.sourceIter.Close() } |