aboutsummaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
authorDavid Svantesson <davidsvantesson@gmail.com>2019-08-25 19:06:36 +0200
committerLauris BH <lauris@nix.lv>2019-08-25 20:06:36 +0300
commitc9546d4cdd5f7de8f56b7d4a9806d1aca784cf3f (patch)
treeeebd4affa86ae9d75b41590453a07af42db31fb0 /models
parent8c24bb9e4344791ca2e8c66efcf3d45881365a5d (diff)
downloadgitea-c9546d4cdd5f7de8f56b7d4a9806d1aca784cf3f.tar.gz
gitea-c9546d4cdd5f7de8f56b7d4a9806d1aca784cf3f.zip
Include description in repository search. (#7942)
* Add description in repository search. Signed-off-by: David Svantesson <davidsvantesson@gmail.com> * Refactor SearchRepositoryByName with a general function SearchRepository Signed-off-by: David Svantesson <davidsvantesson@gmail.com> * Allow to specify if description shall be included in API repo search. Signed-off-by: David Svantesson <davidsvantesson@gmail.com> * Add new app.ini setting for whether to search within repo description. Signed-off-by: David Svantesson <davidsvantesson@gmail.com> * Search keyword in description (if setting enabled) on: - Explore page - Organization profile page - User profile page - Admin repo page Do not search keyword in description on: - Any non-keyword search (not relevant) - Incremental search (uses API) Signed-off-by: David Svantesson <davidsvantesson@gmail.com> * Put parameters related to keyword directly after it Signed-off-by: David Svantesson <davidsvantesson@gmail.com> * Add test cases for including (and not including) repository description in search. Signed-off-by: David Svantesson <davidsvantesson@gmail.com> * Rename test function from TestSearchRepositoryByName to TestSearchRepository. Signed-off-by: David Svantesson <davidsvantesson@gmail.com> * Make setting SEARCH_REPO_DESCRIPTION default to true Signed-off-by: David Svantesson <davidsvantesson@gmail.com>
Diffstat (limited to 'models')
-rw-r--r--models/fixtures/repository.yml1
-rw-r--r--models/repo_list.go16
-rw-r--r--models/repo_list_test.go30
3 files changed, 44 insertions, 3 deletions
diff --git a/models/fixtures/repository.yml b/models/fixtures/repository.yml
index f43fae3d67..16b0045b21 100644
--- a/models/fixtures/repository.yml
+++ b/models/fixtures/repository.yml
@@ -165,6 +165,7 @@
owner_id: 14
lower_name: test_repo_14
name: test_repo_14
+ description: test_description_14
is_private: false
num_issues: 0
num_closed_issues: 0
diff --git a/models/repo_list.go b/models/repo_list.go
index ee4266d4e6..692d4d002f 100644
--- a/models/repo_list.go
+++ b/models/repo_list.go
@@ -136,6 +136,8 @@ type SearchRepoOptions struct {
Mirror util.OptionalBool
// only search topic name
TopicOnly bool
+ // include description in keyword search
+ IncludeDescription bool
}
//SearchOrderBy is used to sort the result
@@ -163,9 +165,9 @@ const (
SearchOrderByForksReverse SearchOrderBy = "num_forks DESC"
)
-// SearchRepositoryByName takes keyword and part of repository name to search,
+// SearchRepository returns repositories based on search options,
// it returns results in given range and number of total results.
-func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, error) {
+func SearchRepository(opts *SearchRepoOptions) (RepositoryList, int64, error) {
if opts.Page <= 0 {
opts.Page = 1
}
@@ -264,6 +266,9 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err
var likes = builder.NewCond()
for _, v := range strings.Split(opts.Keyword, ",") {
likes = likes.Or(builder.Like{"lower_name", strings.ToLower(v)})
+ if opts.IncludeDescription {
+ likes = likes.Or(builder.Like{"LOWER(description)", strings.ToLower(v)})
+ }
}
keywordCond = keywordCond.Or(likes)
}
@@ -311,6 +316,13 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err
return repos, count, nil
}
+// 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) (RepositoryList, int64, error) {
+ opts.IncludeDescription = false
+ return SearchRepository(opts)
+}
+
// FindUserAccessibleRepoIDs find all accessible repositories' ID by user's id
func FindUserAccessibleRepoIDs(userID int64) ([]int64, error) {
var accessCond builder.Cond = builder.Eq{"is_private": false}
diff --git a/models/repo_list_test.go b/models/repo_list_test.go
index 645de2a59a..76ae9ab3d7 100644
--- a/models/repo_list_test.go
+++ b/models/repo_list_test.go
@@ -12,7 +12,7 @@ import (
"github.com/stretchr/testify/assert"
)
-func TestSearchRepositoryByName(t *testing.T) {
+func TestSearchRepository(t *testing.T) {
assert.NoError(t, PrepareTestDatabase())
// test search public repository on explore page
@@ -74,6 +74,34 @@ func TestSearchRepositoryByName(t *testing.T) {
assert.Empty(t, repos)
assert.Equal(t, int64(0), count)
+ // Test search within description
+ repos, count, err = SearchRepository(&SearchRepoOptions{
+ Keyword: "description_14",
+ Page: 1,
+ PageSize: 10,
+ Collaborate: util.OptionalBoolFalse,
+ IncludeDescription: true,
+ })
+
+ assert.NoError(t, err)
+ if assert.Len(t, repos, 1) {
+ assert.Equal(t, "test_repo_14", repos[0].Name)
+ }
+ assert.Equal(t, int64(1), count)
+
+ // Test NOT search within description
+ repos, count, err = SearchRepository(&SearchRepoOptions{
+ Keyword: "description_14",
+ Page: 1,
+ PageSize: 10,
+ Collaborate: util.OptionalBoolFalse,
+ IncludeDescription: false,
+ })
+
+ assert.NoError(t, err)
+ assert.Empty(t, repos)
+ assert.Equal(t, int64(0), count)
+
testCases := []struct {
name string
opts *SearchRepoOptions