Commit 4f10cad9 authored by Mateusz Bajorski's avatar Mateusz Bajorski

Add Inherit quick action

Closes #38450
parent 405c4cae
...@@ -268,6 +268,24 @@ module QuickActions ...@@ -268,6 +268,24 @@ module QuickActions
end end
end end
desc 'Inherit (copy) labels and milestone from other issue'
explanation do |issue_id|
"Inherit (copy) labels and milestone from issue \"#{issue_id}\"."
end
params '#issue'
condition do
issuable.persisted? &&
current_user.can?(:"update_#{issuable.to_ability_name}", issuable)
end
command :inherit do |issue_id|
issue = extract_references(issue_id, :issue).first
if issue.present? && issue.project_id == issuable.project_id
@updates[:add_label_ids] = issue.labels.map(&:id)
@updates[:milestone_id] = issue.milestone.id if issue.milestone
end
end
desc 'Add a todo' desc 'Add a todo'
explanation 'Adds a todo.' explanation 'Adds a todo.'
condition do condition do
......
---
title: Add Inherit quick action
merge_request:
author: Mateusz Bajorski
type: added
...@@ -41,3 +41,4 @@ do. ...@@ -41,3 +41,4 @@ do.
| `/move path/to/project` | Moves issue to another project | | `/move path/to/project` | Moves issue to another project |
| `/tableflip` | Append the comment with `(╯°□°)╯︵ ┻━┻` | | `/tableflip` | Append the comment with `(╯°□°)╯︵ ┻━┻` |
| `/shrug` | Append the comment with `¯\_(ツ)_/¯` | | `/shrug` | Append the comment with `¯\_(ツ)_/¯` |
| `/inherit #issue` | Inherit (copy) labels and milestone from other issue |
...@@ -306,6 +306,23 @@ describe QuickActions::InterpretService do ...@@ -306,6 +306,23 @@ describe QuickActions::InterpretService do
end end
end end
shared_examples 'inherit command' do
it 'fetches issue and copies labels and milestone if content contains /inherit issue_reference' do
issue_father # populate the issue
todo_label # populate this label
inreview_label # populate this label
_, updates = service.execute(content, issuable)
expect(updates[:add_label_ids]).to match_array([inreview_label.id, todo_label.id])
if issue_father.milestone
expect(updates[:milestone_id]).to eq(issue_father.milestone.id)
else
expect(updates).not_to have_key(:milestone_id)
end
end
end
shared_examples 'shrug command' do shared_examples 'shrug command' do
it 'appends ¯\_(ツ)_/¯ to the comment' do it 'appends ¯\_(ツ)_/¯ to the comment' do
new_content, _ = service.execute(content, issuable) new_content, _ = service.execute(content, issuable)
...@@ -757,6 +774,54 @@ describe QuickActions::InterpretService do ...@@ -757,6 +774,54 @@ describe QuickActions::InterpretService do
let(:issuable) { issue } let(:issuable) { issue }
end end
context '/inherit command' do
let!(:todo_label) { create(:label, project: project, title: 'To Do') }
let!(:inreview_label) { create(:label, project: project, title: 'In Review') }
it_behaves_like 'inherit command' do
# Without milestone assignment
let(:issue_father) { create(:labeled_issue, project: project, labels: [inreview_label, todo_label]) }
let(:content) { "/inherit #{issue_father.to_reference}" }
let(:issuable) { issue }
end
it_behaves_like 'inherit command' do
# With milestone assignment
let(:issue_father) { create(:labeled_issue, project: project, labels: [todo_label, inreview_label], milestone: milestone) }
let(:content) { "/inherit #{issue_father.to_reference(project)}" }
let(:issuable) { issue }
end
it_behaves_like 'empty command' do
let(:content) { '/inherit' }
let(:issuable) { issue }
end
context 'cross project references' do
it_behaves_like 'empty command' do
let(:other_project) { create(:project, :public) }
let(:issue_father) { create(:labeled_issue, project: other_project, labels: [todo_label, inreview_label]) }
let(:content) { "/inherit #{issue_father.to_reference(project)}" }
let(:issuable) { issue }
end
it_behaves_like 'empty command' do
let(:content) { "/inherit imaginary#1234" }
let(:issuable) { issue }
end
it_behaves_like 'empty command' do
let(:other_project) { create(:project, :private) }
let(:issue_father) { create(:issue, project: other_project) }
let(:content) { "/inherit #{issue_father.to_reference(project)}" }
let(:issuable) { issue }
end
end
end
context '/duplicate command' do context '/duplicate command' do
it_behaves_like 'duplicate command' do it_behaves_like 'duplicate command' do
let(:issue_duplicate) { create(:issue, project: project) } let(:issue_duplicate) { create(:issue, project: project) }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment