1
1
mirror of https://github.com/cooperspencer/gickup synced 2024-10-18 13:48:07 +02:00
gickup/gitlab/gitlab.go

159 lines
4.5 KiB
Go
Raw Normal View History

2021-12-12 19:23:55 +01:00
package gitlab
import (
"fmt"
"gickup/types"
"strings"
"github.com/rs/zerolog/log"
"github.com/xanzy/go-gitlab"
)
func Backup(r types.Repo, d types.GenRepo, dry bool) {
gitlabclient := &gitlab.Client{}
var err error
if d.Url == "" {
d.Url = "https://gitlab.com"
gitlabclient, err = gitlab.NewClient(d.Token)
} else {
gitlabclient, err = gitlab.NewClient(d.Token, gitlab.WithBaseURL(d.Url))
}
log.Info().Str("stage", "gitlab").Str("url", d.Url).Msgf("mirroring %s to %s", types.Blue(r.Name), d.Url)
if err != nil {
2021-12-13 08:39:38 +01:00
log.Fatal().Str("stage", "gitlab").Str("url", d.Url).Msg(err.Error())
2021-12-12 19:23:55 +01:00
}
True := true
opt := gitlab.ListProjectsOptions{Search: &r.Name, Owned: &True}
projects, _, err := gitlabclient.Projects.ListProjects(&opt)
if err != nil {
2021-12-13 08:39:38 +01:00
log.Fatal().Str("stage", "gitlab").Str("url", d.Url).Msg(err.Error())
2021-12-12 19:23:55 +01:00
}
found := false
for _, p := range projects {
if p.Name == r.Name {
found = true
}
}
if !dry {
if !found {
if r.Token != "" {
splittedurl := strings.Split(r.Url, "//")
r.Url = fmt.Sprintf("%s//%s@%s", splittedurl[0], r.Token, splittedurl[1])
if r.Token == "" {
r.Url = fmt.Sprintf("%s//%s:%s@%s", splittedurl[0], r.Origin.User, r.Origin.Password, splittedurl[1])
}
}
opts := &gitlab.CreateProjectOptions{Mirror: &True, ImportURL: &r.Url, Name: &r.Name}
_, _, err := gitlabclient.Projects.CreateProject(opts)
if err != nil {
2021-12-13 08:39:38 +01:00
log.Fatal().Str("stage", "gitlab").Str("url", d.Url).Msg(err.Error())
2021-12-12 19:23:55 +01:00
}
}
}
}
func Get(conf *types.Conf) []types.Repo {
repos := []types.Repo{}
for _, repo := range conf.Source.Gitlab {
if repo.Url == "" {
repo.Url = "https://gitlab.com"
}
log.Info().Str("stage", "gitlab").Str("url", repo.Url).Msgf("grabbing repositories from %s", repo.User)
gitlabrepos := []*gitlab.Project{}
gitlabgrouprepos := []*gitlab.Project{}
client, err := gitlab.NewClient(repo.Token, gitlab.WithBaseURL(repo.Url))
if err != nil {
2021-12-13 08:39:38 +01:00
log.Fatal().Str("stage", "gitlab").Str("url", repo.Url).Msg(err.Error())
2021-12-12 19:23:55 +01:00
}
opt := &gitlab.ListProjectsOptions{}
users, _, err := client.Users.ListUsers(&gitlab.ListUsersOptions{Username: &repo.User})
if err != nil {
2021-12-13 08:39:38 +01:00
log.Fatal().Str("stage", "gitlab").Str("url", repo.Url).Msg(err.Error())
2021-12-12 19:23:55 +01:00
}
opt.PerPage = 50
i := 0
for _, user := range users {
if user.Username == repo.User {
for {
projects, _, err := client.Projects.ListUserProjects(user.ID, opt)
if err != nil {
2021-12-13 08:39:38 +01:00
log.Fatal().Str("stage", "gitlab").Str("url", repo.Url).Msg(err.Error())
2021-12-12 19:23:55 +01:00
}
if len(projects) == 0 {
break
}
gitlabrepos = append(gitlabrepos, projects...)
i++
opt.Page = i
}
}
}
2021-12-13 11:53:20 +01:00
include := types.GetMap(repo.Include)
exclude := types.GetMap(repo.Exclude)
2021-12-12 19:23:55 +01:00
for _, r := range gitlabrepos {
2021-12-13 11:53:20 +01:00
if include[r.Name] {
repos = append(repos, types.Repo{Name: r.Name, Url: r.HTTPURLToRepo, SshUrl: r.SSHURLToRepo, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo})
continue
}
2021-12-12 19:23:55 +01:00
if exclude[r.Name] {
continue
}
2021-12-13 11:53:20 +01:00
if len(include) == 0 {
repos = append(repos, types.Repo{Name: r.Name, Url: r.HTTPURLToRepo, SshUrl: r.SSHURLToRepo, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo})
}
2021-12-12 19:23:55 +01:00
}
if repo.Token != "" {
groups := []*gitlab.Group{}
i = 1
for {
g, _, err := client.Groups.ListGroups(&gitlab.ListGroupsOptions{ListOptions: gitlab.ListOptions{Page: i, PerPage: 50}})
if err != nil {
log.Fatal().Str("stage", "gitlab").Str("url", repo.Url).Msg(err.Error())
}
if len(g) == 0 {
break
}
groups = append(groups, g...)
i++
}
2021-12-12 19:23:55 +01:00
gopt := &gitlab.ListGroupProjectsOptions{}
2021-12-12 19:23:55 +01:00
for _, group := range groups {
i = 1
gopt.PerPage = 50
gopt.Page = i
2021-12-12 19:23:55 +01:00
for {
projects, _, err := client.Groups.ListGroupProjects(group.ID, gopt)
if err != nil {
2021-12-13 08:39:38 +01:00
log.Fatal().Str("stage", "gitlab").Str("url", repo.Url).Msg(err.Error())
2021-12-12 19:23:55 +01:00
}
if len(projects) == 0 {
break
}
gitlabgrouprepos = append(gitlabgrouprepos, projects...)
i++
gopt.Page = i
}
}
for _, r := range gitlabgrouprepos {
2021-12-13 11:53:20 +01:00
if include[r.Name] {
repos = append(repos, types.Repo{Name: r.Name, Url: r.HTTPURLToRepo, SshUrl: r.SSHURLToRepo, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo})
continue
}
2021-12-12 19:23:55 +01:00
if exclude[r.Name] {
continue
}
2021-12-13 11:53:20 +01:00
if len(include) == 0 {
repos = append(repos, types.Repo{Name: r.Name, Url: r.HTTPURLToRepo, SshUrl: r.SSHURLToRepo, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo})
}
2021-12-12 19:23:55 +01:00
}
}
}
return repos
}