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 76 end
77 77  
78 78 def create
79   - @merge_request = MergeRequest.new(params[:merge_request])
80   - @merge_request.author = current_user
81 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 83 redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully created.'
84 84 else
85 85 @source_project = @merge_request.source_project
... ... @@ -89,29 +89,9 @@ class Projects::MergeRequestsController &lt; Projects::ApplicationController
89 89 end
90 90  
91 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 95 respond_to do |format|
116 96 format.js
117 97 format.html do
... ...
app/models/merge_request.rb
... ... @@ -97,6 +97,7 @@ class MergeRequest &lt; ActiveRecord::Base
97 97 validates :target_project, presence: true
98 98 validates :target_branch, presence: true
99 99 validate :validate_branches
  100 + validate :validate_fork
100 101  
101 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 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 126 end
126 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 143 def update_merge_request_diff
129 144 if source_branch_changed? || target_branch_changed?
130 145 reload_code
... ...
app/models/project.rb
... ... @@ -552,4 +552,8 @@ class Project &lt; ActiveRecord::Base
552 552 gitlab_shell.update_repository_head(self.path_with_namespace, branch)
553 553 reload_default_branch
554 554 end
  555 +
  556 + def forked_from?(project)
  557 + forked? && project == forked_from_project
  558 + end
555 559 end
... ...
app/views/projects/merge_requests/_form.html.haml
... ... @@ -33,7 +33,7 @@
33 33 .col-sm-10
34 34 .clearfix
35 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 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 38 .pull-left
39 39 &nbsp;
... ...
lib/api/merge_requests.rb
... ... @@ -13,14 +13,6 @@ module API
13 13 end
14 14 not_found!
15 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 16 end
25 17  
26 18 # List merge requests
... ... @@ -70,29 +62,15 @@ module API
70 62 # POST /projects/:id/merge_requests
71 63 #
72 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 74 end
97 75 end
98 76  
... ... @@ -111,17 +89,15 @@ module API
111 89 # PUT /projects/:id/merge_request/:merge_request_id
112 90 #
113 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 101 end
126 102 end
127 103  
... ...