Skip to content

Create branch rule model

Joe Woodward requested to merge feat/branch-rules-modelling into master

What does this MR do and why?

Configures BranchRule model for Branch Rule MVC

Also configures relationship between BranchRule and ProtectedBranch

Currently the relationship may seem confusing without context. The old Protected Branches feature is being deprecated after BR MVC is complete. For the time being we need to allow general users to continue using the old ProtectedBranch model as the root model for configuring branch rules, however, at the same time we must allow testers to use the BR MVC features. To enable this we will have 2 way syncing between the models. This MR configures the relationships both ways, BR belongs to project and legacy_protected_branch, PB belongs to branch_rule

In a later MR we will add syncing logic so that all new PBs also have BR records related to them through BR#legacy_protected_branch_id. We will then add a background migration to create BR records for all existing PR records.

Migration Output

Up
main: == 20220707091941 CreateBranchRules: migrating ================================
main: -- create_table(:branch_rules, {})
main: -- quote_column_name(:name)
main:    -> 0.0000s
main:    -> 0.0041s
main: == 20220707091941 CreateBranchRules: migrated (0.0042s) =======================

main: == 20220707121307 AddProjectForeignKeyToBranchRules: migrating ================
main: -- transaction_open?()
main:    -> 0.0000s
main: -- foreign_keys(:branch_rules)
main:    -> 0.0019s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- execute("ALTER TABLE branch_rules\nADD CONSTRAINT fk_56de1c4dcc\nFOREIGN KEY (project_id)\nREFERENCES projects (id)\nON DELETE CASCADE\nNOT VALID;\n")
main:    -> 0.0008s
main: -- execute("SET statement_timeout TO 0")
main:    -> 0.0002s
main: -- execute("ALTER TABLE branch_rules VALIDATE CONSTRAINT fk_56de1c4dcc;")
main:    -> 0.0023s
main: -- execute("RESET statement_timeout")
main:    -> 0.0002s
main: == 20220707121307 AddProjectForeignKeyToBranchRules: migrated (0.0095s) =======

main: == 20220707121323 AddProtectedBranchFkToBranchRules: migrating ================
main: -- transaction_open?()
main:    -> 0.0000s
main: -- foreign_keys(:branch_rules)
main:    -> 0.0018s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- execute("ALTER TABLE branch_rules\nADD CONSTRAINT fk_2b7d491832\nFOREIGN KEY (legacy_protected_branch_id)\nREFERENCES protected_branches (id)\nON DELETE CASCADE\nNOT VALID;\n")
main:    -> 0.0005s
main: -- execute("ALTER TABLE branch_rules VALIDATE CONSTRAINT fk_2b7d491832;")
main:    -> 0.0005s
main: == 20220707121323 AddProtectedBranchFkToBranchRules: migrated (0.0044s) =======

main: == 20220713134812 CreateBranchRuleMergeAccessLevels: migrating ================
main: -- create_table(:branch_rule_merge_access_levels, {})
main:    -> 0.0030s
main: == 20220713134812 CreateBranchRuleMergeAccessLevels: migrated (0.0030s) =======

main: == 20220713134903 CreateBranchRulePushAccessLevels: migrating =================
main: -- create_table(:branch_rule_push_access_levels, {})
main:    -> 0.0030s
main: == 20220713134903 CreateBranchRulePushAccessLevels: migrated (0.0030s) ========

main: == 20220713135028 CreateBranchRuleRequiredCodeOwnersSections: migrating =======
main: -- create_table(:branch_rule_required_code_owners_sections, {})
main: -- quote_column_name(:name)
main:    -> 0.0000s
main:    -> 0.0025s
main: == 20220713135028 CreateBranchRuleRequiredCodeOwnersSections: migrated (0.0025s)

