2022-09-15 10:31:38 +02:00
|
|
|
package gitproviders
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
"sync"
|
2022-09-17 18:28:38 +02:00
|
|
|
"time"
|
2022-09-15 10:31:38 +02:00
|
|
|
|
|
|
|
"code.gitea.io/sdk/gitea"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Gitea struct {
|
|
|
|
logger *zap.Logger
|
|
|
|
giteamu sync.Mutex
|
|
|
|
giteaClients map[string]*gitea.Client
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewGitea(logger *zap.Logger) *Gitea {
|
|
|
|
return &Gitea{
|
2022-09-15 10:50:39 +02:00
|
|
|
logger: logger,
|
|
|
|
giteamu: sync.Mutex{},
|
|
|
|
giteaClients: make(map[string]*gitea.Client, 0),
|
2022-09-15 10:31:38 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-17 18:28:38 +02:00
|
|
|
func (g *Gitea) ListRepositoriesForOrganization(
|
|
|
|
ctx context.Context,
|
|
|
|
server string,
|
|
|
|
organization string,
|
|
|
|
) ([]string, error) {
|
2022-09-15 10:31:38 +02:00
|
|
|
client, err := g.getOrCreateClient(ctx, server)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2022-09-15 10:48:31 +02:00
|
|
|
g.logger.Debug("Listing repos for gitea", zap.String("server", server))
|
2022-09-15 10:31:38 +02:00
|
|
|
repos, resp, err := client.ListOrgRepos(organization, gitea.ListOrgReposOptions{
|
|
|
|
ListOptions: gitea.ListOptions{
|
|
|
|
Page: 0,
|
2022-09-15 10:48:31 +02:00
|
|
|
PageSize: 20,
|
2022-09-15 10:31:38 +02:00
|
|
|
},
|
|
|
|
})
|
|
|
|
if err != nil {
|
2022-09-15 10:50:39 +02:00
|
|
|
return nil, fmt.Errorf("could not list repos: %w", err)
|
2022-09-15 10:31:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if resp.StatusCode >= 300 {
|
|
|
|
return nil, fmt.Errorf("gitea responded with a non 200 status code (gitea response: %s)", resp.Status)
|
|
|
|
}
|
|
|
|
|
|
|
|
repoUrls := make([]string, len(repos))
|
|
|
|
for i, repo := range repos {
|
|
|
|
repoUrls[i] = repo.SSHURL
|
|
|
|
}
|
|
|
|
|
|
|
|
return repoUrls, err
|
|
|
|
}
|
|
|
|
|
2022-09-17 18:28:38 +02:00
|
|
|
func (g *Gitea) CreatePr(
|
|
|
|
ctx context.Context,
|
|
|
|
server string,
|
|
|
|
organization string,
|
|
|
|
repository string,
|
|
|
|
head string,
|
|
|
|
base string,
|
|
|
|
actionName string,
|
|
|
|
) error {
|
|
|
|
client, err := g.getOrCreateClient(ctx, server)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
client.CreatePullRequest(organization, repository, gitea.CreatePullRequestOption{
|
|
|
|
Head: head,
|
|
|
|
Base: base,
|
|
|
|
Title: actionName,
|
|
|
|
Body: "",
|
|
|
|
Assignee: "",
|
|
|
|
Assignees: []string{},
|
|
|
|
Milestone: 0,
|
|
|
|
Labels: []int64{},
|
|
|
|
Deadline: &time.Time{},
|
|
|
|
})
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2022-09-15 10:31:38 +02:00
|
|
|
func (g *Gitea) getOrCreateClient(ctx context.Context, server string) (*gitea.Client, error) {
|
|
|
|
g.giteamu.Lock()
|
|
|
|
defer g.giteamu.Unlock()
|
|
|
|
client, ok := g.giteaClients[server]
|
2022-09-15 10:48:31 +02:00
|
|
|
if !ok || client == nil {
|
2022-09-15 10:31:38 +02:00
|
|
|
c, err := gitea.NewClient(server)
|
|
|
|
if err != nil {
|
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
g.giteaClients[server] = c
|
|
|
|
return c, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return client, nil
|
|
|
|
}
|