4
4
"dnacollector"
5
5
"errors"
6
6
"fmt"
7
+ "strings"
7
8
"sync"
8
9
"time"
9
10
@@ -89,7 +90,7 @@ func createFromGitlabRepo(r *gitlab.Project) *Repository {
89
90
}
90
91
}
91
92
92
- func (p * Provider ) gatherPage (page int ) ([]dnacollector.GitRepository , error ) {
93
+ func (p * Provider ) gatherAccessiblePage (page int ) ([]dnacollector.GitRepository , int , error ) {
93
94
opt := & gitlab.ListProjectsOptions {
94
95
ListOptions : gitlab.ListOptions {
95
96
PerPage : reposPerPage , Page : page ,
@@ -98,9 +99,9 @@ func (p *Provider) gatherPage(page int) ([]dnacollector.GitRepository, error) {
98
99
99
100
log .Infof ("Gathering page %v for %v\n " , page , p .client .BaseURL ())
100
101
101
- repos , _ , err := p .client .Projects .ListProjects (opt )
102
+ repos , resp , err := p .client .Projects .ListProjects (opt )
102
103
if err != nil {
103
- return nil , err
104
+ return nil , 0 , err
104
105
}
105
106
106
107
repositories := make ([]dnacollector.GitRepository , 0 , len (repos ))
@@ -113,7 +114,34 @@ func (p *Provider) gatherPage(page int) ([]dnacollector.GitRepository, error) {
113
114
repositories = append (repositories , createFromGitlabRepo (repo ))
114
115
}
115
116
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
117
145
}
118
146
119
147
func (p * Provider ) findGroup (name string ) (int , error ) {
@@ -128,51 +156,50 @@ func (p *Provider) findGroup(name string) (int, error) {
128
156
return 0 , ErrGroupNotFound
129
157
}
130
158
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
132
166
}
133
167
134
168
// Gather gathers user's repositories for the configured token.
135
169
func (p * Provider ) Gather (user string ) ([]dnacollector.GitRepository , error ) {
136
170
log .Debugf ("Gathering repositories for user %s\n " , user )
137
171
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 )
153
178
}
154
179
155
- pagesCount := resp .TotalPages
156
-
157
- log .Infof ("Gathering %v pages for %s\n " , pagesCount , user )
180
+ return repositories , nil
181
+ }
158
182
183
+ func (p * Provider ) collectAllAccessible (
184
+ repositories []dnacollector.GitRepository ) []dnacollector.GitRepository {
159
185
wg := sync.WaitGroup {}
160
186
161
187
var mu sync.Mutex
162
188
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
167
194
}
168
195
169
- for pageCount := 1 ; pageCount <= pagesCount ; pageCount ++ {
196
+ for pageCount := 1 ; pageCount <= totalPages ; pageCount ++ {
170
197
wg .Add (1 )
171
198
172
199
go func (page int ) {
173
200
defer wg .Done ()
174
201
175
- pageRepositories , err := p .gatherPage (page )
202
+ pageRepositories , _ , err := p .gatherAccessiblePage (page )
176
203
if err != nil {
177
204
log .Errorf ("Error gathering page %v:%v\n " , page , err )
178
205
@@ -187,7 +214,40 @@ func (p *Provider) Gather(user string) ([]dnacollector.GitRepository, error) {
187
214
188
215
wg .Wait ()
189
216
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
191
251
}
192
252
193
253
// CloneRepository clones a Gitlab repository given the token. The token must have the `read_repository` rights.
@@ -199,5 +259,10 @@ func (p *Provider) CloneRepository(
199
259
Password : p .token ,
200
260
}
201
261
262
+ // If token doesn't exist, don't try to basic auth
263
+ if p .token == "" {
264
+ auth = nil
265
+ }
266
+
202
267
return cloner .CloneRepository (repository .GetHTTPUrl (), auth )
203
268
}
0 commit comments