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 }