|
|
|
@ -13,6 +13,7 @@ import (
|
|
|
|
|
"path/filepath"
|
|
|
|
|
"regexp"
|
|
|
|
|
"strings"
|
|
|
|
|
"sync"
|
|
|
|
|
|
|
|
|
|
"code.gitea.io/gitea/modules/base"
|
|
|
|
|
"code.gitea.io/gitea/modules/emoji"
|
|
|
|
@ -71,9 +72,6 @@ var (
|
|
|
|
|
// CSS class for action keywords (e.g. "closes: #1")
|
|
|
|
|
const keywordClass = "issue-keyword"
|
|
|
|
|
|
|
|
|
|
// regexp for full links to issues/pulls
|
|
|
|
|
var issueFullPattern *regexp.Regexp
|
|
|
|
|
|
|
|
|
|
// IsLink reports whether link fits valid format.
|
|
|
|
|
func IsLink(link []byte) bool {
|
|
|
|
|
return isLink(link)
|
|
|
|
@ -88,12 +86,17 @@ func isLinkStr(link string) bool {
|
|
|
|
|
return validLinksPattern.MatchString(link)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// FIXME: This function is not concurrent safe
|
|
|
|
|
// regexp for full links to issues/pulls
|
|
|
|
|
var issueFullPattern *regexp.Regexp
|
|
|
|
|
|
|
|
|
|
// Once for to prevent races
|
|
|
|
|
var issueFullPatternOnce sync.Once
|
|
|
|
|
|
|
|
|
|
func getIssueFullPattern() *regexp.Regexp {
|
|
|
|
|
if issueFullPattern == nil {
|
|
|
|
|
issueFullPatternOnce.Do(func() {
|
|
|
|
|
issueFullPattern = regexp.MustCompile(regexp.QuoteMeta(setting.AppURL) +
|
|
|
|
|
`\w+/\w+/(?:issues|pulls)/((?:\w{1,10}-)?[1-9][0-9]*)([\?|#]\S+.(\S+)?)?\b`)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
return issueFullPattern
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|