@@ -24,7 +24,7 @@ import (
2424
2525 "github.com/keybase/go-crypto/openpgp"
2626 "github.com/keybase/go-crypto/openpgp/armor"
27- "github.com/unknwon/com "
27+ "xorm.io/builder "
2828)
2929
3030const (
@@ -171,135 +171,114 @@ func Milestones(ctx *context.Context) {
171171 return
172172 }
173173
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+ }
179183
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
182187
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
211196 }
212197
213- var repoIDs []int64
214198 if len (reposQuery ) != 0 {
215199 if issueReposQueryPattern .MatchString (reposQuery ) {
216200 // remove "[" and "]" from string
217201 reposQuery = reposQuery [1 : len (reposQuery )- 1 ]
218202 //for each ID (delimiter ",") add to int to repoIDs
219- reposSet := false
203+
220204 for _ , rID := range strings .Split (reposQuery , "," ) {
221205 // Ensure nonempty string entries
222206 if rID != "" && rID != "0" {
223- reposSet = true
224207 rIDint64 , err := strconv .ParseInt (rID , 10 , 64 )
225208 // 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 {
227210 repoIDs = append (repoIDs , rIDint64 )
228211 }
229212 }
230213 }
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 ))
234218 }
235219 } else {
236220 log .Warn ("issueReposQueryPattern not match with query" )
237221 }
238222 }
239223
240- if len (repoIDs ) == 0 {
241- repoIDs = userRepoIDs
242- }
243-
244- counts , err := models .CountMilestonesByRepoIDs (userRepoIDs , isShowClosed )
224+ counts , err := models .CountMilestones (userRepoCond , isShowClosed )
245225 if err != nil {
246226 ctx .ServerError ("CountMilestonesByRepoIDs" , err )
247227 return
248228 }
249229
250- milestones , err := models .GetMilestonesByRepoIDs ( repoIDs , page , isShowClosed , sortType )
230+ milestones , err := models .SearchMilestones ( repoCond , page , isShowClosed , sortType )
251231 if err != nil {
252232 ctx .ServerError ("GetMilestonesByRepoIDs" , err )
253233 return
254234 }
255235
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 )
278239 return
279240 }
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+ }
280255
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 ()
286259 if err != nil {
287260 ctx .ServerError ("LoadTotalTrackedTime" , err )
288261 return
289262 }
290263 }
264+ i ++
291265 }
292266
293- milestoneStats , err := models .GetMilestonesStats (repoIDs )
267+ milestoneStats , err := models .GetMilestonesStats (repoCond )
294268 if err != nil {
295269 ctx .ServerError ("GetMilestoneStats" , err )
296270 return
297271 }
298272
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+ }
303282 }
304283
305284 var pagerCount int
@@ -318,7 +297,7 @@ func Milestones(ctx *context.Context) {
318297 ctx .Data ["Counts" ] = counts
319298 ctx .Data ["MilestoneStats" ] = milestoneStats
320299 ctx .Data ["SortType" ] = sortType
321- if len ( repoIDs ) != len ( userRepoIDs ) {
300+ if milestoneStats . Total ( ) != totalMilestoneStats . Total ( ) {
322301 ctx .Data ["RepoIDs" ] = repoIDs
323302 }
324303 ctx .Data ["IsShowClosed" ] = isShowClosed
0 commit comments