ghorg/scm/gitea.go

195 lines
4.1 KiB
Go

package scm
import (
"fmt"
"net/http"
"os"
"strings"
"code.gitea.io/sdk/gitea"
"github.com/gabrie30/ghorg/colorlog"
)
var (
_ Client = Gitea{}
)
func init() {
registerClient(Gitea{})
}
type Gitea struct{}
func (_ Gitea) GetType() string {
return "gitea"
}
// GetOrgRepos fetches repo data from a specific group
func (c Gitea) GetOrgRepos(targetOrg string) ([]Repo, error) {
repoData := []Repo{}
client, err := c.determineClient()
if err != nil {
colorlog.PrintError(err)
}
perPage := 10
if conf, _, err := client.GetGlobalAPISettings(); err == nil && conf != nil {
perPage = conf.MaxResponseItems
}
for i := 1; ; i++ {
rps, resp, err := client.ListOrgRepos(targetOrg, gitea.ListOrgReposOptions{ListOptions: gitea.ListOptions{
Page: i,
PageSize: perPage,
}})
if err != nil {
if resp != nil && resp.StatusCode == http.StatusNotFound {
colorlog.PrintError(fmt.Errorf("org \"%s\" not found", targetOrg))
}
return []Repo{}, err
}
repoDataFiltered, err := c.filter(client, rps)
if err != nil {
return nil, err
}
repoData = append(repoData, repoDataFiltered...)
// Exit the loop when we've seen all pages.
if len(rps) < perPage {
break
}
}
return repoData, nil
}
// GetUserRepos gets all of a users gitlab repos
func (c Gitea) GetUserRepos(targetUsername string) ([]Repo, error) {
repoData := []Repo{}
client, err := c.determineClient()
if err != nil {
colorlog.PrintError(err)
}
perPage := 10
if conf, _, err := client.GetGlobalAPISettings(); err == nil && conf != nil {
perPage = conf.MaxResponseItems
}
for i := 1; ; i++ {
rps, resp, err := client.ListUserRepos(targetUsername, gitea.ListReposOptions{ListOptions: gitea.ListOptions{
Page: i,
PageSize: perPage,
}})
if err != nil {
if resp != nil && resp.StatusCode == http.StatusNotFound {
colorlog.PrintError(fmt.Errorf("org \"%s\" not found", targetUsername))
}
return []Repo{}, err
}
repoDataFiltered, err := c.filter(client, rps)
if err != nil {
return nil, err
}
repoData = append(repoData, repoDataFiltered...)
// Exit the loop when we've seen all pages.
if len(rps) < perPage {
break
}
}
return repoData, nil
}
func (c Gitea) determineClient() (*gitea.Client, error) {
baseURL := os.Getenv("GHORG_SCM_BASE_URL")
token := os.Getenv("GHORG_GITEA_TOKEN")
if baseURL == "" {
baseURL = "https://gitea.com"
}
return gitea.NewClient(baseURL, gitea.SetToken(token))
}
func (c Gitea) filter(client *gitea.Client, rps []*gitea.Repository) (repoData []Repo, err error) {
envTopics := strings.Split(os.Getenv("GHORG_TOPICS"), ",")
for _, rp := range rps {
if os.Getenv("GHORG_SKIP_ARCHIVED") == "true" {
if rp.Archived == true {
continue
}
}
if os.Getenv("GHORG_SKIP_FORKS") == "true" {
if rp.Fork == true {
continue
}
}
// If user defined a list of topics, check if any match with this repo
if os.Getenv("GHORG_TOPICS") != "" {
rpTopics, _, err := client.ListRepoTopics(rp.Owner.UserName, rp.Name, gitea.ListRepoTopicsOptions{})
if err != nil {
return []Repo{}, err
}
foundTopic := false
for _, topic := range rpTopics {
for _, envTopic := range envTopics {
if topic == envTopic {
foundTopic = true
break
}
}
if foundTopic == true {
break
}
}
if foundTopic == false {
continue
}
}
if os.Getenv("GHORG_MATCH_PREFIX") != "" {
repoName := strings.ToLower(rp.Name)
foundPrefix := false
pfs := strings.Split(os.Getenv("GHORG_MATCH_PREFIX"), ",")
for _, p := range pfs {
if strings.HasPrefix(repoName, strings.ToLower(p)) {
foundPrefix = true
}
}
if foundPrefix == false {
continue
}
}
r := Repo{}
r.Path = rp.FullName
if os.Getenv("GHORG_CLONE_PROTOCOL") == "https" {
cloneURL := rp.CloneURL
if rp.Private {
cloneURL = "https://" + os.Getenv("GHORG_GITEA_TOKEN") + strings.TrimLeft(cloneURL, "https://")
}
r.CloneURL = cloneURL
r.URL = cloneURL
repoData = append(repoData, r)
} else {
r.CloneURL = rp.SSHURL
r.URL = rp.SSHURL
repoData = append(repoData, r)
}
}
return repoData, nil
}