Skip to content

Commit 6244cda

Browse files
author
jguerreiro
committed
feat(gitlab): fix cloning errors
1 parent 2078650 commit 6244cda

File tree

3 files changed

+98
-30
lines changed

3 files changed

+98
-30
lines changed

gitlab/provider.go

Lines changed: 95 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"dnacollector"
55
"errors"
66
"fmt"
7+
"strings"
78
"sync"
89
"time"
910

@@ -89,7 +90,7 @@ func createFromGitlabRepo(r *gitlab.Project) *Repository {
8990
}
9091
}
9192

92-
func (p *Provider) gatherPage(page int) ([]dnacollector.GitRepository, error) {
93+
func (p *Provider) gatherAccessiblePage(page int) ([]dnacollector.GitRepository, int, error) {
9394
opt := &gitlab.ListProjectsOptions{
9495
ListOptions: gitlab.ListOptions{
9596
PerPage: reposPerPage, Page: page,
@@ -98,9 +99,9 @@ func (p *Provider) gatherPage(page int) ([]dnacollector.GitRepository, error) {
9899

99100
log.Infof("Gathering page %v for %v\n", page, p.client.BaseURL())
100101

101-
repos, _, err := p.client.Projects.ListProjects(opt)
102+
repos, resp, err := p.client.Projects.ListProjects(opt)
102103
if err != nil {
103-
return nil, err
104+
return nil, 0, err
104105
}
105106

106107
repositories := make([]dnacollector.GitRepository, 0, len(repos))
@@ -113,7 +114,34 @@ func (p *Provider) gatherPage(page int) ([]dnacollector.GitRepository, error) {
113114
repositories = append(repositories, createFromGitlabRepo(repo))
114115
}
115116

116-
return repositories, nil
117+
return repositories, resp.TotalPages, nil
118+
}
119+
120+
func (p *Provider) gatherGroupProjectPage(page int) ([]dnacollector.GitRepository, int, error) {
121+
opt := &gitlab.ListProjectsOptions{
122+
ListOptions: gitlab.ListOptions{
123+
PerPage: reposPerPage, Page: page,
124+
}, Statistics: gitlab.Bool(true),
125+
}
126+
127+
log.Infof("Gathering page %v for %v\n", page, p.client.BaseURL())
128+
129+
repos, resp, err := p.client.Projects.ListProjects(opt)
130+
if err != nil {
131+
return nil, 0, err
132+
}
133+
134+
repositories := make([]dnacollector.GitRepository, 0, len(repos))
135+
136+
for _, repo := range repos {
137+
if p.options.OmitForks && repo.ForkedFromProject != nil {
138+
continue
139+
}
140+
141+
repositories = append(repositories, createFromGitlabRepo(repo))
142+
}
143+
144+
return repositories, resp.TotalPages, nil
117145
}
118146

119147
func (p *Provider) findGroup(name string) (int, error) {
@@ -128,51 +156,50 @@ func (p *Provider) findGroup(name string) (int, error) {
128156
return 0, ErrGroupNotFound
129157
}
130158

131-
return groups[0].ID, nil
159+
for _, group := range groups {
160+
if strings.EqualFold(group.FullPath, name) {
161+
return group.ID, nil
162+
}
163+
}
164+
165+
return 0, ErrGroupNotFound
132166
}
133167

134168
// Gather gathers user's repositories for the configured token.
135169
func (p *Provider) Gather(user string) ([]dnacollector.GitRepository, error) {
136170
log.Debugf("Gathering repositories for user %s\n", user)
137171

138-
groupID, err := p.findGroup(user)
139-
if err != nil {
140-
return nil, err
141-
}
142-
143-
opt := &gitlab.ListGroupProjectsOptions{
144-
ListOptions: gitlab.ListOptions{
145-
PerPage: reposPerPage,
146-
Page: 1,
147-
},
148-
}
149-
150-
repos, resp, err := p.client.Groups.ListGroupProjects(groupID, opt)
151-
if err != nil {
152-
return nil, err
172+
// repositories protected by mu, since multiple goroutines will access it
173+
repositories := make([]dnacollector.GitRepository, 0)
174+
if user != "" {
175+
repositories = p.collectFromGroup(repositories, user)
176+
} else {
177+
repositories = p.collectAllAccessible(repositories)
153178
}
154179

155-
pagesCount := resp.TotalPages
156-
157-
log.Infof("Gathering %v pages for %s\n", pagesCount, user)
180+
return repositories, nil
181+
}
158182

183+
func (p *Provider) collectAllAccessible(
184+
repositories []dnacollector.GitRepository) []dnacollector.GitRepository {
159185
wg := sync.WaitGroup{}
160186

161187
var mu sync.Mutex
162188

163-
// repositories protected by mu, since multiple goroutines will access it
164-
repositories := make([]dnacollector.GitRepository, 0, pagesCount*reposPerPage)
165-
for _, repo := range repos {
166-
repositories = append(repositories, createFromGitlabRepo(repo))
189+
_, totalPages, err := p.gatherAccessiblePage(1)
190+
if err != nil {
191+
log.Errorf("Error gathering first page: %v\n", err)
192+
193+
return repositories
167194
}
168195

169-
for pageCount := 1; pageCount <= pagesCount; pageCount++ {
196+
for pageCount := 1; pageCount <= totalPages; pageCount++ {
170197
wg.Add(1)
171198

172199
go func(page int) {
173200
defer wg.Done()
174201

175-
pageRepositories, err := p.gatherPage(page)
202+
pageRepositories, _, err := p.gatherAccessiblePage(page)
176203
if err != nil {
177204
log.Errorf("Error gathering page %v:%v\n", page, err)
178205

@@ -187,7 +214,40 @@ func (p *Provider) Gather(user string) ([]dnacollector.GitRepository, error) {
187214

188215
wg.Wait()
189216

190-
return repositories, nil
217+
return repositories
218+
}
219+
220+
func (p *Provider) collectFromGroup(repositories []dnacollector.GitRepository,
221+
user string) []dnacollector.GitRepository {
222+
groupID, err := p.findGroup(user)
223+
if err != nil {
224+
log.Errorf("Error finding group: %v\n", err)
225+
226+
return repositories
227+
}
228+
229+
opt := &gitlab.ListGroupProjectsOptions{
230+
ListOptions: gitlab.ListOptions{
231+
PerPage: reposPerPage,
232+
Page: 1,
233+
},
234+
}
235+
236+
repos, resp, err := p.client.Groups.ListGroupProjects(groupID, opt)
237+
if err != nil {
238+
log.Errorf("Error gathering page: %v\n", err)
239+
240+
return repositories
241+
}
242+
243+
pagesCount := resp.TotalPages
244+
log.Infof("Gathering %v pages for %s\n", pagesCount, user)
245+
246+
for _, repo := range repos {
247+
repositories = append(repositories, createFromGitlabRepo(repo))
248+
}
249+
250+
return repositories
191251
}
192252

193253
// CloneRepository clones a Gitlab repository given the token. The token must have the `read_repository` rights.
@@ -199,5 +259,10 @@ func (p *Provider) CloneRepository(
199259
Password: p.token,
200260
}
201261

262+
// If token doesn't exist, don't try to basic auth
263+
if p.token == "" {
264+
auth = nil
265+
}
266+
202267
return cloner.CloneRepository(repository.GetHTTPUrl(), auth)
203268
}

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ require (
1010
github.com/google/go-querystring v1.1.0 // indirect
1111
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
1212
github.com/kevinburke/ssh_config v1.1.0 // indirect
13+
github.com/ldez/go-git-cmd-wrapper/v2 v2.0.0 // indirect
1314
github.com/russross/blackfriday/v2 v2.1.0 // indirect
1415
github.com/sergi/go-diff v1.2.0 // indirect
1516
github.com/sirupsen/logrus v1.8.1

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
150150
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
151151
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
152152
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
153+
github.com/ldez/go-git-cmd-wrapper/v2 v2.0.0 h1:WyBXbkLaU1oZlZ5czVgnTmzzSD7hMpPVtdavyVk2+7g=
154+
github.com/ldez/go-git-cmd-wrapper/v2 v2.0.0/go.mod h1:8IK8SZaL0HgWHK4Gb8byfw2eyYkaBZjZ6fVLt++vQ7Y=
153155
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
154156
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
155157
github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo=

0 commit comments

Comments
 (0)