Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/dependency_linker/go_mod_linker.rb')
-rw-r--r--lib/gitlab/dependency_linker/go_mod_linker.rb34
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