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