Commit 38d8d749d73921f370ec8ff28e19f2a5fb7e6f34

Authored by Dmitriy Zaporozhets
2 parents 9a1d0c17 99a2b31e

Merge branch 'feature/merge_commit_message' of /home/git/repositories/gitlab/gitlabhq

app/assets/javascripts/merge_requests.js.coffee
... ... @@ -24,6 +24,8 @@ class MergeRequest
24 24  
25 25 modal = $('#modal_merge_info').modal(show: false)
26 26  
  27 + disableButtonIfEmptyField '#merge_commit_message', '.accept_merge_request'
  28 +
27 29 # Local jQuery finder
28 30 $: (selector) ->
29 31 this.$el.find(selector)
... ...
app/controllers/projects/merge_requests_controller.rb
... ... @@ -125,7 +125,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
125 125  
126 126 if @merge_request.opened? && @merge_request.can_be_merged?
127 127 @merge_request.should_remove_source_branch = params[:should_remove_source_branch]
128   - @merge_request.automerge!(current_user)
  128 + @merge_request.automerge!(current_user, params[:merge_commit_message])
129 129 @status = true
130 130 else
131 131 @status = false
... ...
app/models/merge_request.rb
... ... @@ -214,8 +214,8 @@ class MergeRequest < ActiveRecord::Base
214 214 self.merge
215 215 end
216 216  
217   - def automerge!(current_user)
218   - if Gitlab::Satellite::MergeAction.new(current_user, self).merge! && self.unmerged_commits.empty?
  217 + def automerge!(current_user, commit_message = nil)
  218 + if Gitlab::Satellite::MergeAction.new(current_user, self).merge!(commit_message) && self.unmerged_commits.empty?
219 219 self.merge!(current_user.id)
220 220 true
221 221 end
... ... @@ -319,6 +319,15 @@ class MergeRequest < ActiveRecord::Base
319 319 update_all(updated_at: Time.now)
320 320 end
321 321  
  322 + def merge_commit_message
  323 + message = "Merge branch '#{source_branch}' into '#{target_branch}'"
  324 + message << "\n\n"
  325 + message << title.to_s
  326 + message << "\n\n"
  327 + message << description.to_s
  328 + message
  329 + end
  330 +
322 331 private
323 332  
324 333 def dump_commits(commits)
... ...
app/views/projects/merge_requests/show/_mr_accept.html.haml
... ... @@ -13,7 +13,21 @@
13 13 If you still want to do it manually -
14 14 %strong
15 15 = link_to "click here", "#modal_merge_info", class: "how_to_merge_link vlink", title: "How To Merge", "data-toggle" => "modal"
16   - for instructions
  16 + for instructions.
  17 +
  18 + %br
  19 + If you want to modify merge commit message -
  20 + %strong
  21 + = link_to "click here", "#", class: "modify-merge-commit-link js-toggle-visibility-link", title: "Modify merge commit message"
  22 +
  23 + .js-toggle-visibility-container.hide
  24 + .form-group
  25 + = label_tag :merge_commit_message, "Commit message", class: 'control-label'
  26 + .col-sm-10
  27 + = text_area_tag :merge_commit_message, @merge_request.merge_commit_message, class: "form-control js-gfm-input", rows: 14, required: true
  28 + %p.hint
  29 + The recommended maximum line length is 52 characters for the first line and 72 characters for all following lines.
  30 +
17 31 .accept-group
18 32 .pull-left
19 33 = f.submit "Accept Merge Request", class: "btn btn-create accept_merge_request"
... ...
features/project/merge_requests.feature
... ... @@ -67,3 +67,13 @@ Feature: Project Merge Requests
67 67 And I leave a comment on the diff page
68 68 And I switch to the merge request's comments tab
69 69 Then I should see a discussion has started on commit bcf03b5de6c
  70 +
  71 + @javascript
  72 + Scenario: I accept merge request with custom commit message
  73 + Given project "Shop" have "Bug NS-05" open merge request with diffs inside
  74 + And merge request "Bug NS-05" is mergeable
  75 + And I visit merge request page "Bug NS-05"
  76 + And merge request is mergeable
  77 + Then I modify merge commit message
  78 + And I accept this merge request
  79 + Then I should see merged request
