Commit 9ee697dd6847de0bd1a38714df7d8bb509534d20

Authored by Dmitriy Zaporozhets
1 parent 3c867dfa

Use MergeRequest services in API and controllers

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
app/controllers/projects/merge_requests_controller.rb
@@ -76,10 +76,10 @@ class Projects::MergeRequestsController &lt; Projects::ApplicationController @@ -76,10 +76,10 @@ class Projects::MergeRequestsController &lt; 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 &lt; Projects::ApplicationController @@ -89,29 +89,9 @@ class Projects::MergeRequestsController &lt; 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 &lt; ActiveRecord::Base @@ -97,6 +97,7 @@ class MergeRequest &lt; 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 &lt; ActiveRecord::Base @@ -125,6 +126,20 @@ class MergeRequest &lt; 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 &lt; ActiveRecord::Base @@ -552,4 +552,8 @@ class Project &lt; 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 &nbsp; 39 &nbsp;
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