Use MergeRequest services in API and controllers
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
This commit is contained in:
		
							parent
							
								
									3c867dfa8e
								
							
						
					
					
						commit
						9ee697dd68
					
				|  | @ -76,10 +76,10 @@ class Projects::MergeRequestsController < Projects::ApplicationController | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def create |   def create | ||||||
|     @merge_request = MergeRequest.new(params[:merge_request]) |  | ||||||
|     @merge_request.author = current_user |  | ||||||
|     @target_branches ||= [] |     @target_branches ||= [] | ||||||
|     if @merge_request.save |     @merge_request = MergeRequests::CreateService.new(project, current_user, params[:merge_request]).execute | ||||||
|  | 
 | ||||||
|  |     if @merge_request.valid? | ||||||
|       redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully created.' |       redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully created.' | ||||||
|     else |     else | ||||||
|       @source_project = @merge_request.source_project |       @source_project = @merge_request.source_project | ||||||
|  | @ -89,29 +89,9 @@ class Projects::MergeRequestsController < Projects::ApplicationController | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def update |   def update | ||||||
|     # If we close MergeRequest we want to ignore validation |     @merge_request = MergeRequests::UpdateService.new(project, current_user, params[:merge_request]).execute(@merge_request) | ||||||
|     # so we can close broken one (Ex. fork project removed) |  | ||||||
|     if params[:merge_request] == {"state_event"=>"close"} |  | ||||||
|       @merge_request.allow_broken = true |  | ||||||
| 
 |  | ||||||
|       if @merge_request.close |  | ||||||
|         opts = { notice: 'Merge request was successfully closed.' } |  | ||||||
|       else |  | ||||||
|         opts = { alert: 'Failed to close merge request.' } |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       redirect_to [@merge_request.target_project, @merge_request], opts |  | ||||||
|       return |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     # We dont allow change of source/target projects |  | ||||||
|     # after merge request was created |  | ||||||
|     params[:merge_request].delete(:source_project_id) |  | ||||||
|     params[:merge_request].delete(:target_project_id) |  | ||||||
| 
 |  | ||||||
|     if @merge_request.update_attributes(params[:merge_request]) |  | ||||||
|       @merge_request.reset_events_cache |  | ||||||
| 
 | 
 | ||||||
|  |     if @merge_request.valid? | ||||||
|       respond_to do |format| |       respond_to do |format| | ||||||
|         format.js |         format.js | ||||||
|         format.html do |         format.html do | ||||||
|  |  | ||||||
|  | @ -97,6 +97,7 @@ class MergeRequest < ActiveRecord::Base | ||||||
|   validates :target_project, presence: true |   validates :target_project, presence: true | ||||||
|   validates :target_branch, presence: true |   validates :target_branch, presence: true | ||||||
|   validate :validate_branches |   validate :validate_branches | ||||||
|  |   validate :validate_fork | ||||||
| 
 | 
 | ||||||
|   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) } |   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) } | ||||||
|   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) } |   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 | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  |   def validate_fork | ||||||
|  |     if target_projet == source_project | ||||||
|  |       true | ||||||
|  |     else | ||||||
|  |       # If source and target projects are different | ||||||
|  |       # we should check if source project is actually a fork of target project | ||||||
|  |       if source_project.forked_from?(target_project) | ||||||
|  |         true | ||||||
|  |       else | ||||||
|  |         errors.add :base, "Source project is not a fork of target project" | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   def update_merge_request_diff |   def update_merge_request_diff | ||||||
|     if source_branch_changed? || target_branch_changed? |     if source_branch_changed? || target_branch_changed? | ||||||
|       reload_code |       reload_code | ||||||
|  |  | ||||||
|  | @ -552,4 +552,8 @@ class Project < ActiveRecord::Base | ||||||
|     gitlab_shell.update_repository_head(self.path_with_namespace, branch) |     gitlab_shell.update_repository_head(self.path_with_namespace, branch) | ||||||
|     reload_default_branch |     reload_default_branch | ||||||
|   end |   end | ||||||
|  | 
 | ||||||