... ...
features/steps/project/project_merge_requests.rb
... ... @@ -4,60 +4,60 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps
4 4 include SharedNote
5 5 include SharedPaths
6 6  
7   - Given 'I click link "New Merge Request"' do
  7 + step 'I click link "New Merge Request"' do
8 8 click_link "New Merge Request"
9 9 end
10 10  
11   - Given 'I click link "Bug NS-04"' do
  11 + step 'I click link "Bug NS-04"' do
12 12 click_link "Bug NS-04"
13 13 end
14 14  
15   - Given 'I click link "All"' do
  15 + step 'I click link "All"' do
16 16 click_link "All"
17 17 end
18 18  
19   - Given 'I click link "Closed"' do
  19 + step 'I click link "Closed"' do
20 20 click_link "Closed"
21 21 end
22 22  
23   - Then 'I should see merge request "Wiki Feature"' do
  23 + step 'I should see merge request "Wiki Feature"' do
24 24 within '.merge-request' do
25 25 page.should have_content "Wiki Feature"
26 26 end
27 27 end
28 28  
29   - Then 'I should see closed merge request "Bug NS-04"' do
  29 + step 'I should see closed merge request "Bug NS-04"' do
30 30 merge_request = MergeRequest.find_by_title!("Bug NS-04")
31 31 merge_request.closed?.should be_true
32 32 page.should have_content "Closed by"
33 33 end
34 34  
35   - Then 'I should see merge request "Bug NS-04"' do
  35 + step 'I should see merge request "Bug NS-04"' do
36 36 page.should have_content "Bug NS-04"
37 37 end
38 38  
39   - Then 'I should see "Bug NS-04" in merge requests' do
  39 + step 'I should see "Bug NS-04" in merge requests' do
40 40 page.should have_content "Bug NS-04"
41 41 end
42 42  
43   - Then 'I should see "Feature NS-03" in merge requests' do
  43 + step 'I should see "Feature NS-03" in merge requests' do
44 44 page.should have_content "Feature NS-03"
45 45 end
46 46  
47   - And 'I should not see "Feature NS-03" in merge requests' do
  47 + step 'I should not see "Feature NS-03" in merge requests' do
48 48 page.should_not have_content "Feature NS-03"
49 49 end
50 50  
51 51  
52   - And 'I should not see "Bug NS-04" in merge requests' do
  52 + step 'I should not see "Bug NS-04" in merge requests' do
53 53 page.should_not have_content "Bug NS-04"
54 54 end
55 55  
56   - And 'I click link "Close"' do
  56 + step 'I click link "Close"' do
57 57 click_link "Close"
58 58 end
59 59  
60   - And 'I submit new merge request "Wiki Feature"' do
  60 + step 'I submit new merge request "Wiki Feature"' do
61 61 fill_in "merge_request_title", with: "Wiki Feature"
62 62  
63 63 # this must come first, so that the target branch is set
... ... @@ -76,7 +76,7 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps
76 76 click_button "Submit merge request"
77 77 end
78 78  
79   - And 'project "Shop" have "Bug NS-04" open merge request' do
  79 + step 'project "Shop" have "Bug NS-04" open merge request' do
80 80 create(:merge_request,
81 81 title: "Bug NS-04",
82 82 source_project: project,
... ... @@ -84,7 +84,7 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps
84 84 author: project.users.first)
85 85 end
86 86  
87   - And 'project "Shop" have "Bug NS-05" open merge request with diffs inside' do
  87 + step 'project "Shop" have "Bug NS-05" open merge request with diffs inside' do
