Class: Projects::MergeRequestsController

Constant Summary

Constants included from MergeRequestsHelper

MergeRequestsHelper::DIFF_BATCH_ENDPOINT_PER_PAGE

Constants included from Gitlab::Cache::Helpers

Gitlab::Cache::Helpers::DEFAULT_EXPIRY

Constants included from CookiesHelper

CookiesHelper::COOKIE_TYPE_ENCRYPTED, CookiesHelper::COOKIE_TYPE_PERMANENT

Constants included from SortingTitlesValuesHelper

SortingTitlesValuesHelper::SORT_NAME, SortingTitlesValuesHelper::SORT_UPDATED_OLDEST, SortingTitlesValuesHelper::SORT_UPDATED_RECENT

Constants included from Gitlab::HttpRouter::RuleContext

Gitlab::HttpRouter::RuleContext::ALLOWED_ROUTER_RULE_ACTIONS, Gitlab::HttpRouter::RuleContext::ALLOWED_ROUTER_RULE_TYPES, Gitlab::HttpRouter::RuleContext::ROUTER_RULE_ACTIONS_WITHOUT_TYPE

Constants included from StrongPaginationParams

StrongPaginationParams::PAGINATION_PARAMS

Constants included from Gitlab::Logging::CloudflareHelper

Gitlab::Logging::CloudflareHelper::CLOUDFLARE_CUSTOM_HEADERS

Constants included from Gitlab::EndpointAttributes

Gitlab::EndpointAttributes::DEFAULT_URGENCY

Constants included from Impersonation

Impersonation::SESSION_KEYS_TO_DELETE

Constants included from PreferredLanguageSwitcherHelper

PreferredLanguageSwitcherHelper::SWITCHER_MINIMUM_TRANSLATION_LEVEL

Constants included from Routing::PseudonymizationHelper

Routing::PseudonymizationHelper::PSEUDONOMIZED_GROUP, Routing::PseudonymizationHelper::PSEUDONOMIZED_ID, Routing::PseudonymizationHelper::PSEUDONOMIZED_NAMESPACE, Routing::PseudonymizationHelper::PSEUDONOMIZED_PROJECT

Constants included from ProjectsHelper

ProjectsHelper::BANNED

Constants included from Gitlab::NoCacheHeaders

Gitlab::NoCacheHeaders::DEFAULT_GITLAB_NO_CACHE_HEADERS

Instance Method Summary collapse

Methods included from DiffsStreamResource

#diffs_stream_url

Methods included from ParseCommitDate

#convert_date_to_epoch

Methods included from MergeRequestsHelper

#allow_collaboration_unavailable_reason, #award_emoji_merge_request_api_path, #create_mr_button_from_event?, #create_mr_path_from_push_event, #default_merge_request_sort, #diffs_tab_pane_data, #format_mr_branch_names, #how_merge_modal_data, #identity_verification_alert_data, #merge_path_description, #merge_request_button_hidden?, #merge_request_dashboard_enabled?, #merge_request_source_project_for_project, #merge_request_version_path, #mr_change_branches_path, #mr_compare_form_data, #mr_css_classes, #notifications_todos_buttons_enabled?, #project_merge_requests_list_data, #project_merge_requests_list_more_actions_data, #reviewers_label, #show_mr_dashboard_banner?, #sticky_header_data, #tab_link_for, #target_projects, #user_merge_requests_counts

Methods included from CompareHelper

#create_mr_button?, #create_mr_path, #project_compare_selector_data, #target_projects

Methods included from Gitlab::Cache::Helpers

#cache, #render_cached

Methods included from DiffHelper

#apply_diff_view_cookie!, #collapsed_diff_url, #conflicts, #conflicts_with_types, #diff_file_blob_raw_path, #diff_file_blob_raw_url, #diff_file_html_data, #diff_file_old_blob_raw_path, #diff_file_old_blob_raw_url, #diff_file_stats_data, #diff_line_content, #diff_link_number, #diff_match_line, #diff_nomappinginraw_line, #diff_options, #diff_view, #diffs_expanded?, #editable_diff?, #inline_diff_btn, #mark_inline_diffs, #parallel_diff_btn, #parallel_diff_discussions, #params_with_whitespace, #rapid_diffs?, #render_fork_suggestion, #render_overflow_warning?, #show_only_context_commits?, #submodule_diff_compare_link, #submodule_link