main: == 20220713140351 AddBranchRuleFkToBranchRuleMergeAccessLevels: migrating =====
main: -- transaction_open?()
main:    -> 0.0000s
main: -- foreign_keys(:branch_rule_merge_access_levels)
main:    -> 0.0016s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- execute("ALTER TABLE branch_rule_merge_access_levels\nADD CONSTRAINT fk_4610e8aa47\nFOREIGN KEY (branch_rule_id)\nREFERENCES branch_rules (id)\nON DELETE CASCADE\nNOT VALID;\n")
main:    -> 0.0004s
main: -- execute("ALTER TABLE branch_rule_merge_access_levels VALIDATE CONSTRAINT fk_4610e8aa47;")
main:    -> 0.0005s
main: == 20220713140351 AddBranchRuleFkToBranchRuleMergeAccessLevels: migrated (0.0038s)

main: == 20220713140405 AddBranchRuleFkToBranchRulePushAccessLevels: migrating ======
main: -- transaction_open?()
main:    -> 0.0000s
main: -- foreign_keys(:branch_rule_push_access_levels)
main:    -> 0.0014s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- execute("ALTER TABLE branch_rule_push_access_levels\nADD CONSTRAINT fk_e05a16c5b5\nFOREIGN KEY (branch_rule_id)\nREFERENCES branch_rules (id)\nON DELETE CASCADE\nNOT VALID;\n")
main:    -> 0.0008s
main: -- execute("ALTER TABLE branch_rule_push_access_levels VALIDATE CONSTRAINT fk_e05a16c5b5;")
main:    -> 0.0005s
main: == 20220713140405 AddBranchRuleFkToBranchRulePushAccessLevels: migrated (0.0043s)

main: == 20220713140430 AddBranchRuleFkToBranchRuleRequiredCodeOwnersSection: migrating
main: -- transaction_open?()
main:    -> 0.0000s
main: -- foreign_keys(:branch_rule_required_code_owners_sections)
main:    -> 0.0014s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- execute("ALTER TABLE branch_rule_required_code_owners_sections\nADD CONSTRAINT fk_22d9bc8699\nFOREIGN KEY (branch_rule_id)\nREFERENCES branch_rules (id)\nON DELETE CASCADE\nNOT VALID;\n")
main:    -> 0.0004s
main: -- execute("ALTER TABLE branch_rule_required_code_owners_sections VALIDATE CONSTRAINT fk_22d9bc8699;")
main:    -> 0.0004s
main: == 20220713140430 AddBranchRuleFkToBranchRuleRequiredCodeOwnersSection: migrated (0.0034s)

main: == 20220713140448 AddUserFkToBranchRuleMergeAccessLevels: migrating ===========
main: -- transaction_open?()
main:    -> 0.0000s
main: -- foreign_keys(:branch_rule_merge_access_levels)
main:    -> 0.0014s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- execute("ALTER TABLE branch_rule_merge_access_levels\nADD CONSTRAINT fk_e93aff3639\nFOREIGN KEY (user_id)\nREFERENCES branch_rules (id)\nON DELETE CASCADE\nNOT VALID;\n")
main:    -> 0.0004s
main: -- execute("ALTER TABLE branch_rule_merge_access_levels VALIDATE CONSTRAINT fk_e93aff3639;")
main:    -> 0.0003s
main: == 20220713140448 AddUserFkToBranchRuleMergeAccessLevels: migrated (0.0033s) ==

main: == 20220713140458 AddUserFkToBranchRulePushAccessLevel: migrating =============
main: -- transaction_open?()
main:    -> 0.0000s
main: -- foreign_keys(:branch_rule_push_access_levels)
main:    -> 0.0014s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- execute("ALTER TABLE branch_rule_push_access_levels\nADD CONSTRAINT fk_dbbec02309\nFOREIGN KEY (user_id)\nREFERENCES branch_rules (id)\nON DELETE CASCADE\nNOT VALID;\n")
main:    -> 0.0004s
main: -- execute("ALTER TABLE branch_rule_push_access_levels VALIDATE CONSTRAINT fk_dbbec02309;")
main:    -> 0.0004s
main: == 20220713140458 AddUserFkToBranchRulePushAccessLevel: migrated (0.0034s) ====

main: == 20220713140543 AddGroupFkToBranchRuleMergeAccessLevels: migrating ==========
main: -- transaction_open?()
main:    -> 0.0000s
main: -- foreign_keys(:branch_rule_merge_access_levels)
main:    -> 0.0014s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- execute("ALTER TABLE branch_rule_merge_access_levels\nADD CONSTRAINT fk_8f85e377ed\nFOREIGN KEY (group_id)\nREFERENCES branch_rules (id)\nON DELETE CASCADE\nNOT VALID;\n")
main:    -> 0.0004s
main: -- execute("ALTER TABLE branch_rule_merge_access_levels VALIDATE CONSTRAINT fk_8f85e377ed;")
main:    -> 0.0004s
main: == 20220713140543 AddGroupFkToBranchRuleMergeAccessLevels: migrated (0.0035s) =

main: == 20220713140558 AddGroupFkToBranchRulePushAccessLevels: migrating ===========
main: -- transaction_open?()
main:    -> 0.0000s
main: -- foreign_keys(:branch_rule_push_access_levels)
main:    -> 0.0015s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- execute("ALTER TABLE branch_rule_push_access_levels\nADD CONSTRAINT fk_c1143675ce\nFOREIGN KEY (group_id)\nREFERENCES branch_rules (id)\nON DELETE CASCADE\nNOT VALID;\n")
main:    -> 0.0005s
main: -- execute("ALTER TABLE branch_rule_push_access_levels VALIDATE CONSTRAINT fk_c1143675ce;")
main:    -> 0.0004s
main: == 20220713140558 AddGroupFkToBranchRulePushAccessLevels: migrated (0.0038s) ==

main: == 20220713152222 CreateApprovalProjectRulesBranchRules: migrating ============
main: -- create_table(:approval_project_rules_branch_rules, {})
main:    -> 0.0025s
main: == 20220713152222 CreateApprovalProjectRulesBranchRules: migrated (0.0026s) ===

main: == 20220714201546 CreateBranchRuleUnprotectAccessLevels: migrating ============
main: -- create_table(:branch_rule_unprotect_access_levels, {})
main:    -> 0.0243s
main: == 20220714201546 CreateBranchRuleUnprotectAccessLevels: migrated (0.0244s) ===

main: == 20220714201547 AddBranchRuleFkToBranchRuleUnprotectAccessLevels: migrating =
main: -- transaction_open?()
main:    -> 0.0000s
main: -- foreign_keys(:branch_rule_unprotect_access_levels)
main:    -> 0.0039s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- execute("ALTER TABLE branch_rule_unprotect_access_levels\nADD CONSTRAINT fk_933c983013\nFOREIGN KEY (branch_rule_id)\nREFERENCES branch_rules (id)\nON DELETE CASCADE\nNOT VALID;\n")
main:    -> 0.0009s
main: -- execute("SET statement_timeout TO 0")
main:    -> 0.0002s
main: -- execute("ALTER TABLE branch_rule_unprotect_access_levels VALIDATE CONSTRAINT fk_933c983013;")
main:    -> 0.0012s
main: -- execute("RESET statement_timeout")
main:    -> 0.0002s
main: == 20220714201547 AddBranchRuleFkToBranchRuleUnprotectAccessLevels: migrated (0.0129s)

main: == 20220714201548 AddUserFkToBranchRuleUnprotectAccessLevels: migrating =======
main: -- transaction_open?()
main:    -> 0.0000s
main: -- foreign_keys(:branch_rule_unprotect_access_levels)
main:    -> 0.0017s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- execute("ALTER TABLE branch_rule_unprotect_access_levels\nADD CONSTRAINT fk_79922f98a6\nFOREIGN KEY (user_id)\nREFERENCES branch_rules (id)\nON DELETE CASCADE\nNOT VALID;\n")
main:    -> 0.0007s
main: -- execute("ALTER TABLE branch_rule_unprotect_access_levels VALIDATE CONSTRAINT fk_79922f98a6;")
main:    -> 0.0005s
main: == 20220714201548 AddUserFkToBranchRuleUnprotectAccessLevels: migrated (0.0047s)

main: == 20220714201549 AddGroupFkToBranchRuleUnprotectAccessLevels: migrating ======
main: -- transaction_open?()
main:    -> 0.0000s
main: -- foreign_keys(:branch_rule_unprotect_access_levels)
main:    -> 0.0017s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- execute("ALTER TABLE branch_rule_unprotect_access_levels\nADD CONSTRAINT fk_03892ff406\nFOREIGN KEY (group_id)\nREFERENCES branch_rules (id)\nON DELETE CASCADE\nNOT VALID;\n")
main:    -> 0.0007s
main: -- execute("ALTER TABLE branch_rule_unprotect_access_levels VALIDATE CONSTRAINT fk_03892ff406;")
main:    -> 0.0004s
main: == 20220714201549 AddGroupFkToBranchRuleUnprotectAccessLevels: migrated (0.0043s)
Down
main: == 20220714201549 AddGroupFkToBranchRuleUnprotectAccessLevels: reverting ======
main: -- transaction_open?()
main:    -> 0.0000s
main: -- remove_foreign_key(:branch_rule_unprotect_access_levels, {:column=>:group_id})
main:    -> 0.0041s
main: == 20220714201549 AddGroupFkToBranchRuleUnprotectAccessLevels: reverted (0.0104s)

main: == 20220714201548 AddUserFkToBranchRuleUnprotectAccessLevels: reverting =======
main: -- transaction_open?()
main:    -> 0.0000s
main: -- remove_foreign_key(:branch_rule_unprotect_access_levels, {:column=>:user_id})
main:    -> 0.0020s
main: == 20220714201548 AddUserFkToBranchRuleUnprotectAccessLevels: reverted (0.0032s)

main: == 20220714201547 AddBranchRuleFkToBranchRuleUnprotectAccessLevels: reverting =
main: -- transaction_open?()
main:    -> 0.0000s
main: -- remove_foreign_key(:branch_rule_unprotect_access_levels, {:column=>:branch_rule_id})
main:    -> 0.0020s
main: == 20220714201547 AddBranchRuleFkToBranchRuleUnprotectAccessLevels: reverted (0.0032s)

main: == 20220714201546 CreateBranchRuleUnprotectAccessLevels: reverting ============
main: -- drop_table(:branch_rule_unprotect_access_levels, {})
main:    -> 0.0011s
main: == 20220714201546 CreateBranchRuleUnprotectAccessLevels: reverted (0.0023s) ===

main: == 20220713152222 CreateApprovalProjectRulesBranchRules: reverting ============
main: -- drop_table(:approval_project_rules_branch_rules, {})
main:    -> 0.0008s
main: == 20220713152222 CreateApprovalProjectRulesBranchRules: reverted (0.0009s) ===

main: == 20220713140558 AddGroupFkToBranchRulePushAccessLevels: reverting ===========
main: -- transaction_open?()
main:    -> 0.0000s
main: -- remove_foreign_key(:branch_rule_push_access_levels, {:column=>:group_id})
main:    -> 0.0021s
main: == 20220713140558 AddGroupFkToBranchRulePushAccessLevels: reverted (0.0034s) ==

main: == 20220713140543 AddGroupFkToBranchRuleMergeAccessLevels: reverting ==========
main: -- transaction_open?()
main:    -> 0.0000s
main: -- remove_foreign_key(:branch_rule_merge_access_levels, {:column=>:group_id})
main:    -> 0.0020s
main: == 20220713140543 AddGroupFkToBranchRuleMergeAccessLevels: reverted (0.0031s) =

main: == 20220713140458 AddUserFkToBranchRulePushAccessLevel: reverting =============
main: -- transaction_open?()
main:    -> 0.0000s
main: -- remove_foreign_key(:branch_rule_push_access_levels, {:column=>:user_id})
main:    -> 0.0021s
main: == 20220713140458 AddUserFkToBranchRulePushAccessLevel: reverted (0.0034s) ====

