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 |