2019-02-19 17:39:39 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2019-02-19 17:39:39 +03:00
package setting
import (
2023-03-29 05:23:23 +03:00
"net/url"
2019-02-19 17:39:39 +03:00
"path/filepath"
2019-09-11 20:26:28 +03:00
"strings"
2019-10-15 16:39:51 +03:00
"time"
2019-09-11 20:26:28 +03:00
"code.gitea.io/gitea/modules/log"
"github.com/gobwas/glob"
2019-02-19 17:39:39 +03:00
)
2022-01-20 20:46:10 +03:00
// Indexer settings
var Indexer = struct {
IssueType string
IssuePath string
IssueConnStr string
2023-03-29 05:23:23 +03:00
IssueConnAuth string
2022-01-20 20:46:10 +03:00
IssueIndexerName string
StartupTimeout time . Duration
2023-05-25 11:13:47 +03:00
RepoIndexerEnabled bool
RepoIndexerRepoTypes [ ] string
RepoType string
RepoPath string
RepoConnStr string
RepoIndexerName string
MaxIndexerFileSize int64
2024-04-06 16:25:39 +03:00
IncludePatterns [ ] Glob
ExcludePatterns [ ] Glob
2023-05-25 11:13:47 +03:00
ExcludeVendored bool
2022-01-20 20:46:10 +03:00
} {
IssueType : "bleve" ,
IssuePath : "indexers/issues.bleve" ,
IssueConnStr : "" ,
2023-03-29 05:23:23 +03:00
IssueConnAuth : "" ,
2022-01-20 20:46:10 +03:00
IssueIndexerName : "gitea_issues" ,
2023-05-25 11:13:47 +03:00
RepoIndexerEnabled : false ,
RepoIndexerRepoTypes : [ ] string { "sources" , "forks" , "mirrors" , "templates" } ,
RepoType : "bleve" ,
RepoPath : "indexers/repos.bleve" ,
RepoConnStr : "" ,
RepoIndexerName : "gitea_codes" ,
MaxIndexerFileSize : 1024 * 1024 ,
ExcludeVendored : true ,
2022-01-20 20:46:10 +03:00
}
2019-02-19 17:39:39 +03:00
2024-04-06 16:25:39 +03:00
type Glob struct {
glob glob . Glob
pattern string
}
func ( g * Glob ) Match ( s string ) bool {
return g . glob . Match ( s )
}
func ( g * Glob ) Pattern ( ) string {
return g . pattern
}
2023-02-19 19:12:01 +03:00
func loadIndexerFrom ( rootCfg ConfigProvider ) {
sec := rootCfg . Section ( "indexer" )
2019-02-21 08:01:28 +03:00
Indexer . IssueType = sec . Key ( "ISSUE_INDEXER_TYPE" ) . MustString ( "bleve" )
2021-05-26 05:50:35 +03:00
Indexer . IssuePath = filepath . ToSlash ( sec . Key ( "ISSUE_INDEXER_PATH" ) . MustString ( filepath . ToSlash ( filepath . Join ( AppDataPath , "indexers/issues.bleve" ) ) ) )
2019-02-19 17:39:39 +03:00
if ! filepath . IsAbs ( Indexer . IssuePath ) {
2021-05-26 05:50:35 +03:00
Indexer . IssuePath = filepath . ToSlash ( filepath . Join ( AppWorkPath , Indexer . IssuePath ) )
2019-02-19 17:39:39 +03:00
}
2020-02-13 09:06:17 +03:00
Indexer . IssueConnStr = sec . Key ( "ISSUE_INDEXER_CONN_STR" ) . MustString ( Indexer . IssueConnStr )
2023-03-29 05:23:23 +03:00
if Indexer . IssueType == "meilisearch" {
u , err := url . Parse ( Indexer . IssueConnStr )
if err != nil {
log . Warn ( "Failed to parse ISSUE_INDEXER_CONN_STR: %v" , err )
u = & url . URL { }
}
Indexer . IssueConnAuth , _ = u . User . Password ( )
u . User = nil
Indexer . IssueConnStr = u . String ( )
}
2020-02-13 09:06:17 +03:00
Indexer . IssueIndexerName = sec . Key ( "ISSUE_INDEXER_NAME" ) . MustString ( Indexer . IssueIndexerName )
2019-02-19 17:39:39 +03:00
Indexer . RepoIndexerEnabled = sec . Key ( "REPO_INDEXER_ENABLED" ) . MustBool ( false )
2023-05-25 11:13:47 +03:00
Indexer . RepoIndexerRepoTypes = strings . Split ( sec . Key ( "REPO_INDEXER_REPO_TYPES" ) . MustString ( "sources,forks,mirrors,templates" ) , "," )
2020-08-30 19:08:01 +03:00
Indexer . RepoType = sec . Key ( "REPO_INDEXER_TYPE" ) . MustString ( "bleve" )
2021-05-26 05:50:35 +03:00
Indexer . RepoPath = filepath . ToSlash ( sec . Key ( "REPO_INDEXER_PATH" ) . MustString ( filepath . ToSlash ( filepath . Join ( AppDataPath , "indexers/repos.bleve" ) ) ) )
2019-02-19 17:39:39 +03:00
if ! filepath . IsAbs ( Indexer . RepoPath ) {
2021-05-26 05:50:35 +03:00
Indexer . RepoPath = filepath . ToSlash ( filepath . Join ( AppWorkPath , Indexer . RepoPath ) )
2019-02-19 17:39:39 +03:00
}
2020-08-30 19:08:01 +03:00
Indexer . RepoConnStr = sec . Key ( "REPO_INDEXER_CONN_STR" ) . MustString ( "" )
Indexer . RepoIndexerName = sec . Key ( "REPO_INDEXER_NAME" ) . MustString ( "gitea_codes" )
2019-09-11 20:26:28 +03:00
Indexer . IncludePatterns = IndexerGlobFromString ( sec . Key ( "REPO_INDEXER_INCLUDE" ) . MustString ( "" ) )
Indexer . ExcludePatterns = IndexerGlobFromString ( sec . Key ( "REPO_INDEXER_EXCLUDE" ) . MustString ( "" ) )
2020-02-20 22:53:55 +03:00
Indexer . ExcludeVendored = sec . Key ( "REPO_INDEXER_EXCLUDE_VENDORED" ) . MustBool ( true )
2019-02-19 17:39:39 +03:00
Indexer . MaxIndexerFileSize = sec . Key ( "MAX_FILE_SIZE" ) . MustInt64 ( 1024 * 1024 )
2019-10-15 16:39:51 +03:00
Indexer . StartupTimeout = sec . Key ( "STARTUP_TIMEOUT" ) . MustDuration ( 30 * time . Second )
2019-02-19 17:39:39 +03:00
}
2019-09-11 20:26:28 +03:00
// IndexerGlobFromString parses a comma separated list of patterns and returns a glob.Glob slice suited for repo indexing
2024-04-06 16:25:39 +03:00
func IndexerGlobFromString ( globstr string ) [ ] Glob {
extarr := make ( [ ] Glob , 0 , 10 )
2019-09-11 20:26:28 +03:00
for _ , expr := range strings . Split ( strings . ToLower ( globstr ) , "," ) {
expr = strings . TrimSpace ( expr )
if expr != "" {
if g , err := glob . Compile ( expr , '.' , '/' ) ; err != nil {
2021-07-08 14:38:13 +03:00
log . Info ( "Invalid glob expression '%s' (skipped): %v" , expr , err )
2019-09-11 20:26:28 +03:00
} else {
2024-04-06 16:25:39 +03:00
extarr = append ( extarr , Glob { glob : g , pattern : expr } )
2019-09-11 20:26:28 +03:00
}
}
}
return extarr
}