2018-10-22 07:00:50 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2014-06-13 14:19:08 +00:00
|
|
|
module Gitlab
|
2015-04-03 16:03:26 +00:00
|
|
|
class ClosingIssueExtractor
|
2015-11-30 20:15:19 +00:00
|
|
|
ISSUE_CLOSING_REGEX = begin
|
2017-09-21 10:42:16 +00:00
|
|
|
link_pattern = Banzai::Filter::AutolinkFilter::LINK_PATTERN
|
2015-12-02 17:48:39 +00:00
|
|
|
|
2015-11-30 20:15:19 +00:00
|
|
|
pattern = Gitlab.config.gitlab.issue_closing_pattern
|
2015-12-02 17:48:39 +00:00
|
|
|
pattern = pattern.sub('%{issue_ref}', "(?:(?:#{link_pattern})|(?:#{Issue.reference_pattern}))")
|
2015-11-30 20:15:19 +00:00
|
|
|
Regexp.new(pattern).freeze
|
|
|
|
end
|
2014-06-13 14:19:08 +00:00
|
|
|
|
2015-04-03 16:03:26 +00:00
|
|
|
def initialize(project, current_user = nil)
|
2020-01-08 00:07:43 +00:00
|
|
|
@project = project
|
2015-04-03 16:03:26 +00:00
|
|
|
@extractor = Gitlab::ReferenceExtractor.new(project, current_user)
|
|
|
|
end
|
2014-09-17 17:08:35 +00:00
|
|
|
|
2015-04-03 16:03:26 +00:00
|
|
|
def closed_by_message(message)
|
|
|
|
return [] if message.nil?
|
2020-01-08 00:07:43 +00:00
|
|
|
return [] unless @project.autoclose_referenced_issues
|
2015-05-21 20:35:15 +00:00
|
|
|
|
2015-11-30 20:15:19 +00:00
|
|
|
closing_statements = []
|
|
|
|
message.scan(ISSUE_CLOSING_REGEX) do
|
|
|
|
closing_statements << Regexp.last_match[0]
|
|
|
|
end
|
2014-09-17 17:08:35 +00:00
|
|
|
|
2015-11-30 20:15:19 +00:00
|
|
|
@extractor.analyze(closing_statements.join(" "))
|
2014-09-17 17:08:35 +00:00
|
|
|
|
2016-08-04 09:56:58 +00:00
|
|
|
@extractor.issues.reject do |issue|
|
2017-09-20 15:41:11 +00:00
|
|
|
# Don't extract issues from the project this project was forked from
|
|
|
|
@extractor.project.forked_from?(issue.project)
|
2016-08-04 09:56:58 +00:00
|
|
|
end
|
2014-06-13 14:19:08 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|