Methods included from RecordUserLastActivity

#set_member_last_activity, #set_user_last_activity

Methods included from CookiesHelper

#set_secure_cookie

Methods included from SortingPreference

#default_sort_order, #legacy_sort_cookie_name, #set_sort_order

Methods included from SortingHelper

#admin_users_sort_options, #branches_sort_options_hash, #can_sort_by_issue_weight?, #can_sort_by_merged_date?, #due_date_option, #forks_reverse_sort_options_hash, #forks_sort_direction_button, #issuable_reverse_sort_order_hash, #issuable_sort_direction_button, #issuable_sort_option_overrides, #issuable_sort_options, #label_priority_option, #label_sort_options_hash, #merged_option, #milestones_sort_options_hash, #popularity_option, #projects_sort_options_hash, #relative_position_option, #sort_direction_button, #sort_direction_icon, #sort_options_hash, #starrers_sort_options_hash, #tags_sort_options_hash, #title_option, #users_sort_options_hash

Methods included from ButtonHelper

#clipboard_button, #dropdown_item_with_description, #http_clone_button, #http_dropdown_description, #link_button_to, #ssh_clone_button

Methods included from SortingTitlesValuesHelper

#sort_title_closed_date, #sort_title_closed_earlier, #sort_title_closed_recently, #sort_title_contacted_date, #sort_title_created_date, #sort_title_downvotes, #sort_title_due_date, #sort_title_due_date_later, #sort_title_due_date_soon, #sort_title_expire_date, #sort_title_label_priority, #sort_title_largest_group, #sort_title_largest_repo, #sort_title_latest_activity, #sort_title_merged_date, #sort_title_merged_earlier, #sort_title_merged_recently, #sort_title_milestone, #sort_title_milestone_later, #sort_title_milestone_soon, #sort_title_most_stars, #sort_title_name, #sort_title_name_asc, #sort_title_name_desc, #sort_title_oldest_activity, #sort_title_oldest_created, #sort_title_oldest_last_activity, #sort_title_oldest_signin, #sort_title_oldest_starred, #sort_title_oldest_updated, #sort_title_popularity, #sort_title_priority, #sort_title_recently_created, #sort_title_recently_last_activity, #sort_title_recently_signin, #sort_title_recently_starred, #sort_title_recently_updated, #sort_title_relative_position, #sort_title_relevance, #sort_title_size, #sort_title_stars, #sort_title_start_date_later, #sort_title_start_date_soon, #sort_title_title, #sort_title_upvotes, #sort_title_version_asc, #sort_title_version_desc, #sort_value_closed_date, #sort_value_closed_earlier, #sort_value_closed_recently, #sort_value_contacted_date, #sort_value_created_date, #sort_value_downvotes, #sort_value_due_date, #sort_value_due_date_later, #sort_value_due_date_soon, #sort_value_expire_date, #sort_value_label_priority, #sort_value_largest_group, #sort_value_largest_repo, #sort_value_latest_activity, #sort_value_least_popular, #sort_value_merged_date, #sort_value_merged_earlier, #sort_value_merged_recently, #sort_value_milestone, #sort_value_milestone_later, #sort_value_milestone_soon, #sort_value_most_popular, #sort_value_name, #sort_value_name_desc, #sort_value_oldest_activity, #sort_value_oldest_created, #sort_value_oldest_last_activity, #sort_value_oldest_signin, #sort_value_oldest_updated, #sort_value_popularity, #sort_value_priority, #sort_value_recently_created, #sort_value_recently_last_activity, #sort_value_recently_signin, #sort_value_recently_updated, #sort_value_relative_position, #sort_value_relevance, #sort_value_size, #sort_value_stars_asc, #sort_value_stars_desc, #sort_value_start_date_later, #sort_value_start_date_soon, #sort_value_title, #sort_value_title_desc, #sort_value_upvotes, #sort_value_version_asc, #sort_value_version_desc

Methods included from ToggleAwardEmoji

#toggle_award_emoji

Methods included from RendersAssignees

#preload_assignees_for_render

Methods included from RendersCommits

