github.com/argoproj/argo-cd/v3@v3.2.1/applicationset/services/pull_request/gitea.go (about) 1 package pull_request 2 3 import ( 4 "context" 5 "crypto/tls" 6 "net/http" 7 "net/http/cookiejar" 8 "os" 9 10 "code.gitea.io/sdk/gitea" 11 ) 12 13 type GiteaService struct { 14 client *gitea.Client 15 owner string 16 repo string 17 labels []string 18 } 19 20 var _ PullRequestService = (*GiteaService)(nil) 21 22 func NewGiteaService(token, url, owner, repo string, labels []string, insecure bool) (PullRequestService, error) { 23 if token == "" { 24 token = os.Getenv("GITEA_TOKEN") 25 } 26 httpClient := &http.Client{} 27 if insecure { 28 cookieJar, _ := cookiejar.New(nil) 29 30 tr := http.DefaultTransport.(*http.Transport).Clone() 31 tr.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} 32 33 httpClient = &http.Client{ 34 Jar: cookieJar, 35 Transport: tr, 36 } 37 } 38 client, err := gitea.NewClient(url, gitea.SetToken(token), gitea.SetHTTPClient(httpClient)) 39 if err != nil { 40 return nil, err 41 } 42 return &GiteaService{ 43 client: client, 44 owner: owner, 45 repo: repo, 46 labels: labels, 47 }, nil 48 } 49 50 func (g *GiteaService) List(ctx context.Context) ([]*PullRequest, error) { 51 opts := gitea.ListPullRequestsOptions{ 52 State: gitea.StateOpen, 53 } 54 g.client.SetContext(ctx) 55 list := []*PullRequest{} 56 prs, resp, err := g.client.ListRepoPullRequests(g.owner, g.repo, opts) 57 if err != nil { 58 if resp != nil && resp.StatusCode == http.StatusNotFound { 59 // return a custom error indicating that the repository is not found, 60 // but also returning the empty result since the decision to continue or not in this case is made by the caller 61 return list, NewRepositoryNotFoundError(err) 62 } 63 return nil, err 64 } 65 66 for _, pr := range prs { 67 if !giteaContainLabels(g.labels, pr.Labels) { 68 continue 69 } 70 list = append(list, &PullRequest{ 71 Number: int(pr.Index), 72 Title: pr.Title, 73 Branch: pr.Head.Ref, 74 TargetBranch: pr.Base.Ref, 75 HeadSHA: pr.Head.Sha, 76 Labels: getGiteaPRLabelNames(pr.Labels), 77 Author: pr.Poster.UserName, 78 }) 79 } 80 return list, nil 81 } 82 83 // containLabels returns true if gotLabels contains expectedLabels 84 func giteaContainLabels(expectedLabels []string, gotLabels []*gitea.Label) bool { 85 gotLabelNamesMap := make(map[string]bool) 86 for i := 0; i < len(gotLabels); i++ { 87 gotLabelNamesMap[gotLabels[i].Name] = true 88 } 89 for _, expected := range expectedLabels { 90 v, ok := gotLabelNamesMap[expected] 91 if !v || !ok { 92 return false 93 } 94 } 95 return true 96 } 97 98 // Get the Gitea pull request label names. 99 func getGiteaPRLabelNames(giteaLabels []*gitea.Label) []string { 100 var labelNames []string 101 for _, giteaLabel := range giteaLabels { 102 labelNames = append(labelNames, giteaLabel.Name) 103 } 104 return labelNames 105 }