]> source.dussan.org Git - gitea.git/commitdiff
fix #580
authorUnknwon <joe2010xtmf@163.com>
Sun, 30 Nov 2014 07:26:29 +0000 (02:26 -0500)
committerUnknwon <joe2010xtmf@163.com>
Sun, 30 Nov 2014 07:26:29 +0000 (02:26 -0500)
conf/app.ini
conf/locale/locale_en-US.ini
gogs.go
models/repo.go
models/user.go
modules/cron/manager.go
modules/setting/setting.go
routers/admin/admin.go
templates/.VERSION
templates/admin/dashboard.tmpl

index dba75ed1b57779079d01b7cf9feed72c649f3a17..0fec297bc5969f845dfa2edde09403b7cb17f18c 100644 (file)
@@ -257,6 +257,12 @@ 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 = 
+; Arguments for command 'git gc', e.g.: "--aggressive --auto"
+; see more on http://git-scm.com/docs/git-gc/1.7.5
+GC_ARGS = 
 
 [i18n]
 LANGS = en-US,zh-CN,zh-HK,de-DE,fr-CA,nl-NL
index d798f23eccc93f13b36617b51f313aeda656a0d5..2b6081120650b02ff9c0ff05962a51c4acbc46bc 100644 (file)
@@ -476,6 +476,8 @@ dashboard.delete_inactivate_accounts = Delete all inactive accounts
 dashboard.delete_inactivate_accounts_success = All inactivate accounts have been deleted successfully.
 dashboard.delete_repo_archives = Delete all repositories archives
 dashboard.delete_repo_archives_success = All repositories archives have been deleted successfully.
+dashboard.git_gc_repos = Do garbage collection on repositories
+dashboard.git_gc_repos_success = All repositories have done garbage collection successfully.
 dashboard.server_uptime = Server Uptime
 dashboard.current_goroutine = Current Goroutines
 dashboard.current_memory_usage = Current Memory Usage
diff --git a/gogs.go b/gogs.go
index c555b56ccc47a6c011a3b13b59587ae1a331201e..ec8fa486951a9165c20961b5ac1c76c5221ed496 100644 (file)
--- a/gogs.go
+++ b/gogs.go
@@ -17,7 +17,7 @@ import (
        "github.com/gogits/gogs/modules/setting"
 )
 
-const APP_VER = "0.5.8.1128 Beta"
+const APP_VER = "0.5.8.1130 Beta"
 
 func init() {
        runtime.GOMAXPROCS(runtime.NumCPU())
index e4f470680fadf9b5633e8551088e262befbc6445..5676a443ff84709a0136e2ff89a144fe5df47071 100644 (file)
@@ -1140,18 +1140,8 @@ type SearchOption struct {
        Private bool
 }
 
-// FilterSQLInject tries to prevent SQL injection.
-func FilterSQLInject(key string) string {
-       key = strings.TrimSpace(key)
-       key = strings.Split(key, " ")[0]
-       key = strings.Replace(key, ",", "", -1)
-       return key
-}
-
 // SearchRepositoryByName returns given number of repositories whose name contains keyword.
 func SearchRepositoryByName(opt SearchOption) (repos []*Repository, err error) {
-       // Prevent SQL inject.
-       opt.Keyword = FilterSQLInject(opt.Keyword)
        if len(opt.Keyword) == 0 {
                return repos, nil
        }
@@ -1183,6 +1173,47 @@ func DeleteRepositoryArchives() error {
                })
 }
 
+// GitFsck calls 'git fsck' to check repository health.
+func GitFsck() {
+       args := append([]string{"fsck"}, setting.GitFsckArgs...)
+       if err := x.Where("id > 0").Iterate(new(Repository),
+               func(idx int, bean interface{}) error {
+                       repo := bean.(*Repository)
+                       if err := repo.GetOwner(); err != nil {
+                               return err
+                       }
+
+                       repoPath := RepoPath(repo.Owner.Name, repo.Name)
+                       _, _, err := process.ExecDir(-1, repoPath, "Repository health check", "git", args...)
+                       if err != nil {
+                               desc := fmt.Sprintf("Fail to health check repository(%s)", repoPath)
+                               log.Warn(desc)
+                               if err = CreateRepositoryNotice(desc); err != nil {
+                                       log.Error(4, "Fail to add notice: %v", err)
+                               }
+                       }
+                       return nil
+               }); err != nil {
+               log.Error(4, "repo.Fsck: %v", err)
+       }
+}
+
+func GitGcRepos() error {
+       args := append([]string{"gc"}, setting.GitGcArgs...)
+       return x.Where("id > 0").Iterate(new(Repository),
+               func(idx int, bean interface{}) error {
+                       repo := bean.(*Repository)
+                       if err := repo.GetOwner(); err != nil {
+                               return err
+                       }
+                       _, stderr, err := process.ExecDir(-1, RepoPath(repo.Owner.Name, repo.Name), "Repository garbage collection", "git", args...)
+                       if err != nil {
+                               return fmt.Errorf("%v: %v", err, stderr)
+                       }
+                       return nil
+               })
+}
+
 //  __      __         __         .__
 // /  \    /  \_____ _/  |_  ____ |  |__
 // \   \/\/   /\__  \\   __\/ ___\|  |  \
