diff options
Diffstat (limited to 'app/helpers/compare_helper.rb')
-rw-r--r-- | app/helpers/compare_helper.rb | 57 |
1 files changed, 40 insertions, 17 deletions
diff --git a/app/helpers/compare_helper.rb b/app/helpers/compare_helper.rb index f9d62747308..e955ad4cfda 100644 --- a/app/helpers/compare_helper.rb +++ b/app/helpers/compare_helper.rb @@ -1,25 +1,30 @@ # frozen_string_literal: true module CompareHelper - def create_mr_button?(from: params[:from], to: params[:to], source_project: @project, target_project: @target_project) + def create_mr_button?(source_project:, from:, to: nil, target_project: nil) + target_project ||= source_project.default_merge_request_target + to ||= target_project.default_branch + from.present? && to.present? && from != to && can?(current_user, :create_merge_request_from, source_project) && can?(current_user, :create_merge_request_in, target_project) && - target_project.repository.branch_exists?(from) && - source_project.repository.branch_exists?(to) + target_project.repository.branch_exists?(to) && + source_project.repository.branch_exists?(from) end - def create_mr_path(from: params[:from], to: params[:to], source_project: @project, target_project: @target_project) + def create_mr_path(from:, source_project:, to: nil, target_project: nil, mr_params: {}) + merge_request_params = { + source_branch: from + } + + merge_request_params[:target_project_id] = target_project.id if target_project + merge_request_params[:target_branch] = to if to + project_new_merge_request_path( - target_project, - merge_request: { - source_project_id: source_project.id, - source_branch: to, - target_project_id: target_project.id, - target_branch: from - } + source_project, + merge_request: merge_request_params.merge(mr_params) ) end @@ -32,14 +37,32 @@ module CompareHelper def project_compare_selector_data(project, merge_request, params) { project_compare_index_path: project_compare_index_path(project), - refs_project_path: refs_project_path(project), + source_project: { id: project.id, name: project.full_path }.to_json, + target_project: { id: @target_project.id, name: @target_project.full_path }.to_json, + source_project_refs_path: refs_project_path(project), + target_project_refs_path: refs_project_path(@target_project), params_from: params[:from], - params_to: params[:to], - project_merge_request_path: merge_request.present? ? project_merge_request_path(project, merge_request) : '', - create_mr_path: create_mr_button? ? create_mr_path : '' + params_to: params[:to] }.tap do |data| - data[:project_to] = { id: project.id, name: project.full_path }.to_json - data[:projects_from] = target_projects(project).map { |project| { id: project.id, name: project.full_path } }.to_json + data[:projects_from] = target_projects(project).map do |target_project| + { id: target_project.id, name: target_project.full_path } + end.to_json + + data[:project_merge_request_path] = + if merge_request.present? + project_merge_request_path(project, merge_request) + else + '' + end + + # The `from` and `to` params are inverted in the compare page. The route is `/compare/:from...:to`, but the UI + # correctly shows `:to` as the "Source" (i.e. the `from` for MR), and `:from` as "Target" (i.e. the `to` for MR). + data[:create_mr_path] = + if create_mr_button?(from: params[:to], to: params[:from], source_project: project, target_project: @target_project) + create_mr_path(from: params[:to], to: params[:from], source_project: project, target_project: @target_project) + else + '' + end end end end |