2019-03-16 11:12:44 +08:00
|
|
|
// Copyright 2019 The Gitea Authors. All rights reserved.
|
2022-11-28 02:20:29 +08:00
|
|
|
// SPDX-License-Identifier: MIT
|
2019-03-16 11:12:44 +08:00
|
|
|
|
|
|
|
package setting
|
|
|
|
|
|
|
|
import (
|
2022-01-31 00:33:36 +08:00
|
|
|
"os/exec"
|
2019-03-16 11:12:44 +08:00
|
|
|
"path"
|
|
|
|
"path/filepath"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"code.gitea.io/gitea/modules/log"
|
|
|
|
)
|
|
|
|
|
|
|
|
// enumerates all the policy repository creating
|
|
|
|
const (
|
|
|
|
RepoCreatingLastUserVisibility = "last"
|
|
|
|
RepoCreatingPrivate = "private"
|
|
|
|
RepoCreatingPublic = "public"
|
|
|
|
)
|
|
|
|
|
2022-06-12 23:51:54 +08:00
|
|
|
// ItemsPerPage maximum items per page in forks, watchers and stars of a repo
|
|
|
|
const ItemsPerPage = 40
|
|
|
|
|
2019-03-16 11:12:44 +08:00
|
|
|
// Repository settings
|
|
|
|
var (
|
|
|
|
Repository = struct {
|
2020-06-03 06:20:19 +08:00
|
|
|
DetectedCharsetsOrder []string
|
|
|
|
DetectedCharsetScore map[string]int `ini:"-"`
|
2019-03-16 11:12:44 +08:00
|
|
|
AnsiCharset string
|
|
|
|
ForcePrivate bool
|
|
|
|
DefaultPrivate string
|
2020-09-28 03:20:52 +08:00
|
|
|
DefaultPushCreatePrivate bool
|
2019-03-16 11:12:44 +08:00
|
|
|
MaxCreationLimit int
|
|
|
|
PreferredLicenses []string
|
|
|
|
DisableHTTPGit bool
|
|
|
|
AccessControlAllowOrigin string
|
|
|
|
UseCompatSSHURI bool
|
2023-05-12 17:44:37 +08:00
|
|
|
GoGetCloneURLProtocol string
|
2019-03-16 11:12:44 +08:00
|
|
|
DefaultCloseIssuesViaCommitsInAnyBranch bool
|
2019-12-15 10:49:52 +08:00
|
|
|
EnablePushCreateUser bool
|
|
|
|
EnablePushCreateOrg bool
|
2020-01-17 15:34:37 +08:00
|
|
|
DisabledRepoUnits []string
|
|
|
|
DefaultRepoUnits []string
|
2023-02-04 14:48:38 +08:00
|
|
|
DefaultForkRepoUnits []string
|
2020-01-23 07:46:46 +08:00
|
|
|
PrefixArchiveFiles bool
|
2020-12-21 22:39:41 +08:00
|
|
|
DisableMigrations bool
|
2021-04-16 00:53:57 +08:00
|
|
|
DisableStars bool `ini:"DISABLE_STARS"`
|
2020-06-18 04:53:55 +08:00
|
|
|
DefaultBranch string
|
2020-09-25 12:09:23 +08:00
|
|
|
AllowAdoptionOfUnadoptedRepositories bool
|
|
|
|
AllowDeleteOfUnadoptedRepositories bool
|
2022-08-01 00:57:02 +08:00
|
|
|
DisableDownloadSourceArchives bool
|
2022-12-28 05:21:14 +08:00
|
|
|
AllowForkWithoutMaximumLimit bool
|
2019-03-16 11:12:44 +08:00
|
|
|
|
|
|
|
// Repository editor settings
|
|
|
|
Editor struct {
|
2023-03-24 14:12:23 +08:00
|
|
|
LineWrapExtensions []string
|
2019-03-16 11:12:44 +08:00
|
|
|
} `ini:"-"`
|
|
|
|
|
|
|
|
// Repository upload settings
|
|
|
|
Upload struct {
|
|
|
|
Enabled bool
|
|
|
|
TempPath string
|
2020-10-05 13:49:33 +08:00
|
|
|
AllowedTypes string
|
2019-03-16 11:12:44 +08:00
|
|
|
FileMaxSize int64
|
|
|
|
MaxFiles int
|
|
|
|
} `ini:"-"`
|
|
|
|
|
|
|
|
// Repository local settings
|
|
|
|
Local struct {
|
|
|
|
LocalCopyPath string
|
|
|
|
} `ini:"-"`
|
|
|
|
|
|
|
|
// Pull request settings
|
|
|
|
PullRequest struct {
|
2019-12-31 07:34:11 +08:00
|
|
|
WorkInProgressPrefixes []string
|
|
|
|
CloseKeywords []string
|
|
|
|
ReopenKeywords []string
|
2022-06-03 11:45:54 +08:00
|
|
|
DefaultMergeStyle string
|
2019-12-31 07:34:11 +08:00
|
|
|
DefaultMergeMessageCommitsLimit int
|
|
|
|
DefaultMergeMessageSize int
|
|
|
|
DefaultMergeMessageAllAuthors bool
|
|
|
|
DefaultMergeMessageMaxApprovers int
|
|
|
|
DefaultMergeMessageOfficialApproversOnly bool
|
2021-06-19 06:08:22 +08:00
|
|
|
PopulateSquashCommentWithCommitMessages bool
|
2021-11-29 15:09:55 +08:00
|
|
|
AddCoCommitterTrailers bool
|
2022-12-19 19:37:15 +08:00
|
|
|
TestConflictingPatchesWithGitApply bool
|
2019-03-16 11:12:44 +08:00
|
|
|
} `ini:"repository.pull-request"`
|
|
|
|
|
|
|
|
// Issue Setting
|
|
|
|
Issue struct {
|
|
|
|
LockReasons []string
|
2023-05-25 21:17:19 +08:00
|
|
|
MaxPinned int
|
2019-03-16 11:12:44 +08:00
|
|
|
} `ini:"repository.issue"`
|
2019-10-16 21:42:42 +08:00
|
|
|
|
2020-10-05 13:49:33 +08:00
|
|
|
Release struct {
|
2021-08-30 00:25:16 +08:00
|
|
|
AllowedTypes string
|
|
|
|
DefaultPagingNum int
|
2020-10-05 13:49:33 +08:00
|
|
|
} `ini:"repository.release"`
|
|
|
|
|
2019-10-16 21:42:42 +08:00
|
|
|
Signing struct {
|
2020-09-20 00:44:55 +08:00
|
|
|
SigningKey string
|
|
|
|
SigningName string
|
|
|
|
SigningEmail string
|
|
|
|
InitialCommit []string
|
|
|
|
CRUDActions []string `ini:"CRUD_ACTIONS"`
|
|
|
|
Merges []string
|
|
|
|
Wiki []string
|
|
|
|
DefaultTrustModel string
|
2019-10-16 21:42:42 +08:00
|
|
|
} `ini:"repository.signing"`
|
2019-03-16 11:12:44 +08:00
|
|
|
}{
|
2020-06-03 06:20:19 +08:00
|
|
|
DetectedCharsetsOrder: []string{
|
|
|
|
"UTF-8",
|
|
|
|
"UTF-16BE",
|
|
|
|
"UTF-16LE",
|
|
|
|
"UTF-32BE",
|
|
|
|
"UTF-32LE",
|
|
|
|
"ISO-8859-1",
|
|
|
|
"windows-1252",
|
|
|
|
"ISO-8859-2",
|
|
|
|
"windows-1250",
|
|
|
|
"ISO-8859-5",
|
|
|
|
"ISO-8859-6",
|
|
|
|
"ISO-8859-7",
|
|
|
|
"windows-1253",
|
|
|
|
"ISO-8859-8-I",
|
|
|
|
"windows-1255",
|
|
|
|
"ISO-8859-8",
|
|
|
|
"windows-1251",
|
|
|
|
"windows-1256",
|
|
|
|
"KOI8-R",
|
|
|
|
"ISO-8859-9",
|
|
|
|
"windows-1254",
|
|
|
|
"Shift_JIS",
|
|
|
|
"GB18030",
|
|
|
|
"EUC-JP",
|
|
|
|
"EUC-KR",
|
|
|
|
"Big5",
|
|
|
|
"ISO-2022-JP",
|
|
|
|
"ISO-2022-KR",
|
|
|
|
"ISO-2022-CN",
|
|
|
|
"IBM424_rtl",
|
|
|
|
"IBM424_ltr",
|
|
|
|
"IBM420_rtl",
|
|
|
|
"IBM420_ltr",
|
|
|
|
},
|
|
|
|
DetectedCharsetScore: map[string]int{},
|
2019-03-16 11:12:44 +08:00
|
|
|
AnsiCharset: "",
|
|
|
|
ForcePrivate: false,
|
|
|
|
DefaultPrivate: RepoCreatingLastUserVisibility,
|
2020-09-28 03:20:52 +08:00
|
|
|
DefaultPushCreatePrivate: true,
|
2019-03-16 11:12:44 +08:00
|
|
|
MaxCreationLimit: -1,
|
2020-11-14 11:17:58 +08:00
|
|
|
PreferredLicenses: []string{"Apache License 2.0", "MIT License"},
|
2019-03-16 11:12:44 +08:00
|
|
|
DisableHTTPGit: false,
|
|
|
|
AccessControlAllowOrigin: "",
|
|
|
|
UseCompatSSHURI: false,
|
|
|
|
DefaultCloseIssuesViaCommitsInAnyBranch: false,
|
2019-12-15 10:49:52 +08:00
|
|
|
EnablePushCreateUser: false,
|
|
|
|
EnablePushCreateOrg: false,
|
2020-01-17 15:34:37 +08:00
|
|
|
DisabledRepoUnits: []string{},
|
|
|
|
DefaultRepoUnits: []string{},
|
2023-02-04 14:48:38 +08:00
|
|
|
DefaultForkRepoUnits: []string{},
|
2020-01-23 07:46:46 +08:00
|
|
|
PrefixArchiveFiles: true,
|
2020-12-21 22:39:41 +08:00
|
|
|
DisableMigrations: false,
|
2021-04-16 00:53:57 +08:00
|
|
|
DisableStars: false,
|
2022-04-09 12:26:48 +08:00
|
|
|
DefaultBranch: "main",
|
2022-12-28 05:21:14 +08:00
|
|
|
AllowForkWithoutMaximumLimit: true,
|
2019-03-16 11:12:44 +08:00
|
|
|
|
|
|
|
// Repository editor settings
|
|
|
|
Editor: struct {
|
2023-03-24 14:12:23 +08:00
|
|
|
LineWrapExtensions []string
|
2019-03-16 11:12:44 +08:00
|
|
|
}{
|
2023-04-26 23:22:54 +08:00
|
|
|
LineWrapExtensions: strings.Split(".txt,.md,.markdown,.mdown,.mkd,.livemd,", ","),
|
2019-03-16 11:12:44 +08:00
|
|
|
},
|
|
|
|
|
|
|
|
// Repository upload settings
|
|
|
|
Upload: struct {
|
|
|
|
Enabled bool
|
|
|
|
TempPath string
|
2020-10-05 13:49:33 +08:00
|
|
|
AllowedTypes string
|
2019-03-16 11:12:44 +08:00
|
|
|
FileMaxSize int64
|
|
|
|
MaxFiles int
|
|
|
|
}{
|
|
|
|
Enabled: true,
|
|
|
|
TempPath: "data/tmp/uploads",
|
2020-10-05 13:49:33 +08:00
|
|
|
AllowedTypes: "",
|
2023-11-17 19:42:00 +08:00
|
|
|
FileMaxSize: 50,
|
2019-03-16 11:12:44 +08:00
|
|
|
MaxFiles: 5,
|
|
|
|
},
|
|
|
|
|
|
|
|
// Repository local settings
|
|
|
|
Local: struct {
|
|
|
|
LocalCopyPath string
|
|
|
|
}{
|
|
|
|
LocalCopyPath: "tmp/local-repo",
|
|
|
|
},
|
|
|
|
|
|
|
|
// Pull request settings
|
|
|
|
PullRequest: struct {
|
2019-12-31 07:34:11 +08:00
|
|
|
WorkInProgressPrefixes []string
|
|
|
|
CloseKeywords []string
|
|
|
|
ReopenKeywords []string
|
2022-06-03 11:45:54 +08:00
|
|
|
DefaultMergeStyle string
|
2019-12-31 07:34:11 +08:00
|
|
|
DefaultMergeMessageCommitsLimit int
|
|
|
|
DefaultMergeMessageSize int
|
|
|
|
DefaultMergeMessageAllAuthors bool
|
|
|
|
DefaultMergeMessageMaxApprovers int
|
|
|
|
DefaultMergeMessageOfficialApproversOnly bool
|
2021-06-19 06:08:22 +08:00
|
|
|
PopulateSquashCommentWithCommitMessages bool
|
2021-11-29 15:09:55 +08:00
|
|
|
AddCoCommitterTrailers bool
|
2022-12-19 19:37:15 +08:00
|
|
|
TestConflictingPatchesWithGitApply bool
|
2019-03-16 11:12:44 +08:00
|
|
|
}{
|
|
|
|
WorkInProgressPrefixes: []string{"WIP:", "[WIP]"},
|
2019-10-30 20:43:59 +08:00
|
|
|
// Same as GitHub. See
|
|
|
|
// https://help.github.com/articles/closing-issues-via-commit-messages
|
2019-12-31 07:34:11 +08:00
|
|
|
CloseKeywords: strings.Split("close,closes,closed,fix,fixes,fixed,resolve,resolves,resolved", ","),
|
|
|
|
ReopenKeywords: strings.Split("reopen,reopens,reopened", ","),
|
2022-06-03 11:45:54 +08:00
|
|
|
DefaultMergeStyle: "merge",
|
2019-12-31 07:34:11 +08:00
|
|
|
DefaultMergeMessageCommitsLimit: 50,
|
|
|
|
DefaultMergeMessageSize: 5 * 1024,
|
|
|
|
DefaultMergeMessageAllAuthors: false,
|
|
|
|
DefaultMergeMessageMaxApprovers: 10,
|
|
|
|
DefaultMergeMessageOfficialApproversOnly: true,
|
2021-06-19 06:08:22 +08:00
|
|
|
PopulateSquashCommentWithCommitMessages: false,
|
2021-11-29 15:09:55 +08:00
|
|
|
AddCoCommitterTrailers: true,
|
2019-03-16 11:12:44 +08:00
|
|
|
},
|
|
|
|
|
|
|
|
// Issue settings
|
|
|
|
Issue: struct {
|
|
|
|
LockReasons []string
|
2023-05-25 21:17:19 +08:00
|
|
|
MaxPinned int
|
2019-03-16 11:12:44 +08:00
|
|
|
}{
|
|
|
|
LockReasons: strings.Split("Too heated,Off-topic,Spam,Resolved", ","),
|
2023-05-25 21:17:19 +08:00
|
|
|
MaxPinned: 3,
|
2019-03-16 11:12:44 +08:00
|
|
|
},
|
2019-10-16 21:42:42 +08:00
|
|
|
|
2020-10-05 13:49:33 +08:00
|
|
|
Release: struct {
|
2021-08-30 00:25:16 +08:00
|
|
|
AllowedTypes string
|
|
|
|
DefaultPagingNum int
|
2020-10-05 13:49:33 +08:00
|
|
|
}{
|
2021-08-30 00:25:16 +08:00
|
|
|
AllowedTypes: "",
|
|
|
|
DefaultPagingNum: 10,
|
2020-10-05 13:49:33 +08:00
|
|
|
},
|
|
|
|
|
2019-10-16 21:42:42 +08:00
|
|
|
// Signing settings
|
|
|
|
Signing: struct {
|
2020-09-20 00:44:55 +08:00
|
|
|
SigningKey string
|
|
|
|
SigningName string
|
|
|
|
SigningEmail string
|
|
|
|
InitialCommit []string
|
|
|
|
CRUDActions []string `ini:"CRUD_ACTIONS"`
|
|
|
|
Merges []string
|
|
|
|
Wiki []string
|
|
|
|
DefaultTrustModel string
|
2019-10-16 21:42:42 +08:00
|
|
|
}{
|
2020-09-20 00:44:55 +08:00
|
|
|
SigningKey: "default",
|
|
|
|
SigningName: "",
|
|
|
|
SigningEmail: "",
|
|
|
|
InitialCommit: []string{"always"},
|
|
|
|
CRUDActions: []string{"pubkey", "twofa", "parentsigned"},
|
|
|
|
Merges: []string{"pubkey", "twofa", "basesigned", "commitssigned"},
|
|
|
|
Wiki: []string{"never"},
|
|
|
|
DefaultTrustModel: "collaborator",
|
2019-10-16 21:42:42 +08:00
|
|
|
},
|
2019-03-16 11:12:44 +08:00
|
|
|
}
|
|
|
|
RepoRootPath string
|
|
|
|
ScriptType = "bash"
|
|
|
|
)
|
|
|
|
|
2023-02-20 00:12:01 +08:00
|
|
|
func loadRepositoryFrom(rootCfg ConfigProvider) {
|
2020-12-16 05:52:59 +08:00
|
|
|
var err error
|
2019-03-16 11:12:44 +08:00
|
|
|
// Determine and create root git repository path.
|
2023-02-20 00:12:01 +08:00
|
|
|
sec := rootCfg.Section("repository")
|
2019-03-16 11:12:44 +08:00
|
|
|
Repository.DisableHTTPGit = sec.Key("DISABLE_HTTP_GIT").MustBool()
|
|
|
|
Repository.UseCompatSSHURI = sec.Key("USE_COMPAT_SSH_URI").MustBool()
|
2023-05-12 17:44:37 +08:00
|
|
|
Repository.GoGetCloneURLProtocol = sec.Key("GO_GET_CLONE_URL_PROTOCOL").MustString("https")
|
2019-03-16 11:12:44 +08:00
|
|
|
Repository.MaxCreationLimit = sec.Key("MAX_CREATION_LIMIT").MustInt(-1)
|
2020-09-25 12:09:23 +08:00
|
|
|
Repository.DefaultBranch = sec.Key("DEFAULT_BRANCH").MustString(Repository.DefaultBranch)
|
2020-12-16 05:52:59 +08:00
|
|
|
RepoRootPath = sec.Key("ROOT").MustString(path.Join(AppDataPath, "gitea-repositories"))
|
2019-03-16 11:12:44 +08:00
|
|
|
if !filepath.IsAbs(RepoRootPath) {
|
|
|
|
RepoRootPath = filepath.Join(AppWorkPath, RepoRootPath)
|
|
|
|
} else {
|
|
|
|
RepoRootPath = filepath.Clean(RepoRootPath)
|
|
|
|
}
|
2020-06-03 06:20:19 +08:00
|
|
|
defaultDetectedCharsetsOrder := make([]string, 0, len(Repository.DetectedCharsetsOrder))
|
|
|
|
for _, charset := range Repository.DetectedCharsetsOrder {
|
|
|
|
defaultDetectedCharsetsOrder = append(defaultDetectedCharsetsOrder, strings.ToLower(strings.TrimSpace(charset)))
|
|
|
|
}
|
2019-03-16 11:12:44 +08:00
|
|
|
ScriptType = sec.Key("SCRIPT_TYPE").MustString("bash")
|
|
|
|
|
2022-01-31 00:33:36 +08:00
|
|
|
if _, err := exec.LookPath(ScriptType); err != nil {
|
|
|
|
log.Warn("SCRIPT_TYPE %q is not on the current PATH. Are you sure that this is the correct SCRIPT_TYPE?", ScriptType)
|
|
|
|
}
|
|
|
|
|
2023-02-20 00:12:01 +08:00
|
|
|
if err = sec.MapTo(&Repository); err != nil {
|
2019-04-02 15:48:31 +08:00
|
|
|
log.Fatal("Failed to map Repository settings: %v", err)
|
2023-02-20 00:12:01 +08:00
|
|
|
} else if err = rootCfg.Section("repository.editor").MapTo(&Repository.Editor); err != nil {
|
2019-04-02 15:48:31 +08:00
|
|
|
log.Fatal("Failed to map Repository.Editor settings: %v", err)
|
2023-02-20 00:12:01 +08:00
|
|
|
} else if err = rootCfg.Section("repository.upload").MapTo(&Repository.Upload); err != nil {
|
2019-04-02 15:48:31 +08:00
|
|
|
log.Fatal("Failed to map Repository.Upload settings: %v", err)
|
2023-02-20 00:12:01 +08:00
|
|
|
} else if err = rootCfg.Section("repository.local").MapTo(&Repository.Local); err != nil {
|
2019-04-02 15:48:31 +08:00
|
|
|
log.Fatal("Failed to map Repository.Local settings: %v", err)
|
2023-02-20 00:12:01 +08:00
|
|
|
} else if err = rootCfg.Section("repository.pull-request").MapTo(&Repository.PullRequest); err != nil {
|
2019-04-02 15:48:31 +08:00
|
|
|
log.Fatal("Failed to map Repository.PullRequest settings: %v", err)
|
2019-03-16 11:12:44 +08:00
|
|
|
}
|
|
|
|
|
2023-05-19 19:35:12 +08:00
|
|
|
if !rootCfg.Section("packages").Key("ENABLED").MustBool(Packages.Enabled) {
|
2022-05-08 23:51:50 +08:00
|
|
|
Repository.DisabledRepoUnits = append(Repository.DisabledRepoUnits, "repo.packages")
|
|
|
|
}
|
|
|
|
|
2023-05-19 19:35:12 +08:00
|
|
|
if !rootCfg.Section("actions").Key("ENABLED").MustBool(Actions.Enabled) {
|
2023-05-05 20:02:30 +08:00
|
|
|
Repository.DisabledRepoUnits = append(Repository.DisabledRepoUnits, "repo.actions")
|
|
|
|
}
|
|
|
|
|
2020-09-20 00:44:55 +08:00
|
|
|
// Handle default trustmodel settings
|
|
|
|
Repository.Signing.DefaultTrustModel = strings.ToLower(strings.TrimSpace(Repository.Signing.DefaultTrustModel))
|
|
|
|
if Repository.Signing.DefaultTrustModel == "default" {
|
|
|
|
Repository.Signing.DefaultTrustModel = "collaborator"
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle preferred charset orders
|
2020-06-03 06:20:19 +08:00
|
|
|
preferred := make([]string, 0, len(Repository.DetectedCharsetsOrder))
|
|
|
|
for _, charset := range Repository.DetectedCharsetsOrder {
|
|
|
|
canonicalCharset := strings.ToLower(strings.TrimSpace(charset))
|
|
|
|
preferred = append(preferred, canonicalCharset)
|
|
|
|
// remove it from the defaults
|
|
|
|
for i, charset := range defaultDetectedCharsetsOrder {
|
|
|
|
if charset == canonicalCharset {
|
|
|
|
defaultDetectedCharsetsOrder = append(defaultDetectedCharsetsOrder[:i], defaultDetectedCharsetsOrder[i+1:]...)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
i := 0
|
|
|
|
for _, charset := range preferred {
|
|
|
|
// Add the defaults
|
|
|
|
if charset == "defaults" {
|
|
|
|
for _, charset := range defaultDetectedCharsetsOrder {
|
|
|
|
canonicalCharset := strings.ToLower(strings.TrimSpace(charset))
|
|
|
|
if _, has := Repository.DetectedCharsetScore[canonicalCharset]; !has {
|
|
|
|
Repository.DetectedCharsetScore[canonicalCharset] = i
|
|
|
|
i++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if _, has := Repository.DetectedCharsetScore[charset]; !has {
|
|
|
|
Repository.DetectedCharsetScore[charset] = i
|
|
|
|
i++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-16 11:12:44 +08:00
|
|
|
if !filepath.IsAbs(Repository.Upload.TempPath) {
|
|
|
|
Repository.Upload.TempPath = path.Join(AppWorkPath, Repository.Upload.TempPath)
|
|
|
|
}
|
2021-06-24 05:12:38 +08:00
|
|
|
|
2023-06-14 11:42:38 +08:00
|
|
|
if err := loadRepoArchiveFrom(rootCfg); err != nil {
|
|
|
|
log.Fatal("loadRepoArchiveFrom: %v", err)
|
|
|
|
}
|
2019-03-16 11:12:44 +08:00
|
|
|
}
|