index 9eead462e24848e44b9b55629ed3e5661b17520a..61a43ba9bf7e5cb7188d9360c56480b3f7c672fa 100644 (file)
@@ -628,7 +628,6 @@ func GetUserByEmail(email string) (*User, error) {
 
 // SearchUserByName returns given number of users whose name contains keyword.
 func SearchUserByName(opt SearchOption) (us []*User, err error) {
-       opt.Keyword = FilterSQLInject(opt.Keyword)
        if len(opt.Keyword) == 0 {
                return us, nil
        }
index 563426fb7940a0564de30d0dfcafe4a8e3a1ba75..fcf559bcb0b2912d89551f0f23187c56caf57803 100644 (file)
@@ -14,8 +14,10 @@ import (
 var c = New()
 
 func NewCronContext() {
+       models.GitFsck()
        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)
        c.Start()
 }
 
index 9737fa7c1daf5f60ea4a4e2156b17e3394fb4bf2..476fc6affa10dd93f9f9bd542df1c202f8f9d9ab 100644 (file)
@@ -109,6 +109,8 @@ var (
 
        // Git settings.
        MaxGitDiffLines int
+       GitFsckArgs     []string
+       GitGcArgs       []string
 
        // I18n settings.
        Langs, Names []string
@@ -288,6 +290,8 @@ func NewConfigContext() {
        DisableGravatar = Cfg.MustBool("picture", "DISABLE_GRAVATAR")
 
        MaxGitDiffLines = Cfg.MustInt("git", "MAX_GITDIFF_LINES", 10000)
+       GitFsckArgs = Cfg.MustValueArray("git", "FSCK_ARGS", " ")
+       GitGcArgs = Cfg.MustValueArray("git", "GC_ARGS", " ")
 
        Langs = Cfg.MustValueArray("i18n", "LANGS", ",")
        Names = Cfg.MustValueArray("i18n", "NAMES", ",")
index db36696c7745d99eab3b8eec145c6cfa52553d6a..99bae8819a4bb384534712852863f2d4f54a68f2 100644 (file)
@@ -117,6 +117,7 @@ const (
        CLEAN_UNBIND_OAUTH AdminOperation = iota + 1
        CLEAN_INACTIVATE_USER
        CLEAN_REPO_ARCHIVES
+       GIT_GC_REPOS
 )
 
 func Dashboard(ctx *middleware.Context) {
@@ -140,6 +141,9 @@ func Dashboard(ctx *middleware.Context) {
                case CLEAN_REPO_ARCHIVES:
                        success = ctx.Tr("admin.dashboard.delete_repo_archives_success")
                        err = models.DeleteRepositoryArchives()
+               case GIT_GC_REPOS:
+                       success = ctx.Tr("admin.dashboard.git_gc_repos_success")
+                       err = models.GitGcRepos()
                }
 
                if err != nil {
index c4127c31a321212587b58d7e69f023a4d81e8e1d..27cf20dd2f3750206400b7ff053ec6b2778ddaa1 100644 (file)
@@ -1 +1 @@
-0.5.8.1128 Beta
\ No newline at end of file
+0.5.8.1130 Beta
\ No newline at end of file
index 70389105966420dbed469b28aaaf7c5eb167437d..8d17c360b0889b911c4ad91a34addf6d2d2a50a1 100644 (file)
                                                 <td>{{.i18n.Tr "admin.dashboard.delete_repo_archives"}}</td>
                                                 <td><i class="fa fa-caret-square-o-right"></i> <a href="{{AppSubUrl}}/admin?op=3">{{.i18n.Tr "admin.dashboard.operation_run"}}</a></td>
                                             </tr>
+                                            <tr>
+                                                <td>{{.i18n.Tr "admin.dashboard.git_gc_repos"}}</td>
+                                                <td><i class="fa fa-caret-square-o-right"></i> <a href="{{AppSubUrl}}/admin?op=4">{{.i18n.Tr "admin.dashboard.operation_run"}}</a></td>
+                                            </tr>
                                         </tbody>
                                     </table>
                                 </div>