diff options
author | Máximo Cuadros <mcuadros@gmail.com> | 2019-08-05 12:19:40 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-05 12:19:40 +0200 |
commit | 2661d86e26b9adb99ff37a82d6984030000639dd (patch) | |
tree | 3511322c02b495d4b06cdeacc669bbf822a4708c /plumbing | |
parent | a0c8105a91910a022fe2b8d154f0a9ee777f7310 (diff) | |
parent | c7fc75ef6ebd7127e0918b1669d336ba39844201 (diff) | |
download | go-git-2661d86e26b9adb99ff37a82d6984030000639dd.tar.gz |
Merge pull request #1206 from knqyf263/feature/add_log_limiting
Add limiting options to git log
Diffstat (limited to 'plumbing')
-rw-r--r-- | plumbing/object/commit_walker_limit.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/plumbing/object/commit_walker_limit.go b/plumbing/object/commit_walker_limit.go new file mode 100644 index 0000000..ee56e50 --- /dev/null +++ b/plumbing/object/commit_walker_limit.go @@ -0,0 +1,65 @@ +package object + +import ( + "io" + "time" + + "gopkg.in/src-d/go-git.v4/plumbing/storer" +) + +type commitLimitIter struct { + sourceIter CommitIter + limitOptions LogLimitOptions +} + +type LogLimitOptions struct { + Since *time.Time + Until *time.Time +} + +func NewCommitLimitIterFromIter(commitIter CommitIter, limitOptions LogLimitOptions) CommitIter { + iterator := new(commitLimitIter) + iterator.sourceIter = commitIter + iterator.limitOptions = limitOptions + return iterator +} + +func (c *commitLimitIter) Next() (*Commit, error) { + for { + commit, err := c.sourceIter.Next() + if err != nil { + return nil, err + } + + if c.limitOptions.Since != nil && commit.Committer.When.Before(*c.limitOptions.Since) { + continue + } + if c.limitOptions.Until != nil && commit.Committer.When.After(*c.limitOptions.Until) { + continue + } + return commit, nil + } +} + +func (c *commitLimitIter) ForEach(cb func(*Commit) error) error { + for { + commit, nextErr := c.Next() + if nextErr == io.EOF { + break + } + if nextErr != nil { + return nextErr + } + err := cb(commit) + if err == storer.ErrStop { + return nil + } else if err != nil { + return err + } + } + return nil +} + +func (c *commitLimitIter) Close() { + c.sourceIter.Close() +} |