@@ -14,6 +14,7 @@ import (
1414 "regexp"
1515 "strconv"
1616 "strings"
17+ "sync"
1718
1819 "code.gitea.io/gitea/models/db"
1920 "code.gitea.io/gitea/models/unit"
@@ -61,20 +62,30 @@ func (err ErrRepoIsArchived) Error() string {
6162 return fmt .Sprintf ("%s is archived" , err .Repo .LogString ())
6263}
6364
64- var (
65- validRepoNamePattern = regexp .MustCompile (`[-.\w]+` )
66- invalidRepoNamePattern = regexp .MustCompile (`[.]{2,}` )
67- reservedRepoNames = []string {"." , ".." , "-" }
68- reservedRepoPatterns = []string {"*.git" , "*.wiki" , "*.rss" , "*.atom" }
69- )
65+ type globalVarsStruct struct {
66+ validRepoNamePattern * regexp.Regexp
67+ invalidRepoNamePattern * regexp.Regexp
68+ reservedRepoNames []string
69+ reservedRepoPatterns []string
70+ }
71+
72+ var globalVars = sync .OnceValue (func () * globalVarsStruct {
73+ return & globalVarsStruct {
74+ validRepoNamePattern : regexp .MustCompile (`[-.\w]+` ),
75+ invalidRepoNamePattern : regexp .MustCompile (`[.]{2,}` ),
76+ reservedRepoNames : []string {"." , ".." , "-" },
77+ reservedRepoPatterns : []string {"*.git" , "*.wiki" , "*.rss" , "*.atom" },
78+ }
79+ })
7080
7181// IsUsableRepoName returns true when name is usable
7282func IsUsableRepoName (name string ) error {
73- if ! validRepoNamePattern .MatchString (name ) || invalidRepoNamePattern .MatchString (name ) {
83+ vars := globalVars ()
84+ if ! vars .validRepoNamePattern .MatchString (name ) || vars .invalidRepoNamePattern .MatchString (name ) {
7485 // Note: usually this error is normally caught up earlier in the UI
7586 return db.ErrNameCharsNotAllowed {Name : name }
7687 }
77- return db .IsUsableName (reservedRepoNames , reservedRepoPatterns , name )
88+ return db .IsUsableName (vars . reservedRepoNames , vars . reservedRepoPatterns , name )
7889}
7990
8091// TrustModelType defines the types of trust model for this repository
0 commit comments