-
Notifications
You must be signed in to change notification settings - Fork 5k
/
utils.go
62 lines (52 loc) · 1.55 KB
/
utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package pull_request
import (
"context"
"fmt"
"regexp"
argoprojiov1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
)
func compileFilters(filters []argoprojiov1alpha1.PullRequestGeneratorFilter) ([]*Filter, error) {
outFilters := make([]*Filter, 0, len(filters))
for _, filter := range filters {
outFilter := &Filter{}
var err error
if filter.BranchMatch != nil {
outFilter.BranchMatch, err = regexp.Compile(*filter.BranchMatch)
if err != nil {
return nil, fmt.Errorf("error compiling BranchMatch regexp %q: %v", *filter.BranchMatch, err)
}
}
outFilters = append(outFilters, outFilter)
}
return outFilters, nil
}
func matchFilter(pullRequest *PullRequest, filter *Filter) bool {
if filter.BranchMatch != nil && !filter.BranchMatch.MatchString(pullRequest.Branch) {
return false
}
return true
}
func ListPullRequests(ctx context.Context, provider PullRequestService, filters []argoprojiov1alpha1.PullRequestGeneratorFilter) ([]*PullRequest, error) {
compiledFilters, err := compileFilters(filters)
if err != nil {
return nil, err
}
pullRequests, err := provider.List(ctx)
if err != nil {
return nil, err
}
if len(compiledFilters) == 0 {
return pullRequests, nil
}
filteredPullRequests := make([]*PullRequest, 0, len(pullRequests))
for _, pullRequest := range pullRequests {
for _, filter := range compiledFilters {
matches := matchFilter(pullRequest, filter)
if matches {
filteredPullRequests = append(filteredPullRequests, pullRequest)
break
}
}
}
return filteredPullRequests, nil
}