|
|
@@ -12,6 +12,7 @@ import ( |
|
|
|
"code.gitea.io/gitea/modules/util" |
|
|
|
|
|
|
|
"xorm.io/builder" |
|
|
|
"xorm.io/xorm" |
|
|
|
) |
|
|
|
|
|
|
|
// RepositoryListDefaultPageSize is the default number of repositories |
|
|
@@ -363,6 +364,35 @@ func SearchRepository(opts *SearchRepoOptions) (RepositoryList, int64, error) { |
|
|
|
|
|
|
|
// 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 |
|
|
|
} |
|
|
@@ -376,31 +406,24 @@ func SearchRepositoryByCondition(opts *SearchRepoOptions, cond builder.Cond, loa |
|
|
|
} |
|
|
|
|
|
|
|
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 |
|
|
@@ -456,6 +479,33 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err |
|
|
|
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 |