main: == 20220713140448 AddUserFkToBranchRuleMergeAccessLevels: reverting ===========
main: -- transaction_open?()
main:    -> 0.0000s
main: -- remove_foreign_key(:branch_rule_merge_access_levels, {:column=>:user_id})
main:    -> 0.0020s
main: == 20220713140448 AddUserFkToBranchRuleMergeAccessLevels: reverted (0.0039s) ==

main: == 20220713140430 AddBranchRuleFkToBranchRuleRequiredCodeOwnersSection: reverting
main: -- transaction_open?()
main:    -> 0.0000s
main: -- remove_foreign_key(:branch_rule_required_code_owners_sections, {:column=>:branch_rule_id})
main:    -> 0.0020s
main: == 20220713140430 AddBranchRuleFkToBranchRuleRequiredCodeOwnersSection: reverted (0.0034s)

main: == 20220713140405 AddBranchRuleFkToBranchRulePushAccessLevels: reverting ======
main: -- transaction_open?()
main:    -> 0.0000s
main: -- remove_foreign_key(:branch_rule_push_access_levels, {:column=>:branch_rule_id})
main:    -> 0.0019s
main: == 20220713140405 AddBranchRuleFkToBranchRulePushAccessLevels: reverted (0.0031s)

main: == 20220713140351 AddBranchRuleFkToBranchRuleMergeAccessLevels: reverting =====
main: -- transaction_open?()
main:    -> 0.0000s
main: -- remove_foreign_key(:branch_rule_merge_access_levels, {:column=>:branch_rule_id})
main:    -> 0.0020s
main: == 20220713140351 AddBranchRuleFkToBranchRuleMergeAccessLevels: reverted (0.0031s)

main: == 20220713135028 CreateBranchRuleRequiredCodeOwnersSections: reverting =======
main: -- drop_table(:branch_rule_required_code_owners_sections, {})
main:    -> 0.0012s
main: == 20220713135028 CreateBranchRuleRequiredCodeOwnersSections: reverted (0.0013s)

main: == 20220713134903 CreateBranchRulePushAccessLevels: reverting =================
main: -- drop_table(:branch_rule_push_access_levels, {})
main:    -> 0.0008s
main: == 20220713134903 CreateBranchRulePushAccessLevels: reverted (0.0009s) ========

main: == 20220713134812 CreateBranchRuleMergeAccessLevels: reverting ================
main: -- drop_table(:branch_rule_merge_access_levels, {})
main:    -> 0.0008s
main: == 20220713134812 CreateBranchRuleMergeAccessLevels: reverted (0.0009s) =======

main: == 20220707121323 AddProtectedBranchFkToBranchRules: reverting ================
main: -- transaction_open?()
main:    -> 0.0000s
main: -- remove_foreign_key(:branch_rules, {:column=>:legacy_protected_branch_id})
main:    -> 0.0022s
main: == 20220707121323 AddProtectedBranchFkToBranchRules: reverted (0.0037s) =======

main: == 20220707121307 AddProjectForeignKeyToBranchRules: reverting ================
main: -- transaction_open?()
main:    -> 0.0000s
main: -- remove_foreign_key(:branch_rules, {:column=>:project_id})
main:    -> 0.0028s
main: == 20220707121307 AddProjectForeignKeyToBranchRules: reverted (0.0044s) =======

main: == 20220707091941 CreateBranchRules: reverting ================================
main: -- drop_table(:branch_rules, {})
main:    -> 0.0018s
main: == 20220707091941 CreateBranchRules: reverted (0.0034s) =======================

Screenshots or screen recordings

These are strongly recommended to assist reviewers and reduce the time to merge your change.

How to set up and validate locally

Not much to setup. You should be able to pull and migrate, then run the BranchRule model spec

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Joe Woodward

Merge request reports