Merge branch 'Add-a-shash-command-for-target-merge-request-branch' into 'master'
Adds /target_branch slash command functionality for merge requests Closes #23619 See merge request !7216
This commit is contained in:
commit
0dc365914c
5 changed files with 123 additions and 0 deletions
|
@ -304,6 +304,18 @@ module SlashCommands
|
|||
params '@user'
|
||||
command :cc
|
||||
|
||||
desc 'Defines target branch for MR'
|
||||
params '<Local branch name>'
|
||||
condition do
|
||||
issuable.respond_to?(:target_branch) &&
|
||||
(current_user.can?(:"update_#{issuable.to_ability_name}", issuable) ||
|
||||
issuable.new_record?)
|
||||
end
|
||||
command :target_branch do |target_branch_param|
|
||||
branch_name = target_branch_param.strip
|
||||
@updates[:target_branch] = branch_name if project.repository.branch_names.include?(branch_name)
|
||||
end
|
||||
|
||||
def find_label_ids(labels_param)
|
||||
label_ids_by_reference = extract_references(labels_param, :label).map(&:id)
|
||||
labels_ids_by_name = LabelsFinder.new(current_user, project_id: project.id, name: labels_param.split).execute.select(:id)
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: Adds /target_branch slash command functionality for merge requests
|
||||
merge_request:
|
||||
author: YarNayar
|
|
@ -34,3 +34,4 @@ do.
|
|||
| `/remove_estimate` | Remove estimated time |
|
||||
| <code>/spend <1h 30m | -1h 5m></code> | Add or substract spent time |
|
||||
| `/remove_time_spent` | Remove time spent |
|
||||
| `/target_branch <Branch Name>` | Set target branch for current merge request |
|
||||
|
|
|
@ -120,5 +120,79 @@ feature 'Merge Requests > User uses slash commands', feature: true, js: true do
|
|||
expect(page).not_to have_content '/due 2016-08-28'
|
||||
end
|
||||
end
|
||||
|
||||
describe '/target_branch command in merge request' do
|
||||
let(:another_project) { create(:project, :public) }
|
||||
let(:new_url_opts) { { merge_request: { source_branch: 'feature' } } }
|
||||
|
||||
before do
|
||||
logout
|
||||
another_project.team << [user, :master]
|
||||
login_with(user)
|
||||
end
|
||||
|
||||
it 'changes target_branch in new merge_request' do
|
||||
visit new_namespace_project_merge_request_path(another_project.namespace, another_project, new_url_opts)
|
||||
fill_in "merge_request_title", with: 'My brand new feature'
|
||||
fill_in "merge_request_description", with: "le feature \n/target_branch fix\nFeature description:"
|
||||
click_button "Submit merge request"
|
||||
|
||||
merge_request = another_project.merge_requests.first
|
||||
expect(merge_request.description).to eq "le feature \nFeature description:"
|
||||
expect(merge_request.target_branch).to eq 'fix'
|
||||
end
|
||||
|
||||
it 'does not change target branch when merge request is edited' do
|
||||
new_merge_request = create(:merge_request, source_project: another_project)
|
||||
|
||||
visit edit_namespace_project_merge_request_path(another_project.namespace, another_project, new_merge_request)
|
||||
fill_in "merge_request_description", with: "Want to update target branch\n/target_branch fix\n"
|
||||
click_button "Save changes"
|
||||
|
||||
new_merge_request = another_project.merge_requests.first
|
||||
expect(new_merge_request.description).to include('/target_branch')
|
||||
expect(new_merge_request.target_branch).not_to eq('fix')
|
||||
end
|
||||
end
|
||||
|
||||
describe '/target_branch command from note' do
|
||||
context 'when the current user can change target branch' do
|
||||
it 'changes target branch from a note' do
|
||||
write_note("message start \n/target_branch merge-test\n message end.")
|
||||
|
||||
expect(page).not_to have_content('/target_branch')
|
||||
expect(page).to have_content('message start')
|
||||
expect(page).to have_content('message end.')
|
||||
|
||||
expect(merge_request.reload.target_branch).to eq 'merge-test'
|
||||
end
|
||||
|
||||
it 'does not fail when target branch does not exists' do
|
||||
write_note('/target_branch totally_not_existing_branch')
|
||||
|
||||
expect(page).not_to have_content('/target_branch')
|
||||
|
||||
expect(merge_request.target_branch).to eq 'feature'
|
||||
end
|
||||
end
|
||||
|
||||
context 'when current user can not change target branch' do
|
||||
let(:guest) { create(:user) }
|
||||
before do
|
||||
project.team << [guest, :guest]
|
||||
logout
|
||||
login_with(guest)
|
||||
visit namespace_project_merge_request_path(project.namespace, project, merge_request)
|
||||
end
|
||||
|
||||
it 'does not change target branch' do
|
||||
write_note('/target_branch merge-test')
|
||||
|
||||
expect(page).not_to have_content '/target_branch merge-test'
|
||||
|
||||
expect(merge_request.target_branch).to eq 'feature'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -653,5 +653,37 @@ describe SlashCommands::InterpretService, services: true do
|
|||
let(:issuable) { issue }
|
||||
end
|
||||
end
|
||||
|
||||
context '/target_branch command' do
|
||||
let(:non_empty_project) { create(:project) }
|
||||
let(:another_merge_request) { create(:merge_request, author: developer, source_project: non_empty_project) }
|
||||
let(:service) { described_class.new(non_empty_project, developer)}
|
||||
|
||||
it 'updates target_branch if /target_branch command is executed' do
|
||||
_, updates = service.execute('/target_branch merge-test', merge_request)
|
||||
|
||||
expect(updates).to eq(target_branch: 'merge-test')
|
||||
end
|
||||
|
||||
it 'handles blanks around param' do
|
||||
_, updates = service.execute('/target_branch merge-test ', merge_request)
|
||||
|
||||
expect(updates).to eq(target_branch: 'merge-test')
|
||||
end
|
||||
|
||||
context 'ignores command with no argument' do
|
||||
it_behaves_like 'empty command' do
|
||||
let(:content) { '/target_branch' }
|
||||
let(:issuable) { another_merge_request }
|
||||
end
|
||||
end
|
||||
|
||||
context 'ignores non-existing target branch' do
|
||||
it_behaves_like 'empty command' do
|
||||
let(:content) { '/target_branch totally_non_existing_branch' }
|
||||
let(:issuable) { another_merge_request }
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue