forked from NYANDEV/forgejo
ee52d43903
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 commit ca1319aa16128516e50dabdc8e8cadc23eb71d2f) (cherry picked from commit 52a4d238a0b5bbea28b28e55e35f28c51ecbb2de) (cherry picked from commit f63536538cfe4b010ebb5a6323f4b5e5b6ec7232) Conflicts: web_src/js/features/install.js (cherry picked from commit 861cc434e129f3fbd932ee36067c560e754dab9a) (cherry picked from commit 0e6ea60c802d6cfd95dea4aad5df96bb6e4bc7a5) (cherry picked from commit 0cbc0ec15d9d952b0ecfb68a36bf58cbae0c43dd) (cherry picked from commit 3cc19b0ae214ae163f23efa52ab0aa53eb7c935b) (cherry picked from commit 50fcb885fe2f87a27e6ff778cdd0c7cd97bbe9e9) (cherry picked from commit f6039d4df481fc58b8db3e863158665d24cac847) (cherry picked from commit 5ae5c6ba2deefe829f768900f5e1bbcbe9389e15) (cherry picked from commit f0b565e0ed7fe52f0264e92c49736b487b9bff8a) (cherry picked from commit adbd4d2015e8e2c4789849c84cfa4032acd40b7f) (cherry picked from commit d26c540ffdbfb7ec83412635576ab39653d1b531) (cherry picked from commit 6df6781b42ea126d029ba9e85485dbcb9bf6601d) (cherry picked from commit b6fb56e1c407195bedfe09f91ecb6537024d5189) (cherry picked from commit bb4f98a0ca7515aa6c44529df0573195f779a643) (cherry picked from commit 6779229f2732f6791aba3bd1ba51a338a88ca1f3) (cherry picked from commit d6e878a73973183341b3066595e8835bf2ebf1bf) (cherry picked from commit b3c612f2ab93193e176d19ec2ed804bc1c035724) (cherry picked from commit ab09b75301efa6847dbd120feb8a1e5481f1e6c4) (cherry picked from commit 4bd4279a96e332e0b820df534386d91b4152dd7d) (cherry picked from commit 1882439f8dedae0d80ddb116d07541643cc79eaf)
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)
|
|
}
|
|
}
|