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