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 } 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, 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] 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 }