diff --git a/models/issue_indexer.go b/models/issue_indexer.go index b58c9dc2d..18c6f281b 100644 --- a/models/issue_indexer.go +++ b/models/issue_indexer.go @@ -27,9 +27,11 @@ func InitIssueIndexer() { func populateIssueIndexer() error { batch := indexer.IssueIndexerBatch() for page := 1; ; page++ { - repos, _, err := Repositories(&SearchRepoOptions{ + repos, _, err := SearchRepositoryByName(&SearchRepoOptions{ Page: page, PageSize: 10, + OrderBy: SearchOrderByID, + Private: true, }) if err != nil { return fmt.Errorf("Repositories: %v", err) diff --git a/models/repo_list.go b/models/repo_list.go index ca7ae9793..4aeda9067 100644 --- a/models/repo_list.go +++ b/models/repo_list.go @@ -105,6 +105,7 @@ type SearchRepoOptions struct { Starred bool `json:"-"` Page int `json:"-"` IsProfile bool `json:"-"` + AllPublic bool `json:"-"` // Include also all public repositories // Limit of result // // maximum: setting.ExplorePagingNum @@ -129,6 +130,8 @@ const ( SearchOrderByNewest = "created_unix DESC" SearchOrderBySize = "size ASC" SearchOrderBySizeReverse = "size DESC" + SearchOrderByID = "id ASC" + SearchOrderByIDReverse = "id DESC" ) // SearchRepositoryByName takes keyword and part of repository name to search, @@ -147,11 +150,6 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, coun starJoin = true } - opts.Keyword = strings.ToLower(opts.Keyword) - if opts.Keyword != "" { - cond = cond.And(builder.Like{"lower_name", opts.Keyword}) - } - // Append conditions if !opts.Starred && opts.OwnerID > 0 { var searcherReposCond builder.Cond = builder.Eq{"owner_id": opts.OwnerID} @@ -182,6 +180,15 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, coun cond = cond.And(builder.Eq{"is_private": false}) } + if opts.OwnerID > 0 && opts.AllPublic { + cond = cond.Or(builder.Eq{"is_private": false}) + } + + opts.Keyword = strings.ToLower(opts.Keyword) + if opts.Keyword != "" { + cond = cond.And(builder.Like{"lower_name", opts.Keyword}) + } + if len(opts.OrderBy) == 0 { opts.OrderBy = SearchOrderByAlphabetically } @@ -225,78 +232,3 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, coun return } - -// Repositories returns all repositories -func Repositories(opts *SearchRepoOptions) (_ RepositoryList, count int64, err error) { - if len(opts.OrderBy) == 0 { - opts.OrderBy = "id ASC" - } - - repos := make(RepositoryList, 0, opts.PageSize) - - if err = x. - Limit(opts.PageSize, (opts.Page-1)*opts.PageSize). - OrderBy(opts.OrderBy.String()). - Find(&repos); err != nil { - return nil, 0, fmt.Errorf("Repo: %v", err) - } - - if err = repos.loadAttributes(x); err != nil { - return nil, 0, fmt.Errorf("LoadAttributes: %v", err) - } - - count = countRepositories(-1, opts.Private) - - return repos, count, nil -} - -// GetRecentUpdatedRepositories returns the list of repositories that are recently updated. -func GetRecentUpdatedRepositories(opts *SearchRepoOptions) (repos RepositoryList, _ int64, _ error) { - var cond = builder.NewCond() - - if len(opts.OrderBy) == 0 { - opts.OrderBy = SearchOrderByRecentUpdated - } - - if !opts.Private { - cond = builder.Eq{ - "is_private": false, - } - } - - 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, 0, fmt.Errorf("Organization: %v", err) - } - - for _, org := range opts.Searcher.Orgs { - ownerIds = append(ownerIds, org.ID) - } - - cond = cond.Or(builder.In("owner_id", ownerIds)) - } - - 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.String()). - Find(&repos); err != nil { - return nil, 0, fmt.Errorf("Repo: %v", err) - } - - if err = repos.loadAttributes(x); err != nil { - return nil, 0, fmt.Errorf("LoadAttributes: %v", err) - } - - return repos, count, nil -} diff --git a/models/repo_list_test.go b/models/repo_list_test.go index 6f829f279..160ba57d3 100644 --- a/models/repo_list_test.go +++ b/models/repo_list_test.go @@ -98,6 +98,24 @@ func TestSearchRepositoryByName(t *testing.T) { {name: "PublicAndPrivateRepositoriesOfOrganization", opts: &SearchRepoOptions{Page: 1, PageSize: 10, OwnerID: 17, Private: true}, count: 2}, + {name: "AllPublic/PublicRepositoriesByName", + opts: &SearchRepoOptions{Keyword: "big_test_", PageSize: 10, AllPublic: true}, + count: 4}, + {name: "AllPublic/PublicAndPrivateRepositoriesByName", + opts: &SearchRepoOptions{Keyword: "big_test_", Page: 1, PageSize: 10, Private: true, AllPublic: true}, + count: 8}, + {name: "AllPublic/PublicRepositoriesOfUserIncludingCollaborative", + opts: &SearchRepoOptions{Page: 1, PageSize: 10, OwnerID: 15, Collaborate: true, AllPublic: true}, + count: 12}, + {name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborative", + opts: &SearchRepoOptions{Page: 1, PageSize: 10, OwnerID: 15, Private: true, Collaborate: true, AllPublic: true}, + count: 16}, + {name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborativeByName", + opts: &SearchRepoOptions{Keyword: "test", Page: 1, PageSize: 10, OwnerID: 15, Private: true, Collaborate: true, AllPublic: true}, + count: 10}, + {name: "AllPublic/PublicRepositoriesOfOrganization", + opts: &SearchRepoOptions{Page: 1, PageSize: 10, OwnerID: 17, AllPublic: true}, + count: 12}, } for _, testCase := range testCases { @@ -126,7 +144,7 @@ func TestSearchRepositoryByName(t *testing.T) { } // FIXME: Can't check, need to fix current behaviour (see previous FIXME comments in test cases) - /*if testCase.opts.OwnerID > 0 && !testCase.opts.Collaborate { + /*if testCase.opts.OwnerID > 0 && !testCase.opts.Collaborate && !AllPublic { assert.Equal(t, testCase.opts.OwnerID, repo.Owner.ID) }*/ diff --git a/routers/admin/repos.go b/routers/admin/repos.go index 12df6fba1..8712797cf 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{ - Ranger: models.Repositories, Private: true, PageSize: setting.UI.Admin.RepoPagingNum, TplName: tplRepos, diff --git a/routers/home.go b/routers/home.go index 94c570b6c..afcb3d35e 100644 --- a/routers/home.go +++ b/routers/home.go @@ -60,8 +60,7 @@ func Swagger(ctx *context.Context) { // RepoSearchOptions when calling search repositories type RepoSearchOptions struct { - Ranger func(*models.SearchRepoOptions) (models.RepositoryList, int64, error) - Searcher *models.User + OwnerID int64 Private bool PageSize int TplName base.TplName @@ -113,35 +112,21 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { } keyword := strings.Trim(ctx.Query("q"), " ") - if len(keyword) == 0 { - repos, count, err = opts.Ranger(&models.SearchRepoOptions{ - Page: page, - PageSize: opts.PageSize, - Searcher: ctx.User, - OrderBy: orderBy, - Private: opts.Private, - Collaborate: true, - }) - if err != nil { - ctx.Handle(500, "opts.Ranger", err) - return - } - } else { - if isKeywordValid(keyword) { - repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{ - Keyword: keyword, - OrderBy: orderBy, - Private: opts.Private, - Page: page, - PageSize: opts.PageSize, - Searcher: ctx.User, - Collaborate: true, - }) - if err != nil { - ctx.Handle(500, "SearchRepositoryByName", err) - return - } - } + + repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{ + Page: page, + PageSize: opts.PageSize, + OrderBy: orderBy, + Private: opts.Private, + Keyword: keyword, + OwnerID: opts.OwnerID, + Searcher: ctx.User, + Collaborate: true, + AllPublic: true, + }) + if err != nil { + ctx.Handle(500, "SearchRepositoryByName", err) + return } ctx.Data["Keyword"] = keyword ctx.Data["Total"] = count @@ -157,11 +142,15 @@ func ExploreRepos(ctx *context.Context) { ctx.Data["PageIsExplore"] = true ctx.Data["PageIsExploreRepositories"] = true + var ownerID int64 + if ctx.User != nil && !ctx.User.IsAdmin { + ownerID = ctx.User.ID + } + RenderRepoSearch(ctx, &RepoSearchOptions{ - Ranger: models.GetRecentUpdatedRepositories, PageSize: setting.UI.ExplorePagingNum, - Searcher: ctx.User, - Private: ctx.User != nil && ctx.User.IsAdmin, + OwnerID: ownerID, + Private: ctx.User != nil, TplName: tplExploreRepos, }) }