diff --git a/models/issue_indexer.go b/models/issue_indexer.go index 49875fcf7..be74bb24f 100644 --- a/models/issue_indexer.go +++ b/models/issue_indexer.go @@ -116,7 +116,7 @@ func createIssueIndexer() error { // populateIssueIndexer populate the issue indexer with issue data func populateIssueIndexer() error { for page := 1; ; page++ { - repos, err := Repositories(&SearchRepoOptions{ + repos, _, err := Repositories(&SearchRepoOptions{ Page: page, PageSize: 10, }) diff --git a/models/repo.go b/models/repo.go index e50743109..021986f0a 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1231,7 +1231,7 @@ func CountUserRepositories(userID int64, private bool) int64 { } // Repositories returns all repositories -func Repositories(opts *SearchRepoOptions) (_ RepositoryList, err error) { +func Repositories(opts *SearchRepoOptions) (_ RepositoryList, count int64, err error) { if len(opts.OrderBy) == 0 { opts.OrderBy = "id ASC" } @@ -1242,14 +1242,16 @@ func Repositories(opts *SearchRepoOptions) (_ RepositoryList, err error) { Limit(opts.PageSize, (opts.Page-1)*opts.PageSize). OrderBy(opts.OrderBy). Find(&repos); err != nil { - return nil, fmt.Errorf("Repo: %v", err) + return nil, 0, fmt.Errorf("Repo: %v", err) } if err = repos.loadAttributes(x); err != nil { - return nil, fmt.Errorf("LoadAttributes: %v", err) + return nil, 0, fmt.Errorf("LoadAttributes: %v", err) } - return repos, nil + count = countRepositories(-1, opts.Private) + + return repos, count, nil } // RepoPath returns repository path by given user and repository name. @@ -1757,40 +1759,54 @@ func GetUserMirrorRepositories(userID int64) ([]*Repository, error) { } // GetRecentUpdatedRepositories returns the list of repositories that are recently updated. -func GetRecentUpdatedRepositories(opts *SearchRepoOptions) (repos RepositoryList, err error) { +func GetRecentUpdatedRepositories(opts *SearchRepoOptions) (repos RepositoryList, _ int64, _ error) { + var cond = builder.NewCond() + if len(opts.OrderBy) == 0 { opts.OrderBy = "updated_unix DESC" } - sess := x.Where("is_private=?", false). - Limit(opts.PageSize, (opts.Page-1)*opts.PageSize). - Limit(opts.PageSize) + if !opts.Private { + cond = builder.Eq{ + "is_private": false, + } + } - if opts.Searcher != nil { - sess.Or("owner_id = ?", opts.Searcher.ID) + if opts.Searcher != nil && !opts.Searcher.IsAdmin { + var ownerIds []int64 + ownerIds = append(ownerIds, opts.Searcher.ID) err := opts.Searcher.GetOrganizations(true) if err != nil { - return nil, fmt.Errorf("Organization: %v", err) + return nil, 0, fmt.Errorf("Organization: %v", err) } for _, org := range opts.Searcher.Orgs { - sess.Or("owner_id = ?", org.ID) + ownerIds = append(ownerIds, org.ID) } + + cond = cond.Or(builder.In("owner_id", ownerIds)) } - if err = sess. + count, err := x.Where(cond).Count(new(Repository)) + if err != nil { + return nil, 0, fmt.Errorf("Count: %v", err) + } + + if err = x.Where(cond). + Limit(opts.PageSize, (opts.Page-1)*opts.PageSize). + Limit(opts.PageSize). OrderBy(opts.OrderBy). Find(&repos); err != nil { - return nil, fmt.Errorf("Repo: %v", err) + return nil, 0, fmt.Errorf("Repo: %v", err) } if err = repos.loadAttributes(x); err != nil { - return nil, fmt.Errorf("LoadAttributes: %v", err) + return nil, 0, fmt.Errorf("LoadAttributes: %v", err) } - return repos, nil + return repos, count, nil } func getRepositoryCount(e Engine, u *User) (int64, error) { diff --git a/routers/admin/repos.go b/routers/admin/repos.go index f2f402db7..7f885b34c 100644 --- a/routers/admin/repos.go +++ b/routers/admin/repos.go @@ -24,7 +24,6 @@ func Repos(ctx *context.Context) { ctx.Data["PageIsAdminRepositories"] = true routers.RenderRepoSearch(ctx, &routers.RepoSearchOptions{ - Counter: models.CountRepositories, Ranger: models.Repositories, Private: true, PageSize: setting.UI.Admin.RepoPagingNum, diff --git a/routers/home.go b/routers/home.go index 3de32b52e..9fa565b21 100644 --- a/routers/home.go +++ b/routers/home.go @@ -53,8 +53,7 @@ func Home(ctx *context.Context) { // RepoSearchOptions when calling search repositories type RepoSearchOptions struct { - Counter func(bool) int64 - Ranger func(*models.SearchRepoOptions) (models.RepositoryList, error) + Ranger func(*models.SearchRepoOptions) (models.RepositoryList, int64, error) Searcher *models.User Private bool PageSize int @@ -101,17 +100,17 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { keyword := strings.Trim(ctx.Query("q"), " ") if len(keyword) == 0 { - repos, err = opts.Ranger(&models.SearchRepoOptions{ + repos, count, err = opts.Ranger(&models.SearchRepoOptions{ Page: page, PageSize: opts.PageSize, Searcher: ctx.User, OrderBy: orderBy, + Private: opts.Private, }) if err != nil { ctx.Handle(500, "opts.Ranger", err) return } - count = opts.Counter(opts.Private) } else { if isKeywordValid(keyword) { repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{ @@ -143,10 +142,10 @@ func ExploreRepos(ctx *context.Context) { ctx.Data["PageIsExploreRepositories"] = true RenderRepoSearch(ctx, &RepoSearchOptions{ - Counter: models.CountRepositories, Ranger: models.GetRecentUpdatedRepositories, PageSize: setting.UI.ExplorePagingNum, Searcher: ctx.User, + Private: ctx.User != nil && ctx.User.IsAdmin, TplName: tplExploreRepos, }) } @@ -175,7 +174,6 @@ func RenderUserSearch(ctx *context.Context, opts *UserSearchOptions) { ) ctx.Data["SortType"] = ctx.Query("sort") - //OrderBy: "id ASC", switch ctx.Query("sort") { case "oldest": orderBy = "id ASC" @@ -193,7 +191,8 @@ func RenderUserSearch(ctx *context.Context, opts *UserSearchOptions) { keyword := strings.Trim(ctx.Query("q"), " ") if len(keyword) == 0 { - users, err = opts.Ranger(&models.SearchUserOptions{OrderBy: orderBy, + users, err = opts.Ranger(&models.SearchUserOptions{ + OrderBy: orderBy, Page: page, PageSize: opts.PageSize, })