diff --git a/models/repo_list.go b/models/repo_list.go index 905408ae6..15e6144d0 100644 --- a/models/repo_list.go +++ b/models/repo_list.go @@ -120,10 +120,12 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, coun opts.Page = 1 } + var starJoin bool if opts.Starred && opts.OwnerID > 0 { cond = builder.Eq{ "star.uid": opts.OwnerID, } + starJoin = true } opts.Keyword = strings.ToLower(opts.Keyword) @@ -133,34 +135,34 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, coun // Append conditions if !opts.Starred && opts.OwnerID > 0 { - cond = cond.And(builder.Eq{"owner_id": opts.OwnerID}) + var searcherReposCond builder.Cond = builder.Eq{"owner_id": opts.OwnerID} + if opts.Searcher != nil { + 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) + } + + searcherReposCond = searcherReposCond.Or(builder.In("owner_id", ownerIds)) + if opts.Collaborate { + searcherReposCond = searcherReposCond.Or(builder.Expr("id IN (SELECT repo_id FROM `access` WHERE access.user_id = ? AND owner_id != ?)", + opts.Searcher.ID, opts.Searcher.ID)) + } + } + cond = cond.And(searcherReposCond) } + if !opts.Private { cond = cond.And(builder.Eq{"is_private": false}) } - if opts.Searcher != nil { - 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) - } - - searcherReposCond := builder.In("owner_id", ownerIds) - if opts.Collaborate { - searcherReposCond = searcherReposCond.Or(builder.Expr(`id IN (SELECT repo_id FROM "access" WHERE access.user_id = ? AND owner_id != ?)`, - opts.Searcher.ID, opts.Searcher.ID)) - } - cond = cond.And(searcherReposCond) - } - if len(opts.OrderBy) == 0 { opts.OrderBy = "name ASC" } @@ -168,7 +170,7 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, coun sess := x.NewSession() defer sess.Close() - if opts.Starred && opts.OwnerID > 0 { + if starJoin { count, err = sess. Join("INNER", "star", "star.repo_id = repository.id"). Where(cond). diff --git a/routers/home.go b/routers/home.go index 0f7b21462..16d072055 100644 --- a/routers/home.go +++ b/routers/home.go @@ -112,11 +112,12 @@ 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, + Page: page, + PageSize: opts.PageSize, + Searcher: ctx.User, + OrderBy: orderBy, + Private: opts.Private, + Collaborate: true, }) if err != nil { ctx.Handle(500, "opts.Ranger", err) @@ -125,12 +126,13 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { } 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, + 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) diff --git a/routers/user/profile.go b/routers/user/profile.go index f56ddc4ea..7380501f4 100644 --- a/routers/user/profile.go +++ b/routers/user/profile.go @@ -205,13 +205,14 @@ func Profile(ctx *context.Context) { ctx.Data["Total"] = total } else { repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{ - Keyword: keyword, - OwnerID: ctxUser.ID, - OrderBy: orderBy, - Private: showPrivate, - Page: page, - IsProfile: true, - PageSize: setting.UI.User.RepoPagingNum, + Keyword: keyword, + OwnerID: ctxUser.ID, + OrderBy: orderBy, + Private: showPrivate, + Page: page, + IsProfile: true, + PageSize: setting.UI.User.RepoPagingNum, + Collaborate: true, }) if err != nil { ctx.Handle(500, "SearchRepositoryByName", err)