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  }