diff options
Diffstat (limited to 'app/models/merge_request.rb')
-rw-r--r-- | app/models/merge_request.rb | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 396647a14ae..6559f94a696 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -6,6 +6,7 @@ class MergeRequest < ActiveRecord::Base include Issuable include Noteable include Referable + include Presentable include IgnorableColumn include TimeTrackable include ManualInverseAssociation @@ -14,6 +15,7 @@ class MergeRequest < ActiveRecord::Base include Gitlab::Utils::StrongMemoize include LabelEventable include ReactiveCaching + include FromUnion self.reactive_cache_key = ->(model) { [model.project.id, model.iid] } self.reactive_cache_refresh_interval = 10.minutes @@ -137,12 +139,14 @@ class MergeRequest < ActiveRecord::Base Gitlab::Timeless.timeless(merge_request, &block) end + # rubocop: disable CodeReuse/ServiceClass after_transition unchecked: :cannot_be_merged do |merge_request, transition| if merge_request.notify_conflict? NotificationService.new.merge_request_unmergeable(merge_request) TodoService.new.merge_request_became_unmergeable(merge_request) end end + # rubocop: enable CodeReuse/ServiceClass def check_state?(merge_status) [:unchecked, :cannot_be_merged_recheck].include?(merge_status.to_sym) @@ -235,11 +239,10 @@ class MergeRequest < ActiveRecord::Base def self.in_projects(relation) # unscoping unnecessary conditions that'll be applied # when executing `where("merge_requests.id IN (#{union.to_sql})")` - source = unscoped.where(source_project_id: relation).select(:id) - target = unscoped.where(target_project_id: relation).select(:id) - union = Gitlab::SQL::Union.new([source, target]) + source = unscoped.where(source_project_id: relation) + target = unscoped.where(target_project_id: relation) - where("merge_requests.id IN (#{union.to_sql})") # rubocop:disable GitlabSecurity/SqlInjection + from_union([source, target]) end # This is used after project import, to reset the IDs to the correct @@ -258,7 +261,7 @@ class MergeRequest < ActiveRecord::Base end end - WIP_REGEX = /\A\s*(\[WIP\]\s*|WIP:\s*|WIP\s+)+\s*/i.freeze + WIP_REGEX = /\A*(\[WIP\]\s*|WIP:\s*|WIP\s+)+\s*/i.freeze def self.work_in_progress?(title) !!(title =~ WIP_REGEX) @@ -623,11 +626,13 @@ class MergeRequest < ActiveRecord::Base end end + # rubocop: disable CodeReuse/ServiceClass def reload_diff(current_user = nil) return unless open? MergeRequests::ReloadDiffsService.new(self, current_user).execute end + # rubocop: enable CodeReuse/ServiceClass def check_if_can_be_merged return unless self.class.state_machines[:merge_status].check_state?(merge_status) && Gitlab::Database.read_write? @@ -736,11 +741,8 @@ class MergeRequest < ActiveRecord::Base # compared to using OR statements. We're using UNION ALL since the queries # used won't produce any duplicates (e.g. a note for a commit can't also be # a note for an MR). - union = Gitlab::SQL::Union - .new([notes, commit_notes], remove_duplicates: false) - .to_sql - - Note.from("(#{union}) #{Note.table_name}") + Note + .from_union([notes, commit_notes], remove_duplicates: false) .includes(:noteable) end @@ -1036,6 +1038,7 @@ class MergeRequest < ActiveRecord::Base actual_head_pipeline&.has_test_reports? end + # rubocop: disable CodeReuse/ServiceClass def compare_test_reports unless has_test_reports? return { status: :error, status_reason: 'This merge request does not have test reports' } @@ -1050,7 +1053,9 @@ class MergeRequest < ActiveRecord::Base data end || { status: :parsing } end + # rubocop: enable CodeReuse/ServiceClass + # rubocop: disable CodeReuse/ServiceClass def calculate_reactive_cache(identifier, *args) case identifier.to_sym when :compare_test_results @@ -1060,6 +1065,7 @@ class MergeRequest < ActiveRecord::Base raise NotImplementedError, "Unknown identifier: #{identifier}" end end + # rubocop: enable CodeReuse/ServiceClass def all_commits # MySQL doesn't support LIMIT in a subquery. @@ -1125,6 +1131,7 @@ class MergeRequest < ActiveRecord::Base diff_refs && diff_refs.complete? end + # rubocop: disable CodeReuse/ServiceClass def update_diff_discussion_positions(old_diff_refs:, new_diff_refs:, current_user: nil) return unless has_complete_diff_refs? return if new_diff_refs == old_diff_refs @@ -1154,6 +1161,7 @@ class MergeRequest < ActiveRecord::Base .execute(self) end end + # rubocop: enable CodeReuse/ServiceClass def keep_around_commit project.repository.keep_around(self.merge_commit_sha) @@ -1189,9 +1197,11 @@ class MergeRequest < ActiveRecord::Base true end + # rubocop: disable CodeReuse/ServiceClass def update_project_counter_caches Projects::OpenMergeRequestsCountService.new(target_project).refresh_cache end + # rubocop: enable CodeReuse/ServiceClass def first_contribution? return false if project.team.max_member_access(author_id) > Gitlab::Access::GUEST |