summaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2019-09-18 13:39:45 +0800
committerLauris BH <lauris@nix.lv>2019-09-18 08:39:45 +0300
commit04ca7f004710de2b408f558f6f148894aa61ba57 (patch)
tree57fea3b9853127897676faaf9e70abace2565878 /models
parent29454733b4eeea33e6c94c50b32855066c203988 (diff)
downloadgitea-04ca7f004710de2b408f558f6f148894aa61ba57.tar.gz
gitea-04ca7f004710de2b408f558f6f148894aa61ba57.zip
Refuse merge until all required status checks success (#7481)
* refuse merge until ci successfully * deny merge request when required status checkes not succeed on merge Post and API * add database migration for added columns on protected_branch * fix migration * fix protected branch check bug * fix protected branch settings * remove duplicated code on check pull request's required commit statuses pass * remove unused codes * fix migration * add newline for template file * fix go mod * rename function name and some other fixes * fix template * fix bug pull view * remove go1.12 wrong dependencies * add administrator bypass when protected branch status check enabled * fix bug * improve the codes
Diffstat (limited to 'models')
-rw-r--r--models/branches.go2
-rw-r--r--models/commit_status.go22
-rw-r--r--models/migrations/migrations.go2
-rw-r--r--models/migrations/v94.go24
-rw-r--r--models/pull.go14
5 files changed, 64 insertions, 0 deletions
diff --git a/models/branches.go b/models/branches.go
index 2a99d98955..9daaa487e7 100644
--- a/models/branches.go
+++ b/models/branches.go
@@ -36,6 +36,8 @@ type ProtectedBranch struct {
EnableMergeWhitelist bool `xorm:"NOT NULL DEFAULT false"`
MergeWhitelistUserIDs []int64 `xorm:"JSON TEXT"`
MergeWhitelistTeamIDs []int64 `xorm:"JSON TEXT"`
+ EnableStatusCheck bool `xorm:"NOT NULL DEFAULT false"`
+ StatusCheckContexts []string `xorm:"JSON TEXT"`
ApprovalsWhitelistUserIDs []int64 `xorm:"JSON TEXT"`
ApprovalsWhitelistTeamIDs []int64 `xorm:"JSON TEXT"`
RequiredApprovals int64 `xorm:"NOT NULL DEFAULT 0"`
diff --git a/models/commit_status.go b/models/commit_status.go
index 9f0a32cdfb..6f6cbc387f 100644
--- a/models/commit_status.go
+++ b/models/commit_status.go
@@ -9,6 +9,7 @@ import (
"crypto/sha1"
"fmt"
"strings"
+ "time"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
@@ -205,6 +206,27 @@ func GetLatestCommitStatus(repo *Repository, sha string, page int) ([]*CommitSta
return statuses, x.In("id", ids).Find(&statuses)
}
+// FindRepoRecentCommitStatusContexts returns repository's recent commit status contexts
+func FindRepoRecentCommitStatusContexts(repoID int64, before time.Duration) ([]string, error) {
+ start := timeutil.TimeStampNow().AddDuration(-before)
+ ids := make([]int64, 0, 10)
+ if err := x.Table("commit_status").
+ Where("repo_id = ?", repoID).
+ And("updated_unix >= ?", start).
+ Select("max( id ) as id").
+ GroupBy("context_hash").OrderBy("max( id ) desc").
+ Find(&ids); err != nil {
+ return nil, err
+ }
+
+ var contexts = make([]string, 0, len(ids))
+ if len(ids) == 0 {
+ return contexts, nil
+ }
+ return contexts, x.Select("context").Table("commit_status").In("id", ids).Find(&contexts)
+
+}
+
// NewCommitStatusOptions holds options for creating a CommitStatus
type NewCommitStatusOptions struct {
Repo *Repository
diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go
index 15e021c05a..885043dce5 100644
--- a/models/migrations/migrations.go
+++ b/models/migrations/migrations.go
@@ -242,6 +242,8 @@ var migrations = []Migration{
NewMigration("remove orphaned repository index statuses", removeLingeringIndexStatus),
// v93 -> v94
NewMigration("add email notification enabled preference to user", addEmailNotificationEnabledToUser),
+ // v94 -> v95
+ NewMigration("add enable_status_check, status_check_contexts to protected_branch", addStatusCheckColumnsForProtectedBranches),
}
// Migrate database to current version
diff --git a/models/migrations/v94.go b/models/migrations/v94.go
new file mode 100644
index 0000000000..5fe8c3fa12
--- /dev/null
+++ b/models/migrations/v94.go
@@ -0,0 +1,24 @@
+// Copyright 2019 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 "github.com/go-xorm/xorm"
+
+func addStatusCheckColumnsForProtectedBranches(x *xorm.Engine) error {
+ type ProtectedBranch struct {
+ EnableStatusCheck bool `xorm:"NOT NULL DEFAULT false"`
+ StatusCheckContexts []string `xorm:"JSON TEXT"`
+ }
+
+ if err := x.Sync2(new(ProtectedBranch)); err != nil {
+ return err
+ }
+
+ _, err := x.Cols("enable_status_check", "status_check_contexts").Update(&ProtectedBranch{
+ EnableStatusCheck: false,
+ StatusCheckContexts: []string{},
+ })
+ return err
+}
diff --git a/models/pull.go b/models/pull.go
index ecb5c1345e..2f7218f415 100644
--- a/models/pull.go
+++ b/models/pull.go
@@ -99,6 +99,20 @@ func (pr *PullRequest) LoadAttributes() error {
return pr.loadAttributes(x)
}
+// LoadBaseRepo loads pull request base repository from database
+func (pr *PullRequest) LoadBaseRepo() error {
+ if pr.BaseRepo == nil {
+ var repo Repository
+ if has, err := x.ID(pr.BaseRepoID).Get(&repo); err != nil {
+ return err
+ } else if !has {
+ return ErrRepoNotExist{ID: pr.BaseRepoID}
+ }
+ pr.BaseRepo = &repo
+ }
+ return nil
+}
+
// LoadIssue loads issue information from database
func (pr *PullRequest) LoadIssue() (err error) {
return pr.loadIssue(x)