2017-01-25 03:43:02 +01:00
|
|
|
// Copyright 2017 The Gitea Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a MIT-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package models
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
2019-02-19 15:39:39 +01:00
|
|
|
"code.gitea.io/gitea/modules/indexer/issues"
|
2017-01-25 03:43:02 +01:00
|
|
|
"code.gitea.io/gitea/modules/log"
|
|
|
|
"code.gitea.io/gitea/modules/setting"
|
|
|
|
"code.gitea.io/gitea/modules/util"
|
|
|
|
)
|
|
|
|
|
2019-02-19 15:39:39 +01:00
|
|
|
var (
|
|
|
|
// issueIndexerUpdateQueue queue of issue ids to be updated
|
|
|
|
issueIndexerUpdateQueue issues.Queue
|
|
|
|
issueIndexer issues.Indexer
|
|
|
|
)
|
2017-01-25 03:43:02 +01:00
|
|
|
|
|
|
|
// InitIssueIndexer initialize issue indexer
|
2019-02-19 15:39:39 +01:00
|
|
|
func InitIssueIndexer() error {
|
|
|
|
var populate bool
|
|
|
|
switch setting.Indexer.IssueType {
|
|
|
|
case "bleve":
|
|
|
|
issueIndexer = issues.NewBleveIndexer(setting.Indexer.IssuePath)
|
|
|
|
exist, err := issueIndexer.Init()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
populate = !exist
|
|
|
|
default:
|
|
|
|
return fmt.Errorf("unknow issue indexer type: %s", setting.Indexer.IssueType)
|
|
|
|
}
|
|
|
|
|
|
|
|
var err error
|
|
|
|
switch setting.Indexer.IssueIndexerQueueType {
|
|
|
|
case setting.LevelQueueType:
|
|
|
|
issueIndexerUpdateQueue, err = issues.NewLevelQueue(
|
|
|
|
issueIndexer,
|
|
|
|
setting.Indexer.IssueIndexerQueueDir,
|
|
|
|
setting.Indexer.IssueIndexerQueueBatchNumber)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
case setting.ChannelQueueType:
|
|
|
|
issueIndexerUpdateQueue = issues.NewChannelQueue(issueIndexer, setting.Indexer.IssueIndexerQueueBatchNumber)
|
|
|
|
default:
|
|
|
|
return fmt.Errorf("Unsupported indexer queue type: %v", setting.Indexer.IssueIndexerQueueType)
|
|
|
|
}
|
|
|
|
|
|
|
|
go issueIndexerUpdateQueue.Run()
|
|
|
|
|
|
|
|
if populate {
|
|
|
|
go populateIssueIndexer()
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
2017-01-25 03:43:02 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// populateIssueIndexer populate the issue indexer with issue data
|
2019-02-19 15:39:39 +01:00
|
|
|
func populateIssueIndexer() {
|
2017-01-25 03:43:02 +01:00
|
|
|
for page := 1; ; page++ {
|
2017-10-10 22:37:18 +02:00
|
|
|
repos, _, err := SearchRepositoryByName(&SearchRepoOptions{
|
2017-10-26 23:16:13 +02:00
|
|
|
Page: page,
|
2017-12-31 15:45:46 +01:00
|
|
|
PageSize: RepositoryListDefaultPageSize,
|
2017-10-26 23:16:13 +02:00
|
|
|
OrderBy: SearchOrderByID,
|
|
|
|
Private: true,
|
|
|
|
Collaborate: util.OptionalBoolFalse,
|
2017-01-25 03:43:02 +01:00
|
|
|
})
|
|
|
|
if err != nil {
|
2019-02-19 15:39:39 +01:00
|
|
|
log.Error(4, "SearchRepositoryByName: %v", err)
|
|
|
|
continue
|
2017-01-25 03:43:02 +01:00
|
|
|
}
|
|
|
|
if len(repos) == 0 {
|
2019-02-19 15:39:39 +01:00
|
|
|
return
|
2017-01-25 03:43:02 +01:00
|
|
|
}
|
2019-02-19 15:39:39 +01:00
|
|
|
|
2017-01-25 03:43:02 +01:00
|
|
|
for _, repo := range repos {
|
2019-02-19 15:39:39 +01:00
|
|
|
is, err := Issues(&IssuesOptions{
|
2017-12-26 00:25:16 +01:00
|
|
|
RepoIDs: []int64{repo.ID},
|
2017-01-25 03:43:02 +01:00
|
|
|
IsClosed: util.OptionalBoolNone,
|
|
|
|
IsPull: util.OptionalBoolNone,
|
|
|
|
})
|
2017-09-25 02:08:48 +02:00
|
|
|
if err != nil {
|
2019-02-19 15:39:39 +01:00
|
|
|
log.Error(4, "Issues: %v", err)
|
|
|
|
continue
|
2017-01-25 03:43:02 +01:00
|
|
|
}
|
2019-02-19 15:39:39 +01:00
|
|
|
if err = IssueList(is).LoadDiscussComments(); err != nil {
|
|
|
|
log.Error(4, "LoadComments: %v", err)
|
|
|
|
continue
|
2017-11-21 06:28:22 +01:00
|
|
|
}
|
2019-02-19 15:39:39 +01:00
|
|
|
for _, issue := range is {
|
|
|
|
UpdateIssueIndexer(issue)
|
2017-01-25 03:43:02 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-02-19 15:39:39 +01:00
|
|
|
// UpdateIssueIndexer add/update an issue to the issue indexer
|
|
|
|
func UpdateIssueIndexer(issue *Issue) {
|
|
|
|
var comments []string
|
2017-09-16 22:16:21 +02:00
|
|
|
for _, comment := range issue.Comments {
|
|
|
|
if comment.Type == CommentTypeComment {
|
|
|
|
comments = append(comments, comment.Content)
|
|
|
|
}
|
|
|
|
}
|
2019-02-19 15:39:39 +01:00
|
|
|
issueIndexerUpdateQueue.Push(&issues.IndexerData{
|
|
|
|
ID: issue.ID,
|
|
|
|
RepoID: issue.RepoID,
|
|
|
|
Title: issue.Title,
|
|
|
|
Content: issue.Content,
|
|
|
|
Comments: comments,
|
|
|
|
})
|
2017-01-25 03:43:02 +01:00
|
|
|
}
|
|
|
|
|
2019-02-19 15:39:39 +01:00
|
|
|
// DeleteRepoIssueIndexer deletes repo's all issues indexes
|
|
|
|
func DeleteRepoIssueIndexer(repo *Repository) {
|
|
|
|
var ids []int64
|
|
|
|
ids, err := getIssueIDsByRepoID(x, repo.ID)
|
|
|
|
if err != nil {
|
|
|
|
log.Error(4, "getIssueIDsByRepoID failed: %v", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(ids) <= 0 {
|
|
|
|
return
|
2017-12-17 12:53:02 +01:00
|
|
|
}
|
|
|
|
|
2019-02-19 15:39:39 +01:00
|
|
|
issueIndexerUpdateQueue.Push(&issues.IndexerData{
|
|
|
|
IDs: ids,
|
|
|
|
IsDelete: true,
|
|
|
|
})
|
2017-12-17 12:53:02 +01:00
|
|
|
}
|
|
|
|
|
2019-02-19 15:39:39 +01:00
|
|
|
// SearchIssuesByKeyword search issue ids by keywords and repo id
|
|
|
|
func SearchIssuesByKeyword(repoID int64, keyword string) ([]int64, error) {
|
|
|
|
var issueIDs []int64
|
|
|
|
res, err := issueIndexer.Search(keyword, repoID, 1000, 0)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
for _, r := range res.Hits {
|
|
|
|
issueIDs = append(issueIDs, r.ID)
|
2017-09-16 22:16:21 +02:00
|
|
|
}
|
2019-02-19 15:39:39 +01:00
|
|
|
return issueIDs, nil
|
2017-01-25 03:43:02 +01:00
|
|
|
}
|