mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	Change all license headers to comply with REUSE specification. Fix #16132 Co-authored-by: flynnnnnnnnnn <flynnnnnnnnnn@github> Co-authored-by: John Olheiser <john.olheiser@gmail.com>
		
			
				
	
	
		
			168 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2021 The Gitea Authors. All rights reserved.
 | |
| // SPDX-License-Identifier: MIT
 | |
| 
 | |
| package explore
 | |
| 
 | |
| import (
 | |
| 	"net/http"
 | |
| 
 | |
| 	"code.gitea.io/gitea/models/db"
 | |
| 	repo_model "code.gitea.io/gitea/models/repo"
 | |
| 	"code.gitea.io/gitea/modules/base"
 | |
| 	"code.gitea.io/gitea/modules/context"
 | |
| 	"code.gitea.io/gitea/modules/log"
 | |
| 	"code.gitea.io/gitea/modules/setting"
 | |
| 	"code.gitea.io/gitea/modules/sitemap"
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	// tplExploreRepos explore repositories page template
 | |
| 	tplExploreRepos base.TplName = "explore/repos"
 | |
| )
 | |
| 
 | |
| // RepoSearchOptions when calling search repositories
 | |
| type RepoSearchOptions struct {
 | |
| 	OwnerID    int64
 | |
| 	Private    bool
 | |
| 	Restricted bool
 | |
| 	PageSize   int
 | |
| 	TplName    base.TplName
 | |
| }
 | |
| 
 | |
| // RenderRepoSearch render repositories search page
 | |
| func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
 | |
| 	// Sitemap index for sitemap paths
 | |
| 	page := int(ctx.ParamsInt64("idx"))
 | |
| 	isSitemap := ctx.Params("idx") != ""
 | |
| 	if page <= 1 {
 | |
| 		page = ctx.FormInt("page")
 | |
| 	}
 | |
| 
 | |
| 	if page <= 0 {
 | |
| 		page = 1
 | |
| 	}
 | |
| 
 | |
| 	if isSitemap {
 | |
| 		opts.PageSize = setting.UI.SitemapPagingNum
 | |
| 	}
 | |
| 
 | |
| 	var (
 | |
| 		repos            []*repo_model.Repository
 | |
| 		count            int64
 | |
| 		err              error
 | |
| 		orderBy          db.SearchOrderBy
 | |
| 		onlyShowRelevant bool
 | |
| 	)
 | |
| 
 | |
| 	ctx.Data["SortType"] = ctx.FormString("sort")
 | |
| 	switch ctx.FormString("sort") {
 | |
| 	case "newest":
 | |
| 		orderBy = db.SearchOrderByNewest
 | |
| 	case "oldest":
 | |
| 		orderBy = db.SearchOrderByOldest
 | |
| 	case "leastupdate":
 | |
| 		orderBy = db.SearchOrderByLeastUpdated
 | |
| 	case "reversealphabetically":
 | |
| 		orderBy = db.SearchOrderByAlphabeticallyReverse
 | |
| 	case "alphabetically":
 | |
| 		orderBy = db.SearchOrderByAlphabetically
 | |
| 	case "reversesize":
 | |
| 		orderBy = db.SearchOrderBySizeReverse
 | |
| 	case "size":
 | |
| 		orderBy = db.SearchOrderBySize
 | |
| 	case "moststars":
 | |
| 		orderBy = db.SearchOrderByStarsReverse
 | |
| 	case "feweststars":
 | |
| 		orderBy = db.SearchOrderByStars
 | |
| 	case "mostforks":
 | |
| 		orderBy = db.SearchOrderByForksReverse
 | |
| 	case "fewestforks":
 | |
| 		orderBy = db.SearchOrderByForks
 | |
| 	default:
 | |
| 		ctx.Data["SortType"] = "recentupdate"
 | |
| 		orderBy = db.SearchOrderByRecentUpdated
 | |
| 		onlyShowRelevant = setting.UI.OnlyShowRelevantRepos && !ctx.FormBool("no_filter")
 | |
| 	}
 | |
