diff options
Diffstat (limited to 'lib/banzai/filter/references/commit_range_reference_filter.rb')
-rw-r--r-- | lib/banzai/filter/references/commit_range_reference_filter.rb | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/lib/banzai/filter/references/commit_range_reference_filter.rb b/lib/banzai/filter/references/commit_range_reference_filter.rb new file mode 100644 index 00000000000..ad79f8a173c --- /dev/null +++ b/lib/banzai/filter/references/commit_range_reference_filter.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +module Banzai + module Filter + module References + # HTML filter that replaces commit range references with links. + # + # This filter supports cross-project references. + class CommitRangeReferenceFilter < AbstractReferenceFilter + self.reference_type = :commit_range + + def self.object_class + CommitRange + end + + def self.references_in(text, pattern = CommitRange.reference_pattern) + text.gsub(pattern) do |match| + yield match, $~[:commit_range], $~[:project], $~[:namespace], $~ + end + end + + def initialize(*args) + super + + @commit_map = {} + end + + def find_object(project, id) + return unless project.is_a?(Project) + + range = CommitRange.new(id, project) + + range.valid_commits? ? range : nil + end + + def url_for_object(range, project) + h = Gitlab::Routing.url_helpers + h.project_compare_url(project, + range.to_param.merge(only_path: context[:only_path])) + end + + def object_link_title(range, matches) + nil + end + end + end + end +end |