Commit 9ee697dd6847de0bd1a38714df7d8bb509534d20
1 parent
3c867dfa
Exists in
spb-stable
and in
3 other branches
Use MergeRequest services in API and controllers
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Showing
5 changed files
with
42 additions
and
67 deletions
Show diff stats
app/controllers/projects/merge_requests_controller.rb
| @@ -76,10 +76,10 @@ class Projects::MergeRequestsController < Projects::ApplicationController | @@ -76,10 +76,10 @@ class Projects::MergeRequestsController < Projects::ApplicationController | ||
| 76 | end | 76 | end |
| 77 | 77 | ||
| 78 | def create | 78 | def create |
| 79 | - @merge_request = MergeRequest.new(params[:merge_request]) | ||
| 80 | - @merge_request.author = current_user | ||
| 81 | @target_branches ||= [] | 79 | @target_branches ||= [] |
| 82 | - if @merge_request.save | 80 | + @merge_request = MergeRequests::CreateService.new(project, current_user, params[:merge_request]).execute |
| 81 | + | ||
| 82 | + if @merge_request.valid? | ||
| 83 | redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully created.' | 83 | redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully created.' |
| 84 | else | 84 | else |
| 85 | @source_project = @merge_request.source_project | 85 | @source_project = @merge_request.source_project |
| @@ -89,29 +89,9 @@ class Projects::MergeRequestsController < Projects::ApplicationController | @@ -89,29 +89,9 @@ class Projects::MergeRequestsController < Projects::ApplicationController | ||
| 89 | end | 89 | end |
| 90 | 90 | ||
| 91 | def update | 91 | def update |
| 92 | - # If we close MergeRequest we want to ignore validation | ||
| 93 | - # so we can close broken one (Ex. fork project removed) | ||
| 94 | - if params[:merge_request] == {"state_event"=>"close"} | ||
| 95 | - @merge_request.allow_broken = true | ||
| 96 | - | ||
| 97 | - if @merge_request.close | ||
| 98 | - opts = { notice: 'Merge request was successfully closed.' } | ||
| 99 | - else | ||
| 100 | - opts = { alert: 'Failed to close merge request.' } | ||
| 101 | - end | ||
| 102 | - | ||
| 103 | - redirect_to [@merge_request.target_project, @merge_request], opts | ||
| 104 | - return | ||
| 105 | - end | ||
| 106 | - | ||
| 107 | - # We dont allow change of source/target projects | ||
| 108 | - # after merge request was created | ||
| 109 | - params[:merge_request].delete(:source_project_id) | ||
| 110 | - params[:merge_request].delete(:target_project_id) | ||
| 111 | - | ||
| 112 | - if @merge_request.update_attributes(params[:merge_request]) | ||
| 113 | - @merge_request.reset_events_cache | 92 | + @merge_request = MergeRequests::UpdateService.new(project, current_user, params[:merge_request]).execute(@merge_request) |
| 114 | 93 | ||
| 94 | + if @merge_request.valid? | ||
| 115 | respond_to do |format| | 95 | respond_to do |format| |
| 116 | format.js | 96 | format.js |
| 117 | format.html do | 97 | format.html do |
app/models/merge_request.rb
| @@ -97,6 +97,7 @@ class MergeRequest < ActiveRecord::Base | @@ -97,6 +97,7 @@ class MergeRequest < ActiveRecord::Base | ||
| 97 | validates :target_project, presence: true | 97 | validates :target_project, presence: true |
| 98 | validates :target_branch, presence: true | 98 | validates :target_branch, presence: true |
| 99 | validate :validate_branches | 99 | validate :validate_branches |
| 100 | + validate :validate_fork | ||
| 100 | 101 | ||
| 101 | scope :of_group, ->(group) { where("source_project_id in (:group_project_ids) OR target_project_id in (:group_project_ids)", group_project_ids: group.project_ids) } | 102 | scope :of_group, ->(group) { where("source_project_id in (:group_project_ids) OR target_project_id in (:group_project_ids)", group_project_ids: group.project_ids) } |
| 102 | scope :of_user_team, ->(team) { where("(source_project_id in (:team_project_ids) OR target_project_id in (:team_project_ids) AND assignee_id in (:team_member_ids))", team_project_ids: team.project_ids, team_member_ids: team.member_ids) } | 103 | scope :of_user_team, ->(team) { where("(source_project_id in (:team_project_ids) OR target_project_id in (:team_project_ids) AND assignee_id in (:team_member_ids))", team_project_ids: team.project_ids, team_member_ids: team.member_ids) } |
| @@ -125,6 +126,20 @@ class MergeRequest < ActiveRecord::Base | @@ -125,6 +126,20 @@ class MergeRequest < ActiveRecord::Base | ||
| 125 | end | 126 | end |
| 126 | end | 127 | end |
| 127 | 128 | ||
| 129 | + def validate_fork | ||
| 130 | + if target_projet == source_project | ||
| 131 | + true | ||
| 132 | + else | ||
| 133 | + # If source and target projects are different | ||
| 134 | + # we should check if source project is actually a fork of target project | ||
| 135 | + if source_project.forked_from?(target_project) | ||
| 136 | + true | ||
| 137 | + else | ||
| 138 | + errors.add :base, "Source project is not a fork of target project" | ||
| 139 | + end | ||
| 140 | + end | ||
| 141 | + end | ||
| 142 | + | ||
| 128 | def update_merge_request_diff | 143 | def update_merge_request_diff |
| 129 | if source_branch_changed? || target_branch_changed? | 144 | if source_branch_changed? || target_branch_changed? |
| 130 | reload_code | 145 | reload_code |
app/models/project.rb
| @@ -552,4 +552,8 @@ class Project < ActiveRecord::Base | @@ -552,4 +552,8 @@ class Project < ActiveRecord::Base | ||
| 552 | gitlab_shell.update_repository_head(self.path_with_namespace, branch) | 552 | gitlab_shell.update_repository_head(self.path_with_namespace, branch) |
| 553 | reload_default_branch | 553 | reload_default_branch |
| 554 | end | 554 | end |
| 555 | + | ||
| 556 | + def forked_from?(project) | ||
| 557 | + forked? && project == forked_from_project | ||
| 558 | + end | ||
| 555 | end | 559 | end |
app/views/projects/merge_requests/_form.html.haml
| @@ -33,7 +33,7 @@ | @@ -33,7 +33,7 @@ | ||
| 33 | .col-sm-10 | 33 | .col-sm-10 |
| 34 | .clearfix | 34 | .clearfix |
| 35 | .pull-left | 35 | .pull-left |
| 36 | - - projects = @project.forked_from_project.nil? ? [@project] : [ @project,@project.forked_from_project] | 36 | + - projects = @project.forked_from_project.nil? ? [@project] : [@project, @project.forked_from_project] |
| 37 | = f.select(:target_project_id, options_from_collection_for_select(projects, 'id', 'path_with_namespace', f.object.target_project_id), {}, { class: 'target_project select2 span3', disabled: @merge_request.persisted? }) | 37 | = f.select(:target_project_id, options_from_collection_for_select(projects, 'id', 'path_with_namespace', f.object.target_project_id), {}, { class: 'target_project select2 span3', disabled: @merge_request.persisted? }) |
| 38 | .pull-left | 38 | .pull-left |
| 39 | | 39 | |
lib/api/merge_requests.rb
| @@ -13,14 +13,6 @@ module API | @@ -13,14 +13,6 @@ module API | ||
| 13 | end | 13 | end |
| 14 | not_found! | 14 | not_found! |
| 15 | end | 15 | end |
| 16 | - | ||
| 17 | - def not_fork?(target_project_id, user_project) | ||
| 18 | - target_project_id.nil? || target_project_id == user_project.id.to_s | ||
| 19 | - end | ||
| 20 | - | ||
| 21 | - def target_matches_fork(target_project_id,user_project) | ||
| 22 | - user_project.forked? && user_project.forked_from_project.id.to_s == target_project_id | ||
| 23 | - end | ||
| 24 | end | 16 | end |
| 25 | 17 | ||
| 26 | # List merge requests | 18 | # List merge requests |
| @@ -70,29 +62,15 @@ module API | @@ -70,29 +62,15 @@ module API | ||
| 70 | # POST /projects/:id/merge_requests | 62 | # POST /projects/:id/merge_requests |
| 71 | # | 63 | # |
| 72 | post ":id/merge_requests" do | 64 | post ":id/merge_requests" do |
| 73 | - set_current_user_for_thread do | ||
| 74 | - authorize! :write_merge_request, user_project | ||
| 75 | - required_attributes! [:source_branch, :target_branch, :title] | ||
| 76 | - attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :target_project_id, :description] | ||
| 77 | - merge_request = user_project.merge_requests.new(attrs) | ||
| 78 | - merge_request.author = current_user | ||
| 79 | - merge_request.source_project = user_project | ||
| 80 | - target_project_id = attrs[:target_project_id] | ||
| 81 | - if not_fork?(target_project_id, user_project) | ||
| 82 | - merge_request.target_project = user_project | ||
| 83 | - else | ||
| 84 | - if target_matches_fork(target_project_id,user_project) | ||
| 85 | - merge_request.target_project = Project.find_by(id: attrs[:target_project_id]) | ||
| 86 | - else | ||
| 87 | - render_api_error!('(Bad Request) Specified target project that is not the source project, or the source fork of the project.', 400) | ||
| 88 | - end | ||
| 89 | - end | ||
| 90 | - | ||
| 91 | - if merge_request.save | ||
| 92 | - present merge_request, with: Entities::MergeRequest | ||
| 93 | - else | ||
| 94 | - handle_merge_request_errors! merge_request.errors | ||
| 95 | - end | 65 | + authorize! :write_merge_request, user_project |
| 66 | + required_attributes! [:source_branch, :target_branch, :title] | ||
| 67 | + attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :target_project_id, :description] | ||
| 68 | + merge_request = ::MergeRequests::CreateService.new(user_project, current_user, attrs).execute | ||
| 69 | + | ||
| 70 | + if merge_request.valid? | ||
| 71 | + present merge_request, with: Entities::MergeRequest | ||
| 72 | + else | ||
| 73 | + handle_merge_request_errors! merge_request.errors | ||
| 96 | end | 74 | end |
| 97 | end | 75 | end |
| 98 | 76 | ||
| @@ -111,17 +89,15 @@ module API | @@ -111,17 +89,15 @@ module API | ||
| 111 | # PUT /projects/:id/merge_request/:merge_request_id | 89 | # PUT /projects/:id/merge_request/:merge_request_id |
| 112 | # | 90 | # |
| 113 | put ":id/merge_request/:merge_request_id" do | 91 | put ":id/merge_request/:merge_request_id" do |
| 114 | - set_current_user_for_thread do | ||
| 115 | - attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :state_event, :description] | ||
| 116 | - merge_request = user_project.merge_requests.find(params[:merge_request_id]) | ||
| 117 | - | ||
| 118 | - authorize! :modify_merge_request, merge_request | 92 | + attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :state_event, :description] |
| 93 | + merge_request = user_project.merge_requests.find(params[:merge_request_id]) | ||
| 94 | + authorize! :modify_merge_request, merge_request | ||
| 95 | + merge_request = ::MergeRequests::UpdateService.new(user_project, current_user, attrs).execute(merge_request) | ||
| 119 | 96 | ||
| 120 | - if merge_request.update_attributes attrs | ||
| 121 | - present merge_request, with: Entities::MergeRequest | ||
| 122 | - else | ||
| 123 | - handle_merge_request_errors! merge_request.errors | ||
| 124 | - end | 97 | + if merge_request.valid? |
| 98 | + present merge_request, with: Entities::MergeRequest | ||
| 99 | + else | ||
| 100 | + handle_merge_request_errors! merge_request.errors | ||
| 125 | end | 101 | end |
| 126 | end | 102 | end |
| 127 | 103 |