88 88 create(:merge_request_with_diffs,
89 89 title: "Bug NS-05",
90 90 source_project: project,
... ... @@ -92,7 +92,7 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps
92 92 author: project.users.first)
93 93 end
94 94  
95   - And 'project "Shop" have "Feature NS-03" closed merge request' do
  95 + step 'project "Shop" have "Feature NS-03" closed merge request' do
96 96 create(:closed_merge_request,
97 97 title: "Feature NS-03",
98 98 source_project: project,
... ... @@ -100,19 +100,19 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps
100 100 author: project.users.first)
101 101 end
102 102  
103   - And 'I switch to the diff tab' do
  103 + step 'I switch to the diff tab' do
104 104 visit diffs_project_merge_request_path(project, merge_request)
105 105 end
106 106  
107   - And 'I switch to the merge requests comments tab' do
  107 + step 'I switch to the merge requests comments tab' do
108 108 visit project_merge_request_path(project, merge_request)
109 109 end
110 110  
111   - And 'I click on the first commit in the merge request' do
  111 + step 'I click on the first commit in the merge request' do
112 112 click_link merge_request.commits.first.short_id(8)
113 113 end
114 114  
115   - And 'I leave a comment on the diff page' do
  115 + step 'I leave a comment on the diff page' do
116 116 init_diff_note
117 117  
118 118 within('.js-discussion-note-form') do
... ... @@ -125,7 +125,7 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps
125 125 end
126 126 end
127 127  
128   - And 'I leave a comment like "Line is wrong" on line 185 of the first file' do
  128 + step 'I leave a comment like "Line is wrong" on line 185 of the first file' do
129 129 init_diff_note
130 130  
131 131 within(".js-discussion-note-form") do
... ... @@ -138,24 +138,47 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps
138 138 end
139 139 end
140 140  
141   - Then 'I should see a discussion has started on line 185' do
  141 + step 'I should see a discussion has started on line 185' do
142 142 page.should have_content "#{current_user.name} started a discussion on this merge request diff"
143 143 page.should have_content "app/assets/stylesheets/tree.scss:L185"
144 144 page.should have_content "Line is wrong"
145 145 end
146 146  
147   - Then 'I should see a discussion has started on commit bcf03b5de6c:L185' do
  147 + step 'I should see a discussion has started on commit bcf03b5de6c:L185' do
148 148 page.should have_content "#{current_user.name} started a discussion on commit"
149 149 page.should have_content "app/assets/stylesheets/tree.scss:L185"
150 150 page.should have_content "Line is wrong"
151 151 end
152 152  
153   - Then 'I should see a discussion has started on commit bcf03b5de6c' do
  153 + step 'I should see a discussion has started on commit bcf03b5de6c' do
154 154 page.should have_content "#{current_user.name} started a discussion on commit bcf03b5de6c"
155 155 page.should have_content "One comment to rule them all"
156 156 page.should have_content "app/assets/stylesheets/tree.scss:L185"
157 157 end
158 158  
  159 + step 'merge request is mergeable' do
  160 + page.should have_content 'You can accept this request automatically'
  161 + end
  162 +
  163 + step 'I modify merge commit message' do
  164 + find('.modify-merge-commit-link').click
  165 + fill_in 'merge_commit_message', with: "wow such merge"
  166 + end
  167 +
  168 + step 'merge request "Bug NS-05" is mergeable' do
  169 + merge_request.mark_as_mergeable
  170 + end
  171 +
  172 + step 'I accept this merge request' do
  173 + click_button "Accept Merge Request"
  174 + end
  175 +
  176 + step 'I should see merged request' do
  177 + within '.page-title' do
  178 + page.should have_content "Merged"
  179 + end
  180 + end
  181 +
159 182 def project
160 183 @project ||= Project.find_by_name!("Shop")
161 184 end
... ...
lib/gitlab/satellite/merge_action.rb
... ... @@ -24,10 +24,10 @@ module Gitlab
24 24 # Returns false if the merge produced conflicts
25 25 # Returns false if pushing from the satellite to the repository failed or was rejected
26 26 # Returns true otherwise
27   - def merge!
  27 + def merge!(merge_commit_message = nil)
28 28 in_locked_and_timed_satellite do |merge_repo|
29 29 prepare_satellite!(merge_repo)
30   - if merge_in_satellite!(merge_repo)
  30 + if merge_in_satellite!(merge_repo, merge_commit_message)
31 31 # push merge back to bare repo
32 32 # will raise CommandFailed when push fails
33 33 merge_repo.git.push(default_options, :origin, merge_request.target_branch)
... ... @@ -49,14 +49,7 @@ module Gitlab
49 49 in_locked_and_timed_satellite do |merge_repo|
50 50 prepare_satellite!(merge_repo)
51 51 update_satellite_source_and_target!(merge_repo)
52   -
53   - if merge_request.for_fork?
54   - diff = merge_repo.git.native(:diff, default_options, "origin/#{merge_request.target_branch}", "source/#{merge_request.source_branch}")
55   - else
56   - diff = merge_repo.git.native(:diff, default_options, "#{merge_request.target_branch}", "#{merge_request.source_branch}")
57   - end
58   -
59   - return diff
  52 + diff = merge_repo.git.native(:diff, default_options, "origin/#{merge_request.target_branch}", "source/#{merge_request.source_branch}")
60 53 end
61 54 rescue Grit::Git::CommandFailed => ex
62 55 handle_exception(ex)
... ... @@ -88,14 +81,7 @@ module Gitlab
88 81 in_locked_and_timed_satellite do |merge_repo|
89 82 prepare_satellite!(merge_repo)
90 83 update_satellite_source_and_target!(merge_repo)
91   -
92   - if (merge_request.for_fork?)
93   - patch = merge_repo.git.format_patch(default_options({stdout: true}), "origin/#{merge_request.target_branch}..source/#{merge_request.source_branch}")
94   - else
95   - patch = merge_repo.git.format_patch(default_options({stdout: true}), "#{merge_request.target_branch}..#{merge_request.source_branch}")
96   - end
97   -
98   - return patch
  84 + patch = merge_repo.git.format_patch(default_options({stdout: true}), "origin/#{merge_request.target_branch}..source/#{merge_request.source_branch}")
99 85 end
100 86 rescue Grit::Git::CommandFailed => ex
101 87 handle_exception(ex)
... ... @@ -125,34 +111,26 @@ module Gitlab
125 111 #
126 112 # Returns false if the merge produced conflicts
127 113 # Returns true otherwise
128   - def merge_in_satellite!(repo)
  114 + def merge_in_satellite!(repo, message = nil)
129 115 update_satellite_source_and_target!(repo)
130 116  
  117 + message ||= "Merge branch '#{merge_request.source_branch}' into '#{merge_request.target_branch}'"
  118 +
131 119 # merge the source branch into the satellite
132 120 # will raise CommandFailed when merge fails
133   - if merge_request.for_fork?
134   - repo.git.pull(default_options({no_ff: true}), 'source', merge_request.source_branch)
135   - else
136   - repo.git.pull(default_options({no_ff: true}), 'origin', merge_request.source_branch)
137   - end
  121 + repo.git.merge(default_options({no_ff: true}), "-m #{message}", "source/#{merge_request.source_branch}")
138 122 rescue Grit::Git::CommandFailed => ex
139 123 handle_exception(ex)
140 124 end
141 125  
142 126 # Assumes a satellite exists that is a fresh clone of the projects repo, prepares satellite for merges, diffs etc
143 127 def update_satellite_source_and_target!(repo)
144   - if merge_request.for_fork?
145   - repo.remote_add('source', merge_request.source_project.repository.path_to_repo)
146   - repo.remote_fetch('source')
147   - repo.git.checkout(default_options({b: true}), merge_request.target_branch, "origin/#{merge_request.target_branch}")
148   - else
149   - repo.git.checkout(default_options, "#{merge_request.source_branch}")
150   - repo.git.checkout(default_options({t: true}), "origin/#{merge_request.target_branch}")
151   - end
  128 + repo.remote_add('source', merge_request.source_project.repository.path_to_repo)
  129 + repo.remote_fetch('source')
  130 + repo.git.checkout(default_options({b: true}), merge_request.target_branch, "origin/#{merge_request.target_branch}")
152 131 rescue Grit::Git::CommandFailed => ex
153 132 handle_exception(ex)
154 133 end
155   -
156 134 end
157 135 end
158 136 end
... ...
spec/controllers/merge_requests_controller_spec.rb
... ... @@ -3,7 +3,7 @@ require &#39;spec_helper&#39;
3 3 describe Projects::MergeRequestsController do
4 4 let(:project) { create(:project_with_code) }
5 5 let(:user) { create(:user) }
6   - let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project, target_branch: "bcf03b5d~3", source_branch: "bcf03b5d") }
  6 + let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project, target_branch: "stable", source_branch: "master") }
7 7  
8 8 before do
9 9 sign_in(user)
... ... @@ -61,7 +61,7 @@ describe Projects::MergeRequestsController do
61 61 it "should really be a git email patch with commit" do
62 62 get :show, project_id: project.to_param, id: merge_request.iid, format: format
63 63  
64   - expect(response.body[0..100]).to start_with("From #{merge_request.commits.last.id}")
  64 + expect(response.body[0..100]).to start_with("From 6ea87c47f0f8a24ae031c3fff17bc913889ecd00")
65 65 end
66 66  
67 67 it "should contain git diffs" do
... ...
spec/lib/gitlab/satellite/merge_action_spec.rb
... ... @@ -2,13 +2,12 @@ require &#39;spec_helper&#39;
2 2  
3 3 describe 'Gitlab::Satellite::MergeAction' do
4 4 before(:each) do
5   -# TestEnv.init(mailer: false, init_repos: true, repos: true)
6 5 @master = ['master', 'b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828']
7 6 @one_after_stable = ['stable', '6ea87c47f0f8a24ae031c3fff17bc913889ecd00'] #this commit sha is one after stable
8 7 @wiki_branch = ['wiki', '635d3e09b72232b6e92a38de6cc184147e5bcb41'] #this is the commit sha where the wiki branch goes off from master
9 8 @conflicting_metior = ['metior', '313d96e42b313a0af5ab50fa233bf43e27118b3f'] #this branch conflicts with the wiki branch
10 9  
11   - #these commits are quite close together, itended to make string diffs/format patches small
  10 + # these commits are quite close together, itended to make string diffs/format patches small
12 11 @close_commit1 = ['2_3_notes_fix', '8470d70da67355c9c009e4401746b1d5410af2e3']
13 12 @close_commit2 = ['scss_refactoring', 'f0f14c8eaba69ebddd766498a9d0b0e79becd633']
14 13 end
... ... @@ -16,6 +15,7 @@ describe &#39;Gitlab::Satellite::MergeAction&#39; do
16 15 let(:project) { create(:project_with_code) }
17 16 let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
18 17 let(:merge_request_fork) { create(:merge_request) }
  18 +
19 19 describe '#commits_between' do
20 20 def verify_commits(commits, first_commit_sha, last_commit_sha)
21 21 commits.each { |commit| commit.class.should == Gitlab::Git::Commit }
... ... @@ -145,4 +145,4 @@ describe &#39;Gitlab::Satellite::MergeAction&#39; do
145 145 end
146 146 end
147 147 end
148   -end
149 148 \ No newline at end of file
  149 +end
... ...