gitlab_api.go

  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}