2022-09-15 10:31:38 +02:00
|
|
|
package gitproviders
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
"sync"
|
|
|
|
|
|
|
|
"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,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
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 {
|
|
|
|
return nil, 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) 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
|
|
|
|
}
|