octopush/internal/gitproviders/gitea.go
2022-09-17 18:28:38 +02:00

104 lines
2.0 KiB
Go

package gitproviders
import (
"context"
"fmt"
"sync"
"time"
"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{
logger: logger,
giteamu: sync.Mutex{},
giteaClients: make(map[string]*gitea.Client, 0),
}
}
func (g *Gitea) ListRepositoriesForOrganization(
ctx context.Context,
server string,
organization string,
) ([]string, error) {
client, err := g.getOrCreateClient(ctx, server)
if err != nil {
return nil, err
}
g.logger.Debug("Listing repos for gitea", zap.String("server", server))
repos, resp, err := client.ListOrgRepos(organization, gitea.ListOrgReposOptions{
ListOptions: gitea.ListOptions{
Page: 0,
PageSize: 20,
},
})
if err != nil {
return nil, fmt.Errorf("could not list repos: %w", err)
}
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
}
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
}
func (g *Gitea) getOrCreateClient(ctx context.Context, server string) (*gitea.Client, error) {
g.giteamu.Lock()
defer g.giteamu.Unlock()
client, ok := g.giteaClients[server]
if !ok || client == nil {
c, err := gitea.NewClient(server)
if err != nil {
return nil, nil
}
g.giteaClients[server] = c
return c, nil
}
return client, nil
}