mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	* Improve issue indexer * Fix new issue sqlite bug * Different test indexer paths for each db * Add integration indexer paths to make clean
		
			
				
	
	
		
			100 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // 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
 | |
| 		}()
 | |
| 	}
 | |
| }
 |