diff --git a/models/repo_list.go b/models/repo_list.go index 57b6ebbd6..928e1f953 100755 --- a/models/repo_list.go +++ b/models/repo_list.go @@ -166,6 +166,8 @@ type SearchRepoOptions struct { Archived util.OptionalBool // only search topic name TopicOnly bool + //search by Specific TopicName + TopicName string // include description in keyword search IncludeDescription bool // None -> include has milestones AND has no milestone @@ -327,6 +329,18 @@ func SearchRepositoryCondition(opts *SearchRepoOptions) builder.Cond { } cond = cond.And(keywordCond) } + if opts.TopicName != "" { + var subQueryCond = builder.NewCond() + subQueryCond = subQueryCond.Or(builder.Eq{"topic.name": opts.TopicName}) + subQuery := builder.Select("repo_topic.repo_id").From("repo_topic"). + Join("INNER", "topic", "topic.id = repo_topic.topic_id"). + Where(subQueryCond). + GroupBy("repo_topic.repo_id") + + var topicNameCond = builder.In("id", subQuery) + cond = cond.And(topicNameCond) + + } if opts.Fork != util.OptionalBoolNone { cond = cond.And(builder.Eq{"is_fork": opts.Fork == util.OptionalBoolTrue}) diff --git a/routers/home.go b/routers/home.go index a1c07e317..b36501d32 100755 --- a/routers/home.go +++ b/routers/home.go @@ -149,8 +149,7 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { //todo:support other topics keyword := strings.Trim(ctx.Query("q"), " ") - topicOnly := ctx.QueryBool("topic") - ctx.Data["TopicOnly"] = topicOnly + topic := strings.Trim(ctx.Query("topic"), " ") repos, count, err = models.SearchRepository(&models.SearchRepoOptions{ ListOptions: models.ListOptions{ @@ -164,7 +163,7 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { OwnerID: opts.OwnerID, AllPublic: true, AllLimited: true, - TopicOnly: topicOnly, + TopicName: topic, IncludeDescription: setting.UI.SearchRepoDescription, }) if err != nil {