@@ -217,6 +217,57 @@ func DeleteUnadoptedRepository(doer, u *user_model.User, repoName string) error
217217 return util .RemoveAll (repoPath )
218218}
219219
220+ type unadoptedRrepositories struct {
221+ repositories []string
222+ index int
223+ start int
224+ end int
225+ }
226+
227+ func (unadopted * unadoptedRrepositories ) add (repository string ) {
228+ if unadopted .index >= unadopted .start && unadopted .index < unadopted .end {
229+ unadopted .repositories = append (unadopted .repositories , repository )
230+ }
231+ unadopted .index ++
232+ }
233+
234+ func checkUnadoptedRepositories (userName string , repoNamesToCheck []string , unadopted * unadoptedRrepositories ) error {
235+ if len (repoNamesToCheck ) == 0 {
236+ return nil
237+ }
238+ ctxUser , err := user_model .GetUserByName (userName )
239+ if err != nil {
240+ if user_model .IsErrUserNotExist (err ) {
241+ log .Debug ("Missing user: %s" , userName )
242+ return nil
243+ }
244+ return err
245+ }
246+ repos , _ , err := models .GetUserRepositories (& models.SearchRepoOptions {
247+ Actor : ctxUser ,
248+ Private : true ,
249+ ListOptions : db.ListOptions {
250+ Page : 1 ,
251+ PageSize : len (repoNamesToCheck ),
252+ }, LowerNames : repoNamesToCheck })
253+ if err != nil {
254+ return err
255+ }
256+ if len (repos ) == len (repoNamesToCheck ) {
257+ return nil
258+ }
259+ repoNames := make (map [string ]bool , len (repos ))
260+ for _ , repo := range repos {
261+ repoNames [repo .LowerName ] = true
262+ }
263+ for _ , repoName := range repoNamesToCheck {
264+ if _ , ok := repoNames [repoName ]; ! ok {
265+ unadopted .add (filepath .Join (userName , repoName ))
266+ }
267+ }
268+ return nil
269+ }
270+
220271// ListUnadoptedRepositories lists all the unadopted repositories that match the provided query
221272func ListUnadoptedRepositories (query string , opts * db.ListOptions ) ([]string , int , error ) {
222273 globUser , _ := glob .Compile ("*" )
@@ -236,15 +287,17 @@ func ListUnadoptedRepositories(query string, opts *db.ListOptions) ([]string, in
236287 }
237288 }
238289 }
239- start := (opts .Page - 1 ) * opts .PageSize
240- end := start + opts .PageSize
241-
242- repoNamesToCheck := make ([]string , 0 , opts .PageSize )
290+ var repoNamesToCheck []string
243291
244- repoNames := make ([]string , 0 , opts .PageSize )
245- var ctxUser * user_model.User
292+ start := (opts .Page - 1 ) * opts .PageSize
293+ unadopted := & unadoptedRrepositories {
294+ repositories : make ([]string , 0 , opts .PageSize ),
295+ start : start ,
296+ end : start + opts .PageSize ,
297+ index : 0 ,
298+ }
246299
247- count := 0
300+ var userName string
248301
249302 // We're going to iterate by pagesize.
250303 root := filepath .Clean (setting .RepoRootPath )
@@ -258,51 +311,16 @@ func ListUnadoptedRepositories(query string, opts *db.ListOptions) ([]string, in
258311
259312 if ! strings .ContainsRune (path [len (root )+ 1 :], filepath .Separator ) {
260313 // Got a new user
261-
262- // Clean up old repoNamesToCheck
263- if len (repoNamesToCheck ) > 0 {
264- repos , _ , err := models .GetUserRepositories (& models.SearchRepoOptions {
265- Actor : ctxUser ,
266- Private : true ,
267- ListOptions : db.ListOptions {
268- Page : 1 ,
269- PageSize : opts .PageSize ,
270- }, LowerNames : repoNamesToCheck })
271- if err != nil {
272- return err
273- }
274- for _ , name := range repoNamesToCheck {
275- found := false
276- repoLoopCatchup:
277- for i , repo := range repos {
278- if repo .LowerName == name {
279- found = true
280- repos = append (repos [:i ], repos [i + 1 :]... )
281- break repoLoopCatchup
282- }
283- }
284- if ! found {
285- if count >= start && count < end {
286- repoNames = append (repoNames , fmt .Sprintf ("%s/%s" , ctxUser .Name , name ))
287- }
288- count ++
289- }
290- }
291- repoNamesToCheck = repoNamesToCheck [:0 ]
314+ if err = checkUnadoptedRepositories (userName , repoNamesToCheck , unadopted ); err != nil {
315+ return err
292316 }
317+ repoNamesToCheck = repoNamesToCheck [:0 ]
293318
294319 if ! globUser .Match (info .Name ()) {
295320 return filepath .SkipDir
296321 }
297322
298- ctxUser , err = user_model .GetUserByName (info .Name ())
299- if err != nil {
300- if user_model .IsErrUserNotExist (err ) {
301- log .Debug ("Missing user: %s" , info .Name ())
302- return filepath .SkipDir
303- }
304- return err
305- }
323+ userName = info .Name ()
306324 return nil
307325 }
308326
@@ -315,74 +333,16 @@ func ListUnadoptedRepositories(query string, opts *db.ListOptions) ([]string, in
315333 if repo_model .IsUsableRepoName (name ) != nil || strings .ToLower (name ) != name || ! globRepo .Match (name ) {
316334 return filepath .SkipDir
317335 }
318- if count < end {
319- repoNamesToCheck = append (repoNamesToCheck , name )
320- if len (repoNamesToCheck ) >= opts .PageSize {
321- repos , _ , err := models .GetUserRepositories (& models.SearchRepoOptions {
322- Actor : ctxUser ,
323- Private : true ,
324- ListOptions : db.ListOptions {
325- Page : 1 ,
326- PageSize : opts .PageSize ,
327- }, LowerNames : repoNamesToCheck })
328- if err != nil {
329- return err
330- }
331- for _ , name := range repoNamesToCheck {
332- found := false
333- repoLoop:
334- for i , repo := range repos {
335- if repo .LowerName == name {
336- found = true
337- repos = append (repos [:i ], repos [i + 1 :]... )
338- break repoLoop
339- }
340- }
341- if ! found {
342- if count >= start && count < end {
343- repoNames = append (repoNames , fmt .Sprintf ("%s/%s" , ctxUser .Name , name ))
344- }
345- count ++
346- }
347- }
348- repoNamesToCheck = repoNamesToCheck [:0 ]
349- }
350- return filepath .SkipDir
351- }
352- count ++
336+
337+ repoNamesToCheck = append (repoNamesToCheck , name )
353338 return filepath .SkipDir
354339 }); err != nil {
355340 return nil , 0 , err
356341 }
357342
358- if len (repoNamesToCheck ) > 0 {
359- repos , _ , err := models .GetUserRepositories (& models.SearchRepoOptions {
360- Actor : ctxUser ,
361- Private : true ,
362- ListOptions : db.ListOptions {
363- Page : 1 ,
364- PageSize : opts .PageSize ,
365- }, LowerNames : repoNamesToCheck })
366- if err != nil {
367- return nil , 0 , err
368- }
369- for _ , name := range repoNamesToCheck {
370- found := false
371- repoLoop:
372- for i , repo := range repos {
373- if repo .LowerName == name {
374- found = true
375- repos = append (repos [:i ], repos [i + 1 :]... )
376- break repoLoop
377- }
378- }
379- if ! found {
380- if count >= start && count < end {
381- repoNames = append (repoNames , fmt .Sprintf ("%s/%s" , ctxUser .Name , name ))
382- }
383- count ++
384- }
385- }
343+ if err := checkUnadoptedRepositories (userName , repoNamesToCheck , unadopted ); err != nil {
344+ return nil , 0 , err
386345 }
387- return repoNames , count , nil
346+
347+ return unadopted .repositories , unadopted .index , nil
388348}
0 commit comments