@@ -59,8 +59,16 @@ func AddToTaskQueue(pr *issues_model.PullRequest) {
59
59
}
60
60
}
61
61
62
+ type MergeCheckType int
63
+
64
+ const (
65
+ MergeCheckTypeGeneral MergeCheckType = iota // general merge checks for "merge", "rebase", "squash", etc
66
+ MergeCheckTypeManually // Manually Merged button (mark a PR as merged manually)
67
+ MergeCheckTypeAuto // Auto Merge (Scheduled Merge) After Checks Succeed
68
+ )
69
+
62
70
// CheckPullMergable check if the pull mergable based on all conditions (branch protection, merge options, ...)
63
- func CheckPullMergable (stdCtx context.Context , doer * user_model.User , perm * access_model.Permission , pr * issues_model.PullRequest , manuallMerge , force bool ) error {
71
+ func CheckPullMergable (stdCtx context.Context , doer * user_model.User , perm * access_model.Permission , pr * issues_model.PullRequest , mergeCheckType MergeCheckType , adminSkipProtectionCheck bool ) error {
64
72
return db .WithTx (stdCtx , func (ctx context.Context ) error {
65
73
if pr .HasMerged {
66
74
return ErrHasMerged
@@ -80,8 +88,8 @@ func CheckPullMergable(stdCtx context.Context, doer *user_model.User, perm *acce
80
88
return ErrUserNotAllowedToMerge
81
89
}
82
90
83
- if manuallMerge {
84
- // don't check rules to "auto merge", doer is going to mark this pull as merged manually
91
+ if mergeCheckType == MergeCheckTypeManually {
92
+ // if doer is doing "manually merge" ( mark as merged manually), do not check anything
85
93
return nil
86
94
}
87
95
@@ -103,14 +111,25 @@ func CheckPullMergable(stdCtx context.Context, doer *user_model.User, perm *acce
103
111
return err
104
112
}
105
113
106
- if ! force {
107
- return err
114
+ // Now the branch protection check failed, check whether the failure could be skipped (skip by setting err = nil)
115
+
116
+ // * when doing Auto Merge (Scheduled Merge After Checks Succeed), skip the branch protection check
117
+ if mergeCheckType == MergeCheckTypeAuto {
118
+ err = nil
119
+ }
120
+
121
+ // * if the doer is admin, they could skip the branch protection check
122
+ if adminSkipProtectionCheck {
123
+ if isRepoAdmin , errCheckAdmin := access_model .IsUserRepoAdmin (ctx , pr .BaseRepo , doer ); errCheckAdmin != nil {
124
+ log .Error ("Unable to check if %-v is a repo admin in %-v: %v" , doer , pr .BaseRepo , errCheckAdmin )
125
+ return errCheckAdmin
126
+ } else if isRepoAdmin {
127
+ err = nil // repo admin can skip the check, so clear the error
128
+ }
108
129
}
109
130
110
- if isRepoAdmin , err2 := access_model .IsUserRepoAdmin (ctx , pr .BaseRepo , doer ); err2 != nil {
111
- log .Error ("Unable to check if %-v is a repo admin in %-v: %v" , doer , pr .BaseRepo , err2 )
112
- return err2
113
- } else if ! isRepoAdmin {
131
+ // If there is still a branch protection check error, return it
132
+ if err != nil {
114
133
return err
115
134
}
116
135
}
0 commit comments