diff --git a/gogs.go b/gogs.go index 839be5e02..43f54ed0e 100644 --- a/gogs.go +++ b/gogs.go @@ -16,7 +16,7 @@ import ( "github.com/gogits/gogs/modules/setting" ) -const APP_VER = "0.10.21.0316" +const APP_VER = "0.10.22.0317" func init() { setting.AppVer = APP_VER diff --git a/models/pull.go b/models/pull.go index 454a2a185..9db6791b6 100644 --- a/models/pull.go +++ b/models/pull.go @@ -620,16 +620,18 @@ func (prs PullRequestList) loadAttributes(e Engine) (err error) { } // Load issues - issueIDs := make([]int64, 0, len(prs)) + set := make(map[int64]*Issue) for i := range prs { - issueIDs = append(issueIDs, prs[i].IssueID) + set[prs[i].IssueID] = nil + } + issueIDs := make([]int64, 0, len(prs)) + for issueID := range set { + issueIDs = append(issueIDs, issueID) } issues := make([]*Issue, 0, len(issueIDs)) if err = e.Where("id > 0").In("id", issueIDs).Find(&issues); err != nil { return fmt.Errorf("find issues: %v", err) } - - set := make(map[int64]*Issue) for i := range issues { set[issues[i].ID] = issues[i] } diff --git a/models/repo.go b/models/repo.go index b48cb1aa9..751850d85 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1581,11 +1581,6 @@ type SearchRepoOptions struct { // SearchRepositoryByName takes keyword and part of repository name to search, // it returns results in given range and number of total results. func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, _ int64, _ error) { - if len(opts.Keyword) == 0 { - return repos, 0, nil - } - opts.Keyword = strings.ToLower(opts.Keyword) - if opts.Page <= 0 { opts.Page = 1 } @@ -1596,15 +1591,16 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, _ int // this does not include other people's private repositories even if opts.UserID is an admin. if !opts.Private && opts.UserID > 0 { sess.Join("LEFT", "access", "access.repo_id = repo.id"). - Where("repo.lower_name LIKE ? AND (repo.owner_id = ? OR access.user_id = ? OR repo.is_private = ?)", - "%"+opts.Keyword+"%", opts.UserID, opts.UserID, false) + Where("(repo.owner_id = ? OR access.user_id = ? OR repo.is_private = ?)", opts.UserID, opts.UserID, false) } else { - sess.Where("repo.lower_name LIKE ?", "%"+opts.Keyword+"%") // Only return public repositories if opts.Private is not set if !opts.Private { sess.And("repo.is_private = ?", false) } } + if len(opts.Keyword) > 0 { + sess.And("repo.lower_name LIKE ?", "%"+strings.ToLower(opts.Keyword)+"%") + } if opts.OwnerID > 0 { sess.And("repo.owner_id = ?", opts.OwnerID) } @@ -1949,7 +1945,7 @@ func (repos RepositoryList) loadAttributes(e Engine) error { return nil } - // Load owners. + // Load owners set := make(map[int64]*User) for i := range repos { set[repos[i].OwnerID] = nil diff --git a/modules/context/context.go b/modules/context/context.go index 313785323..f543e766d 100644 --- a/modules/context/context.go +++ b/modules/context/context.go @@ -42,6 +42,13 @@ type Context struct { Org *Organization } +func (ctx *Context) UserID() int64 { + if !ctx.IsSigned { + return 0 + } + return ctx.User.ID +} + // HasError returns true if error occurs in form validation. func (ctx *Context) HasApiError() bool { hasErr, ok := ctx.Data["HasError"] diff --git a/routers/admin/repos.go b/routers/admin/repos.go index 11448a3e1..4f688a928 100644 --- a/routers/admin/repos.go +++ b/routers/admin/repos.go @@ -5,13 +5,13 @@ package admin import ( + "github.com/Unknwon/paginater" log "gopkg.in/clog.v1" "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/context" "github.com/gogits/gogs/modules/setting" - "github.com/gogits/gogs/routers" ) const ( @@ -23,14 +23,49 @@ func Repos(ctx *context.Context) { ctx.Data["PageIsAdmin"] = true ctx.Data["PageIsAdminRepositories"] = true - routers.RenderRepoSearch(ctx, &routers.RepoSearchOptions{ - Counter: models.CountRepositories, - Ranger: models.Repositories, - Private: true, - PageSize: setting.UI.Admin.RepoPagingNum, - OrderBy: "id ASC", - TplName: REPOS, - }) + page := ctx.QueryInt("page") + if page <= 0 { + page = 1 + } + + var ( + repos []*models.Repository + count int64 + err error + ) + + keyword := ctx.Query("q") + if len(keyword) == 0 { + repos, err = models.Repositories(page, setting.UI.Admin.RepoPagingNum) + if err != nil { + ctx.Handle(500, "Repositories", err) + return + } + count = models.CountRepositories(true) + } else { + repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{ + Keyword: keyword, + OrderBy: "id ASC", + Private: true, + Page: page, + PageSize: setting.UI.Admin.RepoPagingNum, + }) + if err != nil { + ctx.Handle(500, "SearchRepositoryByName", err) + return + } + } + ctx.Data["Keyword"] = keyword + ctx.Data["Total"] = count + ctx.Data["Page"] = paginater.New(int(count), setting.UI.Admin.RepoPagingNum, page, 5) + + if err = models.RepositoryList(repos).LoadAttributes(); err != nil { + ctx.Handle(500, "LoadAttributes", err) + return + } + ctx.Data["Repos"] = repos + + ctx.HTML(200, REPOS) } func DeleteRepo(ctx *context.Context) { diff --git a/routers/home.go b/routers/home.go index 3c1aa6d59..b928bc608 100644 --- a/routers/home.go +++ b/routers/home.go @@ -5,8 +5,6 @@ package routers import ( - "fmt" - "github.com/Unknwon/paginater" "github.com/gogits/gogs/models" @@ -45,80 +43,39 @@ func Home(ctx *context.Context) { ctx.HTML(200, HOME) } -type RepoSearchOptions struct { - Counter func(bool) int64 - Ranger func(int, int) ([]*models.Repository, error) - Private bool - PageSize int - OrderBy string - TplName base.TplName -} +func ExploreRepos(ctx *context.Context) { + ctx.Data["Title"] = ctx.Tr("explore") + ctx.Data["PageIsExplore"] = true + ctx.Data["PageIsExploreRepositories"] = true -func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { page := ctx.QueryInt("page") if page <= 0 { page = 1 } - var ( - repos []*models.Repository - count int64 - err error - ) - keyword := ctx.Query("q") - if len(keyword) == 0 { - repos, err = opts.Ranger(page, opts.PageSize) - if err != nil { - ctx.Handle(500, "opts.Ranger", err) - return - } - count = opts.Counter(opts.Private) - } else { - var ctxUserID int64 - if ctx.IsSigned { - ctxUserID = ctx.User.ID - } - repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{ - Keyword: keyword, - UserID: ctxUserID, - OrderBy: opts.OrderBy, - Private: opts.Private, - Page: page, - PageSize: opts.PageSize, - }) - if err != nil { - ctx.Handle(500, "SearchRepositoryByName", err) - return - } + repos, count, err := models.SearchRepositoryByName(&models.SearchRepoOptions{ + Keyword: keyword, + UserID: ctx.UserID(), + OrderBy: "updated_unix DESC", + Page: page, + PageSize: setting.UI.ExplorePagingNum, + }) + if err != nil { + ctx.Handle(500, "SearchRepositoryByName", err) + return } ctx.Data["Keyword"] = keyword ctx.Data["Total"] = count - ctx.Data["Page"] = paginater.New(int(count), opts.PageSize, page, 5) + ctx.Data["Page"] = paginater.New(int(count), setting.UI.ExplorePagingNum, page, 5) - for _, repo := range repos { - if err = repo.GetOwner(); err != nil { - ctx.Handle(500, "GetOwner", fmt.Errorf("%d: %v", repo.ID, err)) - return - } + if err = models.RepositoryList(repos).LoadAttributes(); err != nil { + ctx.Handle(500, "LoadAttributes", err) + return } ctx.Data["Repos"] = repos - ctx.HTML(200, opts.TplName) -} - -func ExploreRepos(ctx *context.Context) { - ctx.Data["Title"] = ctx.Tr("explore") - ctx.Data["PageIsExplore"] = true - ctx.Data["PageIsExploreRepositories"] = true - - RenderRepoSearch(ctx, &RepoSearchOptions{ - Counter: models.CountRepositories, - Ranger: models.GetRecentUpdatedRepositories, - PageSize: setting.UI.ExplorePagingNum, - OrderBy: "updated_unix DESC", - TplName: EXPLORE_REPOS, - }) + ctx.HTML(200, EXPLORE_REPOS) } type UserSearchOptions struct { diff --git a/templates/.VERSION b/templates/.VERSION index cf7c3d705..984e5b152 100644 --- a/templates/.VERSION +++ b/templates/.VERSION @@ -1 +1 @@ -0.10.21.0316 \ No newline at end of file +0.10.22.0317 \ No newline at end of file