mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-10-23 18:42:26 +00:00
Replaces `Gitea` with `Forgejo` in the default config settings for new installs. This will not affect existing installs. Co-authored-by: Caesar Schinas <caesar@caesarschinas.com> Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/140 Co-authored-by: Caesar Schinas <caesar@noreply.codeberg.org> Co-committed-by: Caesar Schinas <caesar@noreply.codeberg.org> (cherry picked from commitca1319aa16) (cherry picked from commit52a4d238a0) (cherry picked from commitf63536538c) Conflicts: web_src/js/features/install.js (cherry picked from commit861cc434e1) (cherry picked from commit0e6ea60c80) (cherry picked from commit0cbc0ec15d) (cherry picked from commit3cc19b0ae2) (cherry picked from commit50fcb885fe) (cherry picked from commitf6039d4df4) (cherry picked from commit5ae5c6ba2d) (cherry picked from commitf0b565e0ed) (cherry picked from commitadbd4d2015) (cherry picked from commitd26c540ffd) (cherry picked from commit6df6781b42) (cherry picked from commitb6fb56e1c4) (cherry picked from commitbb4f98a0ca) (cherry picked from commit6779229f27) (cherry picked from commitc216c85aee) (cherry picked from commitdff780bced) (cherry picked from commit4e036aa3b6) (cherry picked from commit8b3bc3e8a6) (cherry picked from commit1e4d852332) (cherry picked from commit07a15d1844) (cherry picked from commitfb44b3e10d) (cherry picked from commitb212d83319) (cherry picked from commit5754971be5) (cherry picked from commit0c43b4e82c) Conflicts: routers/install/install.go https://codeberg.org/forgejo/forgejo/pulls/1351 (cherry picked from commit2e22a7208a) (cherry picked from commit676b0a8a48) (cherry picked from commitbc4a8bf9bc) (cherry picked from commit5e09a4e174) (cherry picked from commit712c52a32a) (cherry picked from commitba3d93cc4a) (cherry picked from commita5a0396abc)
361 lines
12 KiB
Go
361 lines
12 KiB
Go
// Copyright 2019 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package setting
|
|
|
|
import (
|
|
"os/exec"
|
|
"path"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"code.gitea.io/gitea/modules/log"
|
|
)
|
|
|
|
// enumerates all the policy repository creating
|
|
const (
|
|
RepoCreatingLastUserVisibility = "last"
|
|
RepoCreatingPrivate = "private"
|
|
RepoCreatingPublic = "public"
|
|
)
|
|
|
|
// ItemsPerPage maximum items per page in forks, watchers and stars of a repo
|
|
const ItemsPerPage = 40
|
|
|
|
// Repository settings
|
|
var (
|
|
Repository = struct {
|
|
DetectedCharsetsOrder []string
|
|
DetectedCharsetScore map[string]int `ini:"-"`
|
|
AnsiCharset string
|
|
ForcePrivate bool
|
|
DefaultPrivate string
|
|
DefaultPushCreatePrivate bool
|
|
MaxCreationLimit int
|
|
PreferredLicenses []string
|
|
DisableHTTPGit bool
|
|
AccessControlAllowOrigin string
|
|
UseCompatSSHURI bool
|
|
GoGetCloneURLProtocol string
|
|
DefaultCloseIssuesViaCommitsInAnyBranch bool
|
|
EnablePushCreateUser bool
|
|
EnablePushCreateOrg bool
|
|
DisabledRepoUnits []string
|
|
DefaultRepoUnits []string
|
|
DefaultForkRepoUnits []string
|
|
PrefixArchiveFiles bool
|
|
DisableMigrations bool
|
|
DisableStars bool `ini:"DISABLE_STARS"`
|
|
DefaultBranch string
|
|
AllowAdoptionOfUnadoptedRepositories bool
|
|
AllowDeleteOfUnadoptedRepositories bool
|
|
DisableDownloadSourceArchives bool
|
|
AllowForkWithoutMaximumLimit bool
|
|
|
|
// Repository editor settings
|
|
Editor struct {
|
|
LineWrapExtensions []string
|
|
} `ini:"-"`
|
|
|
|
// Repository upload settings
|
|
Upload struct {
|
|
Enabled bool
|
|
TempPath string
|
|
AllowedTypes string
|
|
FileMaxSize int64
|
|
MaxFiles int
|
|
} `ini:"-"`
|
|
|
|
// Repository local settings
|
|
Local struct {
|
|
LocalCopyPath string
|
|
} `ini:"-"`
|
|
|
|
// Pull request settings
|
|
PullRequest struct {
|
|
WorkInProgressPrefixes []string
|
|
CloseKeywords []string
|
|
ReopenKeywords []string
|
|
DefaultMergeStyle string
|
|
DefaultMergeMessageCommitsLimit int
|
|
DefaultMergeMessageSize int
|
|
DefaultMergeMessageAllAuthors bool
|
|
DefaultMergeMessageMaxApprovers int
|
|
DefaultMergeMessageOfficialApproversOnly bool
|
|
PopulateSquashCommentWithCommitMessages bool
|
|
AddCoCommitterTrailers bool
|
|
TestConflictingPatchesWithGitApply bool
|
|
} `ini:"repository.pull-request"`
|
|
|
|
// Issue Setting
|
|
Issue struct {
|
|
LockReasons []string
|
|
MaxPinned int
|
|
} `ini:"repository.issue"`
|
|
|
|
Release struct {
|
|
AllowedTypes string
|
|
DefaultPagingNum int
|
|
} `ini:"repository.release"`
|
|
|
|
Signing struct {
|
|
SigningKey string
|
|
SigningName string
|
|
SigningEmail string
|
|
InitialCommit []string
|
|
CRUDActions []string `ini:"CRUD_ACTIONS"`
|
|
Merges []string
|
|
Wiki []string
|
|
DefaultTrustModel string
|
|
} `ini:"repository.signing"`
|
|
}{
|
|
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{},
|
|
AnsiCharset: "",
|
|
ForcePrivate: false,
|
|
DefaultPrivate: RepoCreatingLastUserVisibility,
|
|
DefaultPushCreatePrivate: true,
|
|
MaxCreationLimit: -1,
|
|
PreferredLicenses: []string{"Apache License 2.0", "MIT License"},
|
|
DisableHTTPGit: false,
|
|
AccessControlAllowOrigin: "",
|
|
UseCompatSSHURI: false,
|
|
DefaultCloseIssuesViaCommitsInAnyBranch: false,
|
|
EnablePushCreateUser: false,
|
|
EnablePushCreateOrg: false,
|
|
DisabledRepoUnits: []string{},
|
|
DefaultRepoUnits: []string{},
|
|
DefaultForkRepoUnits: []string{},
|
|
PrefixArchiveFiles: true,
|
|
DisableMigrations: false,
|
|
DisableStars: false,
|
|
DefaultBranch: "main",
|
|
AllowForkWithoutMaximumLimit: true,
|
|
|
|
// Repository editor settings
|
|
Editor: struct {
|
|
LineWrapExtensions []string
|
|
}{
|
|
LineWrapExtensions: strings.Split(".txt,.md,.markdown,.mdown,.mkd,.livemd,", ","),
|
|
},
|
|
|
|
// Repository upload settings
|
|
Upload: struct {
|
|
Enabled bool
|
|
TempPath string
|
|
AllowedTypes string
|
|
FileMaxSize int64
|
|
MaxFiles int
|
|
}{
|
|
Enabled: true,
|
|
TempPath: "data/tmp/uploads",
|
|
AllowedTypes: "",
|
|
FileMaxSize: 3,
|
|
MaxFiles: 5,
|
|
},
|
|
|
|
// Repository local settings
|
|
Local: struct {
|
|
LocalCopyPath string
|
|
}{
|
|
LocalCopyPath: "tmp/local-repo",
|
|
},
|
|
|
|
// Pull request settings
|
|
PullRequest: struct {
|
|
WorkInProgressPrefixes []string
|
|
CloseKeywords []string
|
|
ReopenKeywords []string
|
|
DefaultMergeStyle string
|
|
DefaultMergeMessageCommitsLimit int
|
|
DefaultMergeMessageSize int
|
|
DefaultMergeMessageAllAuthors bool
|
|
DefaultMergeMessageMaxApprovers int
|
|
DefaultMergeMessageOfficialApproversOnly bool
|
|
PopulateSquashCommentWithCommitMessages bool
|
|
AddCoCommitterTrailers bool
|
|
TestConflictingPatchesWithGitApply bool
|
|
}{
|
|
WorkInProgressPrefixes: []string{"WIP:", "[WIP]"},
|
|
// Same as GitHub. See
|
|
// https://help.github.com/articles/closing-issues-via-commit-messages
|
|
CloseKeywords: strings.Split("close,closes,closed,fix,fixes,fixed,resolve,resolves,resolved", ","),
|
|
ReopenKeywords: strings.Split("reopen,reopens,reopened", ","),
|
|
DefaultMergeStyle: "merge",
|
|
DefaultMergeMessageCommitsLimit: 50,
|
|
DefaultMergeMessageSize: 5 * 1024,
|
|
DefaultMergeMessageAllAuthors: false,
|
|
DefaultMergeMessageMaxApprovers: 10,
|
|
DefaultMergeMessageOfficialApproversOnly: true,
|
|
PopulateSquashCommentWithCommitMessages: false,
|
|
AddCoCommitterTrailers: true,
|
|
},
|
|
|
|
// Issue settings
|
|
Issue: struct {
|
|
LockReasons []string
|
|
MaxPinned int
|
|
}{
|
|
LockReasons: strings.Split("Too heated,Off-topic,Spam,Resolved", ","),
|
|
MaxPinned: 3,
|
|
},
|
|
|
|
Release: struct {
|
|
AllowedTypes string
|
|
DefaultPagingNum int
|
|
}{
|
|
AllowedTypes: "",
|
|
DefaultPagingNum: 10,
|
|
},
|
|
|
|
// Signing settings
|
|
Signing: struct {
|
|
SigningKey string
|
|
SigningName string
|
|
SigningEmail string
|
|
InitialCommit []string
|
|
CRUDActions []string `ini:"CRUD_ACTIONS"`
|
|
Merges []string
|
|
Wiki []string
|
|
DefaultTrustModel string
|
|
}{
|
|
SigningKey: "default",
|
|
SigningName: "",
|
|
SigningEmail: "",
|
|
InitialCommit: []string{"always"},
|
|
CRUDActions: []string{"pubkey", "twofa", "parentsigned"},
|
|
Merges: []string{"pubkey", "twofa", "basesigned", "commitssigned"},
|
|
Wiki: []string{"never"},
|
|
DefaultTrustModel: "collaborator",
|
|
},
|
|
}
|
|
RepoRootPath string
|
|
ScriptType = "bash"
|
|
)
|
|
|
|
func loadRepositoryFrom(rootCfg ConfigProvider) {
|
|
var err error
|
|
// Determine and create root git repository path.
|
|
sec := rootCfg.Section("repository")
|
|
Repository.DisableHTTPGit = sec.Key("DISABLE_HTTP_GIT").MustBool()
|
|
Repository.UseCompatSSHURI = sec.Key("USE_COMPAT_SSH_URI").MustBool()
|
|
Repository.GoGetCloneURLProtocol = sec.Key("GO_GET_CLONE_URL_PROTOCOL").MustString("https")
|
|
Repository.MaxCreationLimit = sec.Key("MAX_CREATION_LIMIT").MustInt(-1)
|
|
Repository.DefaultBranch = sec.Key("DEFAULT_BRANCH").MustString(Repository.DefaultBranch)
|
|
RepoRootPath = sec.Key("ROOT").MustString(path.Join(AppDataPath, "forgejo-repositories"))
|
|
if !filepath.IsAbs(RepoRootPath) {
|
|
RepoRootPath = filepath.Join(AppWorkPath, RepoRootPath)
|
|
} else {
|
|
RepoRootPath = filepath.Clean(RepoRootPath)
|
|
}
|
|
defaultDetectedCharsetsOrder := make([]string, 0, len(Repository.DetectedCharsetsOrder))
|
|
for _, charset := range Repository.DetectedCharsetsOrder {
|
|
defaultDetectedCharsetsOrder = append(defaultDetectedCharsetsOrder, strings.ToLower(strings.TrimSpace(charset)))
|
|
}
|
|
ScriptType = sec.Key("SCRIPT_TYPE").MustString("bash")
|
|
|
|
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)
|
|
}
|
|
|
|
if err = sec.MapTo(&Repository); err != nil {
|
|
log.Fatal("Failed to map Repository settings: %v", err)
|
|
} else if err = rootCfg.Section("repository.editor").MapTo(&Repository.Editor); err != nil {
|
|
log.Fatal("Failed to map Repository.Editor settings: %v", err)
|
|
} else if err = rootCfg.Section("repository.upload").MapTo(&Repository.Upload); err != nil {
|
|
log.Fatal("Failed to map Repository.Upload settings: %v", err)
|
|
} else if err = rootCfg.Section("repository.local").MapTo(&Repository.Local); err != nil {
|
|
log.Fatal("Failed to map Repository.Local settings: %v", err)
|
|
} else if err = rootCfg.Section("repository.pull-request").MapTo(&Repository.PullRequest); err != nil {
|
|
log.Fatal("Failed to map Repository.PullRequest settings: %v", err)
|
|
}
|
|
|
|
if !rootCfg.Section("packages").Key("ENABLED").MustBool(Packages.Enabled) {
|
|
Repository.DisabledRepoUnits = append(Repository.DisabledRepoUnits, "repo.packages")
|
|
}
|
|
|
|
if !rootCfg.Section("actions").Key("ENABLED").MustBool(Actions.Enabled) {
|
|
Repository.DisabledRepoUnits = append(Repository.DisabledRepoUnits, "repo.actions")
|
|
}
|
|
|
|
// 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
|
|
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++
|
|
}
|
|
}
|
|
|
|
if !filepath.IsAbs(Repository.Upload.TempPath) {
|
|
Repository.Upload.TempPath = path.Join(AppWorkPath, Repository.Upload.TempPath)
|
|
}
|
|
|
|
if err := loadRepoArchiveFrom(rootCfg); err != nil {
|
|
log.Fatal("loadRepoArchiveFrom: %v", err)
|
|
}
|
|
}
|