From c73e9057ae949bd0c0bf329b23d4e5da4ac154d0 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Fri, 2 Jan 2015 20:14:43 +0800 Subject: [PATCH] Optmize git-fsck options and fix #820 --- cmd/web.go | 2 ++ conf/app.ini | 14 ++++++++++---- models/repo.go | 4 ++-- modules/cron/manager.go | 4 +++- modules/setting/setting.go | 20 +++++++++++++------- routers/repo/commit.go | 4 ++-- 6 files changed, 32 insertions(+), 16 deletions(-) diff --git a/cmd/web.go b/cmd/web.go index 51f146f374..3c25b9df22 100644 --- a/cmd/web.go +++ b/cmd/web.go @@ -25,6 +25,7 @@ import ( "github.com/macaron-contrib/oauth2" "github.com/macaron-contrib/session" "github.com/macaron-contrib/toolbox" + "gopkg.in/ini.v1" api "github.com/gogits/go-gogs-client" @@ -79,6 +80,7 @@ func checkVersion() { {"github.com/macaron-contrib/csrf", csrf.Version, "0.0.1"}, {"github.com/macaron-contrib/i18n", i18n.Version, "0.0.5"}, {"github.com/macaron-contrib/session", session.Version, "0.1.1"}, + {"gopkg.in/ini.v1", ini.Version, "1.0.1"}, } for _, c := range checkers { ver := strings.Join(strings.Split(c.Version(), ".")[:3], ".") diff --git a/conf/app.ini b/conf/app.ini index 467b430365..c191d105cd 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -260,14 +260,20 @@ DRIVER = CONN = [git] -MAX_GITDIFF_LINES = 10000 -; Arguments for command 'git fsck', e.g.: "--unreachable --tags" -; see more on http://git-scm.com/docs/git-fsck/1.7.5 -FSCK_ARGS = +MAX_GIT_DIFF_LINES = 10000 ; Arguments for command 'git gc', e.g.: "--aggressive --auto" ; see more on http://git-scm.com/docs/git-gc/1.7.5 GC_ARGS = +; Git health check. +[git.fsck] +ENABLE = true +; Execution interval in hours. Default is 24. +INTERVAL = 24 +; Arguments for command 'git fsck', e.g.: "--unreachable --tags" +; see more on http://git-scm.com/docs/git-fsck/1.7.5 +ARGS = + [i18n] LANGS = en-US,zh-CN,zh-HK,de-DE,fr-CA,nl-NL,lv-LV NAMES = English,简体中文,繁體中文,Deutsch,Français,Nederlands,Latviešu diff --git a/models/repo.go b/models/repo.go index 77c4b140db..65689b6a1e 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1228,7 +1228,7 @@ func GitFsck() { isGitFscking = true defer func() { isGitFscking = false }() - args := append([]string{"fsck"}, setting.GitFsckArgs...) + args := append([]string{"fsck"}, setting.Git.Fsck.Args...) if err := x.Where("id > 0").Iterate(new(Repository), func(idx int, bean interface{}) error { repo := bean.(*Repository) @@ -1252,7 +1252,7 @@ func GitFsck() { } func GitGcRepos() error { - args := append([]string{"gc"}, setting.GitGcArgs...) + args := append([]string{"gc"}, setting.Git.GcArgs...) return x.Where("id > 0").Iterate(new(Repository), func(idx int, bean interface{}) error { repo := bean.(*Repository) diff --git a/modules/cron/manager.go b/modules/cron/manager.go index 49b1a99cee..135fec4faa 100644 --- a/modules/cron/manager.go +++ b/modules/cron/manager.go @@ -16,7 +16,9 @@ var c = New() func NewCronContext() { c.AddFunc("Update mirrors", "@every 1h", models.MirrorUpdate) c.AddFunc("Deliver hooks", fmt.Sprintf("@every %dm", setting.WebhookTaskInterval), models.DeliverHooks) - c.AddFunc("Repository health check", "@every 1h", models.GitFsck) + if setting.Git.Fsck.Enable { + c.AddFunc("Repository health check", fmt.Sprintf("@every %dh", setting.Git.Fsck.Interval), models.GitFsck) + } c.Start() } diff --git a/modules/setting/setting.go b/modules/setting/setting.go index c4d3d3a6c2..bc9da3c63a 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -107,9 +107,15 @@ var ( SessionConfig session.Options // Git settings. - MaxGitDiffLines int - GitFsckArgs []string - GitGcArgs []string + Git struct { + MaxGitDiffLines int + GcArgs []string `delim:" "` + Fsck struct { + Enable bool + Interval int + Args []string `delim:" "` + } `ini:"git.fsck"` + } // I18n settings. Langs, Names []string @@ -174,6 +180,7 @@ func NewConfigContext() { } else { log.Warn("No custom 'conf/app.ini' found, please go to '/install'") } + Cfg.NameMapper = ini.AllCapsUnderscore LogRootPath = Cfg.Section("log").Key("ROOT_PATH").MustString(path.Join(workDir, "log")) @@ -291,10 +298,9 @@ func NewConfigContext() { } DisableGravatar = sec.Key("DISABLE_GRAVATAR").MustBool() - sec = Cfg.Section("git") - MaxGitDiffLines = sec.Key("MAX_GITDIFF_LINES").MustInt(10000) - GitFsckArgs = sec.Key("FSCK_ARGS").Strings(" ") - GitGcArgs = sec.Key("GC_ARGS").Strings(" ") + if err = Cfg.Section("git").MapTo(&Git); err != nil { + log.Fatal(4, "Fail to map Git settings: %v", err) + } Langs = Cfg.Section("i18n").Key("LANGS").Strings(",") Names = Cfg.Section("i18n").Key("NAMES").Strings(",") diff --git a/routers/repo/commit.go b/routers/repo/commit.go index 619c6c815c..4571b24f2a 100644 --- a/routers/repo/commit.go +++ b/routers/repo/commit.go @@ -208,7 +208,7 @@ func Diff(ctx *middleware.Context) { commit := ctx.Repo.Commit commit.CommitMessage = string(base.RenderIssueIndexPattern([]byte(commit.CommitMessage), ctx.Repo.RepoLink)) diff, err := models.GetDiffCommit(models.RepoPath(userName, repoName), - commitId, setting.MaxGitDiffLines) + commitId, setting.Git.MaxGitDiffLines) if err != nil { ctx.Handle(404, "GetDiffCommit", err) return @@ -272,7 +272,7 @@ func CompareDiff(ctx *middleware.Context) { } diff, err := models.GetDiffRange(models.RepoPath(userName, repoName), beforeCommitId, - afterCommitId, setting.MaxGitDiffLines) + afterCommitId, setting.Git.MaxGitDiffLines) if err != nil { ctx.Handle(404, "GetDiffRange", err) return