"code.gitea.io/gitea/modules/util"
"xorm.io/builder"
+ "xorm.io/xorm"
)
// RepositoryListDefaultPageSize is the default number of repositories
// SearchRepositoryByCondition search repositories by condition
func SearchRepositoryByCondition(opts *SearchRepoOptions, cond builder.Cond, loadAttributes bool) (RepositoryList, int64, error) {
+ sess, count, err := searchRepositoryByCondition(opts, cond)
+ if err != nil {
+ return nil, 0, err
+ }
+ defer sess.Close()
+
+ defaultSize := 50
+ if opts.PageSize > 0 {
+ defaultSize = opts.PageSize
+ }
+ repos := make(RepositoryList, 0, defaultSize)
+ if err := sess.Find(&repos); err != nil {
+ return nil, 0, fmt.Errorf("Repo: %v", err)
+ }
+
+ if opts.PageSize <= 0 {
+ count = int64(len(repos))
+ }
+
+ if loadAttributes {
+ if err := repos.loadAttributes(sess); err != nil {
+ return nil, 0, fmt.Errorf("LoadAttributes: %v", err)
+ }
+ }
+
+ return repos, count, nil
+}
+
+func searchRepositoryByCondition(opts *SearchRepoOptions, cond builder.Cond) (*xorm.Session, int64, error) {
if opts.Page <= 0 {
opts.Page = 1
}
}
sess := x.NewSession()
- defer sess.Close()
- count, err := sess.
- Where(cond).
- Count(new(Repository))
- if err != nil {
- return nil, 0, fmt.Errorf("Count: %v", err)
+ var count int64
+ if opts.PageSize > 0 {
+ var err error
+ count, err = sess.
+ Where(cond).
+ Count(new(Repository))
+ if err != nil {
+ _ = sess.Close()
+ return nil, 0, fmt.Errorf("Count: %v", err)
+ }
}
- repos := make(RepositoryList, 0, opts.PageSize)
sess.Where(cond).OrderBy(opts.OrderBy.String())
if opts.PageSize > 0 {
sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize)
}
- if err = sess.Find(&repos); err != nil {
- return nil, 0, fmt.Errorf("Repo: %v", err)
- }
-
- if loadAttributes {
- if err = repos.loadAttributes(sess); err != nil {
- return nil, 0, fmt.Errorf("LoadAttributes: %v", err)
- }
- }
-
- return repos, count, nil
+ return sess, count, nil
}
// accessibleRepositoryCondition takes a user a returns a condition for checking if a repository is accessible
return SearchRepository(opts)
}
+// SearchRepositoryIDs takes keyword and part of repository name to search,
+// it returns results in given range and number of total results.
+func SearchRepositoryIDs(opts *SearchRepoOptions) ([]int64, int64, error) {
+ opts.IncludeDescription = false
+
+ cond := SearchRepositoryCondition(opts)
+
+ sess, count, err := searchRepositoryByCondition(opts, cond)
+ if err != nil {
+ return nil, 0, err
+ }
+ defer sess.Close()
+
+ defaultSize := 50
+ if opts.PageSize > 0 {
+ defaultSize = opts.PageSize
+ }
+
+ ids := make([]int64, 0, defaultSize)
+ err = sess.Select("id").Table("repository").Find(&ids)
+ if opts.PageSize <= 0 {
+ count = int64(len(ids))
+ }
+
+ return ids, count, err
+}
+
// AccessibleRepoIDsQuery queries accessible repository ids. Usable as a subquery wherever repo ids need to be filtered.
func AccessibleRepoIDsQuery(user *User) *builder.Builder {
// NB: Please note this code needs to still work if user is nil
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/convert"
issue_indexer "code.gitea.io/gitea/modules/indexer/issues"
- "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/notification"
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
}
// find repos user can access (for issue search)
- repoIDs := make([]int64, 0)
opts := &models.SearchRepoOptions{
- ListOptions: models.ListOptions{
- PageSize: 15,
- },
Private: false,
AllPublic: true,
TopicOnly: false,
opts.AllLimited = true
}
- for page := 1; ; page++ {
- opts.Page = page
- repos, count, err := models.SearchRepositoryByName(opts)
- if err != nil {
- ctx.Error(http.StatusInternalServerError, "SearchRepositoryByName", err)
- return
- }
-
- if len(repos) == 0 {
- break
- }
- log.Trace("Processing next %d repos of %d", len(repos), count)
- for _, repo := range repos {
- repoIDs = append(repoIDs, repo.ID)
- }
+ repoIDs, _, err := models.SearchRepositoryIDs(opts)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, "SearchRepositoryByName", err)
+ return
}
var issues []*models.Issue