#limited_commits, #prepare_commits_for_rendering, #set_commits_for_rendering, #valid_ref?

Methods included from IssuableActions

#bulk_update, #check_destroy_confirmation!, #destroy, #realtime_changes

Methods included from Spam::Concerns::HasSpamActionResponseFields

#spam_action_response_fields

Methods included from SpammableActions::AkismetMarkAsSpamAction

#mark_as_spam

Methods included from ToggleSubscriptionAction

#toggle_subscription

Methods included from ChecksCollaboration

#can_collaborate_with_project?, #user_access

Methods included from RoutableActions

#ensure_canonical_path, #find_routable!, #not_found_actions, #perform_not_found_actions, #routable_authorized?

Methods inherited from ApplicationController

endpoint_id_for_action, #feature_category, #handle_unverified_request, #not_found, #redirect_back_or_default, #render, #route_not_found, #urgency

Methods included from Gitlab::HttpRouter::RuleMetrics

#increment_http_router_metrics

Methods included from StrongPaginationParams

#pagination_params

Methods included from Gitlab::Logging::CloudflareHelper

#store_cloudflare_headers!, #valid_cloudflare_header?

Methods included from CheckRateLimit

#check_rate_limit!

Methods included from FlocOptOut

#floc_enabled?, #set_floc_opt_out_header

Methods included from Impersonation

#current_user

Methods included from InitializesCurrentUserMode

#current_user_mode

Methods included from SessionsHelper

#obfuscated_email, #remember_me_enabled?, #unconfirmed_email?, #unconfirmed_verification_email?, #verification_data, #verification_email

Methods included from SessionlessAuthentication

#authenticate_sessionless_user!, #request_authenticator, #sessionless_bypass_admin_mode!, #sessionless_sign_in, #sessionless_user?

Methods included from PreferredLanguageSwitcherHelper

#ordered_selectable_locales

Methods included from Gitlab::SearchContext::ControllerConcern

#search_context

Methods included from EnforcesTwoFactorAuthentication

#check_two_factor_requirement, #current_user_requires_two_factor?, #execute_action_for_2fa_reason, #mfa_help_page_url, #skip_two_factor?, #two_factor_authentication_required?, #two_factor_grace_period, #two_factor_grace_period_expired?, #two_factor_skippable?, #two_factor_verifier

Methods included from WorkhorseHelper

#attachment_content_disposition, #content_disposition_for_blob, #inline_content_disposition, #send_artifacts_entry, #send_dependency, #send_git_archive, #send_git_blob, #send_git_diff, #send_git_patch, #set_workhorse_internal_api_content_type, #workhorse_set_content_type!

Methods included from SafeParamsHelper

#safe_params

Methods included from PageLayoutHelper

#blank_container, #container_class, #favicon, #fluid_layout, #full_content_class, #header_title, #nav, #page_canonical_link, #page_card_attributes, #page_card_meta_tags, #page_description, #page_image, #page_itemtype, #page_title, #search_context, #sidebar, #user_status_properties

Methods included from Routing::PackagesHelper

#package_path

Methods included from Routing::PseudonymizationHelper

#masked_page_url, #masked_query_params, #masked_referrer_url, #referrer_params

Methods included from Routing::GraphqlHelper

#graphql_etag_pipeline_path, #graphql_etag_pipeline_sha_path, #graphql_etag_project_on_demand_scan_counts_path

Methods included from Routing::WikiHelper

#group_wiki_page_url, #project_wiki_page_url, #wiki_page_path, #wiki_path

Methods included from Routing::SnippetsHelper

#gitlab_dashboard_snippets_path, #gitlab_raw_snippet_blob_path, #gitlab_raw_snippet_blob_url, #gitlab_raw_snippet_path, #gitlab_raw_snippet_url, #gitlab_snippet_note_path, #gitlab_snippet_note_url, #gitlab_snippet_notes_path, #gitlab_snippet_notes_url, #gitlab_snippet_path, #gitlab_snippet_url, #gitlab_toggle_award_emoji_snippet_note_path, #gitlab_toggle_award_emoji_snippet_note_url, #gitlab_toggle_award_emoji_snippet_path, #gitlab_toggle_award_emoji_snippet_url, #preview_markdown_path, #toggle_award_emoji_personal_snippet_path, #toggle_award_emoji_project_project_snippet_path, #toggle_award_emoji_project_project_snippet_url

