gitforgefs/gitlab/client.go

115 lines
2.5 KiB
Go
Raw Normal View History

2020-12-27 03:30:19 +00:00
package gitlab
import (
"fmt"
"github.com/xanzy/go-gitlab"
)
type GroupContentFetcher interface {
FetchGroupContent(path string) (GroupContent, error)
}
type GroupContent struct {
Repositories []Repository
Groups []Group
}
type Repository struct {
ID int
Name string
Path string
CloneURL string
}
type Group struct {
ID int
Name string
Path string
}
type GitlabClient struct {
Client *gitlab.Client
}
func NewClient(gitlabUrl string, gitlabToken string) (*GitlabClient, error) {
client, err := gitlab.NewClient(
gitlabToken,
gitlab.WithBaseURL(gitlabUrl),
)
if err != nil {
return nil, fmt.Errorf("failed to create gitlab client: %w", err)
}
gitlabClient := &GitlabClient{
Client: client,
}
return gitlabClient, nil
}
func NewRepositryFromGitlabProject(project *gitlab.Project) Repository {
// https://godoc.org/github.com/xanzy/go-gitlab#Project
return Repository{
ID: project.ID,
Name: project.Name,
Path: project.Path,
CloneURL: project.HTTPURLToRepo,
// CloneUrl: project.SSHURLToRepo,
}
}
func NewGroupFromGitlabGroup(group *gitlab.Group) Group {
// https://godoc.org/github.com/xanzy/go-gitlab#Group
return Group{
ID: group.ID,
Name: group.Name,
Path: group.Path,
}
}
func (g GitlabClient) FetchGroupContent(group *Group) (*GroupContent, error) {
content := &GroupContent{}
// List repositories in path
listProjectOpt := &gitlab.ListGroupProjectsOptions{
ListOptions: gitlab.ListOptions{
Page: 1,
}}
for {
projects, response, err := g.Client.Groups.ListGroupProjects(group.ID, listProjectOpt)
if err != nil {
return nil, fmt.Errorf("failed to fetch projects in gitlab: %w", err)
}
for _, project := range projects {
content.Repositories = append(content.Repositories, NewRepositryFromGitlabProject(project))
}
if response.CurrentPage >= response.TotalPages {
break
}
// Get the next page
listProjectOpt.Page = response.NextPage
}
// List subgroups in path
ListGroupsOpt := &gitlab.ListSubgroupsOptions{
ListOptions: gitlab.ListOptions{
Page: 1,
}}
for {
groups, response, err := g.Client.Groups.ListSubgroups(group.ID, ListGroupsOpt)
if err != nil {
return nil, fmt.Errorf("failed to fetch groups in gitlab: %w", err)
}
for _, group := range groups {
content.Groups = append(content.Groups, NewGroupFromGitlabGroup(group))
}
if response.CurrentPage >= response.TotalPages {
break
}
// Get the next page
ListGroupsOpt.Page = response.NextPage
}
return content, nil
}