Browse Source

explore: able list and search for private but accessible repositories (#3088)

Unknwon 8 years ago
parent
commit
cac7af2c78
7 changed files with 83 additions and 86 deletions
  1. 1 1
      gogs.go
  2. 6 4
      models/pull.go
  3. 5 9
      models/repo.go
  4. 7 0
      modules/context/context.go
  5. 44 9
      routers/admin/repos.go
  6. 19 62
      routers/home.go
  7. 1 1
      templates/.VERSION

+ 1 - 1
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

+ 6 - 4
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]
 	}

+ 5 - 9
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

+ 7 - 0
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"]

+ 44 - 9
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) {

+ 19 - 62
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 {

+ 1 - 1
templates/.VERSION

@@ -1 +1 @@
-0.10.21.0316
+0.10.22.0317