2019-03-16 04:12:44 +01:00
|
|
|
// Copyright 2019 The Gitea Authors. All rights reserved.
|
2022-11-27 19:20:29 +01:00
|
|
|
// SPDX-License-Identifier: MIT
|
2019-03-16 04:12:44 +01:00
|
|
|
|
|
|
|
package setting
|
|
|
|
|
|
|
|
import (
|
2022-01-30 17:33:36 +01:00
|
|
|
"os/exec"
|
2019-03-16 04:12:44 +01: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 17:51:54 +02:00
|
|
|
// ItemsPerPage maximum items per page in forks, watchers and stars of a repo
|
|
|
|
const ItemsPerPage = 40
|
|
|
|
|
2019-03-16 04:12:44 +01:00
|
|
|
// Repository settings
|
|
|
|
var (
|
|
|
|
Repository = struct {
|
2020-06-03 00:20:19 +02:00
|
|
|
DetectedCharsetsOrder []string
|
|
|
|
DetectedCharsetScore map[string]int `ini:"-"`
|
2019-03-16 04:12:44 +01:00
|
|
|
AnsiCharset string
|
|
|
|
ForcePrivate bool
|
|
|
|
DefaultPrivate string
|
2020-09-27 21:20:52 +02:00
|
|
|
DefaultPushCreatePrivate bool
|
2019-03-16 04:12:44 +01:00
|
|
|
MaxCreationLimit int
|
|
|
|
PreferredLicenses []string
|
|
|
|
DisableHTTPGit bool
|
|
|
|
AccessControlAllowOrigin string
|
|
|
|
UseCompatSSHURI bool
|
2023-05-12 11:44:37 +02:00
|
|
|
GoGetCloneURLProtocol string
|
2019-03-16 04:12:44 +01:00
|
|
|
DefaultCloseIssuesViaCommitsInAnyBranch bool
|
2019-12-15 03:49:52 +01:00
|
|
|
EnablePushCreateUser bool
|
|
|
|
EnablePushCreateOrg bool
|
2020-01-17 08:34:37 +01:00
|
|
|
DisabledRepoUnits []string
|
|
|
|
DefaultRepoUnits []string
|
2023-02-04 07:48:38 +01:00
|
|
|
DefaultForkRepoUnits []string
|
2020-01-23 00:46:46 +01:00
|
|
|
PrefixArchiveFiles bool
|
2020-12-21 15:39:41 +01:00
|
|
|
DisableMigrations bool
|
2021-04-15 18:53:57 +02:00
|
|
|
DisableStars bool `ini:"DISABLE_STARS"`
|
2020-06-17 22:53:55 +02:00
|
|
|
DefaultBranch string
|
2020-09-25 06:09:23 +02:00
|
|
|
AllowAdoptionOfUnadoptedRepositories bool
|
|
|
|
AllowDeleteOfUnadoptedRepositories bool
|
2022-07-31 18:57:02 +02:00
|
|
|
DisableDownloadSourceArchives bool
|
2022-12-27 22:21:14 +01:00
|
|
|
AllowForkWithoutMaximumLimit bool
|
2019-03-16 04:12:44 +01:00
|
|
|
|
|
|
|
// Repository editor settings
|
|
|
|
Editor struct {
|
2023-03-24 07:12:23 +01:00
|
|
|
LineWrapExtensions []string
|
2019-03-16 04:12:44 +01:00
|
|
|
} `ini:"-"`
|
|
|
|
|
|
|
|
// Repository upload settings
|
|
|
|
Upload struct {
|
|
|
|
Enabled bool
|
|
|
|
TempPath string
|
2020-10-05 07:49:33 +02:00
|
|
|
AllowedTypes string
|
2019-03-16 04:12:44 +01:00
|
|
|
FileMaxSize int64
|
|
|
|
MaxFiles int
|
|
|
|
} `ini:"-"`
|
|
|
|
|
|
|
|
// Repository local settings
|
|
|
|
Local struct {
|
|
|
|
LocalCopyPath string
|
|
|
|
} `ini:"-"`
|
|
|
|
|
|
|
|
// Pull request settings
|
|
|
|
PullRequest struct {
|
2019-12-31 00:34:11 +01:00
|
|
|
WorkInProgressPrefixes []string
|
|
|
|
CloseKeywords []string
|
|
|
|
ReopenKeywords []string
|
2022-06-03 05:45:54 +02:00
|
|
|
DefaultMergeStyle string
|
2019-12-31 00:34:11 +01:00
|
|
|
DefaultMergeMessageCommitsLimit int
|
|
|
|
DefaultMergeMessageSize int
|
|
|
|
DefaultMergeMessageAllAuthors bool
|
|
|
|
DefaultMergeMessageMaxApprovers int
|
|
|
|
DefaultMergeMessageOfficialApproversOnly bool
|
2021-06-19 00:08:22 +02:00
|
|
|
PopulateSquashCommentWithCommitMessages bool
|
2021-11-29 08:09:55 +01:00
|
|
|
AddCoCommitterTrailers bool
|
2022-12-19 12:37:15 +01:00
|
|
|
TestConflictingPatchesWithGitApply bool
|
2019-03-16 04:12:44 +01:00
|
|
|
} `ini:"repository.pull-request"`
|
|
|
|
|
|
|
|
// Issue Setting
|
|
|
|
Issue struct {
|
|
|
|
LockReasons []string
|
2023-05-25 15:17:19 +02:00
|
|
|
MaxPinned int
|
2019-03-16 04:12:44 +01:00
|
|
|
} `ini:"repository.issue"`
|
2019-10-16 15:42:42 +02:00
|
|
|
|
2020-10-05 07:49:33 +02:00
|
|
|
Release struct {
|
2021-08-29 18:25:16 +02:00
|
|
|
AllowedTypes string
|
|
|
|
DefaultPagingNum int
|
2020-10-05 07:49:33 +02:00
|
|
|
} `ini:"repository.release"`
|
|
|
|
|
2019-10-16 15:42:42 +02:00
|
|
|
Signing struct {
|
2020-09-19 18:44:55 +02:00
|
|
|
SigningKey string
|
|
|
|
SigningName string
|
|
|
|
SigningEmail string
|
|
|
|
InitialCommit []string
|
|
|
|
CRUDActions []string `ini:"CRUD_ACTIONS"`
|
|
|
|
Merges []string
|
|
|
|
Wiki []string
|
|
|
|
DefaultTrustModel string
|
2019-10-16 15:42:42 +02:00
|
|
|
} `ini:"repository.signing"`
|
2019-03-16 04:12:44 +01:00
|
|
|
}{
|
2020-06-03 00:20:19 +02: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 04:12:44 +01:00
|
|
|
AnsiCharset: "",
|
|
|
|
ForcePrivate: false,
|
|
|
|
DefaultPrivate: RepoCreatingLastUserVisibility,
|
2020-09-27 21:20:52 +02:00
|
|
|
DefaultPushCreatePrivate: true,
|
2019-03-16 04:12:44 +01:00
|
|
|
MaxCreationLimit: -1,
|
2020-11-14 04:17:58 +01:00
|
|
|
PreferredLicenses: []string{"Apache License 2.0", "MIT License"},
|
2019-03-16 04:12:44 +01:00
|
|
|
DisableHTTPGit: false,
|
|
|
|
AccessControlAllowOrigin: "",
|
|
|
|
UseCompatSSHURI: false,
|
|
|
|
DefaultCloseIssuesViaCommitsInAnyBranch: false,
|
2019-12-15 03:49:52 +01:00
|
|
|
EnablePushCreateUser: false,
|
|
|
|
EnablePushCreateOrg: false,
|
2020-01-17 08:34:37 +01:00
|
|
|
DisabledRepoUnits: []string{},
|
|
|
|
DefaultRepoUnits: []string{},
|
2023-02-04 07:48:38 +01:00
|
|
|
DefaultForkRepoUnits: []string{},
|
2020-01-23 00:46:46 +01:00
|
|
|
PrefixArchiveFiles: true,
|
2020-12-21 15:39:41 +01:00
|
|
|
DisableMigrations: false,
|
2021-04-15 18:53:57 +02:00
|
|
|
DisableStars: false,
|
2022-04-09 06:26:48 +02:00
|
|
|
DefaultBranch: "main",
|
2022-12-27 22:21:14 +01:00
|
|
|
AllowForkWithoutMaximumLimit: true,
|
2019-03-16 04:12:44 +01:00
|
|
|
|
|
|
|
// Repository editor settings
|
|
|
|
Editor: struct {
|
2023-03-24 07:12:23 +01:00
|
|
|
LineWrapExtensions []string
|
2019-03-16 04:12:44 +01:00
|
|
|
}{
|
2023-04-26 17:22:54 +02:00
|
|
|
LineWrapExtensions: strings.Split(".txt,.md,.markdown,.mdown,.mkd,.livemd,", ","),
|
2019-03-16 04:12:44 +01:00
|
|
|
},
|
|
|
|
|
|
|
|
// Repository upload settings
|
|
|
|
Upload: struct {
|
|
|
|
Enabled bool
|
|
|
|
TempPath string
|
2020-10-05 07:49:33 +02:00
|
|
|
AllowedTypes string
|
2019-03-16 04:12:44 +01:00
|
|
|
FileMaxSize int64
|
|
|
|
MaxFiles int
|
|
|
|
}{
|
|
|
|
Enabled: true,
|
|
|
|
TempPath: "data/tmp/uploads",
|
2020-10-05 07:49:33 +02:00
|
|
|
AllowedTypes: "",
|
2023-11-17 13:30:42 +01:00
|
|
|
FileMaxSize: 50,
|
2019-03-16 04:12:44 +01:00
|
|
|
MaxFiles: 5,
|
|
|
|
},
|
|
|
|
|
|
|
|
// Repository local settings
|
|
|
|
Local: struct {
|
|
|
|
LocalCopyPath string
|
|
|
|
}{
|
|
|
|
LocalCopyPath: "tmp/local-repo",
|
|
|
|
},
|
|
|
|
|
|
|
|
// Pull request settings
|
|
|
|
PullRequest: struct {
|
2019-12-31 00:34:11 +01:00
|
|
|
WorkInProgressPrefixes []string
|
|
|
|
CloseKeywords []string
|
|
|
|
ReopenKeywords []string
|
2022-06-03 05:45:54 +02:00
|
|
|
DefaultMergeStyle string
|
2019-12-31 00:34:11 +01:00
|
|
|
DefaultMergeMessageCommitsLimit int
|
|
|
|
DefaultMergeMessageSize int
|
|
|
|
DefaultMergeMessageAllAuthors bool
|
|
|
|
DefaultMergeMessageMaxApprovers int
|
|
|
|
DefaultMergeMessageOfficialApproversOnly bool
|
2021-06-19 00:08:22 +02:00
|
|
|
PopulateSquashCommentWithCommitMessages bool
|
2021-11-29 08:09:55 +01:00
|
|
|
AddCoCommitterTrailers bool
|
2022-12-19 12:37:15 +01:00
|
|
|
TestConflictingPatchesWithGitApply bool
|
2019-03-16 04:12:44 +01:00
|
|
|
}{
|
|
|
|
WorkInProgressPrefixes: []string{"WIP:", "[WIP]"},
|
2019-10-30 13:43:59 +01:00
|
|
|
// Same as GitHub. See
|
|
|
|
// https://help.github.com/articles/closing-issues-via-commit-messages
|
2019-12-31 00:34:11 +01:00
|
|
|
CloseKeywords: strings.Split("close,closes,closed,fix,fixes,fixed,resolve,resolves,resolved", ","),
|
|
|
|
ReopenKeywords: strings.Split("reopen,reopens,reopened", ","),
|
2022-06-03 05:45:54 +02:00
|
|
|
DefaultMergeStyle: "merge",
|
2019-12-31 00:34:11 +01:00
|
|
|
DefaultMergeMessageCommitsLimit: 50,
|
|
|
|
DefaultMergeMessageSize: 5 * 1024,
|
|
|
|
DefaultMergeMessageAllAuthors: false,
|
|
|
|
DefaultMergeMessageMaxApprovers: 10,
|
|
|
|
DefaultMergeMessageOfficialApproversOnly: true,
|
2021-06-19 00:08:22 +02:00
|
|
|
PopulateSquashCommentWithCommitMessages: false,
|
2021-11-29 08:09:55 +01:00
|
|
|
AddCoCommitterTrailers: true,
|
2019-03-16 04:12:44 +01:00
|
|
|
},
|
|
|
|
|
|
|
|
// Issue settings
|
|
|
|
Issue: struct {
|
|
|
|
LockReasons []string
|
2023-05-25 15:17:19 +02:00
|
|
|
MaxPinned int
|
2019-03-16 04:12:44 +01:00
|
|
|
}{
|
|
|
|
LockReasons: strings.Split("Too heated,Off-topic,Spam,Resolved", ","),
|
2023-05-25 15:17:19 +02:00
|
|
|
MaxPinned: 3,
|
2019-03-16 04:12:44 +01:00
|
|
|
},
|
2019-10-16 15:42:42 +02:00
|
|
|
|
2020-10-05 07:49:33 +02:00
|
|
|
Release: struct {
|
2021-08-29 18:25:16 +02:00
|
|
|
AllowedTypes string
|
|
|
|
DefaultPagingNum int
|
2020-10-05 07:49:33 +02:00
|
|
|
}{
|
2021-08-29 18:25:16 +02:00
|
|
|
AllowedTypes: "",
|
|
|
|
DefaultPagingNum: 10,
|
2020-10-05 07:49:33 +02:00
|
|
|
},
|
|
|
|
|
2019-10-16 15:42:42 +02:00
|
|
|
// Signing settings
|
|
|
|
Signing: struct {
|
2020-09-19 18:44:55 +02:00
|
|
|
SigningKey string
|
|
|
|
SigningName string
|
|
|
|
SigningEmail string
|
|
|
|
InitialCommit []string
|
|
|
|
CRUDActions []string `ini:"CRUD_ACTIONS"`
|
|
|
|
Merges []string
|
|
|
|
Wiki []string
|
|
|
|
DefaultTrustModel string
|
2019-10-16 15:42:42 +02:00
|
|
|
}{
|
2020-09-19 18:44:55 +02: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 15:42:42 +02:00
|
|
|
},
|
2019-03-16 04:12:44 +01:00
|
|
|
}
|
|
|
|
RepoRootPath string
|
|
|
|
ScriptType = "bash"
|
|
|
|
)
|
|
|
|
|
2023-02-19 17:12:01 +01:00
|
|
|
func loadRepositoryFrom(rootCfg ConfigProvider) {
|
2020-12-15 22:52:59 +01:00
|
|
|
var err error
|
2019-03-16 04:12:44 +01:00
|
|
|
// Determine and create root git repository path.
|
2023-02-19 17:12:01 +01:00
|
|
|
sec := rootCfg.Section("repository")
|
2019-03-16 04:12:44 +01:00
|
|
|
Repository.DisableHTTPGit = sec.Key("DISABLE_HTTP_GIT").MustBool()
|
|
|
|
Repository.UseCompatSSHURI = sec.Key("USE_COMPAT_SSH_URI").MustBool()
|
2023-05-12 11:44:37 +02:00
|
|
|
Repository.GoGetCloneURLProtocol = sec.Key("GO_GET_CLONE_URL_PROTOCOL").MustString("https")
|
2019-03-16 04:12:44 +01:00
|
|
|
Repository.MaxCreationLimit = sec.Key("MAX_CREATION_LIMIT").MustInt(-1)
|
2020-09-25 06:09:23 +02:00
|
|
|
Repository.DefaultBranch = sec.Key("DEFAULT_BRANCH").MustString(Repository.DefaultBranch)
|
2022-12-19 21:01:46 +01:00
|
|
|
RepoRootPath = sec.Key("ROOT").MustString(path.Join(AppDataPath, "forgejo-repositories"))
|
2019-03-16 04:12:44 +01:00
|
|
|
if !filepath.IsAbs(RepoRootPath) {
|
|
|
|
RepoRootPath = filepath.Join(AppWorkPath, RepoRootPath)
|
|
|
|
} else {
|
|
|
|
RepoRootPath = filepath.Clean(RepoRootPath)
|
|
|
|
}
|
2020-06-03 00:20:19 +02:00
|
|
|
defaultDetectedCharsetsOrder := make([]string, 0, len(Repository.DetectedCharsetsOrder))
|
|
|
|
for _, charset := range Repository.DetectedCharsetsOrder {
|
|
|
|
defaultDetectedCharsetsOrder = append(defaultDetectedCharsetsOrder, strings.ToLower(strings.TrimSpace(charset)))
|
|
|
|
}
|
2019-03-16 04:12:44 +01:00
|
|
|
ScriptType = sec.Key("SCRIPT_TYPE").MustString("bash")
|
|
|
|
|
2022-01-30 17:33:36 +01: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-19 17:12:01 +01:00
|
|
|
if err = sec.MapTo(&Repository); err != nil {
|
2019-04-02 09:48:31 +02:00
|
|
|
log.Fatal("Failed to map Repository settings: %v", err)
|
2023-02-19 17:12:01 +01:00
|
|
|
} else if err = rootCfg.Section("repository.editor").MapTo(&Repository.Editor); err != nil {
|
2019-04-02 09:48:31 +02:00
|
|
|
log.Fatal("Failed to map Repository.Editor settings: %v", err)
|
2023-02-19 17:12:01 +01:00
|
|
|
} else if err = rootCfg.Section("repository.upload").MapTo(&Repository.Upload); err != nil {
|
2019-04-02 09:48:31 +02:00
|
|
|
log.Fatal("Failed to map Repository.Upload settings: %v", err)
|
2023-02-19 17:12:01 +01:00
|
|
|
} else if err = rootCfg.Section("repository.local").MapTo(&Repository.Local); err != nil {
|
2019-04-02 09:48:31 +02:00
|
|
|
log.Fatal("Failed to map Repository.Local settings: %v", err)
|
2023-02-19 17:12:01 +01:00
|
|
|
} else if err = rootCfg.Section("repository.pull-request").MapTo(&Repository.PullRequest); err != nil {
|
2019-04-02 09:48:31 +02:00
|
|
|
log.Fatal("Failed to map Repository.PullRequest settings: %v", err)
|
2019-03-16 04:12:44 +01:00
|
|
|
}
|
|
|
|
|
2023-05-19 13:35:12 +02:00
|
|
|
if !rootCfg.Section("packages").Key("ENABLED").MustBool(Packages.Enabled) {
|
2022-05-08 17:51:50 +02:00
|
|
|
Repository.DisabledRepoUnits = append(Repository.DisabledRepoUnits, "repo.packages")
|
|
|
|
}
|
|
|
|
|
2023-05-19 13:35:12 +02:00
|
|
|
if !rootCfg.Section("actions").Key("ENABLED").MustBool(Actions.Enabled) {
|
2023-05-05 14:02:30 +02:00
|
|
|
Repository.DisabledRepoUnits = append(Repository.DisabledRepoUnits, "repo.actions")
|
|
|
|
}
|
|
|
|
|
2020-09-19 18:44:55 +02: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 00:20:19 +02: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 04:12:44 +01:00
|
|
|
if !filepath.IsAbs(Repository.Upload.TempPath) {
|
|
|
|
Repository.Upload.TempPath = path.Join(AppWorkPath, Repository.Upload.TempPath)
|
|
|
|
}
|
2021-06-23 23:12:38 +02:00
|
|
|
|
2023-06-14 05:42:38 +02:00
|
|
|
if err := loadRepoArchiveFrom(rootCfg); err != nil {
|
|
|
|
log.Fatal("loadRepoArchiveFrom: %v", err)
|
|
|
|
}
|
2019-03-16 04:12:44 +01:00
|
|
|
}
|