github.com/argoproj/argo-cd/v3@v3.2.1/applicationset/services/pull_request/utils.go (about) 1 package pull_request 2 3 import ( 4 "context" 5 "fmt" 6 "regexp" 7 8 argoprojiov1alpha1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" 9 ) 10 11 func compileFilters(filters []argoprojiov1alpha1.PullRequestGeneratorFilter) ([]*Filter, error) { 12 outFilters := make([]*Filter, 0, len(filters)) 13 for _, filter := range filters { 14 outFilter := &Filter{} 15 var err error 16 if filter.BranchMatch != nil { 17 outFilter.BranchMatch, err = regexp.Compile(*filter.BranchMatch) 18 if err != nil { 19 return nil, fmt.Errorf("error compiling BranchMatch regexp %q: %w", *filter.BranchMatch, err) 20 } 21 } 22 if filter.TargetBranchMatch != nil { 23 outFilter.TargetBranchMatch, err = regexp.Compile(*filter.TargetBranchMatch) 24 if err != nil { 25 return nil, fmt.Errorf("error compiling TargetBranchMatch regexp %q: %w", *filter.TargetBranchMatch, err) 26 } 27 } 28 if filter.TitleMatch != nil { 29 outFilter.TitleMatch, err = regexp.Compile(*filter.TitleMatch) 30 if err != nil { 31 return nil, fmt.Errorf("error compiling TitleMatch regexp %q: %w", *filter.TitleMatch, err) 32 } 33 } 34 outFilters = append(outFilters, outFilter) 35 } 36 return outFilters, nil 37 } 38 39 func matchFilter(pullRequest *PullRequest, filter *Filter) bool { 40 if filter.BranchMatch != nil && !filter.BranchMatch.MatchString(pullRequest.Branch) { 41 return false 42 } 43 if filter.TargetBranchMatch != nil && !filter.TargetBranchMatch.MatchString(pullRequest.TargetBranch) { 44 return false 45 } 46 if filter.TitleMatch != nil && !filter.TitleMatch.MatchString(pullRequest.Title) { 47 return false 48 } 49 50 return true 51 } 52 53 func ListPullRequests(ctx context.Context, provider PullRequestService, filters []argoprojiov1alpha1.PullRequestGeneratorFilter) ([]*PullRequest, error) { 54 compiledFilters, err := compileFilters(filters) 55 if err != nil { 56 return nil, err 57 } 58 59 pullRequests, err := provider.List(ctx) 60 if err != nil { 61 return nil, err 62 } 63 64 if len(compiledFilters) == 0 { 65 return pullRequests, nil 66 } 67 68 filteredPullRequests := make([]*PullRequest, 0, len(pullRequests)) 69 for _, pullRequest := range pullRequests { 70 for _, filter := range compiledFilters { 71 matches := matchFilter(pullRequest, filter) 72 if matches { 73 filteredPullRequests = append(filteredPullRequests, pullRequest) 74 break 75 } 76 } 77 } 78 79 return filteredPullRequests, nil 80 }