@@ -24,7 +24,7 @@ import (
24
24
25
25
"github.com/keybase/go-crypto/openpgp"
26
26
"github.com/keybase/go-crypto/openpgp/armor"
27
- "github.com/unknwon/com "
27
+ "xorm.io/builder "
28
28
)
29
29
30
30
const (
@@ -171,135 +171,114 @@ func Milestones(ctx *context.Context) {
171
171
return
172
172
}
173
173
174
- sortType := ctx .Query ("sort" )
175
- page := ctx .QueryInt ("page" )
176
- if page <= 1 {
177
- page = 1
178
- }
174
+ var (
175
+ repoOpts = models.SearchRepoOptions {
176
+ OwnerID : ctxUser .ID ,
177
+ Private : true ,
178
+ AllPublic : false , // Include also all public repositories of users and public organisations
179
+ AllLimited : false , // Include also all public repositories of limited organisations
180
+ HasMilestones : util .OptionalBoolTrue , // Just needs display repos has milestones
181
+ IsProfile : false ,
182
+ }
179
183
180
- reposQuery := ctx .Query ("repos" )
181
- isShowClosed := ctx .Query ("state" ) == "closed"
184
+ userRepoCond = models .SearchRepositoryCondition (& repoOpts ) // all repo condition user could visit
185
+ repoCond = userRepoCond
186
+ repoIDs []int64
182
187
183
- // Get repositories.
184
- var err error
185
- var userRepoIDs []int64
186
- if ctxUser .IsOrganization () {
187
- env , err := ctxUser .AccessibleReposEnv (ctx .User .ID )
188
- if err != nil {
189
- ctx .ServerError ("AccessibleReposEnv" , err )
190
- return
191
- }
192
- userRepoIDs , err = env .RepoIDs (1 , ctxUser .NumRepos )
193
- if err != nil {
194
- ctx .ServerError ("env.RepoIDs" , err )
195
- return
196
- }
197
- userRepoIDs , err = models .FilterOutRepoIdsWithoutUnitAccess (ctx .User , userRepoIDs , models .UnitTypeIssues , models .UnitTypePullRequests )
198
- if err != nil {
199
- ctx .ServerError ("FilterOutRepoIdsWithoutUnitAccess" , err )
200
- return
201
- }
202
- } else {
203
- userRepoIDs , err = ctxUser .GetAccessRepoIDs (models .UnitTypeIssues , models .UnitTypePullRequests )
204
- if err != nil {
205
- ctx .ServerError ("ctxUser.GetAccessRepoIDs" , err )
206
- return
207
- }
208
- }
209
- if len (userRepoIDs ) == 0 {
210
- userRepoIDs = []int64 {- 1 }
188
+ reposQuery = ctx .Query ("repos" )
189
+ isShowClosed = ctx .Query ("state" ) == "closed"
190
+ sortType = ctx .Query ("sort" )
191
+ page = ctx .QueryInt ("page" )
192
+ )
193
+
194
+ if page <= 1 {
195
+ page = 1
211
196
}
212
197
213
- var repoIDs []int64
214
198
if len (reposQuery ) != 0 {
215
199
if issueReposQueryPattern .MatchString (reposQuery ) {
216
200
// remove "[" and "]" from string
217
201
reposQuery = reposQuery [1 : len (reposQuery )- 1 ]
218
202
//for each ID (delimiter ",") add to int to repoIDs
219
- reposSet := false
203
+
220
204
for _ , rID := range strings .Split (reposQuery , "," ) {
221
205
// Ensure nonempty string entries
222
206
if rID != "" && rID != "0" {
223
- reposSet = true
224
207
rIDint64 , err := strconv .ParseInt (rID , 10 , 64 )
225
208
// If the repo id specified by query is not parseable or not accessible by user, just ignore it.
226
- if err == nil && com . IsSliceContainsInt64 ( userRepoIDs , rIDint64 ) {
209
+ if err == nil {
227
210
repoIDs = append (repoIDs , rIDint64 )
228
211
}
229
212
}
230
213
}
231
- if reposSet && len (repoIDs ) == 0 {
232
- // force an empty result
233
- repoIDs = []int64 {- 1 }
214
+ if len (repoIDs ) > 0 {
215
+ // Don't just let repoCond = builder.In("id", repoIDs) because user may has no permission on repoIDs
216
+ // But the original repoCond has a limitation
217
+ repoCond = repoCond .And (builder .In ("id" , repoIDs ))
234
218
}
235
219
} else {
236
220
log .Warn ("issueReposQueryPattern not match with query" )
237
221
}
238
222
}
239
223
240
- if len (repoIDs ) == 0 {
241
- repoIDs = userRepoIDs
242
- }
243
-
244
- counts , err := models .CountMilestonesByRepoIDs (userRepoIDs , isShowClosed )
224
+ counts , err := models .CountMilestones (userRepoCond , isShowClosed )
245
225
if err != nil {
246
226
ctx .ServerError ("CountMilestonesByRepoIDs" , err )
247
227
return
248
228
}
249
229
250
- milestones , err := models .GetMilestonesByRepoIDs ( repoIDs , page , isShowClosed , sortType )
230
+ milestones , err := models .SearchMilestones ( repoCond , page , isShowClosed , sortType )
251
231
if err != nil {
252
232
ctx .ServerError ("GetMilestonesByRepoIDs" , err )
253
233
return
254
234
}
255
235
256
- showReposMap := make (map [int64 ]* models.Repository , len (counts ))
257
- for rID := range counts {
258
- if rID == - 1 {
259
- break
260
- }
261
- repo , err := models .GetRepositoryByID (rID )
262
- if err != nil {
263
- if models .IsErrRepoNotExist (err ) {
264
- ctx .NotFound ("GetRepositoryByID" , err )
265
- return
266
- } else if err != nil {
267
- ctx .ServerError ("GetRepositoryByID" , fmt .Errorf ("[%d]%v" , rID , err ))
268
- return
269
- }
270
- }
271
- showReposMap [rID ] = repo
272
- }
273
-
274
- showRepos := models .RepositoryListOfMap (showReposMap )
275
- sort .Sort (showRepos )
276
- if err = showRepos .LoadAttributes (); err != nil {
277
- ctx .ServerError ("LoadAttributes" , err )
236
+ showRepos , _ , err := models .SearchRepositoryByCondition (& repoOpts , userRepoCond )
237
+ if err != nil {
238
+ ctx .ServerError ("SearchRepositoryByCondition" , err )
278
239
return
279
240
}
241
+ sort .Sort (showRepos )
242
+
243
+ for i := 0 ; i < len (milestones ); {
244
+ for _ , repo := range showRepos {
245
+ if milestones [i ].RepoID == repo .ID {
246
+ milestones [i ].Repo = repo
247
+ break
248
+ }
249
+ }
250
+ if milestones [i ].Repo == nil {
251
+ log .Warn ("Cannot find milestone %d 's repository %d" , milestones [i ].ID , milestones [i ].RepoID )
252
+ milestones = append (milestones [:i ], milestones [i + 1 :]... )
253
+ continue
254
+ }
280
255
281
- for _ , m := range milestones {
282
- m .Repo = showReposMap [m .RepoID ]
283
- m .RenderedContent = string (markdown .Render ([]byte (m .Content ), m .Repo .Link (), m .Repo .ComposeMetas ()))
284
- if m .Repo .IsTimetrackerEnabled () {
285
- err := m .LoadTotalTrackedTime ()
256
+ milestones [i ].RenderedContent = string (markdown .Render ([]byte (milestones [i ].Content ), milestones [i ].Repo .Link (), milestones [i ].Repo .ComposeMetas ()))
257
+ if milestones [i ].Repo .IsTimetrackerEnabled () {
258
+ err := milestones [i ].LoadTotalTrackedTime ()
286
259
if err != nil {
287
260
ctx .ServerError ("LoadTotalTrackedTime" , err )
288
261
return
289
262
}
290
263
}
264
+ i ++
291
265
}
292
266
293
- milestoneStats , err := models .GetMilestonesStats (repoIDs )
267
+ milestoneStats , err := models .GetMilestonesStats (repoCond )
294
268
if err != nil {
295
269
ctx .ServerError ("GetMilestoneStats" , err )
296
270
return
297
271
}
298
272
299
- totalMilestoneStats , err := models .GetMilestonesStats (userRepoIDs )
300
- if err != nil {
301
- ctx .ServerError ("GetMilestoneStats" , err )
302
- return
273
+ var totalMilestoneStats * models.MilestonesStats
274
+ if len (repoIDs ) == 0 {
275
+ totalMilestoneStats = milestoneStats
276
+ } else {
277
+ totalMilestoneStats , err = models .GetMilestonesStats (userRepoCond )
278
+ if err != nil {
279
+ ctx .ServerError ("GetMilestoneStats" , err )
280
+ return
281
+ }
303
282
}
304
283
305
284
var pagerCount int
@@ -318,7 +297,7 @@ func Milestones(ctx *context.Context) {
318
297
ctx .Data ["Counts" ] = counts
319
298
ctx .Data ["MilestoneStats" ] = milestoneStats
320
299
ctx .Data ["SortType" ] = sortType
321
- if len ( repoIDs ) != len ( userRepoIDs ) {
300
+ if milestoneStats . Total ( ) != totalMilestoneStats . Total ( ) {
322
301
ctx .Data ["RepoIDs" ] = repoIDs
323
302
}
324
303
ctx .Data ["IsShowClosed" ] = isShowClosed
0 commit comments