diff options
author | Bob Van Landuyt <bob@vanlanduyt.co> | 2016-12-22 15:31:12 +0300 |
---|---|---|
committer | Bob Van Landuyt <bob@gitlab.com> | 2017-03-13 10:27:51 +0300 |
commit | 0267b83898d604181e70c5ea8ac4a84108d2e6d6 (patch) | |
tree | 3ce8cc81ba90185c976f3b19b7e548c67856370f /app/services/issues | |
parent | 9ed3db915026c6e0cd266a1c276386e3e96d2151 (diff) |
Delegate a single discussion to a new issue
Delegate a discussion in a merge request into a new issue.
The discussion wil be marked as resolved and a system note will be
added linking to the newly created issue.
Diffstat (limited to 'app/services/issues')
-rw-r--r-- | app/services/issues/base_service.rb | 25 | ||||
-rw-r--r-- | app/services/issues/build_service.rb | 21 | ||||
-rw-r--r-- | app/services/issues/create_service.rb | 17 |
3 files changed, 46 insertions, 17 deletions
diff --git a/app/services/issues/base_service.rb b/app/services/issues/base_service.rb index 35af867a098..3aa842eb9a8 100644 --- a/app/services/issues/base_service.rb +++ b/app/services/issues/base_service.rb @@ -1,11 +1,12 @@ module Issues class BaseService < ::IssuableBaseService - attr_reader :merge_request_for_resolving_discussions + attr_reader :merge_request_for_resolving_discussions, :discussion_to_resolve def initialize(*args) super @merge_request_for_resolving_discussions ||= params.delete(:merge_request_for_resolving_discussions) + @discussion_to_resolve ||= params.delete(:discussion_to_resolve) end def hook_data(issue, action) @@ -15,6 +16,28 @@ module Issues issue_data end + def merge_request_for_resolving_discussions + @merge_request_for_resolving_discussions ||= discussion_to_resolve.try(:noteable) + end + + def for_all_discussions_in_a_merge_request? + discussion_to_resolve.nil? && merge_request_for_resolving_discussions + end + + def for_single_discussion? + discussion_to_resolve && discussion_to_resolve.noteable == merge_request_for_resolving_discussions + end + + def discussions_to_resolve + @discussions_to_resolve ||= if for_all_discussions_in_a_merge_request? + merge_request_for_resolving_discussions.resolvable_discussions + elsif for_single_discussion? + Array(discussion_to_resolve) + else + [] + end + end + private def execute_hooks(issue, action = 'open') diff --git a/app/services/issues/build_service.rb b/app/services/issues/build_service.rb index 7cd927d8005..1bcc5abd3f2 100644 --- a/app/services/issues/build_service.rb +++ b/app/services/issues/build_service.rb @@ -4,32 +4,35 @@ module Issues @issue = project.issues.new(issue_params) end - def issue_params_with_info_from_merge_request + def issue_params_with_info_from_discussions return {} unless merge_request_for_resolving_discussions - { title: title_from_merge_request, description: description_from_merge_request } + { title: title_for_merge_request, description: description_for_discussions } end - def title_from_merge_request + def title_for_merge_request "Follow-up from \"#{merge_request_for_resolving_discussions.title}\"" end - def description_from_merge_request - if merge_request_for_resolving_discussions.resolvable_discussions.empty? + def description_for_discussions + if discussions_to_resolve.empty? return "There are no unresolved discussions. "\ "Review the conversation in #{merge_request_for_resolving_discussions.to_reference}" end - description = "The following discussions from #{merge_request_for_resolving_discussions.to_reference} should be addressed:" + description = "The following #{'discussion'.pluralize(discussions_to_resolve.size)} "\ + "from #{merge_request_for_resolving_discussions.to_reference} "\ + "should be addressed:" + [description, *items_for_discussions].join("\n\n") end def items_for_discussions - merge_request_for_resolving_discussions.resolvable_discussions.map { |discussion| item_for_discussion(discussion) } + discussions_to_resolve.map { |discussion| item_for_discussion(discussion) } end def item_for_discussion(discussion) - first_note = discussion.first_note_to_resolve + first_note = discussion.first_note_to_resolve || discussion.first_note other_note_count = discussion.notes.size - 1 creation_time = first_note.created_at.to_s(:medium) note_url = Gitlab::UrlBuilder.build(first_note) @@ -44,7 +47,7 @@ module Issues end def issue_params - @issue_params ||= issue_params_with_info_from_merge_request.merge(whitelisted_issue_params) + @issue_params ||= issue_params_with_info_from_discussions.merge(whitelisted_issue_params) end def whitelisted_issue_params diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb index 85b6eb3fe3d..d2cc70ed0dc 100644 --- a/app/services/issues/create_service.rb +++ b/app/services/issues/create_service.rb @@ -5,7 +5,11 @@ module Issues def execute filter_spam_check_params - issue_attributes = params.merge(merge_request_for_resolving_discussions: merge_request_for_resolving_discussions) + issue_attributes = params.merge( + merge_request_for_resolving_discussions: merge_request_for_resolving_discussions, + discussion_to_resolve: discussion_to_resolve + ) + @issue = BuildService.new(project, current_user, issue_attributes).execute create(@issue) @@ -21,17 +25,16 @@ module Issues notification_service.new_issue(issuable, current_user) todo_service.new_issue(issuable, current_user) user_agent_detail_service.create - - if merge_request_for_resolving_discussions.try(:discussions_can_be_resolved_by?, current_user) - resolve_discussions_in_merge_request(issuable) - end + resolve_discussions_with_issue(issuable) end - def resolve_discussions_in_merge_request(issue) + def resolve_discussions_with_issue(issue) + return if discussions_to_resolve.empty? + Discussions::ResolveService.new(project, current_user, merge_request: merge_request_for_resolving_discussions, follow_up_issue: issue). - execute(merge_request_for_resolving_discussions.resolvable_discussions) + execute(discussions_to_resolve) end private |