debian-mirror-gitlab/app/services/system_note_service.rb

346 lines
12 KiB
Ruby
Raw Normal View History

2018-11-18 11:00:15 +05:30
# frozen_string_literal: true
2015-09-11 14:41:01 +05:30
# SystemNoteService
#
# Used for creating system notes (e.g., when a user references a merge request
# from an issue, an issue's assignee changes, an issue is closed, etc.)
2016-09-13 17:45:13 +05:30
module SystemNoteService
extend self
2015-09-11 14:41:01 +05:30
# Called when commits are added to a Merge Request
#
# noteable - Noteable object
# project - Project owning noteable
# author - User performing the change
# new_commits - Array of Commits added since last push
# existing_commits - Array of Commits added in a previous push
# oldrev - Optional String SHA of a previous Commit
#
# Returns the created Note object
2016-09-13 17:45:13 +05:30
def add_commits(noteable, project, author, new_commits, existing_commits = [], oldrev = nil)
2019-12-21 20:55:43 +05:30
::SystemNotes::CommitService.new(noteable: noteable, project: project, author: author).add_commits(new_commits, existing_commits, oldrev)
2015-09-11 14:41:01 +05:30
end
2018-11-20 20:47:30 +05:30
# Called when a commit was tagged
#
# noteable - Noteable object
# project - Project owning noteable
# author - User performing the tag
# tag_name - The created tag name
#
# Returns the created Note object
def tag_commit(noteable, project, author, tag_name)
2019-12-21 20:55:43 +05:30
::SystemNotes::CommitService.new(noteable: noteable, project: project, author: author).tag_commit(tag_name)
2018-11-20 20:47:30 +05:30
end
2016-09-13 17:45:13 +05:30
def change_assignee(noteable, project, author, assignee)
2019-12-21 20:55:43 +05:30
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).change_assignee(assignee)
2017-08-17 22:00:37 +05:30
end
2019-07-31 22:56:46 +05:30
def change_issuable_assignees(issuable, project, author, old_assignees)
2019-12-21 20:55:43 +05:30
::SystemNotes::IssuablesService.new(noteable: issuable, project: project, author: author).change_issuable_assignees(old_assignees)
2015-09-11 14:41:01 +05:30
end
2018-11-20 20:47:30 +05:30
def change_milestone(noteable, project, author, milestone)
2019-12-21 20:55:43 +05:30
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).change_milestone(milestone)
2015-09-11 14:41:01 +05:30
end
2018-11-20 20:47:30 +05:30
# Called when the due_date of a Noteable is changed
2015-09-11 14:41:01 +05:30
#
# noteable - Noteable object
# project - Project owning noteable
# author - User performing the change
2018-11-20 20:47:30 +05:30
# due_date - Due date being assigned, or nil
2015-09-11 14:41:01 +05:30
#
# Example Note text:
#
2018-11-20 20:47:30 +05:30
# "removed due date"
2015-09-11 14:41:01 +05:30
#
2018-11-20 20:47:30 +05:30
# "changed due date to September 20, 2018"
2015-09-11 14:41:01 +05:30
#
# Returns the created Note object
2018-11-20 20:47:30 +05:30
def change_due_date(noteable, project, author, due_date)
body = due_date ? "changed due date to #{due_date.to_s(:long)}" : 'removed due date'
2015-09-11 14:41:01 +05:30
2018-11-20 20:47:30 +05:30
create_note(NoteSummary.new(noteable, project, author, body, action: 'due_date'))
2017-08-17 22:00:37 +05:30
end
# Called when the estimated time of a Noteable is changed
#
# noteable - Noteable object
# project - Project owning noteable
# author - User performing the change
# time_estimate - Estimated time
#
# Example Note text:
#
# "removed time estimate"
#
# "changed time estimate to 3d 5h"
#
# Returns the created Note object
def change_time_estimate(noteable, project, author)
parsed_time = Gitlab::TimeTrackingFormatter.output(noteable.time_estimate)
body = if noteable.time_estimate == 0
"removed time estimate"
else
"changed time estimate to #{parsed_time}"
end
create_note(NoteSummary.new(noteable, project, author, body, action: 'time_tracking'))
end
# Called when the spent time of a Noteable is changed
#
# noteable - Noteable object
# project - Project owning noteable
# author - User performing the change
# time_spent - Spent time
#
# Example Note text:
#
# "removed time spent"
#
# "added 2h 30m of time spent"
#
# Returns the created Note object
def change_time_spent(noteable, project, author)
time_spent = noteable.time_spent
if time_spent == :reset
body = "removed time spent"
else
2018-03-17 18:26:18 +05:30
spent_at = noteable.spent_at
2017-08-17 22:00:37 +05:30
parsed_time = Gitlab::TimeTrackingFormatter.output(time_spent.abs)
action = time_spent > 0 ? 'added' : 'subtracted'
2018-11-18 11:00:15 +05:30
text_parts = ["#{action} #{parsed_time} of time spent"]
text_parts << "at #{spent_at}" if spent_at
body = text_parts.join(' ')
2017-08-17 22:00:37 +05:30
end
create_note(NoteSummary.new(noteable, project, author, body, action: 'time_tracking'))
2015-09-11 14:41:01 +05:30
end
2018-12-13 13:39:08 +05:30
def change_status(noteable, project, author, status, source = nil)
2019-12-21 20:55:43 +05:30
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).change_status(status, source)
2015-12-23 02:04:40 +05:30
end
2017-08-17 22:00:37 +05:30
# Called when 'merge when pipeline succeeds' is executed
2019-09-30 21:07:59 +05:30
def merge_when_pipeline_succeeds(noteable, project, author, sha)
body = "enabled an automatic merge when the pipeline for #{sha} succeeds"
2015-12-23 02:04:40 +05:30
2017-08-17 22:00:37 +05:30
create_note(NoteSummary.new(noteable, project, author, body, action: 'merge'))
2015-12-23 02:04:40 +05:30
end
2017-08-17 22:00:37 +05:30
# Called when 'merge when pipeline succeeds' is canceled
def cancel_merge_when_pipeline_succeeds(noteable, project, author)
body = 'canceled the automatic merge'
2015-09-11 14:41:01 +05:30
2017-08-17 22:00:37 +05:30
create_note(NoteSummary.new(noteable, project, author, body, action: 'merge'))
2015-09-11 14:41:01 +05:30
end
2019-09-30 21:07:59 +05:30
# Called when 'merge when pipeline succeeds' is aborted
def abort_merge_when_pipeline_succeeds(noteable, project, author, reason)
body = "aborted the automatic merge because #{reason}"
##
# TODO: Abort message should be sent by the system, not a particular user.
2019-12-04 20:38:33 +05:30
# See https://gitlab.com/gitlab-org/gitlab-foss/issues/63187.
2019-09-30 21:07:59 +05:30
create_note(NoteSummary.new(noteable, project, author, body, action: 'merge'))
end
2018-03-17 18:26:18 +05:30
def handle_merge_request_wip(noteable, project, author)
prefix = noteable.work_in_progress? ? "marked" : "unmarked"
2016-06-02 11:05:42 +05:30
2018-03-17 18:26:18 +05:30
body = "#{prefix} as a **Work In Progress**"
2017-08-17 22:00:37 +05:30
create_note(NoteSummary.new(noteable, project, author, body, action: 'title'))
end
def add_merge_request_wip_from_commit(noteable, project, author, commit)
body = "marked as a **Work In Progress** from #{commit.to_reference(project)}"
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
create_note(NoteSummary.new(noteable, project, author, body, action: 'title'))
2016-06-02 11:05:42 +05:30
end
2017-09-10 17:25:29 +05:30
def resolve_all_discussions(merge_request, project, author)
2019-09-30 21:07:59 +05:30
body = "resolved all threads"
2016-09-13 17:45:13 +05:30
2017-08-17 22:00:37 +05:30
create_note(NoteSummary.new(merge_request, project, author, body, action: 'discussion'))
end
def discussion_continued_in_issue(discussion, project, author, issue)
body = "created #{issue.to_reference} to continue this discussion"
note_attributes = discussion.reply_attributes.merge(project: project, author: author, note: body)
2019-07-31 22:56:46 +05:30
note = Note.create(note_attributes.merge(system: true, created_at: issue.system_note_timestamp))
2017-08-17 22:00:37 +05:30
note.system_note_metadata = SystemNoteMetadata.new(action: 'discussion')
note
2016-09-13 17:45:13 +05:30
end
2017-09-10 17:25:29 +05:30
def diff_discussion_outdated(discussion, project, author, change_position)
merge_request = discussion.noteable
diff_refs = change_position.diff_refs
version_index = merge_request.merge_request_diffs.viewable.count
2019-09-30 21:07:59 +05:30
position_on_text = change_position.on_text?
text_parts = ["changed this #{position_on_text ? 'line' : 'file'} in"]
2017-09-10 17:25:29 +05:30
if version_params = merge_request.version_params_for(diff_refs)
2019-09-30 21:07:59 +05:30
repository = project.repository
anchor = position_on_text ? change_position.line_code(repository) : change_position.file_hash
url = url_helpers.diffs_project_merge_request_path(project, merge_request, version_params.merge(anchor: anchor))
2017-09-10 17:25:29 +05:30
2018-11-18 11:00:15 +05:30
text_parts << "[version #{version_index} of the diff](#{url})"
2017-09-10 17:25:29 +05:30
else
2018-11-18 11:00:15 +05:30
text_parts << "version #{version_index} of the diff"
2017-09-10 17:25:29 +05:30
end
2018-11-18 11:00:15 +05:30
body = text_parts.join(' ')
2017-09-10 17:25:29 +05:30
note_attributes = discussion.reply_attributes.merge(project: project, author: author, note: body)
2018-11-18 11:00:15 +05:30
2017-09-10 17:25:29 +05:30
note = Note.create(note_attributes.merge(system: true))
note.system_note_metadata = SystemNoteMetadata.new(action: 'outdated')
note
end
2016-09-13 17:45:13 +05:30
def change_title(noteable, project, author, old_title)
2019-12-21 20:55:43 +05:30
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).change_title(old_title)
2017-08-17 22:00:37 +05:30
end
def change_description(noteable, project, author)
2019-12-21 20:55:43 +05:30
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).change_description
2015-09-11 14:41:01 +05:30
end
2016-09-13 17:45:13 +05:30
def change_issue_confidentiality(issue, project, author)
2019-12-21 20:55:43 +05:30
::SystemNotes::IssuablesService.new(noteable: issue, project: project, author: author).change_issue_confidentiality
2016-06-02 11:05:42 +05:30
end
2015-09-11 14:41:01 +05:30
# Called when a branch in Noteable is changed
#
# noteable - Noteable object
# project - Project owning noteable
# author - User performing the change
# branch_type - 'source' or 'target'
# old_branch - old branch name
2019-07-07 11:18:12 +05:30
# new_branch - new branch name
2015-09-11 14:41:01 +05:30
#
# Example Note text:
#
2017-08-17 22:00:37 +05:30
# "changed target branch from `Old` to `New`"
2015-09-11 14:41:01 +05:30
#
# Returns the created Note object
2016-09-13 17:45:13 +05:30
def change_branch(noteable, project, author, branch_type, old_branch, new_branch)
2017-08-17 22:00:37 +05:30
body = "changed #{branch_type} branch from `#{old_branch}` to `#{new_branch}`"
create_note(NoteSummary.new(noteable, project, author, body, action: 'branch'))
2015-09-11 14:41:01 +05:30
end
2015-10-24 18:46:33 +05:30
# Called when a branch in Noteable is added or deleted
#
# noteable - Noteable object
# project - Project owning noteable
# author - User performing the change
# branch_type - :source or :target
# branch - branch name
# presence - :add or :delete
#
# Example Note text:
#
2017-08-17 22:00:37 +05:30
# "restored target branch `feature`"
2015-10-24 18:46:33 +05:30
#
# Returns the created Note object
2016-09-13 17:45:13 +05:30
def change_branch_presence(noteable, project, author, branch_type, branch, presence)
2015-10-24 18:46:33 +05:30
verb =
if presence == :add
'restored'
else
'deleted'
end
2016-08-24 12:49:21 +05:30
2017-08-17 22:00:37 +05:30
body = "#{verb} #{branch_type} branch `#{branch}`"
create_note(NoteSummary.new(noteable, project, author, body, action: 'branch'))
2015-10-24 18:46:33 +05:30
end
2016-06-02 11:05:42 +05:30
# Called when a branch is created from the 'new branch' button on a issue
# Example note text:
#
2017-08-17 22:00:37 +05:30
# "created branch `201-issue-branch-button`"
2019-09-30 21:07:59 +05:30
def new_issue_branch(issue, project, author, branch, branch_project: nil)
branch_project ||= project
link = url_helpers.project_compare_path(branch_project, from: branch_project.default_branch, to: branch)
2016-06-02 11:05:42 +05:30
2019-02-15 15:39:39 +05:30
body = "created branch [`#{branch}`](#{link}) to address this issue"
2017-08-17 22:00:37 +05:30
create_note(NoteSummary.new(issue, project, author, body, action: 'branch'))
2016-06-02 11:05:42 +05:30
end
2019-02-15 15:39:39 +05:30
def new_merge_request(issue, project, author, merge_request)
2019-09-30 21:07:59 +05:30
body = "created merge request #{merge_request.to_reference(project)} to address this issue"
2019-02-15 15:39:39 +05:30
create_note(NoteSummary.new(issue, project, author, body, action: 'merge'))
end
2016-09-13 17:45:13 +05:30
def cross_reference(noteable, mentioner, author)
2019-12-21 20:55:43 +05:30
::SystemNotes::IssuablesService.new(noteable: noteable, author: author).cross_reference(mentioner)
2015-09-11 14:41:01 +05:30
end
2016-09-13 17:45:13 +05:30
def cross_reference_exists?(noteable, mentioner)
2019-12-21 20:55:43 +05:30
::SystemNotes::IssuablesService.new(noteable: noteable).cross_reference_exists?(mentioner)
2016-09-13 17:45:13 +05:30
end
def change_task_status(noteable, project, author, new_task)
2019-12-21 20:55:43 +05:30
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).change_task_status(new_task)
2016-09-13 17:45:13 +05:30
end
def noteable_moved(noteable, project, noteable_ref, author, direction:)
2019-12-21 20:55:43 +05:30
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).noteable_moved(noteable_ref, direction)
2016-09-13 17:45:13 +05:30
end
2017-09-10 17:25:29 +05:30
def mark_duplicate_issue(noteable, project, author, canonical_issue)
2019-12-21 20:55:43 +05:30
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).mark_duplicate_issue(canonical_issue)
2017-09-10 17:25:29 +05:30
end
def mark_canonical_issue_of_duplicate(noteable, project, author, duplicate_issue)
2019-12-21 20:55:43 +05:30
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).mark_canonical_issue_of_duplicate(duplicate_issue)
2017-09-10 17:25:29 +05:30
end
2018-03-17 18:26:18 +05:30
def discussion_lock(issuable, author)
2019-12-21 20:55:43 +05:30
::SystemNotes::IssuablesService.new(noteable: issuable, project: issuable.project, author: author).discussion_lock
2018-03-17 18:26:18 +05:30
end
2019-12-21 20:55:43 +05:30
def cross_reference_disallowed?(noteable, mentioner)
::SystemNotes::IssuablesService.new(noteable: noteable).cross_reference_disallowed?(mentioner)
2018-03-17 18:26:18 +05:30
end
2019-10-12 21:52:04 +05:30
def zoom_link_added(issue, project, author)
2019-12-21 20:55:43 +05:30
::SystemNotes::ZoomService.new(noteable: issue, project: project, author: author).zoom_link_added
2019-10-12 21:52:04 +05:30
end
def zoom_link_removed(issue, project, author)
2019-12-21 20:55:43 +05:30
::SystemNotes::ZoomService.new(noteable: issue, project: project, author: author).zoom_link_removed
2019-10-12 21:52:04 +05:30
end
2015-09-11 14:41:01 +05:30
private
2017-08-17 22:00:37 +05:30
def create_note(note_summary)
note = Note.create(note_summary.note.merge(system: true))
note.system_note_metadata = SystemNoteMetadata.new(note_summary.metadata) if note_summary.metadata?
note
2015-09-11 14:41:01 +05:30
end
2016-11-03 12:29:30 +05:30
def url_helpers
@url_helpers ||= Gitlab::Routing.url_helpers
end
2018-03-17 18:26:18 +05:30
def content_tag(*args)
ActionController::Base.helpers.content_tag(*args)
end
2015-09-11 14:41:01 +05:30
end
2019-12-04 20:38:33 +05:30
SystemNoteService.prepend_if_ee('EE::SystemNoteService')