@ -12,6 +12,7 @@ import (
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/modules/util"
"xorm.io/builder"
"xorm.io/builder"
"xorm.io/xorm"
)
)
// RepositoryListDefaultPageSize is the default number of repositories
// RepositoryListDefaultPageSize is the default number of repositories
@ -363,6 +364,35 @@ func SearchRepository(opts *SearchRepoOptions) (RepositoryList, int64, error) {
// SearchRepositoryByCondition search repositories by condition
// SearchRepositoryByCondition search repositories by condition
func SearchRepositoryByCondition ( opts * SearchRepoOptions , cond builder . Cond , loadAttributes bool ) ( RepositoryList , int64 , error ) {
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 {
if opts . Page <= 0 {
opts . Page = 1
opts . Page = 1
}
}
@ -376,31 +406,24 @@ func SearchRepositoryByCondition(opts *SearchRepoOptions, cond builder.Cond, loa
}
}
sess := x . NewSession ( )
sess := x . NewSession ( )
defer sess . Close ( )
count , err := sess .
var count int64
Where ( cond ) .
if opts . PageSize > 0 {
Count ( new ( Repository ) )
var err error
if err != nil {
count , err = sess .
return nil , 0 , fmt . Errorf ( "Count: %v" , err )
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 ( ) )
sess . Where ( cond ) . OrderBy ( opts . OrderBy . String ( ) )
if opts . PageSize > 0 {
if opts . PageSize > 0 {
sess . Limit ( opts . PageSize , ( opts . Page - 1 ) * opts . PageSize )
sess . Limit ( opts . PageSize , ( opts . Page - 1 ) * opts . PageSize )
}
}
if err = sess . Find ( & repos ) ; err != nil {
return sess , count , 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
}
}
// accessibleRepositoryCondition takes a user a returns a condition for checking if a repository is accessible
// 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 )
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.
// AccessibleRepoIDsQuery queries accessible repository ids. Usable as a subquery wherever repo ids need to be filtered.
func AccessibleRepoIDsQuery ( user * User ) * builder . Builder {
func AccessibleRepoIDsQuery ( user * User ) * builder . Builder {
// NB: Please note this code needs to still work if user is nil
// NB: Please note this code needs to still work if user is nil