]> source.dussan.org Git - gitea.git/commitdiff
Fix migration v111 (#12868)
authorLunny Xiao <xiaolunwen@gmail.com>
Wed, 16 Sep 2020 07:37:04 +0000 (15:37 +0800)
committerGitHub <noreply@github.com>
Wed, 16 Sep 2020 07:37:04 +0000 (10:37 +0300)
models/migrations/v111.go
models/review.go

index 30128abd04efa8fc42072658471cbe31f0e56968..e4efc1ea57eb10f19a42dfde44d09b85f6dbf7a6 100644 (file)
@@ -11,7 +11,6 @@ import (
 )
 
 func addBranchProtectionCanPushAndEnableWhitelist(x *xorm.Engine) error {
-
        type ProtectedBranch struct {
                CanPush                  bool  `xorm:"NOT NULL DEFAULT false"`
                EnableApprovalsWhitelist bool  `xorm:"NOT NULL DEFAULT false"`
@@ -23,29 +22,26 @@ func addBranchProtectionCanPushAndEnableWhitelist(x *xorm.Engine) error {
                Official bool  `xorm:"NOT NULL DEFAULT false"`
        }
 
-       sess := x.NewSession()
-       defer sess.Close()
-
-       if err := sess.Sync2(new(ProtectedBranch)); err != nil {
+       if err := x.Sync2(new(ProtectedBranch)); err != nil {
                return err
        }
 
-       if err := sess.Sync2(new(Review)); err != nil {
+       if err := x.Sync2(new(Review)); err != nil {
                return err
        }
 
-       if _, err := sess.Exec("UPDATE `protected_branch` SET `enable_whitelist` = ? WHERE enable_whitelist IS NULL", false); err != nil {
+       if _, err := x.Exec("UPDATE `protected_branch` SET `enable_whitelist` = ? WHERE enable_whitelist IS NULL", false); err != nil {
                return err
        }
-       if _, err := sess.Exec("UPDATE `protected_branch` SET `can_push` = `enable_whitelist`"); err != nil {
+       if _, err := x.Exec("UPDATE `protected_branch` SET `can_push` = `enable_whitelist`"); err != nil {
                return err
        }
-       if _, err := sess.Exec("UPDATE `protected_branch` SET `enable_approvals_whitelist` = ? WHERE `required_approvals` > ?", true, 0); err != nil {
+       if _, err := x.Exec("UPDATE `protected_branch` SET `enable_approvals_whitelist` = ? WHERE `required_approvals` > ?", true, 0); err != nil {
                return err
        }
 
        var pageSize int64 = 20
-       qresult, err := sess.QueryInterface("SELECT max(id) as max_id FROM issue")
+       qresult, err := x.QueryInterface("SELECT max(id) as max_id FROM issue")
        if err != nil {
                return err
        }
@@ -57,10 +53,19 @@ func addBranchProtectionCanPushAndEnableWhitelist(x *xorm.Engine) error {
        }
        totalPages := totalIssues / pageSize
 
+       sess := x.NewSession()
+       defer sess.Close()
+
+       if err := sess.Begin(); err != nil {
+               return err
+       }
+
        // Find latest review of each user in each pull request, and set official field if appropriate
-       reviews := []*models.Review{}
+
        var page int64
+       var count int
        for page = 0; page <= totalPages; page++ {
+               reviews := []*models.Review{}
                if err := sess.SQL("SELECT * FROM review WHERE id IN (SELECT max(id) as id FROM review WHERE issue_id > ? AND issue_id <= ? AND type in (?, ?) GROUP BY issue_id, reviewer_id)",
                        page*pageSize, (page+1)*pageSize, models.ReviewTypeApprove, models.ReviewTypeReject).
                        Find(&reviews); err != nil {
@@ -68,23 +73,37 @@ func addBranchProtectionCanPushAndEnableWhitelist(x *xorm.Engine) error {
                }
 
                for _, review := range reviews {
-                       if err := review.LoadAttributes(); err != nil {
+                       if err := review.LoadAttributesX(sess); err != nil {
                                // Error might occur if user or issue doesn't exist, ignore it.
                                continue
                        }
-                       official, err := models.IsOfficialReviewer(review.Issue, review.Reviewer)
+                       official, err := models.IsOfficialReviewerX(sess, review.Issue, review.Reviewer)
                        if err != nil {
                                // Branch might not be proteced or other error, ignore it.
                                continue
                        }
                        review.Official = official
 
+                       count++
+
                        if _, err := sess.ID(review.ID).Cols("official").Update(review); err != nil {
                                return err
                        }
-               }
 
+                       if count == 100 {
+                               if err := sess.Commit(); err != nil {
+                                       return err
+                               }
+                               count = 0
+                               if err := sess.Begin(); err != nil {
+                                       return err
+                               }
+                       }
+               }
        }
 
-       return sess.Commit()
+       if count > 0 {
+               return sess.Commit()
+       }
+       return nil
 }
index 522fe5886c372e71394722acd931309e3ef6c1e9..03f15e46ebfc5ad8ede1f53c5e0e271eba38e912 100644 (file)
@@ -110,7 +110,8 @@ func (r *Review) LoadReviewer() error {
        return r.loadReviewer(x)
 }
 
-func (r *Review) loadAttributes(e Engine) (err error) {
+// LoadAttributesX loads all attributes except CodeComments with an Engine parameter
+func (r *Review) LoadAttributesX(e Engine) (err error) {
        if err = r.loadIssue(e); err != nil {
                return
        }
@@ -125,7 +126,7 @@ func (r *Review) loadAttributes(e Engine) (err error) {
 
 // LoadAttributes loads all attributes except CodeComments
 func (r *Review) LoadAttributes() error {
-       return r.loadAttributes(x)
+       return r.LoadAttributesX(x)
 }
 
 func getReviewByID(e Engine, id int64) (*Review, error) {
@@ -203,6 +204,12 @@ func IsOfficialReviewer(issue *Issue, reviewer *User) (bool, error) {
        return isOfficialReviewer(x, issue, reviewer)
 }
 
+// IsOfficialReviewerX check if reviewer can make official reviews in issue (counts towards required approvals)
+// with an Engine parameter
+func IsOfficialReviewerX(e Engine, issue *Issue, reviewer *User) (bool, error) {
+       return isOfficialReviewer(x, issue, reviewer)
+}
+
 func isOfficialReviewer(e Engine, issue *Issue, reviewer *User) (bool, error) {
        pr, err := getPullRequestByIssueID(e, issue.ID)
        if err != nil {