Methods included from Routing::PipelineSchedulesHelper

#edit_pipeline_schedule_path, #pipeline_schedule_path, #pipeline_schedules_path, #play_pipeline_schedule_path, #take_ownership_pipeline_schedule_path

Methods included from Routing::ArtifactsHelper

#artifacts_action_path, #expose_fast_artifacts_path, #fast_browse_project_job_artifacts_path, #fast_download_project_job_artifacts_path, #fast_keep_project_job_artifacts_path

Methods included from Routing::MembersHelper

#source_members_url

Methods included from Routing::Groups::MembersHelper

#approve_access_request_group_member_path, #group_member_path, #group_members_url, #leave_group_members_path, #request_access_group_members_path, #resend_invite_group_member_path

Methods included from Routing::Projects::MembersHelper

#approve_access_request_project_member_path, #leave_project_members_path, #project_member_path, #project_members_url, #request_access_project_members_path, #resend_invite_project_member_path

Methods included from Routing::ProjectsHelper

#commit_url, #commits_url, #edit_milestone_path, #environment_delete_path, #environment_path, #issue_path, #issue_url, #merge_request_path, #merge_request_url, #pipeline_job_url, #pipeline_path, #pipeline_url, #project_commits_path, #project_ref_path, #project_tree_path, #release_url, #toggle_subscription_path, #work_item_url

Methods included from API::Helpers::RelatedResourcesHelpers

#expose_path, #expose_url, #issues_available?, #mrs_available?, #project_feature_string_access_level

Methods included from ApplicationSettingsHelper

#all_protocols_enabled?, #allowed_protocols_present?, #anti_spam_service_enabled?, #deprecated_attributes, #enabled_protocol, #enabled_protocol_button, #expanded_by_default?, #external_authorization_allow_token_help_text, #external_authorization_client_certificate_help_text, #external_authorization_client_key_help_text, #external_authorization_client_pass_help_text, #external_authorization_client_url_help_text, #external_authorization_description, #external_authorization_service_attributes, #external_authorization_timeout_help_text, #external_authorization_url_help_text, #http_enabled?, #import_sources_checkboxes, #instance_clusters_enabled?, #integration_expanded?, #key_restriction_options_for_select, #kroki_available_formats, #oauth_providers_checkboxes, #pending_user_count, #registration_features_can_be_prompted?, #repository_storages_options_json, #restricted_level_checkboxes, #runner_token_expiration_interval_attributes, #sidekiq_job_limiter_mode_help_text, #sidekiq_job_limiter_modes_for_select, #signup_enabled?, #signup_form_data, #ssh_enabled?, #storage_weights, #user_oauth_applications?, #valid_runner_registrars, #visible_attributes

Methods included from ProjectsHelper

#able_to_see_forks_count?, #able_to_see_issues?, #able_to_see_merge_requests?, #any_projects?, #author_content_tag, #autodeploy_flash_notice, #badge_count, #branch_rules_path, #can_admin_associated_clusters?, #can_admin_project_member?, #can_change_visibility_level?, #can_disable_emails?, #can_push_code?, #can_set_diff_preview_in_email?, #can_view_branch_rules?, #clusters_deprecation_alert_message, #dashboard_projects_app_data, #delete_confirm_phrase, #directory?, #error_tracking_setting_project_json, #explore_projects_tab?, #external_classification_label_help_message, #fork_button_data_attributes, #hidden_issue_icon, #home_panel_data_attributes, #http_clone_url_to_repo, #import_from_bitbucket_message, #inactive_project_deletion_date, #issue_css_classes, #issue_manual_ordering_class, #last_pipeline_from_status_cache, #last_push_event, #link_to_autodeploy_doc, #link_to_data_loss_doc, #link_to_member, #link_to_member_avatar, #link_to_namespace_change_doc, #link_to_project, #load_catalog_resources, #load_pipeline_status, #localized_project_human_access, #membership_locked?, #no_password_message, #notification_data_attributes, #project_can_be_shared?, #project_classes, #project_coverage_chart_data_attributes, #project_incident_management_setting, #project_license_name, #project_permissions_panel_data, #project_title, #projects_filtered_search_and_sort_app_data, #push_to_create_project_command, #remote_mirror_setting_enabled?, #remove_fork_project_confirm_json, #remove_fork_project_description_message, #remove_fork_project_warning_message, #remove_project_message, #show_archived_project_banner?, #show_auto_devops_implicitly_enabled_banner?, #show_clusters_alert?, #show_count?, #show_dashboard_projects_welcome_page?, #show_inactive_project_deletion_banner?, #show_invalid_gpg_key_message?, #show_lfs_misconfiguration_banner?, #show_mobile_devops_project_promo?, #show_no_password_message?, #show_no_ssh_key_message?, #show_projects?, #show_terraform_banner?, #show_xcode_link?, #ssh_clone_url_to_repo, #star_count_data_attributes, #transfer_project_confirm_button, #transfer_project_message, #visibility_level_content, #visible_fork_source, #vue_fork_divergence_data, #xcode_uri_to_repo

