2018-07-05 06:18:17 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2015-04-30 23:16:19 -04:00
|
|
|
# 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-07-19 08:18:51 -04:00
|
|
|
module SystemNoteService
|
|
|
|
extend self
|
|
|
|
|
2015-05-09 18:18:50 -04:00
|
|
|
# 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
|
2015-05-26 16:30:07 -04:00
|
|
|
# oldrev - Optional String SHA of a previous Commit
|
2015-05-09 18:18:50 -04:00
|
|
|
#
|
|
|
|
# Returns the created Note object
|
2016-07-19 08:18:51 -04:00
|
|
|
def add_commits(noteable, project, author, new_commits, existing_commits = [], oldrev = nil)
|
2019-10-03 08:06:00 -04:00
|
|
|
::SystemNotes::CommitService.new(noteable: noteable, project: project, author: author).add_commits(new_commits, existing_commits, oldrev)
|
2015-05-09 18:18:50 -04:00
|
|
|
end
|
|
|
|
|
2018-07-21 08:57:52 -04:00
|
|
|
# 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-10-03 08:06:00 -04:00
|
|
|
::SystemNotes::CommitService.new(noteable: noteable, project: project, author: author).tag_commit(tag_name)
|
2018-07-21 08:57:52 -04:00
|
|
|
end
|
|
|
|
|
2016-07-19 08:18:51 -04:00
|
|
|
def change_assignee(noteable, project, author, assignee)
|
2019-10-08 11:06:04 -04:00
|
|
|
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).change_assignee(assignee)
|
2015-04-30 23:16:19 -04:00
|
|
|
end
|
|
|
|
|
2019-04-07 14:35:16 -04:00
|
|
|
def change_issuable_assignees(issuable, project, author, old_assignees)
|
2019-10-08 11:06:04 -04:00
|
|
|
::SystemNotes::IssuablesService.new(noteable: issuable, project: project, author: author).change_issuable_assignees(old_assignees)
|
2017-05-04 08:11:15 -04:00
|
|
|
end
|
|
|
|
|
2016-07-19 08:18:51 -04:00
|
|
|
def change_milestone(noteable, project, author, milestone)
|
2019-10-08 11:06:04 -04:00
|
|
|
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).change_milestone(milestone)
|
2015-04-30 23:16:19 -04:00
|
|
|
end
|
|
|
|
|
2018-09-09 14:08:21 -04:00
|
|
|
# Called when the due_date of a Noteable is changed
|
|
|
|
#
|
|
|
|
# noteable - Noteable object
|
|
|
|
# project - Project owning noteable
|
|
|
|
# author - User performing the change
|
|
|
|
# due_date - Due date being assigned, or nil
|
|
|
|
#
|
|
|
|
# Example Note text:
|
|
|
|
#
|
|
|
|
# "removed due date"
|
|
|
|
#
|
|
|
|
# "changed due date to September 20, 2018"
|
|
|
|
#
|
|
|
|
# Returns the created Note object
|
|
|
|
def change_due_date(noteable, project, author, due_date)
|
|
|
|
body = due_date ? "changed due date to #{due_date.to_s(:long)}" : 'removed due date'
|
|
|
|
|
|
|
|
create_note(NoteSummary.new(noteable, project, author, body, action: 'due_date'))
|
|
|
|
end
|
|
|
|
|
2016-12-23 00:44:02 -05:00
|
|
|
# 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:
|
|
|
|
#
|
2017-01-26 08:00:32 -05:00
|
|
|
# "removed time estimate"
|
2017-01-26 07:33:35 -05:00
|
|
|
#
|
2017-01-26 08:00:32 -05:00
|
|
|
# "changed time estimate to 3d 5h"
|
2016-12-23 00:44:02 -05:00
|
|
|
#
|
|
|
|
# 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
|
2017-01-26 08:00:32 -05:00
|
|
|
"removed time estimate"
|
2016-12-23 00:44:02 -05:00
|
|
|
else
|
2018-04-25 16:56:06 -04:00
|
|
|
"changed time estimate to #{parsed_time}"
|
2016-12-23 00:44:02 -05:00
|
|
|
end
|
|
|
|
|
2017-03-15 09:19:45 -04:00
|
|
|
create_note(NoteSummary.new(noteable, project, author, body, action: 'time_tracking'))
|
2016-12-23 00:44:02 -05:00
|
|
|
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:
|
|
|
|
#
|
2017-01-26 08:00:32 -05:00
|
|
|
# "removed time spent"
|
2017-01-26 07:33:35 -05:00
|
|
|
#
|
2017-01-26 08:00:32 -05:00
|
|
|
# "added 2h 30m of time spent"
|
2016-12-23 00:44:02 -05:00
|
|
|
#
|
|
|
|
# Returns the created Note object
|
|
|
|
def change_time_spent(noteable, project, author)
|
|
|
|
time_spent = noteable.time_spent
|
|
|
|
|
|
|
|
if time_spent == :reset
|
2017-01-26 08:00:32 -05:00
|
|
|
body = "removed time spent"
|
2016-12-23 00:44:02 -05:00
|
|
|
else
|
2017-09-22 12:20:44 -04:00
|
|
|
spent_at = noteable.spent_at
|
2016-12-23 00:44:02 -05:00
|
|
|
parsed_time = Gitlab::TimeTrackingFormatter.output(time_spent.abs)
|
2017-01-26 07:33:35 -05:00
|
|
|
action = time_spent > 0 ? 'added' : 'subtracted'
|
2018-07-05 06:18:17 -04:00
|
|
|
|
|
|
|
text_parts = ["#{action} #{parsed_time} of time spent"]
|
|
|
|
text_parts << "at #{spent_at}" if spent_at
|
|
|
|
body = text_parts.join(' ')
|
2016-12-23 00:44:02 -05:00
|
|
|
end
|
|
|
|
|
2017-03-15 09:19:45 -04:00
|
|
|
create_note(NoteSummary.new(noteable, project, author, body, action: 'time_tracking'))
|
2016-12-23 00:44:02 -05:00
|
|
|
end
|
|
|
|
|
2018-10-08 08:55:52 -04:00
|
|
|
def change_status(noteable, project, author, status, source = nil)
|
2019-10-08 11:06:04 -04:00
|
|
|
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).change_status(status, source)
|
2015-04-30 23:16:19 -04:00
|
|
|
end
|
|
|
|
|
2016-11-21 05:27:28 -05:00
|
|
|
# Called when 'merge when pipeline succeeds' is executed
|
2019-06-26 07:58:24 -04:00
|
|
|
def merge_when_pipeline_succeeds(noteable, project, author, sha)
|
2019-10-23 05:06:03 -04:00
|
|
|
::SystemNotes::MergeRequestsService.new(noteable: noteable, project: project, author: author).merge_when_pipeline_succeeds(sha)
|
2015-11-02 11:27:38 -05:00
|
|
|
end
|
|
|
|
|
2016-11-21 05:27:28 -05:00
|
|
|
# Called when 'merge when pipeline succeeds' is canceled
|
2017-02-17 08:56:13 -05:00
|
|
|
def cancel_merge_when_pipeline_succeeds(noteable, project, author)
|
2019-10-23 05:06:03 -04:00
|
|
|
::SystemNotes::MergeRequestsService.new(noteable: noteable, project: project, author: author).cancel_merge_when_pipeline_succeeds
|
2015-11-02 11:27:38 -05:00
|
|
|
end
|
|
|
|
|
2019-06-26 08:24:09 -04:00
|
|
|
# Called when 'merge when pipeline succeeds' is aborted
|
|
|
|
def abort_merge_when_pipeline_succeeds(noteable, project, author, reason)
|
2019-10-23 05:06:03 -04:00
|
|
|
::SystemNotes::MergeRequestsService.new(noteable: noteable, project: project, author: author).abort_merge_when_pipeline_succeeds(reason)
|
2019-06-26 08:24:09 -04:00
|
|
|
end
|
|
|
|
|
2017-11-21 14:25:37 -05:00
|
|
|
def handle_merge_request_wip(noteable, project, author)
|
2019-10-23 05:06:03 -04:00
|
|
|
::SystemNotes::MergeRequestsService.new(noteable: noteable, project: project, author: author).handle_merge_request_wip
|
2016-02-26 22:34:14 -05:00
|
|
|
end
|
|
|
|
|
2016-12-15 15:48:26 -05:00
|
|
|
def add_merge_request_wip_from_commit(noteable, project, author, commit)
|
2019-10-23 05:06:03 -04:00
|
|
|
::SystemNotes::MergeRequestsService.new(noteable: noteable, project: project, author: author).add_merge_request_wip_from_commit(commit)
|
2016-12-15 15:48:26 -05:00
|
|
|
end
|
|
|
|
|
2017-05-21 16:38:33 -04:00
|
|
|
def resolve_all_discussions(merge_request, project, author)
|
2019-10-23 05:06:03 -04:00
|
|
|
::SystemNotes::MergeRequestsService.new(noteable: merge_request, project: project, author: author).resolve_all_discussions
|
2016-07-28 22:39:35 -04:00
|
|
|
end
|
|
|
|
|
2016-10-26 17:21:50 -04:00
|
|
|
def discussion_continued_in_issue(discussion, project, author, issue)
|
2019-10-23 05:06:03 -04:00
|
|
|
::SystemNotes::MergeRequestsService.new(project: project, author: author).discussion_continued_in_issue(discussion, issue)
|
2016-10-26 17:21:50 -04:00
|
|
|
end
|
|
|
|
|
2017-05-21 16:38:33 -04:00
|
|
|
def diff_discussion_outdated(discussion, project, author, change_position)
|
2019-10-23 05:06:03 -04:00
|
|
|
::SystemNotes::MergeRequestsService.new(project: project, author: author).diff_discussion_outdated(discussion, change_position)
|
2017-05-21 16:38:33 -04:00
|
|
|
end
|
|
|
|
|
2016-07-19 08:18:51 -04:00
|
|
|
def change_title(noteable, project, author, old_title)
|
2019-10-08 11:06:04 -04:00
|
|
|
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).change_title(old_title)
|
2015-05-26 21:49:04 -04:00
|
|
|
end
|
|
|
|
|
2017-04-28 19:54:37 -04:00
|
|
|
def change_description(noteable, project, author)
|
2019-10-08 11:06:04 -04:00
|
|
|
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).change_description
|
2017-04-28 19:54:37 -04:00
|
|
|
end
|
|
|
|
|
2016-07-19 08:18:51 -04:00
|
|
|
def change_issue_confidentiality(issue, project, author)
|
2019-10-08 11:06:04 -04:00
|
|
|
::SystemNotes::IssuablesService.new(noteable: issue, project: project, author: author).change_issue_confidentiality
|
2016-04-20 18:41:11 -04:00
|
|
|
end
|
|
|
|
|
2015-05-28 21:00:37 -04:00
|
|
|
# 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-02-25 05:42:31 -05:00
|
|
|
# new_branch - new branch name
|
2015-05-28 21:00:37 -04:00
|
|
|
#
|
|
|
|
# Example Note text:
|
|
|
|
#
|
2016-11-23 01:55:23 -05:00
|
|
|
# "changed target branch from `Old` to `New`"
|
2015-05-28 21:00:37 -04:00
|
|
|
#
|
|
|
|
# Returns the created Note object
|
2016-07-19 08:18:51 -04:00
|
|
|
def change_branch(noteable, project, author, branch_type, old_branch, new_branch)
|
2019-10-23 05:06:03 -04:00
|
|
|
::SystemNotes::MergeRequestsService.new(noteable: noteable, project: project, author: author).change_branch(branch_type, old_branch, new_branch)
|
2015-05-28 21:00:37 -04:00
|
|
|
end
|
|
|
|
|
2015-10-15 04:41:46 -04:00
|
|
|
# Called when a branch in Noteable is added or deleted
|
|
|
|
#
|
|
|
|
# noteable - Noteable object
|
|
|
|
# project - Project owning noteable
|
|
|
|
# author - User performing the change
|
2015-10-15 05:08:22 -04:00
|
|
|
# branch_type - :source or :target
|
2015-10-15 04:41:46 -04:00
|
|
|
# branch - branch name
|
2015-10-15 05:08:22 -04:00
|
|
|
# presence - :add or :delete
|
2015-10-15 04:41:46 -04:00
|
|
|
#
|
|
|
|
# Example Note text:
|
|
|
|
#
|
2016-11-23 01:55:23 -05:00
|
|
|
# "restored target branch `feature`"
|
2015-10-15 04:41:46 -04:00
|
|
|
#
|
|
|
|
# Returns the created Note object
|
2016-07-19 08:18:51 -04:00
|
|
|
def change_branch_presence(noteable, project, author, branch_type, branch, presence)
|
2019-10-23 05:06:03 -04:00
|
|
|
::SystemNotes::MergeRequestsService.new(noteable: noteable, project: project, author: author).change_branch_presence(branch_type, branch, presence)
|
2015-10-15 04:41:46 -04:00
|
|
|
end
|
|
|
|
|
2016-02-17 01:11:48 -05:00
|
|
|
# Called when a branch is created from the 'new branch' button on a issue
|
|
|
|
# Example note text:
|
|
|
|
#
|
2016-11-23 01:55:23 -05:00
|
|
|
# "created branch `201-issue-branch-button`"
|
2019-06-28 18:08:26 -04:00
|
|
|
def new_issue_branch(issue, project, author, branch, branch_project: nil)
|
2019-10-23 05:06:03 -04:00
|
|
|
::SystemNotes::MergeRequestsService.new(noteable: issue, project: project, author: author).new_issue_branch(branch, branch_project: branch_project)
|
2016-02-17 01:11:48 -05:00
|
|
|
end
|
|
|
|
|
2018-10-19 03:16:58 -04:00
|
|
|
def new_merge_request(issue, project, author, merge_request)
|
2019-10-23 05:06:03 -04:00
|
|
|
::SystemNotes::MergeRequestsService.new(noteable: issue, project: project, author: author).new_merge_request(merge_request)
|
2018-10-19 03:16:58 -04:00
|
|
|
end
|
|
|
|
|
2016-07-19 08:18:51 -04:00
|
|
|
def cross_reference(noteable, mentioner, author)
|
2019-10-08 11:06:04 -04:00
|
|
|
::SystemNotes::IssuablesService.new(noteable: noteable, author: author).cross_reference(mentioner)
|
2015-04-30 23:16:19 -04:00
|
|
|
end
|
|
|
|
|
2016-07-19 08:18:51 -04:00
|
|
|
def cross_reference_exists?(noteable, mentioner)
|
2019-10-08 11:06:04 -04:00
|
|
|
::SystemNotes::IssuablesService.new(noteable: noteable).cross_reference_exists?(mentioner)
|
2015-04-30 23:16:19 -04:00
|
|
|
end
|
|
|
|
|
2016-07-19 08:18:51 -04:00
|
|
|
def change_task_status(noteable, project, author, new_task)
|
2019-10-08 11:06:04 -04:00
|
|
|
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).change_task_status(new_task)
|
2016-07-19 08:18:51 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def noteable_moved(noteable, project, noteable_ref, author, direction:)
|
2019-10-08 11:06:04 -04:00
|
|
|
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).noteable_moved(noteable_ref, direction)
|
2016-07-19 08:18:51 -04:00
|
|
|
end
|
|
|
|
|
2017-07-20 10:42:33 -04:00
|
|
|
def mark_duplicate_issue(noteable, project, author, canonical_issue)
|
2019-10-08 11:06:04 -04:00
|
|
|
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).mark_duplicate_issue(canonical_issue)
|
2017-07-20 10:42:33 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def mark_canonical_issue_of_duplicate(noteable, project, author, duplicate_issue)
|
2019-10-08 11:06:04 -04:00
|
|
|
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).mark_canonical_issue_of_duplicate(duplicate_issue)
|
2017-03-29 21:39:06 -04:00
|
|
|
end
|
|
|
|
|
2017-08-30 10:57:50 -04:00
|
|
|
def discussion_lock(issuable, author)
|
2019-10-08 11:06:04 -04:00
|
|
|
::SystemNotes::IssuablesService.new(noteable: issuable, project: issuable.project, author: author).discussion_lock
|
2017-08-30 10:57:50 -04:00
|
|
|
end
|
|
|
|
|
2019-10-08 11:06:04 -04:00
|
|
|
def cross_reference_disallowed?(noteable, mentioner)
|
|
|
|
::SystemNotes::IssuablesService.new(noteable: noteable).cross_reference_disallowed?(mentioner)
|
2017-11-16 09:23:32 -05:00
|
|
|
end
|
|
|
|
|
2019-07-20 05:06:19 -04:00
|
|
|
def zoom_link_added(issue, project, author)
|
2019-10-10 11:06:07 -04:00
|
|
|
::SystemNotes::ZoomService.new(noteable: issue, project: project, author: author).zoom_link_added
|
2019-07-20 05:06:19 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def zoom_link_removed(issue, project, author)
|
2019-10-10 11:06:07 -04:00
|
|
|
::SystemNotes::ZoomService.new(noteable: issue, project: project, author: author).zoom_link_removed
|
2019-07-20 05:06:19 -04:00
|
|
|
end
|
|
|
|
|
2015-04-30 23:16:19 -04:00
|
|
|
private
|
|
|
|
|
2017-03-15 09:19:45 -04:00
|
|
|
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-04-30 23:16:19 -04:00
|
|
|
end
|
|
|
|
|
2016-09-30 11:00:03 -04:00
|
|
|
def url_helpers
|
|
|
|
@url_helpers ||= Gitlab::Routing.url_helpers
|
|
|
|
end
|
|
|
|
|
2018-02-02 14:16:10 -05:00
|
|
|
def content_tag(*args)
|
|
|
|
ActionController::Base.helpers.content_tag(*args)
|
|
|
|
end
|
2015-04-30 23:16:19 -04:00
|
|
|
end
|
2019-09-13 09:26:31 -04:00
|
|
|
|
|
|
|
SystemNoteService.prepend_if_ee('EE::SystemNoteService')
|