Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/services/quick_actions/interpret_service.rb18
-rw-r--r--changelogs/unreleased/add-inherit-command.yml5
-rw-r--r--doc/user/project/quick_actions.md3
-rw-r--r--spec/services/quick_actions/interpret_service_spec.rb65
4 files changed, 90 insertions, 1 deletions
diff --git a/app/services/quick_actions/interpret_service.rb b/app/services/quick_actions/interpret_service.rb
index 1e9bd84e749..4abb936e14a 100644
--- a/app/services/quick_actions/interpret_service.rb
+++ b/app/services/quick_actions/interpret_service.rb
@@ -268,6 +268,24 @@ module QuickActions
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'
explanation 'Adds a todo.'
condition do
diff --git a/changelogs/unreleased/add-inherit-command.yml b/changelogs/unreleased/add-inherit-command.yml
new file mode 100644
index 00000000000..84f5bc97fbe
--- /dev/null
+++ b/changelogs/unreleased/add-inherit-command.yml
@@ -0,0 +1,5 @@
+---
+title: Add Inherit quick action
+merge_request:
+author: Mateusz Bajorski
+type: added
diff --git a/doc/user/project/quick_actions.md b/doc/user/project/quick_actions.md
index 442fc978284..3b6bdc8ca3d 100644
--- a/doc/user/project/quick_actions.md
+++ b/doc/user/project/quick_actions.md
@@ -40,4 +40,5 @@ do.
| `/duplicate #issue` | Closes this issue and marks it as a duplicate of another issue |
| `/move path/to/project` | Moves issue to another project |
| `/tableflip` | Append the comment with `(╯°□°)╯︵ ┻━┻` |
-| `/shrug` | Append the comment with `¯\_(ツ)_/¯` | \ No newline at end of file
+| `/shrug` | Append the comment with `¯\_(ツ)_/¯` |
+| `/inherit #issue` | Inherit (copy) labels and milestone from other issue |
diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/spec/services/quick_actions/interpret_service_spec.rb
index f793f55e51b..ebe0c7639a0 100644
--- a/spec/services/quick_actions/interpret_service_spec.rb
+++ b/spec/services/quick_actions/interpret_service_spec.rb
@@ -306,6 +306,23 @@ describe QuickActions::InterpretService do
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
it 'appends ¯\_(ツ)_/¯ to the comment' do
new_content, _ = service.execute(content, issuable)
@@ -757,6 +774,54 @@ describe QuickActions::InterpretService do
let(:issuable) { issue }
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
it_behaves_like 'duplicate command' do
let(:issue_duplicate) { create(:issue, project: project) }