2017-01-24 21:43:02 -05: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"
2017-09-16 13:16:21 -07:00
"code.gitea.io/gitea/modules/indexer"
2017-01-24 21:43:02 -05:00
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
)
2017-09-16 13:16:21 -07:00
// issueIndexerUpdateQueue queue of issue ids to be updated
var issueIndexerUpdateQueue chan int64
2017-01-24 21:43:02 -05:00
// InitIssueIndexer initialize issue indexer
func InitIssueIndexer ( ) {
2017-09-16 13:16:21 -07:00
indexer . InitIssueIndexer ( populateIssueIndexer )
issueIndexerUpdateQueue = make ( chan int64 , setting . Indexer . UpdateQueueLength )
2017-01-24 21:43:02 -05:00
go processIssueIndexerUpdateQueue ( )
}
// populateIssueIndexer populate the issue indexer with issue data
func populateIssueIndexer ( ) error {
2017-09-24 17:08:48 -07:00
batch := indexer . IssueIndexerBatch ( )
2017-01-24 21:43:02 -05: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 ,
PageSize : 10 ,
OrderBy : SearchOrderByID ,
Private : true ,
Collaborate : util . OptionalBoolFalse ,
2017-01-24 21:43:02 -05:00
} )
if err != nil {
return fmt . Errorf ( "Repositories: %v" , err )
}
if len ( repos ) == 0 {
2017-09-24 17:08:48 -07:00
return batch . Flush ( )
2017-01-24 21:43:02 -05:00
}
for _ , repo := range repos {
issues , err := Issues ( & IssuesOptions {
RepoID : repo . ID ,
IsClosed : util . OptionalBoolNone ,
IsPull : util . OptionalBoolNone ,
} )
2017-09-24 17:08:48 -07:00
if err != nil {
return err
2017-01-24 21:43:02 -05:00
}
2017-11-20 21:28:22 -08:00
if err = IssueList ( issues ) . LoadComments ( ) ; err != nil {
return err
}
2017-09-24 17:08:48 -07:00
for _ , issue := range issues {
if err := batch . Add ( issue . update ( ) ) ; err != nil {
return err
}
2017-01-24 21:43:02 -05:00
}
}
}
}
func processIssueIndexerUpdateQueue ( ) {
2017-09-24 17:08:48 -07:00
batch := indexer . IssueIndexerBatch ( )
2017-01-24 21:43:02 -05:00
for {
2017-09-24 17:08:48 -07:00
var issueID int64
2017-01-24 21:43:02 -05:00
select {
2017-09-24 17:08:48 -07:00
case issueID = <- issueIndexerUpdateQueue :
default :
// flush whatever updates we currently have, since we
// might have to wait a while
if err := batch . Flush ( ) ; err != nil {
log . Error ( 4 , "IssueIndexer: %v" , err )
2017-01-24 21:43:02 -05:00
}
2017-09-24 17:08:48 -07:00
issueID = <- issueIndexerUpdateQueue
}
issue , err := GetIssueByID ( issueID )
if err != nil {
log . Error ( 4 , "GetIssueByID: %v" , err )
} else if err = batch . Add ( issue . update ( ) ) ; err != nil {
log . Error ( 4 , "IssueIndexer: %v" , err )
2017-01-24 21:43:02 -05:00
}
}
}
2017-09-16 13:16:21 -07:00
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 ,
} ,
2017-01-24 21:43:02 -05:00
}
}
// UpdateIssueIndexer add/update an issue to the issue indexer
2017-09-16 13:16:21 -07:00
func UpdateIssueIndexer ( issueID int64 ) {
select {
case issueIndexerUpdateQueue <- issueID :
default :
go func ( ) {
issueIndexerUpdateQueue <- issueID
} ( )
}
2017-01-24 21:43:02 -05:00
}