]> source.dussan.org Git - gitea.git/commitdiff
Add repository setting to enable/disable health checks (#3607)
authorAllen Wild <aswild@users.noreply.github.com>
Tue, 27 Mar 2018 14:13:20 +0000 (10:13 -0400)
committerLunny Xiao <xiaolunwen@gmail.com>
Tue, 27 Mar 2018 14:13:20 +0000 (22:13 +0800)
New Feature:
  * Repository struct field for IsFsckEnabled (default true of course)
  * Admin Settings section on repo options page, accessible only by
    admin users

Possible Enhancements:
  * There's no way to force running health checks on all repos
    regardless of their IsFsckEnabled setting. This would be useful if
    there were an admin API or dashboard button to run fsck immediately.

Issue: https://github.com/go-gitea/gitea/issues/1712
Signed-off-by: Allen Wild <allenwild93@gmail.com>
models/migrations/migrations.go
models/migrations/v60.go [new file with mode: 0644]
models/repo.go
modules/auth/repo_form.go
options/locale/locale_en-US.ini
routers/repo/setting.go
templates/repo/settings/options.tmpl

index 6c3404bcd75a6a29cb0373a0af1a3b39a06bec1f..36c84a61aaca99666dcb35054723c3c011ce5aa9 100644 (file)
@@ -172,6 +172,8 @@ var migrations = []Migration{
        NewMigration("add label descriptions", addLabelsDescriptions),
        // v59 -> v60
        NewMigration("add merge whitelist for protected branches", addProtectedBranchMergeWhitelist),
+       // v60 -> v61
+       NewMigration("add is_fsck_enabled column for repos", addFsckEnabledToRepo),
 }
 
 // Migrate database to current version
diff --git a/models/migrations/v60.go b/models/migrations/v60.go
new file mode 100644 (file)
index 0000000..13ec382
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright 2018 The Gitea 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 migrations
+
+import (
+       "fmt"
+
+       "github.com/go-xorm/xorm"
+)
+
+func addFsckEnabledToRepo(x *xorm.Engine) error {
+       type Repository struct {
+               IsFsckEnabled bool `xorm:"NOT NULL DEFAULT true"`
+       }
+
+       if err := x.Sync2(new(Repository)); err != nil {
+               return fmt.Errorf("Sync2: %v", err)
+       }
+       return nil
+}
index e9b3307d9ac1de5de128a17e0e732fddfff6e9b4..300bdbe875b25a79e19b6c45f825b95803ae3ab9 100644 (file)
@@ -198,6 +198,7 @@ type Repository struct {
        BaseRepo      *Repository        `xorm:"-"`
        Size          int64              `xorm:"NOT NULL DEFAULT 0"`
        IndexerStatus *RepoIndexerStatus `xorm:"-"`
+       IsFsckEnabled bool               `xorm:"NOT NULL DEFAULT true"`
 
        CreatedUnix util.TimeStamp `xorm:"INDEX created"`
        UpdatedUnix util.TimeStamp `xorm:"INDEX updated"`
@@ -2173,12 +2174,12 @@ func GitFsck() {
        log.Trace("Doing: GitFsck")
 
        if err := x.
-               Where("id>0").BufferSize(setting.IterateBufferSize).
+               Where("id>0 AND is_fsck_enabled=?", true).BufferSize(setting.IterateBufferSize).
                Iterate(new(Repository),
                        func(idx int, bean interface{}) error {
                                repo := bean.(*Repository)
                                repoPath := repo.RepoPath()
-                               log.Trace(fmt.Sprintf("Running health check for repository %s", repoPath))
+                               log.Trace("Running health check on repository %s", repoPath)
                                if err := git.Fsck(repoPath, setting.Cron.RepoHealthCheck.Timeout, setting.Cron.RepoHealthCheck.Args...); err != nil {
                                        desc := fmt.Sprintf("Failed to health check repository (%s): %v", repoPath, err)
                                        log.Warn(desc)
index 565428c350a93ad9978afa1f26e2ecae98df38fe..7180a05665a8c3387012306903613ed5988c8d0f 100644 (file)
@@ -113,6 +113,9 @@ type RepoSettingForm struct {
        PullsAllowSquash                 bool
        EnableTimetracker                bool
        AllowOnlyContributorsToTrackTime bool
+
+       // Admin settings
+       EnableHealthCheck bool
 }
 
 // Validate validates the fields
index 0bc8309ff81f9aa32c31b49b61b14c504c439c99..136b5e522aa35daf8a48728b76d00a8010a46a0a 100644 (file)
@@ -910,6 +910,8 @@ settings.pulls.ignore_whitespace = Ignore changes in whitespace when checking co
 settings.pulls.allow_merge_commits = Allow merge commits
 settings.pulls.allow_rebase_merge = Allow rebase to merge commits
 settings.pulls.allow_squash_commits = Allow to squash commits before merging
+settings.admin_settings = Admin Settings
+settings.admin_enable_health_check = Enable health checks (git fsck) for this repo
 settings.danger_zone = Danger Zone
 settings.new_owner_has_same_repo = The new owner already has a repository with same name. Please choose another name.
 settings.convert = Convert To Regular Repository
index 6986658b75d1074992c6df2294b7cc9174c08b91..0d44cb50a8f69307164e6841e8abe6df8b7844cc 100644 (file)
@@ -229,6 +229,24 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
                ctx.Flash.Success(ctx.Tr("repo.settings.update_settings_success"))
                ctx.Redirect(ctx.Repo.RepoLink + "/settings")
 
+       case "admin":
+               if !ctx.User.IsAdmin {
+                       ctx.Error(403)
+                       return
+               }
+
+               if repo.IsFsckEnabled != form.EnableHealthCheck {
+                       repo.IsFsckEnabled = form.EnableHealthCheck
+                       if err := models.UpdateRepository(repo, false); err != nil {
+                               ctx.ServerError("UpdateRepository", err)
+                               return
+                       }
+                       log.Trace("Repository admin settings updated: %s/%s", ctx.Repo.Owner.Name, repo.Name)
+               }
+
+               ctx.Flash.Success(ctx.Tr("repo.settings.update_settings_success"))
+               ctx.Redirect(ctx.Repo.RepoLink + "/settings")
+
        case "convert":
                if !ctx.Repo.IsOwner() {
                        ctx.Error(404)
index 01814dcca8eb39c70350bf5c53c641329d7da825..8470d6a5e29194655bb80ad58f84c229b93582dd 100644 (file)
                        </form>
                </div>
 
+               {{if .IsAdmin}}
+               <h4 class="ui top attached header">
+                       {{.i18n.Tr "repo.settings.admin_settings"}}
+               </h4>
+               <div class="ui attached segment">
+                       <form class="ui form" method="post">
+                               {{.CsrfTokenHtml}}
+                               <input type="hidden" name="action" value="admin">
+                               <div class="field">
+                                       <div class="ui checkbox">
+                                               <input name="enable_health_check" type="checkbox" {{if .Repository.IsFsckEnabled}}checked{{end}}>
+                                               <label>{{.i18n.Tr "repo.settings.admin_enable_health_check"}}</label>
+                                       </div>
+                               </div>
+
+                               <div class="ui divider"></div>
+                               <div class="field">
+                                       <button class="ui green button">{{$.i18n.Tr "repo.settings.update_settings"}}</button>
+                               </div>
+                       </form>
+               </div>
+               {{end}}
+
                {{if .IsRepositoryOwner}}
                <h4 class="ui top attached warning header">
                        {{.i18n.Tr "repo.settings.danger_zone"}}