| 
 | |
| 	keyword := ctx.FormTrim("q")
 | |
| 	if keyword != "" {
 | |
| 		onlyShowRelevant = false
 | |
| 	}
 | |
| 
 | |
| 	ctx.Data["OnlyShowRelevant"] = onlyShowRelevant
 | |
| 
 | |
| 	topicOnly := ctx.FormBool("topic")
 | |
| 	ctx.Data["TopicOnly"] = topicOnly
 | |
| 
 | |
| 	language := ctx.FormTrim("language")
 | |
| 	ctx.Data["Language"] = language
 | |
| 
 | |
| 	repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{
 | |
| 		ListOptions: db.ListOptions{
 | |
| 			Page:     page,
 | |
| 			PageSize: opts.PageSize,
 | |
| 		},
 | |
| 		Actor:              ctx.Doer,
 | |
| 		OrderBy:            orderBy,
 | |
| 		Private:            opts.Private,
 | |
| 		Keyword:            keyword,
 | |
| 		OwnerID:            opts.OwnerID,
 | |
| 		AllPublic:          true,
 | |
| 		AllLimited:         true,
 | |
| 		TopicOnly:          topicOnly,
 | |
| 		Language:           language,
 | |
| 		IncludeDescription: setting.UI.SearchRepoDescription,
 | |
| 		OnlyShowRelevant:   onlyShowRelevant,
 | |
| 	})
 | |
| 	if err != nil {
 | |
| 		ctx.ServerError("SearchRepository", err)
 | |
| 		return
 | |
| 	}
 | |
| 	if isSitemap {
 | |
| 		m := sitemap.NewSitemap()
 | |
| 		for _, item := range repos {
 | |
| 			m.Add(sitemap.URL{URL: item.HTMLURL(), LastMod: item.UpdatedUnix.AsTimePtr()})
 | |
| 		}
 | |
| 		ctx.Resp.Header().Set("Content-Type", "text/xml")
 | |
| 		if _, err := m.WriteTo(ctx.Resp); err != nil {
 | |
| 			log.Error("Failed writing sitemap: %v", err)
 | |
| 		}
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	ctx.Data["Keyword"] = keyword
 | |
| 	ctx.Data["Total"] = count
 | |
| 	ctx.Data["Repos"] = repos
 | |
| 	ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
 | |
| 
 | |
| 	pager := context.NewPagination(int(count), opts.PageSize, page, 5)
 | |
| 	pager.SetDefaultParams(ctx)
 | |
| 	pager.AddParam(ctx, "topic", "TopicOnly")
 | |
| 	pager.AddParam(ctx, "language", "Language")
 | |
| 	pager.AddParamString("no_filter", ctx.FormString("no_filter"))
 | |
| 	ctx.Data["Page"] = pager
 | |
| 
 | |
| 	ctx.HTML(http.StatusOK, opts.TplName)
 | |
| }
 | |
| 
 | |
| // Repos render explore repositories page
 | |
| func Repos(ctx *context.Context) {
 | |
| 	ctx.Data["UsersIsDisabled"] = setting.Service.Explore.DisableUsersPage
 | |
| 	ctx.Data["Title"] = ctx.Tr("explore")
 | |
| 	ctx.Data["PageIsExplore"] = true
 | |
| 	ctx.Data["PageIsExploreRepositories"] = true
 | |
| 	ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
 | |
| 
 | |
| 	var ownerID int64
 | |
| 	if ctx.Doer != nil && !ctx.Doer.IsAdmin {
 | |
| 		ownerID = ctx.Doer.ID
 | |
| 	}
 | |
| 
 | |
| 	RenderRepoSearch(ctx, &RepoSearchOptions{
 | |
| 		PageSize: setting.UI.ExplorePagingNum,
 | |
| 		OwnerID:  ownerID,
 | |
| 		Private:  ctx.Doer != nil,
 | |
| 		TplName:  tplExploreRepos,
 | |
| 	})
 | |
| }
 |