|  |   def forked_from?(project) | ||||||
|  |     forked? && project == forked_from_project | ||||||
|  |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -33,7 +33,7 @@ | ||||||
|       .col-sm-10 |       .col-sm-10 | ||||||
|         .clearfix |         .clearfix | ||||||
|           .pull-left |           .pull-left | ||||||
|             - projects =  @project.forked_from_project.nil? ? [@project] : [ @project,@project.forked_from_project] |             - projects =  @project.forked_from_project.nil? ? [@project] : [@project, @project.forked_from_project] | ||||||
|             = 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? }) |             = 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? }) | ||||||
|           .pull-left |           .pull-left | ||||||
|               |               | ||||||
|  |  | ||||||
|  | @ -13,14 +13,6 @@ module API | ||||||
|           end |           end | ||||||
|           not_found! |           not_found! | ||||||
|         end |         end | ||||||
| 
 |  | ||||||
|         def not_fork?(target_project_id, user_project) |  | ||||||
|           target_project_id.nil? || target_project_id == user_project.id.to_s |  | ||||||
|         end |  | ||||||
| 
 |  | ||||||
|         def target_matches_fork(target_project_id,user_project) |  | ||||||
|           user_project.forked? && user_project.forked_from_project.id.to_s == target_project_id |  | ||||||
|         end |  | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       # List merge requests |       # List merge requests | ||||||
|  | @ -70,31 +62,17 @@ module API | ||||||
|       #   POST /projects/:id/merge_requests |       #   POST /projects/:id/merge_requests | ||||||
|       # |       # | ||||||
|       post ":id/merge_requests" do |       post ":id/merge_requests" do | ||||||
|         set_current_user_for_thread do |  | ||||||
|         authorize! :write_merge_request, user_project |         authorize! :write_merge_request, user_project | ||||||
|         required_attributes! [:source_branch, :target_branch, :title] |         required_attributes! [:source_branch, :target_branch, :title] | ||||||
|         attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :target_project_id, :description] |         attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :target_project_id, :description] | ||||||
|           merge_request = user_project.merge_requests.new(attrs) |         merge_request = ::MergeRequests::CreateService.new(user_project, current_user, attrs).execute | ||||||
|           merge_request.author = current_user |  | ||||||
|           merge_request.source_project = user_project |  | ||||||
|           target_project_id = attrs[:target_project_id] |  | ||||||
|           if not_fork?(target_project_id, user_project) |  | ||||||
|             merge_request.target_project = user_project |  | ||||||
|           else |  | ||||||
|             if target_matches_fork(target_project_id,user_project) |  | ||||||
|               merge_request.target_project = Project.find_by(id: attrs[:target_project_id]) |  | ||||||
|             else |  | ||||||
|               render_api_error!('(Bad Request) Specified target project that is not the source project, or the source fork of the project.', 400) |  | ||||||
|             end |  | ||||||
|           end |  | ||||||
| 
 | 
 | ||||||
|           if merge_request.save |         if merge_request.valid? | ||||||
|           present merge_request, with: Entities::MergeRequest |           present merge_request, with: Entities::MergeRequest | ||||||
|         else |         else | ||||||
|           handle_merge_request_errors! merge_request.errors |           handle_merge_request_errors! merge_request.errors | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
|       end |  | ||||||
| 
 | 
 | ||||||
|       # Update MR |       # Update MR | ||||||
|       # |       # | ||||||
|  | @ -111,19 +89,17 @@ module API | ||||||
|       #   PUT /projects/:id/merge_request/:merge_request_id |       #   PUT /projects/:id/merge_request/:merge_request_id | ||||||
|       # |       # | ||||||
|       put ":id/merge_request/:merge_request_id" do |       put ":id/merge_request/:merge_request_id" do | ||||||
|         set_current_user_for_thread do |  | ||||||
|         attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :state_event, :description] |         attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :state_event, :description] | ||||||
|         merge_request = user_project.merge_requests.find(params[:merge_request_id]) |         merge_request = user_project.merge_requests.find(params[:merge_request_id]) | ||||||
| 
 |  | ||||||
|         authorize! :modify_merge_request, merge_request |         authorize! :modify_merge_request, merge_request | ||||||
|  |         merge_request = ::MergeRequests::UpdateService.new(user_project, current_user, attrs).execute(merge_request) | ||||||
| 
 | 
 | ||||||
|           if merge_request.update_attributes attrs |         if merge_request.valid? | ||||||
|           present merge_request, with: Entities::MergeRequest |           present merge_request, with: Entities::MergeRequest | ||||||
|         else |         else | ||||||
|           handle_merge_request_errors! merge_request.errors |           handle_merge_request_errors! merge_request.errors | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
|       end |  | ||||||
| 
 | 
 | ||||||
|       # Get a merge request's comments |       # Get a merge request's comments | ||||||
|       # |       # | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue