aboutsummaryrefslogtreecommitdiffstats
path: root/bridge/gitlab/iterator/issue.go
diff options
context:
space:
mode:
Diffstat (limited to 'bridge/gitlab/iterator/issue.go')
-rw-r--r--bridge/gitlab/iterator/issue.go89
1 files changed, 89 insertions, 0 deletions
diff --git a/bridge/gitlab/iterator/issue.go b/bridge/gitlab/iterator/issue.go
new file mode 100644
index 00000000..9361b496
--- /dev/null
+++ b/bridge/gitlab/iterator/issue.go
@@ -0,0 +1,89 @@
+package iterator
+
+import (
+ "context"
+
+ "github.com/xanzy/go-gitlab"
+)
+
+type issueIterator struct {
+ page int
+ lastPage bool
+ index int
+ cache []*gitlab.Issue
+}
+
+func newIssueIterator() *issueIterator {
+ ii := &issueIterator{}
+ ii.Reset()
+ return ii
+}
+
+func (ii *issueIterator) Next(ctx context.Context, conf config) (bool, error) {
+ // first query
+ if ii.cache == nil {
+ return ii.getNext(ctx, conf)
+ }
+
+ // move cursor index
+ if ii.index < len(ii.cache)-1 {
+ ii.index++
+ return true, nil
+ }
+
+ return ii.getNext(ctx, conf)
+}
+
+func (ii *issueIterator) Value() *gitlab.Issue {
+ return ii.cache[ii.index]
+}
+
+func (ii *issueIterator) getNext(ctx context.Context, conf config) (bool, error) {
+ if ii.lastPage {
+ return false, nil
+ }
+
+ ctx, cancel := context.WithTimeout(ctx, conf.timeout)
+ defer cancel()
+
+ issues, resp, err := conf.gc.Issues.ListProjectIssues(
+ conf.project,
+ &gitlab.ListProjectIssuesOptions{
+ ListOptions: gitlab.ListOptions{
+ Page: ii.page,
+ PerPage: conf.capacity,
+ },
+ Scope: gitlab.String("all"),
+ UpdatedAfter: &conf.since,
+ Sort: gitlab.String("asc"),
+ },
+ gitlab.WithContext(ctx),
+ )
+
+ if err != nil {
+ ii.Reset()
+ return false, err
+ }
+
+ if resp.TotalPages == ii.page {
+ ii.lastPage = true
+ }
+
+ // if repository doesn't have any issues
+ if len(issues) == 0 {
+ return false, nil
+ }
+
+ ii.cache = issues
+ ii.index = 0
+ ii.page++
+
+ return true, nil
+}
+
+func (ii *issueIterator) Reset() {
+ ii.index = -1
+ ii.page = 1
+ ii.lastPage = false
+ ii.cache = nil
+}