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