Skip to content

Commit 9a83aa2

Browse files
Zettat123lunny
andauthored
Get rules by id when editing branch protection rule (#22932)
When users rename an existing branch protection rule, a new rule with the new name will be created and the old rule will still exist. ![image](https://user-images.githubusercontent.com/15528715/219276442-d3c001ad-e693-44ec-9ad2-b33f2666b49b.png) --- ![image](https://user-images.githubusercontent.com/15528715/219276478-547c3b93-b3f1-4292-a1ef-c1b7747fe1bb.png) The reason is that the `SettingsProtectedBranchPost` function only get branch protection rule by name before updating or creating a rule. When the rule name changes, the function cannot find the existing rule so it will create a new rule rather than update the existing rule. To fix the bug, the function should get rule by id first. --------- Co-authored-by: Lunny Xiao <[email protected]>
1 parent 3596df5 commit 9a83aa2

File tree

3 files changed

+32
-4
lines changed

3 files changed

+32
-4
lines changed

options/locale/locale_en-US.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2152,6 +2152,7 @@ settings.choose_branch = Choose a branch…
21522152
settings.no_protected_branch = There are no protected branches.
21532153
settings.edit_protected_branch = Edit
21542154
settings.protected_branch_required_rule_name = Required rule name
2155+
settings.protected_branch_duplicate_rule_name = Duplicate rule name
21552156
settings.protected_branch_required_approvals_min = Required approvals cannot be negative.
21562157
settings.tags = Tags
21572158
settings.tags.protection = Tag Protection

routers/web/repo/setting_protected_branch.go

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,36 @@ func SettingsProtectedBranchPost(ctx *context.Context) {
166166
}
167167

168168
var err error
169-
protectBranch, err = git_model.GetProtectedBranchRuleByName(ctx, ctx.Repo.Repository.ID, f.RuleName)
170-
if err != nil {
171-
ctx.ServerError("GetProtectBranchOfRepoByName", err)
172-
return
169+
if f.RuleID > 0 {
170+
// If the RuleID isn't 0, it must be an edit operation. So we get rule by id.
171+
protectBranch, err = git_model.GetProtectedBranchRuleByID(ctx, ctx.Repo.Repository.ID, f.RuleID)
172+
if err != nil {
173+
ctx.ServerError("GetProtectBranchOfRepoByID", err)
174+
return
175+
}
176+
if protectBranch != nil && protectBranch.RuleName != f.RuleName {
177+
// RuleName changed. We need to check if there is a rule with the same name.
178+
// If a rule with the same name exists, an error should be returned.
179+
sameNameProtectBranch, err := git_model.GetProtectedBranchRuleByName(ctx, ctx.Repo.Repository.ID, f.RuleName)
180+
if err != nil {
181+
ctx.ServerError("GetProtectBranchOfRepoByName", err)
182+
return
183+
}
184+
if sameNameProtectBranch != nil {
185+
ctx.Flash.Error(ctx.Tr("repo.settings.protected_branch_duplicate_rule_name"))
186+
ctx.Redirect(fmt.Sprintf("%s/settings/branches/edit?rule_name=%s", ctx.Repo.RepoLink, protectBranch.RuleName))
187+
return
188+
}
189+
}
190+
} else {
191+
// FIXME: If a new ProtectBranch has a duplicate RuleName, an error should be returned.
192+
// Currently, if a new ProtectBranch with a duplicate RuleName is created, the existing ProtectBranch will be updated.
193+
// But we cannot modify this logic now because many unit tests rely on it.
194+
protectBranch, err = git_model.GetProtectedBranchRuleByName(ctx, ctx.Repo.Repository.ID, f.RuleName)
195+
if err != nil {
196+
ctx.ServerError("GetProtectBranchOfRepoByName", err)
197+
return
198+
}
173199
}
174200
if protectBranch == nil {
175201
// No options found, create defaults.

services/forms/repo_form.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ func (f *RepoSettingForm) Validate(req *http.Request, errs binding.Errors) bindi
190190
// ProtectBranchForm form for changing protected branch settings
191191
type ProtectBranchForm struct {
192192
RuleName string `binding:"Required"`
193+
RuleID int64
193194
EnablePush string
194195
WhitelistUsers string
195196
WhitelistTeams string

0 commit comments

Comments
 (0)