split setting.go to multiple files (#6154)
* split setting.go to multiple files * fix lint
This commit is contained in:
parent
faf446b372
commit
379289639e
5 changed files with 433 additions and 348 deletions
124
modules/setting/cron.go
Normal file
124
modules/setting/cron.go
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
// Copyright 2019 The Gitea Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package setting
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
|
||||||
|
// Cron tasks
|
||||||
|
Cron = struct {
|
||||||
|
UpdateMirror struct {
|
||||||
|
Enabled bool
|
||||||
|
RunAtStart bool
|
||||||
|
Schedule string
|
||||||
|
} `ini:"cron.update_mirrors"`
|
||||||
|
RepoHealthCheck struct {
|
||||||
|
Enabled bool
|
||||||
|
RunAtStart bool
|
||||||
|
Schedule string
|
||||||
|
Timeout time.Duration
|
||||||
|
Args []string `delim:" "`
|
||||||
|
} `ini:"cron.repo_health_check"`
|
||||||
|
CheckRepoStats struct {
|
||||||
|
Enabled bool
|
||||||
|
RunAtStart bool
|
||||||
|
Schedule string
|
||||||
|
} `ini:"cron.check_repo_stats"`
|
||||||
|
ArchiveCleanup struct {
|
||||||
|
Enabled bool
|
||||||
|
RunAtStart bool
|
||||||
|
Schedule string
|
||||||
|
OlderThan time.Duration
|
||||||
|
} `ini:"cron.archive_cleanup"`
|
||||||
|
SyncExternalUsers struct {
|
||||||
|
Enabled bool
|
||||||
|
RunAtStart bool
|
||||||
|
Schedule string
|
||||||
|
UpdateExisting bool
|
||||||
|
} `ini:"cron.sync_external_users"`
|
||||||
|
DeletedBranchesCleanup struct {
|
||||||
|
Enabled bool
|
||||||
|
RunAtStart bool
|
||||||
|
Schedule string
|
||||||
|
OlderThan time.Duration
|
||||||
|
} `ini:"cron.deleted_branches_cleanup"`
|
||||||
|
}{
|
||||||
|
UpdateMirror: struct {
|
||||||
|
Enabled bool
|
||||||
|
RunAtStart bool
|
||||||
|
Schedule string
|
||||||
|
}{
|
||||||
|
Enabled: true,
|
||||||
|
RunAtStart: false,
|
||||||
|
Schedule: "@every 10m",
|
||||||
|
},
|
||||||
|
RepoHealthCheck: struct {
|
||||||
|
Enabled bool
|
||||||
|
RunAtStart bool
|
||||||
|
Schedule string
|
||||||
|
Timeout time.Duration
|
||||||
|
Args []string `delim:" "`
|
||||||
|
}{
|
||||||
|
Enabled: true,
|
||||||
|
RunAtStart: false,
|
||||||
|
Schedule: "@every 24h",
|
||||||
|
Timeout: 60 * time.Second,
|
||||||
|
Args: []string{},
|
||||||
|
},
|
||||||
|
CheckRepoStats: struct {
|
||||||
|
Enabled bool
|
||||||
|
RunAtStart bool
|
||||||
|
Schedule string
|
||||||
|
}{
|
||||||
|
Enabled: true,
|
||||||
|
RunAtStart: true,
|
||||||
|
Schedule: "@every 24h",
|
||||||
|
},
|
||||||
|
ArchiveCleanup: struct {
|
||||||
|
Enabled bool
|
||||||
|
RunAtStart bool
|
||||||
|
Schedule string
|
||||||
|
OlderThan time.Duration
|
||||||
|
}{
|
||||||
|
Enabled: true,
|
||||||
|
RunAtStart: true,
|
||||||
|
Schedule: "@every 24h",
|
||||||
|
OlderThan: 24 * time.Hour,
|
||||||
|
},
|
||||||
|
SyncExternalUsers: struct {
|
||||||
|
Enabled bool
|
||||||
|
RunAtStart bool
|
||||||
|
Schedule string
|
||||||
|
UpdateExisting bool
|
||||||
|
}{
|
||||||
|
Enabled: true,
|
||||||
|
RunAtStart: false,
|
||||||
|
Schedule: "@every 24h",
|
||||||
|
UpdateExisting: true,
|
||||||
|
},
|
||||||
|
DeletedBranchesCleanup: struct {
|
||||||
|
Enabled bool
|
||||||
|
RunAtStart bool
|
||||||
|
Schedule string
|
||||||
|
OlderThan time.Duration
|
||||||
|
}{
|
||||||
|
Enabled: true,
|
||||||
|
RunAtStart: true,
|
||||||
|
Schedule: "@every 24h",
|
||||||
|
OlderThan: 24 * time.Hour,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func newCron() {
|
||||||
|
if err := Cfg.Section("cron").MapTo(&Cron); err != nil {
|
||||||
|
log.Fatal(4, "Failed to map Cron settings: %v", err)
|
||||||
|
}
|
||||||
|
}
|
71
modules/setting/git.go
Normal file
71
modules/setting/git.go
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
// Copyright 2019 The Gitea Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package setting
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"code.gitea.io/git"
|
||||||
|
"code.gitea.io/gitea/modules/log"
|
||||||
|
version "github.com/mcuadros/go-version"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// Git settings
|
||||||
|
Git = struct {
|
||||||
|
Version string `ini:"-"`
|
||||||
|
DisableDiffHighlight bool
|
||||||
|
MaxGitDiffLines int
|
||||||
|
MaxGitDiffLineCharacters int
|
||||||
|
MaxGitDiffFiles int
|
||||||
|
GCArgs []string `delim:" "`
|
||||||
|
Timeout struct {
|
||||||
|
Default int
|
||||||
|
Migrate int
|
||||||
|
Mirror int
|
||||||
|
Clone int
|
||||||
|
Pull int
|
||||||
|
GC int `ini:"GC"`
|
||||||
|
} `ini:"git.timeout"`
|
||||||
|
}{
|
||||||
|
DisableDiffHighlight: false,
|
||||||
|
MaxGitDiffLines: 1000,
|
||||||
|
MaxGitDiffLineCharacters: 5000,
|
||||||
|
MaxGitDiffFiles: 100,
|
||||||
|
GCArgs: []string{},
|
||||||
|
Timeout: struct {
|
||||||
|
Default int
|
||||||
|
Migrate int
|
||||||
|
Mirror int
|
||||||
|
Clone int
|
||||||
|
Pull int
|
||||||
|
GC int `ini:"GC"`
|
||||||
|
}{
|
||||||
|
Default: int(git.DefaultCommandExecutionTimeout / time.Second),
|
||||||
|
Migrate: 600,
|
||||||
|
Mirror: 300,
|
||||||
|
Clone: 300,
|
||||||
|
Pull: 300,
|
||||||
|
GC: 60,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func newGit() {
|
||||||
|
if err := Cfg.Section("git").MapTo(&Git); err != nil {
|
||||||
|
log.Fatal(4, "Failed to map Git settings: %v", err)
|
||||||
|
}
|
||||||
|
git.DefaultCommandExecutionTimeout = time.Duration(Git.Timeout.Default) * time.Second
|
||||||
|
|
||||||
|
binVersion, err := git.BinVersion()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(4, "Error retrieving git version: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if version.Compare(binVersion, "2.9", ">=") {
|
||||||
|
// Explicitly disable credential helper, otherwise Git credentials might leak
|
||||||
|
git.GlobalCommandArgs = append(git.GlobalCommandArgs, "-c", "credential.helper=")
|
||||||
|
}
|
||||||
|
}
|
66
modules/setting/markup.go
Normal file
66
modules/setting/markup.go
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
// Copyright 2019 The Gitea Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package setting
|
||||||
|
|
||||||
|
import (
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ExternalMarkupParsers represents the external markup parsers
|
||||||
|
var (
|
||||||
|
ExternalMarkupParsers []MarkupParser
|
||||||
|
)
|
||||||
|
|
||||||
|
// MarkupParser defines the external parser configured in ini
|
||||||
|
type MarkupParser struct {
|
||||||
|
Enabled bool
|
||||||
|
MarkupName string
|
||||||
|
Command string
|
||||||
|
FileExtensions []string
|
||||||
|
IsInputFile bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func newMarkup() {
|
||||||
|
extensionReg := regexp.MustCompile(`\.\w`)
|
||||||
|
for _, sec := range Cfg.Section("markup").ChildSections() {
|
||||||
|
name := strings.TrimPrefix(sec.Name(), "markup.")
|
||||||
|
if name == "" {
|
||||||
|
log.Warn("name is empty, markup " + sec.Name() + "ignored")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
extensions := sec.Key("FILE_EXTENSIONS").Strings(",")
|
||||||
|
var exts = make([]string, 0, len(extensions))
|
||||||
|
for _, extension := range extensions {
|
||||||
|
if !extensionReg.MatchString(extension) {
|
||||||
|
log.Warn(sec.Name() + " file extension " + extension + " is invalid. Extension ignored")
|
||||||
|
} else {
|
||||||
|
exts = append(exts, extension)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(exts) == 0 {
|
||||||
|
log.Warn(sec.Name() + " file extension is empty, markup " + name + " ignored")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
command := sec.Key("RENDER_COMMAND").MustString("")
|
||||||
|
if command == "" {
|
||||||
|
log.Warn(" RENDER_COMMAND is empty, markup " + name + " ignored")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
ExternalMarkupParsers = append(ExternalMarkupParsers, MarkupParser{
|
||||||
|
Enabled: sec.Key("ENABLED").MustBool(false),
|
||||||
|
MarkupName: name,
|
||||||
|
FileExtensions: exts,
|
||||||
|
Command: command,
|
||||||
|
IsInputFile: sec.Key("IS_INPUT_FILE").MustBool(false),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
168
modules/setting/repository.go
Normal file
168
modules/setting/repository.go
Normal file
|
@ -0,0 +1,168 @@
|
||||||
|
// Copyright 2019 The Gitea Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package setting
|
||||||
|
|
||||||
|
import (
|
||||||
|
"path"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/log"
|
||||||
|
"github.com/Unknwon/com"
|
||||||
|
)
|
||||||
|
|
||||||
|
// enumerates all the policy repository creating
|
||||||
|
const (
|
||||||
|
RepoCreatingLastUserVisibility = "last"
|
||||||
|
RepoCreatingPrivate = "private"
|
||||||
|
RepoCreatingPublic = "public"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Repository settings
|
||||||
|
var (
|
||||||
|
Repository = struct {
|
||||||
|
AnsiCharset string
|
||||||
|
ForcePrivate bool
|
||||||
|
DefaultPrivate string
|
||||||
|
MaxCreationLimit int
|
||||||
|
MirrorQueueLength int
|
||||||
|
PullRequestQueueLength int
|
||||||
|
PreferredLicenses []string
|
||||||
|
DisableHTTPGit bool
|
||||||
|
AccessControlAllowOrigin string
|
||||||
|
UseCompatSSHURI bool
|
||||||
|
DefaultCloseIssuesViaCommitsInAnyBranch bool
|
||||||
|
|
||||||
|
// Repository editor settings
|
||||||
|
Editor struct {
|
||||||
|
LineWrapExtensions []string
|
||||||
|
PreviewableFileModes []string
|
||||||
|
} `ini:"-"`
|
||||||
|
|
||||||
|
// Repository upload settings
|
||||||
|
Upload struct {
|
||||||
|
Enabled bool
|
||||||
|
TempPath string
|
||||||
|
AllowedTypes []string `delim:"|"`
|
||||||
|
FileMaxSize int64
|
||||||
|
MaxFiles int
|
||||||
|
} `ini:"-"`
|
||||||
|
|
||||||
|
// Repository local settings
|
||||||
|
Local struct {
|
||||||
|
LocalCopyPath string
|
||||||
|
LocalWikiPath string
|
||||||
|
} `ini:"-"`
|
||||||
|
|
||||||
|
// Pull request settings
|
||||||
|
PullRequest struct {
|
||||||
|
WorkInProgressPrefixes []string
|
||||||
|
} `ini:"repository.pull-request"`
|
||||||
|
|
||||||
|
// Issue Setting
|
||||||
|
Issue struct {
|
||||||
|
LockReasons []string
|
||||||
|
} `ini:"repository.issue"`
|
||||||
|
}{
|
||||||
|
AnsiCharset: "",
|
||||||
|
ForcePrivate: false,
|
||||||
|
DefaultPrivate: RepoCreatingLastUserVisibility,
|
||||||
|
MaxCreationLimit: -1,
|
||||||
|
MirrorQueueLength: 1000,
|
||||||
|
PullRequestQueueLength: 1000,
|
||||||
|
PreferredLicenses: []string{"Apache License 2.0,MIT License"},
|
||||||
|
DisableHTTPGit: false,
|
||||||
|
AccessControlAllowOrigin: "",
|
||||||
|
UseCompatSSHURI: false,
|
||||||
|
DefaultCloseIssuesViaCommitsInAnyBranch: false,
|
||||||
|
|
||||||
|
// Repository editor settings
|
||||||
|
Editor: struct {
|
||||||
|
LineWrapExtensions []string
|
||||||
|
PreviewableFileModes []string
|
||||||
|
}{
|
||||||
|
LineWrapExtensions: strings.Split(".txt,.md,.markdown,.mdown,.mkd,", ","),
|
||||||
|
PreviewableFileModes: []string{"markdown"},
|
||||||
|
},
|
||||||
|
|
||||||
|
// Repository upload settings
|
||||||
|
Upload: struct {
|
||||||
|
Enabled bool
|
||||||
|
TempPath string
|
||||||
|
AllowedTypes []string `delim:"|"`
|
||||||
|
FileMaxSize int64
|
||||||
|
MaxFiles int
|
||||||
|
}{
|
||||||
|
Enabled: true,
|
||||||
|
TempPath: "data/tmp/uploads",
|
||||||
|
AllowedTypes: []string{},
|
||||||
|
FileMaxSize: 3,
|
||||||
|
MaxFiles: 5,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Repository local settings
|
||||||
|
Local: struct {
|
||||||
|
LocalCopyPath string
|
||||||
|
LocalWikiPath string
|
||||||
|
}{
|
||||||
|
LocalCopyPath: "tmp/local-repo",
|
||||||
|
LocalWikiPath: "tmp/local-wiki",
|
||||||
|
},
|
||||||
|
|
||||||
|
// Pull request settings
|
||||||
|
PullRequest: struct {
|
||||||
|
WorkInProgressPrefixes []string
|
||||||
|
}{
|
||||||
|
WorkInProgressPrefixes: []string{"WIP:", "[WIP]"},
|
||||||
|
},
|
||||||
|
|
||||||
|
// Issue settings
|
||||||
|
Issue: struct {
|
||||||
|
LockReasons []string
|
||||||
|
}{
|
||||||
|
LockReasons: strings.Split("Too heated,Off-topic,Spam,Resolved", ","),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
RepoRootPath string
|
||||||
|
ScriptType = "bash"
|
||||||
|
)
|
||||||
|
|
||||||
|
func newRepository() {
|
||||||
|
homeDir, err := com.HomeDir()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(4, "Failed to get home directory: %v", err)
|
||||||
|
}
|
||||||
|
homeDir = strings.Replace(homeDir, "\\", "/", -1)
|
||||||
|
|
||||||
|
// Determine and create root git repository path.
|
||||||
|
sec := Cfg.Section("repository")
|
||||||
|
Repository.DisableHTTPGit = sec.Key("DISABLE_HTTP_GIT").MustBool()
|
||||||
|
Repository.UseCompatSSHURI = sec.Key("USE_COMPAT_SSH_URI").MustBool()
|
||||||
|
Repository.MaxCreationLimit = sec.Key("MAX_CREATION_LIMIT").MustInt(-1)
|
||||||
|
RepoRootPath = sec.Key("ROOT").MustString(path.Join(homeDir, "gitea-repositories"))
|
||||||
|
forcePathSeparator(RepoRootPath)
|
||||||
|
if !filepath.IsAbs(RepoRootPath) {
|
||||||
|
RepoRootPath = filepath.Join(AppWorkPath, RepoRootPath)
|
||||||
|
} else {
|
||||||
|
RepoRootPath = filepath.Clean(RepoRootPath)
|
||||||
|
}
|
||||||
|
ScriptType = sec.Key("SCRIPT_TYPE").MustString("bash")
|
||||||
|
|
||||||
|
if err = Cfg.Section("repository").MapTo(&Repository); err != nil {
|
||||||
|
log.Fatal(4, "Failed to map Repository settings: %v", err)
|
||||||
|
} else if err = Cfg.Section("repository.editor").MapTo(&Repository.Editor); err != nil {
|
||||||
|
log.Fatal(4, "Failed to map Repository.Editor settings: %v", err)
|
||||||
|
} else if err = Cfg.Section("repository.upload").MapTo(&Repository.Upload); err != nil {
|
||||||
|
log.Fatal(4, "Failed to map Repository.Upload settings: %v", err)
|
||||||
|
} else if err = Cfg.Section("repository.local").MapTo(&Repository.Local); err != nil {
|
||||||
|
log.Fatal(4, "Failed to map Repository.Local settings: %v", err)
|
||||||
|
} else if err = Cfg.Section("repository.pull-request").MapTo(&Repository.PullRequest); err != nil {
|
||||||
|
log.Fatal(4, "Failed to map Repository.PullRequest settings: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !filepath.IsAbs(Repository.Upload.TempPath) {
|
||||||
|
Repository.Upload.TempPath = path.Join(AppWorkPath, Repository.Upload.TempPath)
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,7 +15,6 @@ import (
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -63,22 +62,6 @@ const (
|
||||||
LandingPageOrganizations LandingPage = "/explore/organizations"
|
LandingPageOrganizations LandingPage = "/explore/organizations"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MarkupParser defines the external parser configured in ini
|
|
||||||
type MarkupParser struct {
|
|
||||||
Enabled bool
|
|
||||||
MarkupName string
|
|
||||||
Command string
|
|
||||||
FileExtensions []string
|
|
||||||
IsInputFile bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// enumerates all the policy repository creating
|
|
||||||
const (
|
|
||||||
RepoCreatingLastUserVisibility = "last"
|
|
||||||
RepoCreatingPrivate = "private"
|
|
||||||
RepoCreatingPublic = "public"
|
|
||||||
)
|
|
||||||
|
|
||||||
// enumerates all the types of captchas
|
// enumerates all the types of captchas
|
||||||
const (
|
const (
|
||||||
ImageCaptcha = "image"
|
ImageCaptcha = "image"
|
||||||
|
@ -181,113 +164,6 @@ var (
|
||||||
DBConnectRetries int
|
DBConnectRetries int
|
||||||
DBConnectBackoff time.Duration
|
DBConnectBackoff time.Duration
|
||||||
|
|
||||||
// Repository settings
|
|
||||||
Repository = struct {
|
|
||||||
AnsiCharset string
|
|
||||||
ForcePrivate bool
|
|
||||||
DefaultPrivate string
|
|
||||||
MaxCreationLimit int
|
|
||||||
MirrorQueueLength int
|
|
||||||
PullRequestQueueLength int
|
|
||||||
PreferredLicenses []string
|
|
||||||
DisableHTTPGit bool
|
|
||||||
AccessControlAllowOrigin string
|
|
||||||
UseCompatSSHURI bool
|
|
||||||
DefaultCloseIssuesViaCommitsInAnyBranch bool
|
|
||||||
|
|
||||||
// Repository editor settings
|
|
||||||
Editor struct {
|
|
||||||
LineWrapExtensions []string
|
|
||||||
PreviewableFileModes []string
|
|
||||||
} `ini:"-"`
|
|
||||||
|
|
||||||
// Repository upload settings
|
|
||||||
Upload struct {
|
|
||||||
Enabled bool
|
|
||||||
TempPath string
|
|
||||||
AllowedTypes []string `delim:"|"`
|
|
||||||
FileMaxSize int64
|
|
||||||
MaxFiles int
|
|
||||||
} `ini:"-"`
|
|
||||||
|
|
||||||
// Repository local settings
|
|
||||||
Local struct {
|
|
||||||
LocalCopyPath string
|
|
||||||
LocalWikiPath string
|
|
||||||
} `ini:"-"`
|
|
||||||
|
|
||||||
// Pull request settings
|
|
||||||
PullRequest struct {
|
|
||||||
WorkInProgressPrefixes []string
|
|
||||||
} `ini:"repository.pull-request"`
|
|
||||||
|
|
||||||
// Issue Setting
|
|
||||||
Issue struct {
|
|
||||||
LockReasons []string
|
|
||||||
} `ini:"repository.issue"`
|
|
||||||
}{
|
|
||||||
AnsiCharset: "",
|
|
||||||
ForcePrivate: false,
|
|
||||||
DefaultPrivate: RepoCreatingLastUserVisibility,
|
|
||||||
MaxCreationLimit: -1,
|
|
||||||
MirrorQueueLength: 1000,
|
|
||||||
PullRequestQueueLength: 1000,
|
|
||||||
PreferredLicenses: []string{"Apache License 2.0,MIT License"},
|
|
||||||
DisableHTTPGit: false,
|
|
||||||
AccessControlAllowOrigin: "",
|
|
||||||
UseCompatSSHURI: false,
|
|
||||||
DefaultCloseIssuesViaCommitsInAnyBranch: false,
|
|
||||||
|
|
||||||
// Repository editor settings
|
|
||||||
Editor: struct {
|
|
||||||
LineWrapExtensions []string
|
|
||||||
PreviewableFileModes []string
|
|
||||||
}{
|
|
||||||
LineWrapExtensions: strings.Split(".txt,.md,.markdown,.mdown,.mkd,", ","),
|
|
||||||
PreviewableFileModes: []string{"markdown"},
|
|
||||||
},
|
|
||||||
|
|
||||||
// Repository upload settings
|
|
||||||
Upload: struct {
|
|
||||||
Enabled bool
|
|
||||||
TempPath string
|
|
||||||
AllowedTypes []string `delim:"|"`
|
|
||||||
FileMaxSize int64
|
|
||||||
MaxFiles int
|
|
||||||
}{
|
|
||||||
Enabled: true,
|
|
||||||
TempPath: "data/tmp/uploads",
|
|
||||||
AllowedTypes: []string{},
|
|
||||||
FileMaxSize: 3,
|
|
||||||
MaxFiles: 5,
|
|
||||||
},
|
|
||||||
|
|
||||||
// Repository local settings
|
|
||||||
Local: struct {
|
|
||||||
LocalCopyPath string
|
|
||||||
LocalWikiPath string
|
|
||||||
}{
|
|
||||||
LocalCopyPath: "tmp/local-repo",
|
|
||||||
LocalWikiPath: "tmp/local-wiki",
|
|
||||||
},
|
|
||||||
|
|
||||||
// Pull request settings
|
|
||||||
PullRequest: struct {
|
|
||||||
WorkInProgressPrefixes []string
|
|
||||||
}{
|
|
||||||
WorkInProgressPrefixes: []string{"WIP:", "[WIP]"},
|
|
||||||
},
|
|
||||||
|
|
||||||
// Issue settings
|
|
||||||
Issue: struct {
|
|
||||||
LockReasons []string
|
|
||||||
}{
|
|
||||||
LockReasons: strings.Split("Too heated,Off-topic,Spam,Resolved", ","),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
RepoRootPath string
|
|
||||||
ScriptType = "bash"
|
|
||||||
|
|
||||||
// UI settings
|
// UI settings
|
||||||
UI = struct {
|
UI = struct {
|
||||||
ExplorePagingNum int
|
ExplorePagingNum int
|
||||||
|
@ -400,149 +276,6 @@ var (
|
||||||
|
|
||||||
CSRFCookieName = "_csrf"
|
CSRFCookieName = "_csrf"
|
||||||
|
|
||||||
// Cron tasks
|
|
||||||
Cron = struct {
|
|
||||||
UpdateMirror struct {
|
|
||||||
Enabled bool
|
|
||||||
RunAtStart bool
|
|
||||||
Schedule string
|
|
||||||
} `ini:"cron.update_mirrors"`
|
|
||||||
RepoHealthCheck struct {
|
|
||||||
Enabled bool
|
|
||||||
RunAtStart bool
|
|
||||||
Schedule string
|
|
||||||
Timeout time.Duration
|
|
||||||
Args []string `delim:" "`
|
|
||||||
} `ini:"cron.repo_health_check"`
|
|
||||||
CheckRepoStats struct {
|
|
||||||
Enabled bool
|
|
||||||
RunAtStart bool
|
|
||||||
Schedule string
|
|
||||||
} `ini:"cron.check_repo_stats"`
|
|
||||||
ArchiveCleanup struct {
|
|
||||||
Enabled bool
|
|
||||||
RunAtStart bool
|
|
||||||
Schedule string
|
|
||||||
OlderThan time.Duration
|
|
||||||
} `ini:"cron.archive_cleanup"`
|
|
||||||
SyncExternalUsers struct {
|
|
||||||
Enabled bool
|
|
||||||
RunAtStart bool
|
|
||||||
Schedule string
|
|
||||||
UpdateExisting bool
|
|
||||||
} `ini:"cron.sync_external_users"`
|
|
||||||
DeletedBranchesCleanup struct {
|
|
||||||
Enabled bool
|
|
||||||
RunAtStart bool
|
|
||||||
Schedule string
|
|
||||||
OlderThan time.Duration
|
|
||||||
} `ini:"cron.deleted_branches_cleanup"`
|
|
||||||
}{
|
|
||||||
UpdateMirror: struct {
|
|
||||||
Enabled bool
|
|
||||||
RunAtStart bool
|
|
||||||
Schedule string
|
|
||||||
}{
|
|
||||||
Enabled: true,
|
|
||||||
RunAtStart: false,
|
|
||||||
Schedule: "@every 10m",
|
|
||||||
},
|
|
||||||
RepoHealthCheck: struct {
|
|
||||||
Enabled bool
|
|
||||||
RunAtStart bool
|
|
||||||
Schedule string
|
|
||||||
Timeout time.Duration
|
|
||||||
Args []string `delim:" "`
|
|
||||||
}{
|
|
||||||
Enabled: true,
|
|
||||||
RunAtStart: false,
|
|
||||||
Schedule: "@every 24h",
|
|
||||||
Timeout: 60 * time.Second,
|
|
||||||
Args: []string{},
|
|
||||||
},
|
|
||||||
CheckRepoStats: struct {
|
|
||||||
Enabled bool
|
|
||||||
RunAtStart bool
|
|
||||||
Schedule string
|
|
||||||
}{
|
|
||||||
Enabled: true,
|
|
||||||
RunAtStart: true,
|
|
||||||
Schedule: "@every 24h",
|
|
||||||
},
|
|
||||||
ArchiveCleanup: struct {
|
|
||||||
Enabled bool
|
|
||||||
RunAtStart bool
|
|
||||||
Schedule string
|
|
||||||
OlderThan time.Duration
|
|
||||||
}{
|
|
||||||
Enabled: true,
|
|
||||||
RunAtStart: true,
|
|
||||||
Schedule: "@every 24h",
|
|
||||||
OlderThan: 24 * time.Hour,
|
|
||||||
},
|
|
||||||
SyncExternalUsers: struct {
|
|
||||||
Enabled bool
|
|
||||||
RunAtStart bool
|
|
||||||
Schedule string
|
|
||||||
UpdateExisting bool
|
|
||||||
}{
|
|
||||||
Enabled: true,
|
|
||||||
RunAtStart: false,
|
|
||||||
Schedule: "@every 24h",
|
|
||||||
UpdateExisting: true,
|
|
||||||
},
|
|
||||||
DeletedBranchesCleanup: struct {
|
|
||||||
Enabled bool
|
|
||||||
RunAtStart bool
|
|
||||||
Schedule string
|
|
||||||
OlderThan time.Duration
|
|
||||||
}{
|
|
||||||
Enabled: true,
|
|
||||||
RunAtStart: true,
|
|
||||||
Schedule: "@every 24h",
|
|
||||||
OlderThan: 24 * time.Hour,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// Git settings
|
|
||||||
Git = struct {
|
|
||||||
Version string `ini:"-"`
|
|
||||||
DisableDiffHighlight bool
|
|
||||||
MaxGitDiffLines int
|
|
||||||
MaxGitDiffLineCharacters int
|
|
||||||
MaxGitDiffFiles int
|
|
||||||
GCArgs []string `delim:" "`
|
|
||||||
Timeout struct {
|
|
||||||
Default int
|
|
||||||
Migrate int
|
|
||||||
Mirror int
|
|
||||||
Clone int
|
|
||||||
Pull int
|
|
||||||
GC int `ini:"GC"`
|
|
||||||
} `ini:"git.timeout"`
|
|
||||||
}{
|
|
||||||
DisableDiffHighlight: false,
|
|
||||||
MaxGitDiffLines: 1000,
|
|
||||||
MaxGitDiffLineCharacters: 5000,
|
|
||||||
MaxGitDiffFiles: 100,
|
|
||||||
GCArgs: []string{},
|
|
||||||
Timeout: struct {
|
|
||||||
Default int
|
|
||||||
Migrate int
|
|
||||||
Mirror int
|
|
||||||
Clone int
|
|
||||||
Pull int
|
|
||||||
GC int `ini:"GC"`
|
|
||||||
}{
|
|
||||||
Default: int(git.DefaultCommandExecutionTimeout / time.Second),
|
|
||||||
Migrate: 600,
|
|
||||||
Mirror: 300,
|
|
||||||
Clone: 300,
|
|
||||||
Pull: 300,
|
|
||||||
GC: 60,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mirror settings
|
// Mirror settings
|
||||||
Mirror struct {
|
Mirror struct {
|
||||||
DefaultInterval time.Duration
|
DefaultInterval time.Duration
|
||||||
|
@ -612,7 +345,6 @@ var (
|
||||||
InternalToken string // internal access token
|
InternalToken string // internal access token
|
||||||
IterateBufferSize int
|
IterateBufferSize int
|
||||||
|
|
||||||
ExternalMarkupParsers []MarkupParser
|
|
||||||
// UILocation is the location on the UI, so that we can display the time on UI.
|
// UILocation is the location on the UI, so that we can display the time on UI.
|
||||||
// Currently only show the default time.Local, it could be added to app.ini after UI is ready
|
// Currently only show the default time.Local, it could be added to app.ini after UI is ready
|
||||||
UILocation = time.Local
|
UILocation = time.Local
|
||||||
|
@ -1064,34 +796,7 @@ func NewContext() {
|
||||||
|
|
||||||
SSH.BuiltinServerUser = Cfg.Section("server").Key("BUILTIN_SSH_SERVER_USER").MustString(RunUser)
|
SSH.BuiltinServerUser = Cfg.Section("server").Key("BUILTIN_SSH_SERVER_USER").MustString(RunUser)
|
||||||
|
|
||||||
// Determine and create root git repository path.
|
newRepository()
|
||||||
sec = Cfg.Section("repository")
|
|
||||||
Repository.DisableHTTPGit = sec.Key("DISABLE_HTTP_GIT").MustBool()
|
|
||||||
Repository.UseCompatSSHURI = sec.Key("USE_COMPAT_SSH_URI").MustBool()
|
|
||||||
Repository.MaxCreationLimit = sec.Key("MAX_CREATION_LIMIT").MustInt(-1)
|
|
||||||
RepoRootPath = sec.Key("ROOT").MustString(path.Join(homeDir, "gitea-repositories"))
|
|
||||||
forcePathSeparator(RepoRootPath)
|
|
||||||
if !filepath.IsAbs(RepoRootPath) {
|
|
||||||
RepoRootPath = filepath.Join(AppWorkPath, RepoRootPath)
|
|
||||||
} else {
|
|
||||||
RepoRootPath = filepath.Clean(RepoRootPath)
|
|
||||||
}
|
|
||||||
ScriptType = sec.Key("SCRIPT_TYPE").MustString("bash")
|
|
||||||
if err = Cfg.Section("repository").MapTo(&Repository); err != nil {
|
|
||||||
log.Fatal(4, "Failed to map Repository settings: %v", err)
|
|
||||||
} else if err = Cfg.Section("repository.editor").MapTo(&Repository.Editor); err != nil {
|
|
||||||
log.Fatal(4, "Failed to map Repository.Editor settings: %v", err)
|
|
||||||
} else if err = Cfg.Section("repository.upload").MapTo(&Repository.Upload); err != nil {
|
|
||||||
log.Fatal(4, "Failed to map Repository.Upload settings: %v", err)
|
|
||||||
} else if err = Cfg.Section("repository.local").MapTo(&Repository.Local); err != nil {
|
|
||||||
log.Fatal(4, "Failed to map Repository.Local settings: %v", err)
|
|
||||||
} else if err = Cfg.Section("repository.pull-request").MapTo(&Repository.PullRequest); err != nil {
|
|
||||||
log.Fatal(4, "Failed to map Repository.PullRequest settings: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if !filepath.IsAbs(Repository.Upload.TempPath) {
|
|
||||||
Repository.Upload.TempPath = path.Join(AppWorkPath, Repository.Upload.TempPath)
|
|
||||||
}
|
|
||||||
|
|
||||||
sec = Cfg.Section("picture")
|
sec = Cfg.Section("picture")
|
||||||
AvatarUploadPath = sec.Key("AVATAR_UPLOAD_PATH").MustString(path.Join(AppDataPath, "avatars"))
|
AvatarUploadPath = sec.Key("AVATAR_UPLOAD_PATH").MustString(path.Join(AppDataPath, "avatars"))
|
||||||
|
@ -1145,17 +850,14 @@ func NewContext() {
|
||||||
log.Fatal(4, "Failed to map Markdown settings: %v", err)
|
log.Fatal(4, "Failed to map Markdown settings: %v", err)
|
||||||
} else if err = Cfg.Section("admin").MapTo(&Admin); err != nil {
|
} else if err = Cfg.Section("admin").MapTo(&Admin); err != nil {
|
||||||
log.Fatal(4, "Fail to map Admin settings: %v", err)
|
log.Fatal(4, "Fail to map Admin settings: %v", err)
|
||||||
} else if err = Cfg.Section("cron").MapTo(&Cron); err != nil {
|
|
||||||
log.Fatal(4, "Failed to map Cron settings: %v", err)
|
|
||||||
} else if err = Cfg.Section("git").MapTo(&Git); err != nil {
|
|
||||||
log.Fatal(4, "Failed to map Git settings: %v", err)
|
|
||||||
} else if err = Cfg.Section("api").MapTo(&API); err != nil {
|
} else if err = Cfg.Section("api").MapTo(&API); err != nil {
|
||||||
log.Fatal(4, "Failed to map API settings: %v", err)
|
log.Fatal(4, "Failed to map API settings: %v", err)
|
||||||
} else if err = Cfg.Section("metrics").MapTo(&Metrics); err != nil {
|
} else if err = Cfg.Section("metrics").MapTo(&Metrics); err != nil {
|
||||||
log.Fatal(4, "Failed to map Metrics settings: %v", err)
|
log.Fatal(4, "Failed to map Metrics settings: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
git.DefaultCommandExecutionTimeout = time.Duration(Git.Timeout.Default) * time.Second
|
newCron()
|
||||||
|
newGit()
|
||||||
|
|
||||||
sec = Cfg.Section("mirror")
|
sec = Cfg.Section("mirror")
|
||||||
Mirror.MinInterval = sec.Key("MIN_INTERVAL").MustDuration(10 * time.Minute)
|
Mirror.MinInterval = sec.Key("MIN_INTERVAL").MustDuration(10 * time.Minute)
|
||||||
|
@ -1193,57 +895,11 @@ func NewContext() {
|
||||||
|
|
||||||
HasRobotsTxt = com.IsFile(path.Join(CustomPath, "robots.txt"))
|
HasRobotsTxt = com.IsFile(path.Join(CustomPath, "robots.txt"))
|
||||||
|
|
||||||
extensionReg := regexp.MustCompile(`\.\w`)
|
newMarkup()
|
||||||
for _, sec := range Cfg.Section("markup").ChildSections() {
|
|
||||||
name := strings.TrimPrefix(sec.Name(), "markup.")
|
|
||||||
if name == "" {
|
|
||||||
log.Warn("name is empty, markup " + sec.Name() + "ignored")
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
extensions := sec.Key("FILE_EXTENSIONS").Strings(",")
|
|
||||||
var exts = make([]string, 0, len(extensions))
|
|
||||||
for _, extension := range extensions {
|
|
||||||
if !extensionReg.MatchString(extension) {
|
|
||||||
log.Warn(sec.Name() + " file extension " + extension + " is invalid. Extension ignored")
|
|
||||||
} else {
|
|
||||||
exts = append(exts, extension)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(exts) == 0 {
|
|
||||||
log.Warn(sec.Name() + " file extension is empty, markup " + name + " ignored")
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
command := sec.Key("RENDER_COMMAND").MustString("")
|
|
||||||
if command == "" {
|
|
||||||
log.Warn(" RENDER_COMMAND is empty, markup " + name + " ignored")
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
ExternalMarkupParsers = append(ExternalMarkupParsers, MarkupParser{
|
|
||||||
Enabled: sec.Key("ENABLED").MustBool(false),
|
|
||||||
MarkupName: name,
|
|
||||||
FileExtensions: exts,
|
|
||||||
Command: command,
|
|
||||||
IsInputFile: sec.Key("IS_INPUT_FILE").MustBool(false),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
sec = Cfg.Section("U2F")
|
sec = Cfg.Section("U2F")
|
||||||
U2F.TrustedFacets, _ = shellquote.Split(sec.Key("TRUSTED_FACETS").MustString(strings.TrimRight(AppURL, "/")))
|
U2F.TrustedFacets, _ = shellquote.Split(sec.Key("TRUSTED_FACETS").MustString(strings.TrimRight(AppURL, "/")))
|
||||||
U2F.AppID = sec.Key("APP_ID").MustString(strings.TrimRight(AppURL, "/"))
|
U2F.AppID = sec.Key("APP_ID").MustString(strings.TrimRight(AppURL, "/"))
|
||||||
|
|
||||||
binVersion, err := git.BinVersion()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(4, "Error retrieving git version: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if version.Compare(binVersion, "2.9", ">=") {
|
|
||||||
// Explicitly disable credential helper, otherwise Git credentials might leak
|
|
||||||
git.GlobalCommandArgs = append(git.GlobalCommandArgs, "-c", "credential.helper=")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadInternalToken(sec *ini.Section) string {
|
func loadInternalToken(sec *ini.Section) string {
|
||||||
|
|
Reference in a new issue