mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2026-06-05 20:50:27 +00:00
Weirdly, git doesn't verify the consistency of objects when receiving new objects. Enable that git verifies this, so we don't allow a repository to get in a weird or even corrupt state. We've already dealt with a few cases of inconsistent objects, the most notable one being mode of objects (forgejo/forgejo!9161). This can be risky, as such ignore 3 consistency checks that are not harmful to ignore and is battle tested by Gitlab. bad timezone:692a0d3476missing space:2da0b39399non-zero padded filemode:db8f2e8da5Typically we set these settings in `modules/git/git.go`, but that means a instance administrator wouldn't be able to override it. Given we don't strictly require these settings to be set. A instance admin could choose to disable the consistency checks or override our set of ignores this would allow them to do so via the `[git.config]` section. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/12695 Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org> Reviewed-by: elle <0xllx0@noreply.codeberg.org>
119 lines
3.1 KiB
Go
119 lines
3.1 KiB
Go
// Copyright 2019 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package setting
|
|
|
|
import (
|
|
"path/filepath"
|
|
"strings"
|
|
"time"
|
|
|
|
"forgejo.org/modules/log"
|
|
)
|
|
|
|
// Git settings
|
|
var Git = struct {
|
|
Path string
|
|
HomePath string
|
|
DisableDiffHighlight bool
|
|
|
|
MaxGitDiffLines int
|
|
MaxGitDiffLineCharacters int
|
|
MaxGitDiffFiles int
|
|
CommitsRangeSize int // CommitsRangeSize the default commits range size
|
|
BranchesRangeSize int // BranchesRangeSize the default branches range size
|
|
VerbosePush bool
|
|
VerbosePushDelay time.Duration
|
|
GCArgs []string `ini:"GC_ARGS" delim:" "`
|
|
PullRequestPushMessage bool
|
|
DisablePartialClone bool
|
|
Timeout struct {
|
|
Default int
|
|
Migrate int
|
|
Mirror int
|
|
Clone int
|
|
Pull int
|
|
GC int `ini:"GC"`
|
|
Grep int
|
|
} `ini:"git.timeout"`
|
|
}{
|
|
DisableDiffHighlight: false,
|
|
MaxGitDiffLines: 1000,
|
|
MaxGitDiffLineCharacters: 5000,
|
|
MaxGitDiffFiles: 100,
|
|
CommitsRangeSize: 50,
|
|
BranchesRangeSize: 20,
|
|
VerbosePush: true,
|
|
VerbosePushDelay: 5 * time.Second,
|
|
GCArgs: []string{},
|
|
PullRequestPushMessage: true,
|
|
DisablePartialClone: false,
|
|
Timeout: struct {
|
|
Default int
|
|
Migrate int
|
|
Mirror int
|
|
Clone int
|
|
Pull int
|
|
GC int `ini:"GC"`
|
|
Grep int
|
|
}{
|
|
Default: 360,
|
|
Migrate: 600,
|
|
Mirror: 300,
|
|
Clone: 300,
|
|
Pull: 300,
|
|
GC: 60,
|
|
Grep: 2,
|
|
},
|
|
}
|
|
|
|
type GitConfigType struct {
|
|
Options map[string]string // git config key is case-insensitive, always use lower-case
|
|
}
|
|
|
|
func (c *GitConfigType) SetOption(key, val string) {
|
|
c.Options[strings.ToLower(key)] = val
|
|
}
|
|
|
|
func (c *GitConfigType) GetOption(key string) string {
|
|
return c.Options[strings.ToLower(key)]
|
|
}
|
|
|
|
var GitConfig = GitConfigType{
|
|
Options: make(map[string]string),
|
|
}
|
|
|
|
func loadGitFrom(rootCfg ConfigProvider) {
|
|
sec := rootCfg.Section("git")
|
|
if err := sec.MapTo(&Git); err != nil {
|
|
log.Fatal("Failed to map Git settings: %v", err)
|
|
}
|
|
|
|
secGitConfig := rootCfg.Section("git.config")
|
|
GitConfig.Options = make(map[string]string)
|
|
GitConfig.SetOption("diff.algorithm", "histogram")
|
|
GitConfig.SetOption("core.logAllRefUpdates", "true")
|
|
GitConfig.SetOption("gc.reflogExpire", "90")
|
|
|
|
GitConfig.SetOption("transfer.fsckObjects", "true")
|
|
// To ignore specific warnings they have to be set for all of the three
|
|
// scenarios. Per git-config(1): "To uniformly configure the same fsck
|
|
// settings in different circumstances, all three of them must be set to the
|
|
// same values."
|
|
for _, prefix := range []string{"fsck.", "fetch.fsck.", "receive.fsck."} {
|
|
GitConfig.SetOption(prefix+"badTimezone", "ignore")
|
|
GitConfig.SetOption(prefix+"missingSpaceBeforeDate", "ignore")
|
|
GitConfig.SetOption(prefix+"zeroPaddedFilemode", "ignore")
|
|
}
|
|
|
|
for _, key := range secGitConfig.Keys() {
|
|
GitConfig.SetOption(key.Name(), key.String())
|
|
}
|
|
|
|
Git.HomePath = sec.Key("HOME_PATH").MustString("home")
|
|
if !filepath.IsAbs(Git.HomePath) {
|
|
Git.HomePath = filepath.Join(AppDataPath, Git.HomePath)
|
|
} else {
|
|
Git.HomePath = filepath.Clean(Git.HomePath)
|
|
}
|
|
}
|