aboutsummaryrefslogtreecommitdiffstats
path: root/bridge/gitlab/iterator/iterator.go
diff options
context:
space:
mode:
authorMichael Muré <batolettre@gmail.com>2020-03-28 21:09:36 +0100
committerMichael Muré <batolettre@gmail.com>2020-03-28 21:23:18 +0100
commitf4ca533fe10f7fa893e1953f8c8d9ed3e783486c (patch)
treef9fdaff8aa02f723acc3a4492d46655d63cbff5a /bridge/gitlab/iterator/iterator.go
parent38b42bc867f8f352908ba81334bec86b001e8fac (diff)
downloadgit-bug-f4ca533fe10f7fa893e1953f8c8d9ed3e783486c.tar.gz
gitlab: refactor the iterator, fix bugs
Notably, properly reset sub iterators when changing to the next issue
Diffstat (limited to 'bridge/gitlab/iterator/iterator.go')
-rw-r--r--bridge/gitlab/iterator/iterator.go138
1 files changed, 138 insertions, 0 deletions
diff --git a/bridge/gitlab/iterator/iterator.go b/bridge/gitlab/iterator/iterator.go
new file mode 100644
index 00000000..ee2090b0
--- /dev/null
+++ b/bridge/gitlab/iterator/iterator.go
@@ -0,0 +1,138 @@
+package iterator
+
+import (
+ "context"
+ "time"
+
+ "github.com/xanzy/go-gitlab"
+)
+
+type Iterator struct {
+ // shared context
+ ctx context.Context
+
+ // to pass to sub-iterators
+ conf config
+
+ // sticky error
+ err error
+
+ // issues iterator
+ issue *issueIterator
+
+ // notes iterator
+ note *noteIterator
+
+ // labelEvent iterator
+ labelEvent *labelEventIterator
+}
+
+type config struct {
+ // gitlab api v4 client
+ gc *gitlab.Client
+
+ timeout time.Duration
+
+ // if since is given the iterator will query only the issues
+ // updated after this date
+ since time.Time
+
+ // project id
+ project string
+
+ // number of issues and notes to query at once
+ capacity int
+}
+
+// NewIterator create a new iterator
+func NewIterator(ctx context.Context, client *gitlab.Client, capacity int, projectID string, since time.Time) *Iterator {
+ return &Iterator{
+ ctx: ctx,
+ conf: config{
+ gc: client,
+ timeout: 60 * time.Second,
+ since: since,
+ project: projectID,
+ capacity: capacity,
+ },
+ issue: newIssueIterator(),
+ note: newNoteIterator(),
+ labelEvent: newLabelEventIterator(),
+ }
+}
+
+// Error return last encountered error
+func (i *Iterator) Error() error {
+ return i.err
+}
+
+func (i *Iterator) NextIssue() bool {
+ if i.err != nil {
+ return false
+ }
+
+ if i.ctx.Err() != nil {
+ return false
+ }
+
+ more, err := i.issue.Next(i.ctx, i.conf)
+ if err != nil {
+ i.err = err
+ return false
+ }
+
+ // Also reset the other sub iterators as they would
+ // no longer be valid
+ i.note.Reset(i.issue.Value().IID)
+ i.labelEvent.Reset(i.issue.Value().IID)
+
+ return more
+}
+
+func (i *Iterator) IssueValue() *gitlab.Issue {
+ return i.issue.Value()
+}
+
+func (i *Iterator) NextNote() bool {
+ if i.err != nil {
+ return false
+ }
+
+ if i.ctx.Err() != nil {
+ return false
+ }
+
+ more, err := i.note.Next(i.ctx, i.conf)
+ if err != nil {
+ i.err = err
+ return false
+ }
+
+ return more
+}
+
+func (i *Iterator) NoteValue() *gitlab.Note {
+ return i.note.Value()
+}
+
+func (i *Iterator) NextLabelEvent() bool {
+ if i.err != nil {
+ return false
+ }
+
+ if i.ctx.Err() != nil {
+ return false
+ }
+
+ more, err := i.labelEvent.Next(i.ctx, i.conf)
+ if err != nil {
+ i.err = err
+ return false
+ }
+
+ return more
+}
+
+func (i *Iterator) LabelEventValue() *gitlab.LabelEvent {
+ return i.labelEvent.Value()
+}