mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	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.  ---  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 <xiaolunwen@gmail.com>
This commit is contained in:
		| @@ -2152,6 +2152,7 @@ settings.choose_branch = Choose a branch… | |||||||
| settings.no_protected_branch = There are no protected branches. | settings.no_protected_branch = There are no protected branches. | ||||||
| settings.edit_protected_branch = Edit | settings.edit_protected_branch = Edit | ||||||
| settings.protected_branch_required_rule_name = Required rule name | settings.protected_branch_required_rule_name = Required rule name | ||||||
|  | settings.protected_branch_duplicate_rule_name = Duplicate rule name | ||||||
| settings.protected_branch_required_approvals_min = Required approvals cannot be negative. | settings.protected_branch_required_approvals_min = Required approvals cannot be negative. | ||||||
| settings.tags = Tags | settings.tags = Tags | ||||||
| settings.tags.protection = Tag Protection | settings.tags.protection = Tag Protection | ||||||
|   | |||||||
| @@ -166,10 +166,36 @@ func SettingsProtectedBranchPost(ctx *context.Context) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	var err error | 	var err error | ||||||
| 	protectBranch, err = git_model.GetProtectedBranchRuleByName(ctx, ctx.Repo.Repository.ID, f.RuleName) | 	if f.RuleID > 0 { | ||||||
| 	if err != nil { | 		// If the RuleID isn't 0, it must be an edit operation. So we get rule by id. | ||||||
| 		ctx.ServerError("GetProtectBranchOfRepoByName", err) | 		protectBranch, err = git_model.GetProtectedBranchRuleByID(ctx, ctx.Repo.Repository.ID, f.RuleID) | ||||||
| 		return | 		if err != nil { | ||||||
|  | 			ctx.ServerError("GetProtectBranchOfRepoByID", err) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		if protectBranch != nil && protectBranch.RuleName != f.RuleName { | ||||||
|  | 			// RuleName changed. We need to check if there is a rule with the same name. | ||||||
|  | 			// If a rule with the same name exists, an error should be returned. | ||||||
|  | 			sameNameProtectBranch, err := git_model.GetProtectedBranchRuleByName(ctx, ctx.Repo.Repository.ID, f.RuleName) | ||||||
|  | 			if err != nil { | ||||||
|  | 				ctx.ServerError("GetProtectBranchOfRepoByName", err) | ||||||
|  | 				return | ||||||
|  | 			} | ||||||
|  | 			if sameNameProtectBranch != nil { | ||||||
|  | 				ctx.Flash.Error(ctx.Tr("repo.settings.protected_branch_duplicate_rule_name")) | ||||||
|  | 				ctx.Redirect(fmt.Sprintf("%s/settings/branches/edit?rule_name=%s", ctx.Repo.RepoLink, protectBranch.RuleName)) | ||||||
|  | 				return | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		// FIXME: If a new ProtectBranch has a duplicate RuleName, an error should be returned. | ||||||
|  | 		// Currently, if a new ProtectBranch with a duplicate RuleName is created, the existing ProtectBranch will be updated. | ||||||
|  | 		// But we cannot modify this logic now because many unit tests rely on it. | ||||||
|  | 		protectBranch, err = git_model.GetProtectedBranchRuleByName(ctx, ctx.Repo.Repository.ID, f.RuleName) | ||||||
|  | 		if err != nil { | ||||||
|  | 			ctx.ServerError("GetProtectBranchOfRepoByName", err) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	if protectBranch == nil { | 	if protectBranch == nil { | ||||||
| 		// No options found, create defaults. | 		// No options found, create defaults. | ||||||
|   | |||||||
| @@ -190,6 +190,7 @@ func (f *RepoSettingForm) Validate(req *http.Request, errs binding.Errors) bindi | |||||||
| // ProtectBranchForm form for changing protected branch settings | // ProtectBranchForm form for changing protected branch settings | ||||||
| type ProtectBranchForm struct { | type ProtectBranchForm struct { | ||||||
| 	RuleName                      string `binding:"Required"` | 	RuleName                      string `binding:"Required"` | ||||||
|  | 	RuleID                        int64 | ||||||
| 	EnablePush                    string | 	EnablePush                    string | ||||||
| 	WhitelistUsers                string | 	WhitelistUsers                string | ||||||
| 	WhitelistTeams                string | 	WhitelistTeams                string | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user