Methods included from Gitlab::Allowable

#can?, #can_all?, #can_any?

Methods included from Gitlab::NoCacheHeaders

#no_cache_headers

Methods included from Gitlab::GonHelper

#add_browsersdk_tracking, #add_gon_variables, #current_organization, #default_avatar_url, #push_force_frontend_feature_flag, #push_frontend_ability, #push_frontend_feature_flag, #push_namespace_setting, #push_to_gon_attributes

Methods included from WebpackHelper

#prefetch_link_tag, #webpack_bundle_tag, #webpack_controller_bundle_tags, #webpack_entrypoint_paths, #webpack_preload_asset_tag, #webpack_public_host, #webpack_public_path

Methods included from ViteHelper

#universal_path_to_stylesheet, #universal_stylesheet_link_tag, #vite_enabled?, #vite_hmr_http_url, #vite_hmr_websocket_url, #vite_page_entrypoint_paths

Methods included from ContentSecurityPolicyPatch

#content_security_policy_with_context

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Projects::ApplicationController

Instance Method Details

#accessibility_reportsObject



206
207
208
209
210
211
212
# File 'app/controllers/projects/merge_requests_controller.rb', line 206

def accessibility_reports
  if @merge_request.has_accessibility_reports?
    reports_response(@merge_request.compare_accessibility_reports)
  else
    head :no_content
  end
end


314
315
316
317
318
319
320
321
322
323
324
325
326
327
# File 'app/controllers/projects/merge_requests_controller.rb', line 314

def assign_related_issues
  result = ::MergeRequests::AssignIssuesService
    .new(project: project, current_user: current_user, params: { merge_request: @merge_request })
    .execute

  case result[:count]
  when 0
    flash[:alert] = _("Failed to assign you issues related to the merge request.")
  else
    flash[:notice] = n_("An issue has been assigned to you.", "%d issues have been assigned to you.", result[:count])
  end

  redirect_to(merge_request_path(@merge_request))
end

#cancel_auto_mergeObject



290
291
292
293
294
295
296
# File 'app/controllers/projects/merge_requests_controller.rb', line 290

def cancel_auto_merge
  return access_denied! unless @merge_request.can_cancel_auto_merge?(current_user)

  AutoMergeService.new(project, current_user).cancel(@merge_request)

  render json: serialize_widget(@merge_request)
end

#ci_environments_statusObject



335
336
337
338
339
340
341
342
343
344
# File 'app/controllers/projects/merge_requests_controller.rb', line 335

def ci_environments_status
  environments =
    if ci_environments_status_on_merge_result?
      EnvironmentStatus.for_deployed_merge_request(@merge_request, current_user)
    else
      EnvironmentStatus.for_merge_request(@merge_request, current_user)
    end

  render json: EnvironmentStatusSerializer.new(current_user: current_user).represent(environments)
end

#codequality_mr_diff_reportsObject

documented in doc/development/rails_endpoints/index.md



223
224
225
# File 'app/controllers/projects/merge_requests_controller.rb', line 223

def codequality_mr_diff_reports
  reports_response(@merge_request.find_codequality_mr_diff_reports, head_pipeline)
end

#codequality_reportsObject

documented in doc/development/rails_endpoints/index.md



228
229
230
# File 'app/controllers/projects/merge_requests_controller.rb', line 228

def codequality_reports
  reports_response(@merge_request.compare_codequality_reports)
end

#commit_change_contentObject



286
287
288
# File 'app/controllers/projects/merge_requests_controller.rb', line 286

def commit_change_content
  render partial: 'projects/merge_requests/widget/commit_change_content', layout: false
end

#commitsObject



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'app/controllers/projects/merge_requests_controller.rb', line 122

def commits
  # Get context commits from repository
  @context_commits =
    set_commits_for_rendering(
      @merge_request.recent_context_commits
    )

  per_page = [
    (params[:per_page] || MergeRequestDiff::COMMITS_SAFE_SIZE).to_i,
    MergeRequestDiff::COMMITS_SAFE_SIZE
  ].min
  recent_commits = @merge_request
    .recent_commits(load_from_gitaly: true, limit: per_page, page: params[:page])
    .with_latest_pipeline(@merge_request.source_branch)
    .with_markdown_cache
  @next_page = recent_commits.next_page
  @commits = set_commits_for_rendering(
    recent_commits,
    commits_count: @merge_request.commits_count
  )

  commits_count = if @merge_request.preparing?
                    '-'
                  else
                    @merge_request.commits_count + @merge_request.context_commits_count
                  end

  render json: {
    html: view_to_html_string('projects/merge_requests/_commits'),
    next_page: @next_page,
    count: commits_count
  }
end

#context_commitsObject



189
190
191
192
193
194
195
196
197
198
199
200
# File 'app/controllers/projects/merge_requests_controller.rb', line 189

def context_commits
  # Get commits from repository
  # or from cache if already merged
  commits = ContextCommitsFinder.new(project, @merge_request, {
    search: params[:search],
    author: params[:author],
    committed_before: convert_date_to_epoch(params[:committed_before]),
    committed_after: convert_date_to_epoch(params[:committed_after]),
    limit: params[:limit]
  }).execute
  render json: CommitEntity.represent(commits, { type: :full, request: merge_request })
end

#coverage_reportsObject



214
215
216
217
218
219
220
# File 'app/controllers/projects/merge_requests_controller.rb', line 214

def coverage_reports
  if @merge_request.has_coverage_reports?
    reports_response(@merge_request.find_coverage_reports)
  else
    head :no_content
  end
end

#diffsObject



108
109
110
# File 'app/controllers/projects/merge_requests_controller.rb', line 108

def diffs
  show_merge_request
end

#discussionsObject



355
356
357
358
359
360
# File 'app/controllers/projects/merge_requests_controller.rb', line 355

def discussions
  super do |discussion_notes|
    note_ids = discussion_notes.flat_map { |x| x.notes.collect(&:id) }
    merge_request.discussions_diffs.load_highlight(diff_note_ids: note_ids)
  end
end

#editObject



244
245
246
# File 'app/controllers/projects/merge_requests_controller.rb', line 244

def edit
  define_edit_vars
end

#export_csvObject



362
363
364
365
366
367
368
369
# File 'app/controllers/projects/merge_requests_controller.rb', line 362

def export_csv
  IssuableExportCsvWorker.perform_async(:merge_request, current_user.id, project.id, finder_options.to_h) # rubocop:disable CodeReuse/Worker

  index_path = project_merge_requests_path(project)
  message = format(_('Your CSV export has started. It will be emailed to %{email} when complete.'),
    email: current_user.notification_email_or_default)
  redirect_to(index_path, notice: message)
end

#exposed_artifactsObject



236
237
238
239
240
241
242
# File 'app/controllers/projects/merge_requests_controller.rb', line 236

def exposed_artifacts
  if @merge_request.has_exposed_artifacts?
    reports_response(@merge_request.find_exposed_artifacts)
  else
    head :no_content
  end
end

#indexObject



95
96
97
98
99
100
101
102
# File 'app/controllers/projects/merge_requests_controller.rb', line 95

def index
  @merge_requests = @issuables

  respond_to do |format|
    format.html
    format.atom { render layout: 'xml' }
  end
end

#mergeObject



298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
# File 'app/controllers/projects/merge_requests_controller.rb', line 298

def merge
  access_check_result = merge_access_check

  return access_check_result if access_check_result

  status = merge!

  Gitlab::ApplicationContext.push(merge_action_status: status.to_s)

  if @merge_request.merge_error
    render json: { status: status, merge_error: @merge_request.merge_error }
  else
    render json: { status: status }
  end
end

#pipeline_statusObject



329
330
331
332
333
# File 'app/controllers/projects/merge_requests_controller.rb', line 329

def pipeline_status
  render json: PipelineSerializer
    .new(project: @project, current_user: @current_user)
    .represent_status(head_pipeline)
end

#pipelinesObject



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'app/controllers/projects/merge_requests_controller.rb', line 156

def pipelines
  set_pipeline_variables
  @pipelines = @pipelines.page(params[:page])

  Gitlab::PollingInterval.set_header(response, interval: 10_000)

  render json: {
    pipelines: PipelineSerializer
      .new(project: @project, current_user: @current_user)
      .with_pagination(request, response)
      .represent(
        @pipelines,
        disable_coverage: true,
        disable_failed_builds: true,
        disable_manual_and_scheduled_actions: true,
        preload: true,
        preload_statuses: false,
        preload_downstream_statuses: false
      ),
    count: {
      all: @pipelines.count
    }
  }
end

#rapid_diffsObject



112
113
114
115
116
117
118
119
120
# File 'app/controllers/projects/merge_requests_controller.rb', line 112

def rapid_diffs
  return render_404 unless ::Feature.enabled?(:rapid_diffs, current_user, type: :wip)

  streaming_offset = 5
  @stream_url = diffs_stream_url(@merge_request, streaming_offset, diff_view)
  @diffs_slice = @merge_request.first_diffs_slice(streaming_offset)

  show_merge_request
end

#rebaseObject



346
347
348
349
350
351
352
353
# File 'app/controllers/projects/merge_requests_controller.rb', line 346

def rebase
  @merge_request
    .rebase_async(current_user.id, skip_ci: Gitlab::Utils.to_boolean(merge_params[:skip_ci], default: false))

  head :ok
rescue MergeRequest::RebaseLockTimeout => e
  render json: { merge_error: e.message }, status: :conflict
end

#remove_wipObject



278
279
280
281
282
283
284
# File 'app/controllers/projects/merge_requests_controller.rb', line 278

def remove_wip
  @merge_request = ::MergeRequests::UpdateService
    .new(project: project, current_user: current_user, params: { wip_event: 'ready' })
    .execute(@merge_request)

  render json: serialize_widget(@merge_request)
end

#sast_reportsObject



181
182
183
# File 'app/controllers/projects/merge_requests_controller.rb', line 181

def sast_reports
  reports_response(merge_request.compare_sast_reports(current_user), head_pipeline)
end

#secret_detection_reportsObject



185
186
187
# File 'app/controllers/projects/merge_requests_controller.rb', line 185

def secret_detection_reports
  reports_response(merge_request.compare_secret_detection_reports(current_user), head_pipeline)
end

#showObject



104
105
106
# File 'app/controllers/projects/merge_requests_controller.rb', line 104

def show
  show_merge_request
end

#terraform_reportsObject



232
233
234
# File 'app/controllers/projects/merge_requests_controller.rb', line 232

def terraform_reports
  reports_response(@merge_request.find_terraform_reports)
end

#test_reportsObject



202
203
204
# File 'app/controllers/projects/merge_requests_controller.rb', line 202

def test_reports
  reports_response(@merge_request.compare_test_reports)
end

#updateObject



248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
# File 'app/controllers/projects/merge_requests_controller.rb', line 248

def update
  @merge_request = ::MergeRequests::UpdateService
    .new(project: project, current_user: current_user, params: merge_request_update_params)
    .execute(@merge_request)

  respond_to do |format|
    format.html do
      if @merge_request.errors.present?
        define_edit_vars

        render :edit
      else
        redirect_to project_merge_request_path(@merge_request.target_project, @merge_request)
      end
    end

    format.json do
      if merge_request.errors.present?
        render json: @merge_request.errors, status: :bad_request
      else
        render json: serializer.represent(@merge_request, serializer: params[:serializer] || 'basic')
      end
    end
  end
rescue ActiveRecord::StaleObjectError
  define_edit_vars if request.format.html?

  render_conflict_response
end