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:
authorBob Van Landuyt <bob@vanlanduyt.co>2016-12-22 15:31:12 +0300
committerBob Van Landuyt <bob@gitlab.com>2017-03-13 10:27:51 +0300
commit0267b83898d604181e70c5ea8ac4a84108d2e6d6 (patch)
tree3ce8cc81ba90185c976f3b19b7e548c67856370f /app/services/issues
parent9ed3db915026c6e0cd266a1c276386e3e96d2151 (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.rb25
-rw-r--r--app/services/issues/build_service.rb21
-rw-r--r--app/services/issues/create_service.rb17
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