Skip to content
Snippets Groups Projects
Verified Commit 9ee697dd authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets
Browse files

Use MergeRequest services in API and controllers

parent 3c867dfa
No related branches found
No related tags found
No related merge requests found
Loading
@@ -76,10 +76,10 @@ class Projects::MergeRequestsController < Projects::ApplicationController
Loading
@@ -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
Loading
@@ -89,29 +89,9 @@ class Projects::MergeRequestsController < Projects::ApplicationController
Loading
@@ -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
Loading
Loading
Loading
@@ -97,6 +97,7 @@ class MergeRequest < ActiveRecord::Base
Loading
@@ -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) }
Loading
@@ -125,6 +126,20 @@ class MergeRequest < ActiveRecord::Base
Loading
@@ -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
Loading
Loading
Loading
@@ -552,4 +552,8 @@ class Project < ActiveRecord::Base
Loading
@@ -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
Loading
@@ -33,7 +33,7 @@
Loading
@@ -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
&nbsp; &nbsp;
Loading
Loading
Loading
@@ -13,14 +13,6 @@ module API
Loading
@@ -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
Loading
@@ -70,29 +62,15 @@ module API
Loading
@@ -70,29 +62,15 @@ 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 = ::MergeRequests::CreateService.new(user_project, current_user, attrs).execute
merge_request = user_project.merge_requests.new(attrs)
merge_request.author = current_user if merge_request.valid?
merge_request.source_project = user_project present merge_request, with: Entities::MergeRequest
target_project_id = attrs[:target_project_id] else
if not_fork?(target_project_id, user_project) handle_merge_request_errors! merge_request.errors
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
present merge_request, with: Entities::MergeRequest
else
handle_merge_request_errors! merge_request.errors
end
end end
end end
   
Loading
@@ -111,17 +89,15 @@ module API
Loading
@@ -111,17 +89,15 @@ 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
merge_request = ::MergeRequests::UpdateService.new(user_project, current_user, attrs).execute(merge_request)
authorize! :modify_merge_request, 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
   
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment