| @@ -281,21 +281,34 @@ DRIVER = | |||||
| ; Based on xorm, e.g.: root:root@localhost/gogs?charset=utf8 | ; Based on xorm, e.g.: root:root@localhost/gogs?charset=utf8 | ||||
| CONN = | CONN = | ||||
| [cron] | |||||
| ; Enable running cron tasks periodically. | |||||
| ENABLED = true | |||||
| ; Run cron tasks when Gogs starts. | |||||
| RUN_AT_START = false | |||||
| ; Update mirrors | |||||
| [cron.update_mirrors] | |||||
| SCHEDULE = @every 1h | |||||
| ; Repository health check | |||||
| [cron.repo_health_check] | |||||
| SCHEDULE = @every 24h | |||||
| ; Arguments for command 'git fsck', e.g.: "--unreachable --tags" | |||||
| ; see more on http://git-scm.com/docs/git-fsck/1.7.5 | |||||
| ARGS = | |||||
| ; Check repository statistics | |||||
| [cron.check_repo_stats] | |||||
| RUN_AT_START = true | |||||
| SCHEDULE = @every 24h | |||||
| [git] | [git] | ||||
| MAX_GIT_DIFF_LINES = 10000 | MAX_GIT_DIFF_LINES = 10000 | ||||
| ; Arguments for command 'git gc', e.g.: "--aggressive --auto" | ; Arguments for command 'git gc', e.g.: "--aggressive --auto" | ||||
| ; see more on http://git-scm.com/docs/git-gc/1.7.5 | ; see more on http://git-scm.com/docs/git-gc/1.7.5 | ||||
| GC_ARGS = | 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] | [i18n] | ||||
| LANGS = en-US,zh-CN,zh-HK,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT | LANGS = en-US,zh-CN,zh-HK,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT | ||||
| NAMES = English,简体中文,繁體中文,Deutsch,Français,Nederlands,Latviešu,Русский,日本語,Español,Português do Brasil,Polski,български,Italiano | NAMES = English,简体中文,繁體中文,Deutsch,Français,Nederlands,Latviešu,Русский,日本語,Español,Português do Brasil,Polski,български,Italiano | ||||
| @@ -17,7 +17,7 @@ import ( | |||||
| "github.com/gogits/gogs/modules/setting" | "github.com/gogits/gogs/modules/setting" | ||||
| ) | ) | ||||
| const APP_VER = "0.6.5.0817 Beta" | |||||
| const APP_VER = "0.6.5.0818 Beta" | |||||
| func init() { | func init() { | ||||
| runtime.GOMAXPROCS(runtime.NumCPU()) | runtime.GOMAXPROCS(runtime.NumCPU()) | ||||
| @@ -0,0 +1,40 @@ | |||||
| // Copyright 2014 The Gogs Authors. All rights reserved. | |||||
| // Use of this source code is governed by a MIT-style | |||||
| // license that can be found in the LICENSE file. | |||||
| package cron | |||||
| import ( | |||||
| "github.com/gogits/gogs/models" | |||||
| "github.com/gogits/gogs/modules/cron" | |||||
| "github.com/gogits/gogs/modules/setting" | |||||
| ) | |||||
| var c = cron.New() | |||||
| func NewCronContext() { | |||||
| if setting.Cron.UpdateMirror.Enabled { | |||||
| c.AddFunc("Update mirrors", setting.Cron.UpdateMirror.Schedule, models.MirrorUpdate) | |||||
| if setting.Cron.UpdateMirror.RunAtStart { | |||||
| go models.MirrorUpdate() | |||||
| } | |||||
| } | |||||
| if setting.Cron.RepoHealthCheck.Enabled { | |||||
| c.AddFunc("Repository health check", setting.Cron.RepoHealthCheck.Schedule, models.GitFsck) | |||||
| if setting.Cron.RepoHealthCheck.RunAtStart { | |||||
| go models.GitFsck() | |||||
| } | |||||
| } | |||||
| if setting.Cron.CheckRepoStats.Enabled { | |||||
| c.AddFunc("Check repository statistics", setting.Cron.CheckRepoStats.Schedule, models.CheckRepoStats) | |||||
| if setting.Cron.CheckRepoStats.RunAtStart { | |||||
| go models.CheckRepoStats() | |||||
| } | |||||
| } | |||||
| c.Start() | |||||
| } | |||||
| // ListTasks returns all running cron tasks. | |||||
| func ListTasks() []*cron.Entry { | |||||
| return c.Entries() | |||||
| } | |||||
| @@ -1108,7 +1108,7 @@ func RewriteRepositoryUpdateHook() error { | |||||
| } | } | ||||
| var ( | var ( | ||||
| // Prevent duplicate tasks. | |||||
| // Prevent duplicate running tasks. | |||||
| isMirrorUpdating = false | isMirrorUpdating = false | ||||
| isGitFscking = false | isGitFscking = false | ||||
| isCheckingRepos = false | isCheckingRepos = false | ||||
| @@ -1164,7 +1164,7 @@ func GitFsck() { | |||||
| isGitFscking = true | isGitFscking = true | ||||
| defer func() { isGitFscking = false }() | defer func() { isGitFscking = false }() | ||||
| args := append([]string{"fsck"}, setting.Git.Fsck.Args...) | |||||
| args := append([]string{"fsck"}, setting.Cron.RepoHealthCheck.Args...) | |||||
| if err := x.Where("id > 0").Iterate(new(Repository), | if err := x.Where("id > 0").Iterate(new(Repository), | ||||
| func(idx int, bean interface{}) error { | func(idx int, bean interface{}) error { | ||||
| repo := bean.(*Repository) | repo := bean.(*Repository) | ||||
| @@ -1216,7 +1216,7 @@ func CheckRepoStats() { | |||||
| log.Error(4, "select repository check 'watch': %v", err) | log.Error(4, "select repository check 'watch': %v", err) | ||||
| } | } | ||||
| for _, repo_id := range results_watch { | for _, repo_id := range results_watch { | ||||
| log.Info("updating repository count 'watch'") | |||||
| log.Trace("updating repository count 'watch'") | |||||
| repoID := com.StrTo(repo_id["id"]).MustInt64() | repoID := com.StrTo(repo_id["id"]).MustInt64() | ||||
| _, err := x.Exec("UPDATE `repository` SET num_watches=(SELECT count(*) FROM `watch` WHERE repo_id=?) WHERE id=?", repoID, repoID) | _, err := x.Exec("UPDATE `repository` SET num_watches=(SELECT count(*) FROM `watch` WHERE repo_id=?) WHERE id=?", repoID, repoID) | ||||
| if err != nil { | if err != nil { | ||||
| @@ -1230,7 +1230,7 @@ func CheckRepoStats() { | |||||
| log.Error(4, "select repository check 'star': %v", err) | log.Error(4, "select repository check 'star': %v", err) | ||||
| } | } | ||||
| for _, repo_id := range results_star { | for _, repo_id := range results_star { | ||||
| log.Info("updating repository count 'star'") | |||||
| log.Trace("updating repository count 'star'") | |||||
| repoID := com.StrTo(repo_id["id"]).MustInt64() | repoID := com.StrTo(repo_id["id"]).MustInt64() | ||||
| _, err := x.Exec("UPDATE `repository` SET .num_stars=(SELECT count(*) FROM `star` WHERE repo_id=?) WHERE id=?", repoID, repoID) | _, err := x.Exec("UPDATE `repository` SET .num_stars=(SELECT count(*) FROM `star` WHERE repo_id=?) WHERE id=?", repoID, repoID) | ||||
| if err != nil { | if err != nil { | ||||
| @@ -1,27 +0,0 @@ | |||||
| // Copyright 2014 The Gogs Authors. All rights reserved. | |||||
| // Use of this source code is governed by a MIT-style | |||||
| // license that can be found in the LICENSE file. | |||||
| package cron | |||||
| import ( | |||||
| "fmt" | |||||
| "github.com/gogits/gogs/models" | |||||
| "github.com/gogits/gogs/modules/setting" | |||||
| ) | |||||
| var c = New() | |||||
| func NewCronContext() { | |||||
| c.AddFunc("Update mirrors", "@every 1h", models.MirrorUpdate) | |||||
| if setting.Git.Fsck.Enable { | |||||
| c.AddFunc("Repository health check", fmt.Sprintf("@every %dh", setting.Git.Fsck.Interval), models.GitFsck) | |||||
| } | |||||
| c.AddFunc("Check repository statistics", "@every 24h", models.CheckRepoStats) | |||||
| c.Start() | |||||
| } | |||||
| func ListEntries() []*Entry { | |||||
| return c.Entries() | |||||
| } | |||||
| @@ -126,11 +126,26 @@ var ( | |||||
| Git struct { | Git struct { | ||||
| MaxGitDiffLines int | MaxGitDiffLines int | ||||
| GcArgs []string `delim:" "` | GcArgs []string `delim:" "` | ||||
| Fsck struct { | |||||
| Enable bool | |||||
| Interval int | |||||
| Args []string `delim:" "` | |||||
| } `ini:"git.fsck"` | |||||
| } | |||||
| // Cron tasks. | |||||
| Cron struct { | |||||
| UpdateMirror struct { | |||||
| Enabled bool | |||||
| RunAtStart bool | |||||
| Schedule string | |||||
| } `ini:"cron.update_mirrors"` | |||||
| RepoHealthCheck struct { | |||||
| Enabled bool | |||||
| RunAtStart bool | |||||
| Schedule string | |||||
| Args []string `delim:" "` | |||||
| } `ini:"cron.repo_health_check"` | |||||
| CheckRepoStats struct { | |||||
| Enabled bool | |||||
| RunAtStart bool | |||||
| Schedule string | |||||
| } `ini:"cron.check_repo_stats"` | |||||
| } | } | ||||
| // I18n settings. | // I18n settings. | ||||
| @@ -361,6 +376,8 @@ func NewConfigContext() { | |||||
| if err = Cfg.Section("git").MapTo(&Git); err != nil { | if err = Cfg.Section("git").MapTo(&Git); err != nil { | ||||
| log.Fatal(4, "Fail to map Git settings: %v", err) | log.Fatal(4, "Fail to map Git settings: %v", err) | ||||
| } else if Cfg.Section("cron").MapTo(&Cron); err != nil { | |||||
| log.Fatal(4, "Fail to map Cron settings: %v", err) | |||||
| } | } | ||||
| Langs = Cfg.Section("i18n").Key("LANGS").Strings(",") | Langs = Cfg.Section("i18n").Key("LANGS").Strings(",") | ||||
| @@ -14,8 +14,8 @@ import ( | |||||
| "github.com/Unknwon/macaron" | "github.com/Unknwon/macaron" | ||||
| "github.com/gogits/gogs/models" | "github.com/gogits/gogs/models" | ||||
| "github.com/gogits/gogs/models/cron" | |||||
| "github.com/gogits/gogs/modules/base" | "github.com/gogits/gogs/modules/base" | ||||
| "github.com/gogits/gogs/modules/cron" | |||||
| "github.com/gogits/gogs/modules/middleware" | "github.com/gogits/gogs/modules/middleware" | ||||
| "github.com/gogits/gogs/modules/process" | "github.com/gogits/gogs/modules/process" | ||||
| "github.com/gogits/gogs/modules/setting" | "github.com/gogits/gogs/modules/setting" | ||||
| @@ -229,6 +229,6 @@ func Monitor(ctx *middleware.Context) { | |||||
| ctx.Data["PageIsAdmin"] = true | ctx.Data["PageIsAdmin"] = true | ||||
| ctx.Data["PageIsAdminMonitor"] = true | ctx.Data["PageIsAdminMonitor"] = true | ||||
| ctx.Data["Processes"] = process.Processes | ctx.Data["Processes"] = process.Processes | ||||
| ctx.Data["Entries"] = cron.ListEntries() | |||||
| ctx.Data["Entries"] = cron.ListTasks() | |||||
| ctx.HTML(200, MONITOR) | ctx.HTML(200, MONITOR) | ||||
| } | } | ||||
| @@ -18,9 +18,9 @@ import ( | |||||
| "gopkg.in/ini.v1" | "gopkg.in/ini.v1" | ||||
| "github.com/gogits/gogs/models" | "github.com/gogits/gogs/models" | ||||
| "github.com/gogits/gogs/models/cron" | |||||
| "github.com/gogits/gogs/modules/auth" | "github.com/gogits/gogs/modules/auth" | ||||
| "github.com/gogits/gogs/modules/base" | "github.com/gogits/gogs/modules/base" | ||||
| "github.com/gogits/gogs/modules/cron" | |||||
| "github.com/gogits/gogs/modules/log" | "github.com/gogits/gogs/modules/log" | ||||
| "github.com/gogits/gogs/modules/mailer" | "github.com/gogits/gogs/modules/mailer" | ||||
| "github.com/gogits/gogs/modules/middleware" | "github.com/gogits/gogs/modules/middleware" | ||||
| @@ -1 +1 @@ | |||||
| 0.6.5.0817 Beta | |||||
| 0.6.5.0818 Beta | |||||