@@ -169,7 +169,7 @@ func Milestones(ctx *context.Context) {
169
169
page = 1
170
170
}
171
171
172
- repoID := ctx .QueryInt64 ( "repo " )
172
+ reposQuery := ctx .Query ( "repos " )
173
173
isShowClosed := ctx .Query ("state" ) == "closed"
174
174
175
175
// Get repositories.
@@ -199,17 +199,34 @@ func Milestones(ctx *context.Context) {
199
199
}
200
200
201
201
var repoIDs []int64
202
- if repoID > 0 {
203
- repoIDs = []int64 {repoID }
204
- if ! com .IsSliceContainsInt64 (userRepoIDs , repoID ) {
202
+ if issueReposQueryPattern .MatchString (reposQuery ) {
203
+ // remove "[" and "]" from string
204
+ reposQuery = reposQuery [1 : len (reposQuery )- 1 ]
205
+ //for each ID (delimiter ",") add to int to repoIDs
206
+ reposSet := false
207
+ for _ , rID := range strings .Split (reposQuery , "," ) {
208
+ // Ensure nonempty string entries
209
+ if rID != "" && rID != "0" {
210
+ reposSet = true
211
+ rIDint64 , err := strconv .ParseInt (rID , 10 , 64 )
212
+ if err == nil && com .IsSliceContainsInt64 (userRepoIDs , rIDint64 ) {
213
+ repoIDs = append (repoIDs , rIDint64 )
214
+ }
215
+ }
216
+ }
217
+ if reposSet && len (repoIDs ) == 0 {
205
218
// force an empty result
206
219
repoIDs = []int64 {- 1 }
207
220
}
208
221
} else {
222
+ log .Error ("issueReposQueryPattern not match with query" )
223
+ }
224
+
225
+ if len (repoIDs ) == 0 {
209
226
repoIDs = userRepoIDs
210
227
}
211
228
212
- counts , err := models .CountMilestonesByRepoIDs (repoIDs , isShowClosed )
229
+ counts , err := models .CountMilestonesByRepoIDs (userRepoIDs , isShowClosed )
213
230
if err != nil {
214
231
ctx .ServerError ("CountMilestonesByRepoIDs" , err )
215
232
return
@@ -222,36 +239,29 @@ func Milestones(ctx *context.Context) {
222
239
}
223
240
224
241
showReposMap := make (map [int64 ]* models.Repository , len (counts ))
225
- for repoID := range counts {
226
- repo , err := models .GetRepositoryByID (repoID )
227
- if err != nil {
228
- ctx .ServerError ("GetRepositoryByID" , err )
229
- return
242
+ for rID := range counts {
243
+ if rID == - 1 {
244
+ break
230
245
}
231
- showReposMap [repoID ] = repo
232
- }
233
-
234
- if repoID > 0 {
235
- if _ , ok := showReposMap [repoID ]; ! ok {
236
- repo , err := models .GetRepositoryByID (repoID )
246
+ repo , err := models .GetRepositoryByID (rID )
247
+ if err != nil {
237
248
if models .IsErrRepoNotExist (err ) {
238
249
ctx .NotFound ("GetRepositoryByID" , err )
239
250
return
240
251
} else if err != nil {
241
- ctx .ServerError ("GetRepositoryByID" , fmt .Errorf ("[%d]%v" , repoID , err ))
252
+ ctx .ServerError ("GetRepositoryByID" , fmt .Errorf ("[%d]%v" , rID , err ))
242
253
return
243
254
}
244
- showReposMap [repoID ] = repo
245
255
}
246
-
247
- repo := showReposMap [repoID ]
256
+ showReposMap [rID ] = repo
248
257
249
258
// Check if user has access to given repository.
250
259
perm , err := models .GetUserRepoPermission (repo , ctxUser )
251
260
if err != nil {
252
- ctx .ServerError ("GetUserRepoPermission" , fmt .Errorf ("[%d]%v" , repoID , err ))
261
+ ctx .ServerError ("GetUserRepoPermission" , fmt .Errorf ("[%d]%v" , rID , err ))
253
262
return
254
263
}
264
+
255
265
if ! perm .CanRead (models .UnitTypeIssues ) {
256
266
if log .IsTrace () {
257
267
log .Trace ("Permission Denied: User %-v cannot read %-v of repo %-v\n " +
@@ -285,36 +295,41 @@ func Milestones(ctx *context.Context) {
285
295
}
286
296
}
287
297
288
- milestoneStats , err := models .GetMilestonesStats (userRepoIDs )
298
+ milestoneStats , err := models .GetMilestonesStats (repoIDs )
289
299
if err != nil {
290
300
ctx .ServerError ("GetMilestoneStats" , err )
291
301
return
292
302
}
293
303
294
- var total int
295
- if ! isShowClosed {
296
- total = int (milestoneStats .OpenCount )
304
+ totalMilestoneStats , err := models .GetMilestonesStats (userRepoIDs )
305
+ if err != nil {
306
+ ctx .ServerError ("GetMilestoneStats" , err )
307
+ return
308
+ }
309
+
310
+ var pagerCount int
311
+ if isShowClosed {
312
+ ctx .Data ["State" ] = "closed"
313
+ ctx .Data ["Total" ] = totalMilestoneStats .ClosedCount
314
+ pagerCount = int (milestoneStats .ClosedCount )
297
315
} else {
298
- total = int (milestoneStats .ClosedCount )
316
+ ctx .Data ["State" ] = "open"
317
+ ctx .Data ["Total" ] = totalMilestoneStats .OpenCount
318
+ pagerCount = int (milestoneStats .OpenCount )
299
319
}
300
320
301
321
ctx .Data ["Milestones" ] = milestones
302
322
ctx .Data ["Repos" ] = showRepos
303
323
ctx .Data ["Counts" ] = counts
304
324
ctx .Data ["MilestoneStats" ] = milestoneStats
305
- ctx .Data ["Total" ] = total
306
325
ctx .Data ["SortType" ] = sortType
307
- ctx .Data ["RepoID" ] = repoID
308
- ctx .Data ["IsShowClosed" ] = isShowClosed
309
-
310
- if isShowClosed {
311
- ctx .Data ["State" ] = "closed"
312
- } else {
313
- ctx .Data ["State" ] = "open"
326
+ if len (repoIDs ) != len (userRepoIDs ) {
327
+ ctx .Data ["RepoIDs" ] = repoIDs
314
328
}
329
+ ctx .Data ["IsShowClosed" ] = isShowClosed
315
330
316
- pager := context .NewPagination (total , setting .UI .IssuePagingNum , page , 5 )
317
- pager .AddParam (ctx , "repo " , "RepoID " )
331
+ pager := context .NewPagination (pagerCount , setting .UI .IssuePagingNum , page , 5 )
332
+ pager .AddParam (ctx , "repos " , "RepoIDs " )
318
333
pager .AddParam (ctx , "sort" , "SortType" )
319
334
pager .AddParam (ctx , "state" , "State" )
320
335
ctx .Data ["Page" ] = pager
0 commit comments