diff --git a/models/repo_list.go b/models/repo_list.go index 290919bb6..36f57abcc 100644 --- a/models/repo_list.go +++ b/models/repo_list.go @@ -136,6 +136,8 @@ type SearchRepoOptions struct { Archived util.OptionalBool // only search topic name TopicOnly bool + // only search repositories with specified primary language + Language string // include description in keyword search IncludeDescription bool // None -> include has milestones AND has no milestone @@ -439,6 +441,13 @@ func SearchRepositoryCondition(opts *SearchRepoOptions) builder.Cond { cond = cond.And(keywordCond) } + if opts.Language != "" { + cond = cond.And(builder.In("id", builder. + Select("repo_id"). + From("language_stat"). + Where(builder.Eq{"language": opts.Language}).And(builder.Eq{"is_primary": true}))) + } + if opts.Fork != util.OptionalBoolNone { cond = cond.And(builder.Eq{"is_fork": opts.Fork == util.OptionalBoolTrue}) } diff --git a/routers/web/explore/repo.go b/routers/web/explore/repo.go index 0a78e9e29..ce3aefe26 100644 --- a/routers/web/explore/repo.go +++ b/routers/web/explore/repo.go @@ -78,6 +78,9 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { topicOnly := ctx.FormBool("topic") ctx.Data["TopicOnly"] = topicOnly + language := ctx.FormTrim("language") + ctx.Data["Language"] = language + repos, count, err = models.SearchRepository(&models.SearchRepoOptions{ ListOptions: db.ListOptions{ Page: page, @@ -91,6 +94,7 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { AllPublic: true, AllLimited: true, TopicOnly: topicOnly, + Language: language, IncludeDescription: setting.UI.SearchRepoDescription, }) if err != nil { @@ -105,6 +109,7 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { pager := context.NewPagination(int(count), opts.PageSize, page, 5) pager.SetDefaultParams(ctx) pager.AddParam(ctx, "topic", "TopicOnly") + pager.AddParam(ctx, "language", "Language") ctx.Data["Page"] = pager ctx.HTML(http.StatusOK, opts.TplName) diff --git a/routers/web/org/home.go b/routers/web/org/home.go index cf23a1e29..d07e2993b 100644 --- a/routers/web/org/home.go +++ b/routers/web/org/home.go @@ -83,6 +83,9 @@ func Home(ctx *context.Context) { keyword := ctx.FormTrim("q") ctx.Data["Keyword"] = keyword + language := ctx.FormTrim("language") + ctx.Data["Language"] = language + page := ctx.FormInt("page") if page <= 0 { page = 1 @@ -103,6 +106,7 @@ func Home(ctx *context.Context) { OrderBy: orderBy, Private: ctx.IsSigned, Actor: ctx.User, + Language: language, IncludeDescription: setting.UI.SearchRepoDescription, }) if err != nil { @@ -148,6 +152,7 @@ func Home(ctx *context.Context) { pager := context.NewPagination(int(count), setting.UI.User.RepoPagingNum, page, 5) pager.SetDefaultParams(ctx) + pager.AddParam(ctx, "language", "Language") ctx.Data["Page"] = pager ctx.HTML(http.StatusOK, tplOrgHome) diff --git a/routers/web/user/profile.go b/routers/web/user/profile.go index 86ecb7c02..9c0ce10da 100644 --- a/routers/web/user/profile.go +++ b/routers/web/user/profile.go @@ -232,6 +232,10 @@ func Profile(ctx *context.Context) { keyword := ctx.FormTrim("q") ctx.Data["Keyword"] = keyword + + language := ctx.FormTrim("language") + ctx.Data["Language"] = language + switch tab { case "followers": items, err := user_model.GetUserFollowers(ctxUser, db.ListOptions{ @@ -283,6 +287,7 @@ func Profile(ctx *context.Context) { StarredByID: ctxUser.ID, Collaborate: util.OptionalBoolFalse, TopicOnly: topicOnly, + Language: language, IncludeDescription: setting.UI.SearchRepoDescription, }) if err != nil { @@ -314,6 +319,7 @@ func Profile(ctx *context.Context) { WatchedByID: ctxUser.ID, Collaborate: util.OptionalBoolFalse, TopicOnly: topicOnly, + Language: language, IncludeDescription: setting.UI.SearchRepoDescription, }) if err != nil { @@ -335,6 +341,7 @@ func Profile(ctx *context.Context) { Private: ctx.IsSigned, Collaborate: util.OptionalBoolFalse, TopicOnly: topicOnly, + Language: language, IncludeDescription: setting.UI.SearchRepoDescription, }) if err != nil { @@ -349,6 +356,9 @@ func Profile(ctx *context.Context) { pager := context.NewPagination(total, setting.UI.User.RepoPagingNum, page, 5) pager.SetDefaultParams(ctx) + if tab != "followers" && tab != "following" && tab != "activity" && tab != "projects" { + pager.AddParam(ctx, "language", "Language") + } ctx.Data["Page"] = pager ctx.Data["ShowUserEmail"] = len(ctxUser.Email) > 0 && ctx.IsSigned && (!ctxUser.KeepEmailPrivate || ctxUser.ID == ctx.User.ID) diff --git a/templates/explore/repo_list.tmpl b/templates/explore/repo_list.tmpl index 196c94721..03f1928e2 100644 --- a/templates/explore/repo_list.tmpl +++ b/templates/explore/repo_list.tmpl @@ -40,7 +40,9 @@
{{if .PrimaryLanguage }} - {{ .PrimaryLanguage.Language }} + + {{ .PrimaryLanguage.Language }} + {{end}} {{if not $.DisableStars}} {{svg "octicon-star" 16 "mr-3"}}{{.NumStars}} diff --git a/templates/explore/repo_search.tmpl b/templates/explore/repo_search.tmpl index c1745525a..bc4572dfc 100644 --- a/templates/explore/repo_search.tmpl +++ b/templates/explore/repo_search.tmpl @@ -6,24 +6,25 @@ {{svg "octicon-triangle-down" 14 "dropdown icon"}}
+