|
|
|
// 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"
|
|
|
|
|
|
|
|
"code.gitea.io/gitea/modules/indexer"
|
|
|
|
"code.gitea.io/gitea/modules/log"
|
|
|
|
"code.gitea.io/gitea/modules/setting"
|
|
|
|
"code.gitea.io/gitea/modules/util"
|
|
|
|
)
|
|
|
|
|
|
|
|
// issueIndexerUpdateQueue queue of issue ids to be updated
|
|
|
|
var issueIndexerUpdateQueue chan int64
|
|
|
|
|
|
|
|
// InitIssueIndexer initialize issue indexer
|
|
|
|
func InitIssueIndexer() {
|
|
|
|
indexer.InitIssueIndexer(populateIssueIndexer)
|
|
|
|
issueIndexerUpdateQueue = make(chan int64, setting.Indexer.UpdateQueueLength)
|
|
|
|
go processIssueIndexerUpdateQueue()
|
|
|
|
}
|
|
|
|
|
|
|
|
// populateIssueIndexer populate the issue indexer with issue data
|
|
|
|
func populateIssueIndexer() error {
|
|
|
|
for page := 1; ; page++ {
|
|
|
|
repos, _, err := Repositories(&SearchRepoOptions{
|
|
|
|
Page: page,
|
|
|
|
PageSize: 10,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("Repositories: %v", err)
|
|
|
|
}
|
|
|
|
if len(repos) == 0 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
for _, repo := range repos {
|
|
|
|
issues, err := Issues(&IssuesOptions{
|
|
|
|
RepoID: repo.ID,
|
|
|
|
IsClosed: util.OptionalBoolNone,
|
|
|
|
IsPull: util.OptionalBoolNone,
|
|
|
|
})
|
|
|
|
updates := make([]indexer.IssueIndexerUpdate, len(issues))
|
|
|
|
for i, issue := range issues {
|
|
|
|
updates[i] = issue.update()
|
|
|
|
}
|
|
|
|
if err = indexer.BatchUpdateIssues(updates...); err != nil {
|
|
|
|
return fmt.Errorf("BatchUpdate: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func processIssueIndexerUpdateQueue() {
|
|
|
|
for {
|
|
|
|
select {
|
|
|
|
case issueID := <-issueIndexerUpdateQueue:
|
|
|
|
issue, err := GetIssueByID(issueID)
|
|
|
|
if err != nil {
|
|
|
|
log.Error(4, "issuesIndexer.Index: %v", err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if err = indexer.UpdateIssue(issue.update()); err != nil {
|
|
|
|
log.Error(4, "issuesIndexer.Index: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (issue *Issue) update() indexer.IssueIndexerUpdate {
|
|
|
|
comments := make([]string, 0, 5)
|
|
|
|
for _, comment := range issue.Comments {
|
|
|
|
if comment.Type == CommentTypeComment {
|
|
|
|
comments = append(comments, comment.Content)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return indexer.IssueIndexerUpdate{
|
|
|
|
IssueID: issue.ID,
|
|
|
|
Data: &indexer.IssueIndexerData{
|
|
|
|
RepoID: issue.RepoID,
|
|
|
|
Title: issue.Title,
|
|
|
|
Content: issue.Content,
|
|
|
|
Comments: comments,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// UpdateIssueIndexer add/update an issue to the issue indexer
|
|
|
|
func UpdateIssueIndexer(issueID int64) {
|
|
|
|
select {
|
|
|
|
case issueIndexerUpdateQueue <- issueID:
|
|
|
|
default:
|
|
|
|
go func() {
|
|
|
|
issueIndexerUpdateQueue <- issueID
|
|
|
|
}()
|
|
|
|
}
|
|
|
|
}
|