@@ -14,6 +14,7 @@ import (
14
14
"regexp"
15
15
"strconv"
16
16
"strings"
17
+ "sync"
17
18
18
19
"code.gitea.io/gitea/models/db"
19
20
"code.gitea.io/gitea/models/unit"
@@ -61,20 +62,30 @@ func (err ErrRepoIsArchived) Error() string {
61
62
return fmt .Sprintf ("%s is archived" , err .Repo .LogString ())
62
63
}
63
64
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
+ })
70
80
71
81
// IsUsableRepoName returns true when name is usable
72
82
func 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 ) {
74
85
// Note: usually this error is normally caught up earlier in the UI
75
86
return db.ErrNameCharsNotAllowed {Name : name }
76
87
}
77
- return db .IsUsableName (reservedRepoNames , reservedRepoPatterns , name )
88
+ return db .IsUsableName (vars . reservedRepoNames , vars . reservedRepoPatterns , name )
78
89
}
79
90
80
91
// TrustModelType defines the types of trust model for this repository
0 commit comments