From ba91214633280313a7b97205b9a7cb6e43001680 Mon Sep 17 00:00:00 2001 From: Richard Mahn Date: Fri, 8 Feb 2019 09:45:43 -0700 Subject: [PATCH] Feature - #3031 - search for org repos (#5986) --- models/org.go | 9 ++++ routers/user/home.go | 69 ++++++++++++++++++++++++++---- templates/explore/repo_search.tmpl | 1 + templates/org/home.tmpl | 1 + 4 files changed, 71 insertions(+), 9 deletions(-) diff --git a/models/org.go b/models/org.go index 3f17e3641..daff110cf 100644 --- a/models/org.go +++ b/models/org.go @@ -620,6 +620,7 @@ type AccessibleReposEnvironment interface { RepoIDs(page, pageSize int) ([]int64, error) Repos(page, pageSize int) ([]*Repository, error) MirrorRepos() ([]*Repository, error) + AddKeyword(keyword string) } type accessibleReposEnv struct { @@ -627,6 +628,7 @@ type accessibleReposEnv struct { userID int64 teamIDs []int64 e Engine + keyword string } // AccessibleReposEnv an AccessibleReposEnvironment for the repositories in `org` @@ -656,6 +658,9 @@ func (env *accessibleReposEnv) cond() builder.Cond { if len(env.teamIDs) > 0 { cond = cond.Or(builder.In("team_repo.team_id", env.teamIDs)) } + if env.keyword != "" { + cond = cond.And(builder.Like{"`repository`.lower_name", strings.ToLower(env.keyword)}) + } return cond } @@ -731,3 +736,7 @@ func (env *accessibleReposEnv) MirrorRepos() ([]*Repository, error) { In("`repository`.id", repoIDs). Find(&repos) } + +func (env *accessibleReposEnv) AddKeyword(keyword string) { + env.keyword = keyword +} diff --git a/routers/user/home.go b/routers/user/home.go index 99c747e12..67a882af9 100644 --- a/routers/user/home.go +++ b/routers/user/home.go @@ -1,4 +1,5 @@ // Copyright 2014 The Gogs Authors. All rights reserved. +// Copyright 2019 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -387,6 +388,37 @@ func showOrgProfile(ctx *context.Context) { org := ctx.Org.Organization ctx.Data["Title"] = org.DisplayName() + var orderBy models.SearchOrderBy + ctx.Data["SortType"] = ctx.Query("sort") + switch ctx.Query("sort") { + case "newest": + orderBy = models.SearchOrderByNewest + case "oldest": + orderBy = models.SearchOrderByOldest + case "recentupdate": + orderBy = models.SearchOrderByRecentUpdated + case "leastupdate": + orderBy = models.SearchOrderByLeastUpdated + case "reversealphabetically": + orderBy = models.SearchOrderByAlphabeticallyReverse + case "alphabetically": + orderBy = models.SearchOrderByAlphabetically + case "moststars": + orderBy = models.SearchOrderByStarsReverse + case "feweststars": + orderBy = models.SearchOrderByStars + case "mostforks": + orderBy = models.SearchOrderByForksReverse + case "fewestforks": + orderBy = models.SearchOrderByForks + default: + ctx.Data["SortType"] = "recentupdate" + orderBy = models.SearchOrderByRecentUpdated + } + + keyword := strings.Trim(ctx.Query("q"), " ") + ctx.Data["Keyword"] = keyword + page := ctx.QueryInt("page") if page <= 0 { page = 1 @@ -403,6 +435,9 @@ func showOrgProfile(ctx *context.Context) { ctx.ServerError("AccessibleReposEnv", err) return } + if len(keyword) != 0 { + env.AddKeyword(keyword) + } repos, err = env.Repos(page, setting.UI.User.RepoPagingNum) if err != nil { ctx.ServerError("env.Repos", err) @@ -413,25 +448,41 @@ func showOrgProfile(ctx *context.Context) { ctx.ServerError("env.CountRepos", err) return } - ctx.Data["Repos"] = repos } else { showPrivate := ctx.IsSigned && ctx.User.IsAdmin - repos, err = models.GetUserRepositories(org.ID, showPrivate, page, setting.UI.User.RepoPagingNum, "") - if err != nil { - ctx.ServerError("GetRepositories", err) - return + if len(keyword) == 0 { + repos, err = models.GetUserRepositories(org.ID, showPrivate, page, setting.UI.User.RepoPagingNum, orderBy.String()) + if err != nil { + ctx.ServerError("GetRepositories", err) + return + } + count = models.CountUserRepositories(org.ID, showPrivate) + } else { + repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{ + Keyword: keyword, + OwnerID: org.ID, + OrderBy: orderBy, + Private: showPrivate, + Page: page, + IsProfile: true, + PageSize: setting.UI.User.RepoPagingNum, + }) + if err != nil { + ctx.ServerError("SearchRepositoryByName", err) + return + } } - ctx.Data["Repos"] = repos - count = models.CountUserRepositories(org.ID, showPrivate) } - ctx.Data["Page"] = paginater.New(int(count), setting.UI.User.RepoPagingNum, page, 5) if err := org.GetMembers(); err != nil { ctx.ServerError("GetMembers", err) return } - ctx.Data["Members"] = org.Members + ctx.Data["Repos"] = repos + ctx.Data["Total"] = count + ctx.Data["Page"] = paginater.New(int(count), setting.UI.User.RepoPagingNum, page, 5) + ctx.Data["Members"] = org.Members ctx.Data["Teams"] = org.Teams ctx.HTML(200, tplOrgHome) diff --git a/templates/explore/repo_search.tmpl b/templates/explore/repo_search.tmpl index de0b63e07..62bb5ea3c 100644 --- a/templates/explore/repo_search.tmpl +++ b/templates/explore/repo_search.tmpl @@ -23,6 +23,7 @@
+
diff --git a/templates/org/home.tmpl b/templates/org/home.tmpl index 13b557bd7..03bb52527 100644 --- a/templates/org/home.tmpl +++ b/templates/org/home.tmpl @@ -28,6 +28,7 @@
{{end}} + {{template "explore/repo_search" .}} {{template "explore/repo_list" .}} {{template "base/paginate" .}}