diff options
Diffstat (limited to 'lib/gitlab/background_migration/add_modified_to_approval_merge_request_rule.rb')
-rw-r--r-- | lib/gitlab/background_migration/add_modified_to_approval_merge_request_rule.rb | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/lib/gitlab/background_migration/add_modified_to_approval_merge_request_rule.rb b/lib/gitlab/background_migration/add_modified_to_approval_merge_request_rule.rb new file mode 100644 index 00000000000..2148e96f6b4 --- /dev/null +++ b/lib/gitlab/background_migration/add_modified_to_approval_merge_request_rule.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +module Gitlab + module BackgroundMigration + # Compare all current rules to project rules + class AddModifiedToApprovalMergeRequestRule + # Stubbed class to access the Group table + class Group < ActiveRecord::Base + self.table_name = 'namespaces' + self.inheritance_column = :_type_disabled + end + + # Stubbed class to access the ApprovalMergeRequestRule table + class ApprovalMergeRequestRule < ActiveRecord::Base + self.table_name = 'approval_merge_request_rules' + + has_one :approval_merge_request_rule_source, class_name: 'AddModifiedToApprovalMergeRequestRule::ApprovalMergeRequestRuleSource' + has_one :approval_project_rule, through: :approval_merge_request_rule_source + has_and_belongs_to_many :groups, + class_name: 'AddModifiedToApprovalMergeRequestRule::Group', join_table: "#{self.table_name}_groups" + end + + # Stubbed class to access the ApprovalProjectRule table + class ApprovalProjectRule < ActiveRecord::Base + self.table_name = 'approval_project_rules' + + has_many :approval_merge_request_rule_sources, class_name: 'AddModifiedToApprovalMergeRequestRule::ApprovalMergeRequestRuleSource' + has_and_belongs_to_many :groups, + class_name: 'AddModifiedToApprovalMergeRequestRule::Group', join_table: "#{self.table_name}_groups" + end + + # Stubbed class to access the ApprovalMergeRequestRuleSource table + class ApprovalMergeRequestRuleSource < ActiveRecord::Base + self.table_name = 'approval_merge_request_rule_sources' + + belongs_to :approval_merge_request_rule, class_name: 'AddModifiedToApprovalMergeRequestRule::ApprovalMergeRequestRule' + belongs_to :approval_project_rule, class_name: 'AddModifiedToApprovalMergeRequestRule::ApprovalProjectRule' + end + + def perform(start_id, stop_id) + approval_merge_requests_rules = ApprovalMergeRequestRule + .joins(:groups, :approval_merge_request_rule_source) + .where(id: start_id..stop_id) + .pluck( + 'approval_merge_request_rule_sources.id as ars_id', + 'approval_merge_request_rules_groups.id as amrg_id' + ) + + approval_project_rules = ApprovalProjectRule + .joins(:groups, approval_merge_request_rule_sources: :approval_merge_request_rule) + .where(approval_merge_request_rules: { id: start_id..stop_id }) + .pluck( + 'approval_merge_request_rule_sources.id as ars_id', + 'approval_project_rules_groups.id as apg_id' + ) + + different_names_or_approval_sources = ApprovalMergeRequestRule.joins(:approval_project_rule, :approval_merge_request_rule_source) + .where(id: start_id..stop_id) + .where('approval_merge_request_rules.name != approval_project_rules.name OR ' \ + 'approval_merge_request_rules.approvals_required != approval_project_rules.approvals_required') + .pluck('approval_merge_request_rule_sources.id as ars_id') + + intersected_set = approval_merge_requests_rules.to_set ^ approval_project_rules.to_set + source_ids = intersected_set.collect { |rule| rule[0] }.uniq + + rule_sources = ApprovalMergeRequestRuleSource.where(id: source_ids + different_names_or_approval_sources) + changed_merge_request_rules = ApprovalMergeRequestRule.where(id: rule_sources.select(:approval_merge_request_rule_id)) + + changed_merge_request_rules.update_all(modified_from_project_rule: true) + end + end + end +end |