code.gitea.io/gitea@v1.22.3/modules/setting/indexer.go (about)

     1  // Copyright 2019 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package setting
     5  
     6  import (
     7  	"net/url"
     8  	"path/filepath"
     9  	"strings"
    10  	"time"
    11  
    12  	"code.gitea.io/gitea/modules/log"
    13  )
    14  
    15  // Indexer settings
    16  var Indexer = struct {
    17  	IssueType        string
    18  	IssuePath        string
    19  	IssueConnStr     string
    20  	IssueConnAuth    string
    21  	IssueIndexerName string
    22  	StartupTimeout   time.Duration
    23  
    24  	RepoIndexerEnabled   bool
    25  	RepoIndexerRepoTypes []string
    26  	RepoType             string
    27  	RepoPath             string
    28  	RepoConnStr          string
    29  	RepoIndexerName      string
    30  	MaxIndexerFileSize   int64
    31  	IncludePatterns      []*GlobMatcher
    32  	ExcludePatterns      []*GlobMatcher
    33  	ExcludeVendored      bool
    34  }{
    35  	IssueType:        "bleve",
    36  	IssuePath:        "indexers/issues.bleve",
    37  	IssueConnStr:     "",
    38  	IssueConnAuth:    "",
    39  	IssueIndexerName: "gitea_issues",
    40  
    41  	RepoIndexerEnabled:   false,
    42  	RepoIndexerRepoTypes: []string{"sources", "forks", "mirrors", "templates"},
    43  	RepoType:             "bleve",
    44  	RepoPath:             "indexers/repos.bleve",
    45  	RepoConnStr:          "",
    46  	RepoIndexerName:      "gitea_codes",
    47  	MaxIndexerFileSize:   1024 * 1024,
    48  	ExcludeVendored:      true,
    49  }
    50  
    51  func loadIndexerFrom(rootCfg ConfigProvider) {
    52  	sec := rootCfg.Section("indexer")
    53  	Indexer.IssueType = sec.Key("ISSUE_INDEXER_TYPE").MustString("bleve")
    54  	if Indexer.IssueType == "bleve" {
    55  		Indexer.IssuePath = filepath.ToSlash(sec.Key("ISSUE_INDEXER_PATH").MustString(filepath.ToSlash(filepath.Join(AppDataPath, "indexers/issues.bleve"))))
    56  		if !filepath.IsAbs(Indexer.IssuePath) {
    57  			Indexer.IssuePath = filepath.ToSlash(filepath.Join(AppWorkPath, Indexer.IssuePath))
    58  		}
    59  		checkOverlappedPath("[indexer].ISSUE_INDEXER_PATH", Indexer.IssuePath)
    60  	} else {
    61  		Indexer.IssueConnStr = sec.Key("ISSUE_INDEXER_CONN_STR").MustString(Indexer.IssueConnStr)
    62  		if Indexer.IssueType == "meilisearch" {
    63  			u, err := url.Parse(Indexer.IssueConnStr)
    64  			if err != nil {
    65  				log.Warn("Failed to parse ISSUE_INDEXER_CONN_STR: %v", err)
    66  				u = &url.URL{}
    67  			}
    68  			Indexer.IssueConnAuth, _ = u.User.Password()
    69  			u.User = nil
    70  			Indexer.IssueConnStr = u.String()
    71  		}
    72  	}
    73  
    74  	Indexer.IssueIndexerName = sec.Key("ISSUE_INDEXER_NAME").MustString(Indexer.IssueIndexerName)
    75  
    76  	Indexer.RepoIndexerEnabled = sec.Key("REPO_INDEXER_ENABLED").MustBool(false)
    77  	Indexer.RepoIndexerRepoTypes = strings.Split(sec.Key("REPO_INDEXER_REPO_TYPES").MustString("sources,forks,mirrors,templates"), ",")
    78  	Indexer.RepoType = sec.Key("REPO_INDEXER_TYPE").MustString("bleve")
    79  	Indexer.RepoPath = filepath.ToSlash(sec.Key("REPO_INDEXER_PATH").MustString(filepath.ToSlash(filepath.Join(AppDataPath, "indexers/repos.bleve"))))
    80  	if !filepath.IsAbs(Indexer.RepoPath) {
    81  		Indexer.RepoPath = filepath.ToSlash(filepath.Join(AppWorkPath, Indexer.RepoPath))
    82  	}
    83  	Indexer.RepoConnStr = sec.Key("REPO_INDEXER_CONN_STR").MustString("")
    84  	Indexer.RepoIndexerName = sec.Key("REPO_INDEXER_NAME").MustString("gitea_codes")
    85  
    86  	Indexer.IncludePatterns = IndexerGlobFromString(sec.Key("REPO_INDEXER_INCLUDE").MustString(""))
    87  	Indexer.ExcludePatterns = IndexerGlobFromString(sec.Key("REPO_INDEXER_EXCLUDE").MustString(""))
    88  	Indexer.ExcludeVendored = sec.Key("REPO_INDEXER_EXCLUDE_VENDORED").MustBool(true)
    89  	Indexer.MaxIndexerFileSize = sec.Key("MAX_FILE_SIZE").MustInt64(1024 * 1024)
    90  	Indexer.StartupTimeout = sec.Key("STARTUP_TIMEOUT").MustDuration(30 * time.Second)
    91  }
    92  
    93  // IndexerGlobFromString parses a comma separated list of patterns and returns a glob.Glob slice suited for repo indexing
    94  func IndexerGlobFromString(globstr string) []*GlobMatcher {
    95  	extarr := make([]*GlobMatcher, 0, 10)
    96  	for _, expr := range strings.Split(strings.ToLower(globstr), ",") {
    97  		expr = strings.TrimSpace(expr)
    98  		if expr != "" {
    99  			if g, err := GlobMatcherCompile(expr, '.', '/'); err != nil {
   100  				log.Info("Invalid glob expression '%s' (skipped): %v", expr, err)
   101  			} else {
   102  				extarr = append(extarr, g)
   103  			}
   104  		}
   105  	}
   106  	return extarr
   107  }