diff options
Diffstat (limited to 'lib/gitlab/dependency_linker/go_mod_linker.rb')
-rw-r--r-- | lib/gitlab/dependency_linker/go_mod_linker.rb | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/gitlab/dependency_linker/go_mod_linker.rb b/lib/gitlab/dependency_linker/go_mod_linker.rb new file mode 100644 index 00000000000..4d6fe366333 --- /dev/null +++ b/lib/gitlab/dependency_linker/go_mod_linker.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +module Gitlab + module DependencyLinker + class GoModLinker < BaseLinker + include Gitlab::Golang + + self.file_type = :go_mod + + private + + SEMVER = Gitlab::Regex.unbounded_semver_regex + NAME = Gitlab::Regex.go_package_regex + REGEX = Regexp.new("(?<name>#{NAME.source})(?:\\s+(?<version>v#{SEMVER.source}))?", SEMVER.options | NAME.options).freeze + + # rubocop: disable CodeReuse/ActiveRecord + def link_dependencies + highlighted_lines.map!.with_index do |rich_line, i| + plain_line = plain_lines[i].chomp + match = REGEX.match(plain_line) + next rich_line unless match + + i, j = match.offset(:name) + marker = StringRangeMarker.new(plain_line, rich_line.html_safe) + marker.mark([i..(j - 1)]) do |text, left:, right:| + url = package_url(text, match[:version]) + url ? link_tag(text, url) : text + end + end + end + # rubocop: enable CodeReuse/ActiveRecord + end + end +end |