1package gitlab
2
3import (
4 "context"
5 "time"
6
7 "github.com/git-bug/git-bug/util/text"
8 "github.com/xanzy/go-gitlab"
9)
10
11// Issues returns a channel with gitlab project issues, ascending order.
12func Issues(ctx context.Context, client *gitlab.Client, pid string, since time.Time) <-chan *gitlab.Issue {
13 out := make(chan *gitlab.Issue)
14
15 go func() {
16 defer close(out)
17
18 opts := gitlab.ListProjectIssuesOptions{
19 UpdatedAfter: &since,
20 Scope: gitlab.String("all"),
21 Sort: gitlab.String("asc"),
22 }
23
24 for {
25 issues, resp, err := client.Issues.ListProjectIssues(pid, &opts, gitlab.WithContext(ctx))
26 if err != nil {
27 return
28 }
29
30 for _, issue := range issues {
31 out <- issue
32 }
33
34 if resp.CurrentPage >= resp.TotalPages {
35 break
36 }
37
38 opts.Page = resp.NextPage
39 }
40 }()
41
42 return out
43}
44
45// Notes returns a channel with note events
46func Notes(ctx context.Context, client *gitlab.Client, issue *gitlab.Issue) <-chan Event {
47 out := make(chan Event)
48
49 go func() {
50 defer close(out)
51
52 opts := gitlab.ListIssueNotesOptions{
53 OrderBy: gitlab.String("created_at"),
54 Sort: gitlab.String("asc"),
55 }
56
57 for {
58 notes, resp, err := client.Notes.ListIssueNotes(issue.ProjectID, issue.IID, &opts, gitlab.WithContext(ctx))
59
60 if err != nil {
61 out <- ErrorEvent{Err: err, Time: time.Now()}
62 }
63
64 for _, note := range notes {
65 out <- NoteEvent{*note}
66 }
67
68 if resp.CurrentPage >= resp.TotalPages {
69 break
70 }
71
72 opts.Page = resp.NextPage
73 }
74 }()
75
76 return out
77}
78
79// LabelEvents returns a channel with label events.
80func LabelEvents(ctx context.Context, client *gitlab.Client, issue *gitlab.Issue) <-chan Event {
81 out := make(chan Event)
82
83 go func() {
84 defer close(out)
85
86 opts := gitlab.ListLabelEventsOptions{}
87
88 for {
89 events, resp, err := client.ResourceLabelEvents.ListIssueLabelEvents(issue.ProjectID, issue.IID, &opts, gitlab.WithContext(ctx))
90
91 if err != nil {
92 out <- ErrorEvent{Err: err, Time: time.Now()}
93 }
94
95 for _, e := range events {
96 le := LabelEvent{*e}
97 le.Label.Name = text.CleanupOneLine(le.Label.Name)
98 out <- le
99 }
100
101 if resp.CurrentPage >= resp.TotalPages {
102 break
103 }
104
105 opts.Page = resp.NextPage
106 }
107 }()
108
109 return out
110}
111
112// StateEvents returns a channel with state change events.
113func StateEvents(ctx context.Context, client *gitlab.Client, issue *gitlab.Issue) <-chan Event {
114 out := make(chan Event)
115
116 go func() {
117 defer close(out)
118
119 opts := gitlab.ListStateEventsOptions{}
120
121 for {
122 events, resp, err := client.ResourceStateEvents.ListIssueStateEvents(issue.ProjectID, issue.IID, &opts, gitlab.WithContext(ctx))
123 if err != nil {
124 out <- ErrorEvent{Err: err, Time: time.Now()}
125 }
126
127 for _, e := range events {
128 out <- StateEvent{*e}
129 }
130
131 if resp.CurrentPage >= resp.TotalPages {
132 break
133 }
134
135 opts.Page = resp.NextPage
136 }
137 }()
138
139 return out
140}