@@ -169,7 +169,7 @@ func Milestones(ctx *context.Context) {
169169 page = 1
170170 }
171171
172- repoID := ctx .QueryInt64 ( "repo " )
172+ reposQuery := ctx .Query ( "repos " )
173173 isShowClosed := ctx .Query ("state" ) == "closed"
174174
175175 // Get repositories.
@@ -199,17 +199,34 @@ func Milestones(ctx *context.Context) {
199199 }
200200
201201 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 {
205218 // force an empty result
206219 repoIDs = []int64 {- 1 }
207220 }
208221 } else {
222+ log .Error ("issueReposQueryPattern not match with query" )
223+ }
224+
225+ if len (repoIDs ) == 0 {
209226 repoIDs = userRepoIDs
210227 }
211228
212- counts , err := models .CountMilestonesByRepoIDs (repoIDs , isShowClosed )
229+ counts , err := models .CountMilestonesByRepoIDs (userRepoIDs , isShowClosed )
213230 if err != nil {
214231 ctx .ServerError ("CountMilestonesByRepoIDs" , err )
215232 return
@@ -222,36 +239,29 @@ func Milestones(ctx *context.Context) {
222239 }
223240
224241 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
230245 }
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 {
237248 if models .IsErrRepoNotExist (err ) {
238249 ctx .NotFound ("GetRepositoryByID" , err )
239250 return
240251 } else if err != nil {
241- ctx .ServerError ("GetRepositoryByID" , fmt .Errorf ("[%d]%v" , repoID , err ))
252+ ctx .ServerError ("GetRepositoryByID" , fmt .Errorf ("[%d]%v" , rID , err ))
242253 return
243254 }
244- showReposMap [repoID ] = repo
245255 }
246-
247- repo := showReposMap [repoID ]
256+ showReposMap [rID ] = repo
248257
249258 // Check if user has access to given repository.
250259 perm , err := models .GetUserRepoPermission (repo , ctxUser )
251260 if err != nil {
252- ctx .ServerError ("GetUserRepoPermission" , fmt .Errorf ("[%d]%v" , repoID , err ))
261+ ctx .ServerError ("GetUserRepoPermission" , fmt .Errorf ("[%d]%v" , rID , err ))
253262 return
254263 }
264+
255265 if ! perm .CanRead (models .UnitTypeIssues ) {
256266 if log .IsTrace () {
257267 log .Trace ("Permission Denied: User %-v cannot read %-v of repo %-v\n " +
@@ -285,36 +295,41 @@ func Milestones(ctx *context.Context) {
285295 }
286296 }
287297
288- milestoneStats , err := models .GetMilestonesStats (userRepoIDs )
298+ milestoneStats , err := models .GetMilestonesStats (repoIDs )
289299 if err != nil {
290300 ctx .ServerError ("GetMilestoneStats" , err )
291301 return
292302 }
293303
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 )
297315 } else {
298- total = int (milestoneStats .ClosedCount )
316+ ctx .Data ["State" ] = "open"
317+ ctx .Data ["Total" ] = totalMilestoneStats .OpenCount
318+ pagerCount = int (milestoneStats .OpenCount )
299319 }
300320
301321 ctx .Data ["Milestones" ] = milestones
302322 ctx .Data ["Repos" ] = showRepos
303323 ctx .Data ["Counts" ] = counts
304324 ctx .Data ["MilestoneStats" ] = milestoneStats
305- ctx .Data ["Total" ] = total
306325 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
314328 }
329+ ctx .Data ["IsShowClosed" ] = isShowClosed
315330
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 " )
318333 pager .AddParam (ctx , "sort" , "SortType" )
319334 pager .AddParam (ctx , "state" , "State" )
320335 ctx .Data ["Page" ] = pager
0 commit comments