dependabot-core 0.89.5 → 0.90.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,74 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "excon"
4
- require "nokogiri"
5
-
6
- require "dependabot/shared_helpers"
7
- require "dependabot/source"
8
- require "dependabot/utils/go/shared_helper"
9
-
10
- module Dependabot
11
- module Utils
12
- module Go
13
- module PathConverter
14
- def self.git_url_for_path(path)
15
- # Save a query by manually converting golang.org/x names
16
- import_path = path.gsub(%r{^golang\.org/x}, "github.com/golang")
17
-
18
- SharedHelpers.run_helper_subprocess(
19
- command: Go::SharedHelper.path,
20
- function: "getVcsRemoteForImport",
21
- args: { import: import_path }
22
- )
23
- end
24
-
25
- # Used in dependabot-backend, which doesn't have access to any Go
26
- # helpers.
27
- # TODO: remove the need for this.
28
- def self.git_url_for_path_without_go_helper(path)
29
- # Save a query by manually converting golang.org/x names
30
- tmp_path = path.gsub(%r{^golang\.org/x}, "github.com/golang")
31
-
32
- # Currently, Dependabot::Source.new will return `nil` if it can't
33
- # find a git SCH associated with a path. If it is ever extended to
34
- # handle non-git sources we'll need to add an additional check here.
35
- return Source.from_url(tmp_path).url if Source.from_url(tmp_path)
36
- return "https://#{tmp_path}" if tmp_path.end_with?(".git")
37
- return unless (metadata_response = fetch_path_metadata(path))
38
-
39
- # Look for a GitHub, Bitbucket or GitLab URL in the response
40
- metadata_response.scan(Dependabot::Source::SOURCE_REGEX) do
41
- source_url = Regexp.last_match.to_s
42
- return Source.from_url(source_url).url
43
- end
44
-
45
- # If none are found, parse the response and return the go-import path
46
- doc = Nokogiri::XML(metadata_response)
47
- doc.remove_namespaces!
48
- import_details =
49
- doc.xpath("//meta").
50
- find { |n| n.attributes["name"]&.value == "go-import" }&.
51
- attributes&.fetch("content")&.value&.split(/\s+/)
52
- return unless import_details && import_details[1] == "git"
53
-
54
- import_details[2]
55
- end
56
-
57
- def self.fetch_path_metadata(path)
58
- # TODO: This is not robust! Instead, we should shell out to Go and
59
- # use https://github.com/Masterminds/vcs.
60
- response = Excon.get(
61
- "https://#{path}?go-get=1",
62
- idempotent: true,
63
- **SharedHelpers.excon_defaults
64
- )
65
-
66
- return unless response.status == 200
67
-
68
- response.body
69
- end
70
- private_class_method :fetch_path_metadata
71
- end
72
- end
73
- end
74
- end
@@ -1,152 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- ################################################################################
4
- # For more details on Go version constraints, see: #
5
- # - https://github.com/Masterminds/semver #
6
- # - https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md #
7
- ################################################################################
8
-
9
- require "dependabot/utils/go/version"
10
-
11
- module Dependabot
12
- module Utils
13
- module Go
14
- class Requirement < Gem::Requirement
15
- WILDCARD_REGEX = /(?:\.|^)[xX*]/.freeze
16
- OR_SEPARATOR = /(?<=[a-zA-Z0-9*])\s*\|{2}/.freeze
17
-
18
- # Override the version pattern to allow a 'v' prefix
19
- quoted = OPS.keys.map { |k| Regexp.quote(k) }.join("|")
20
- version_pattern = "v?#{Utils::Go::Version::VERSION_PATTERN}"
21
-
22
- PATTERN_RAW = "\\s*(#{quoted})?\\s*(#{version_pattern})\\s*"
23
- PATTERN = /\A#{PATTERN_RAW}\z/.freeze
24
-
25
- # Use Utils::Go::Version rather than Gem::Version to ensure that
26
- # pre-release versions aren't transformed.
27
- def self.parse(obj)
28
- if obj.is_a?(Gem::Version)
29
- return ["=", Utils::Go::Version.new(obj.to_s)]
30
- end
31
-
32
- unless (matches = PATTERN.match(obj.to_s))
33
- msg = "Illformed requirement [#{obj.inspect}]"
34
- raise BadRequirementError, msg
35
- end
36
-
37
- return DefaultRequirement if matches[1] == ">=" && matches[2] == "0"
38
-
39
- [matches[1] || "=", Utils::Go::Version.new(matches[2])]
40
- end
41
-
42
- # Returns an array of requirements. At least one requirement from the
43
- # returned array must be satisfied for a version to be valid.
44
- def self.requirements_array(requirement_string)
45
- return [new(nil)] if requirement_string.nil?
46
-
47
- requirement_string.strip.split(OR_SEPARATOR).map do |req_string|
48
- new(req_string)
49
- end
50
- end
51
-
52
- def initialize(*requirements)
53
- requirements = requirements.flatten.flat_map do |req_string|
54
- req_string.split(",").map do |r|
55
- convert_go_constraint_to_ruby_constraint(r.strip)
56
- end
57
- end
58
-
59
- super(requirements)
60
- end
61
-
62
- private
63
-
64
- def convert_go_constraint_to_ruby_constraint(req_string)
65
- req_string = req_string
66
- req_string = convert_wildcard_characters(req_string)
67
-
68
- if req_string.match?(WILDCARD_REGEX)
69
- ruby_range(req_string.gsub(WILDCARD_REGEX, "").gsub(/^[^\d]/, ""))
70
- elsif req_string.match?(/^~[^>]/) then convert_tilde_req(req_string)
71
- elsif req_string.include?(" - ") then convert_hyphen_req(req_string)
72
- elsif req_string.match?(/^[\dv^]/) then convert_caret_req(req_string)
73
- elsif req_string.match?(/[<=>]/) then req_string
74
- else ruby_range(req_string)
75
- end
76
- end
77
-
78
- def convert_wildcard_characters(req_string)
79
- if req_string.match?(/^[\dv^>~]/)
80
- replace_wildcard_in_lower_bound(req_string)
81
- elsif req_string.start_with?("<")
82
- parts = req_string.split(".")
83
- parts.map.with_index do |part, index|
84
- next "0" if part.match?(WILDCARD_REGEX)
85
- next part.to_i + 1 if parts[index + 1]&.match?(WILDCARD_REGEX)
86
-
87
- part
88
- end.join(".")
89
- else
90
- req_string
91
- end
92
- end
93
-
94
- def replace_wildcard_in_lower_bound(req_string)
95
- after_wildcard = false
96
-
97
- if req_string.start_with?("~")
98
- req_string = req_string.gsub(/(?:(?:\.|^)[xX*])(\.[xX*])+/, "")
99
- end
100
-
101
- req_string.split(".").
102
- map do |part|
103
- part.split("-").map.with_index do |p, i|
104
- # Before we hit a wildcard we just return the existing part
105
- next p unless p.match?(WILDCARD_REGEX) || after_wildcard
106
-
107
- # On or after a wildcard we replace the version part with zero
108
- after_wildcard = true
109
- i.zero? ? "0" : "a"
110
- end.join("-")
111
- end.join(".")
112
- end
113
-
114
- def convert_tilde_req(req_string)
115
- version = req_string.gsub(/^~/, "")
116
- parts = version.split(".")
117
- parts << "0" if parts.count < 3
118
- "~> #{parts.join('.')}"
119
- end
120
-
121
- def convert_hyphen_req(req_string)
122
- lower_bound, upper_bound = req_string.split(/\s+-\s+/)
123
- [">= #{lower_bound}", "<= #{upper_bound}"]
124
- end
125
-
126
- def ruby_range(req_string)
127
- parts = req_string.split(".")
128
-
129
- # If we have three or more parts then this is an exact match
130
- return req_string if parts.count >= 3
131
-
132
- # If we have no parts then the version is completely unlocked
133
- return ">= 0" if parts.count.zero?
134
-
135
- # If we have fewer than three parts we do a partial match
136
- parts << "0"
137
- "~> #{parts.join('.')}"
138
- end
139
-
140
- # Note: Dep's caret notation implementation doesn't distinguish between
141
- # pre and post-1.0.0 requirements (unlike in JS)
142
- def convert_caret_req(req_string)
143
- version = req_string.gsub(/^\^?v?/, "")
144
- parts = version.split(".")
145
- upper_bound = [parts.first.to_i + 1, 0, 0, "a"].map(&:to_s).join(".")
146
-
147
- [">= #{version}", "< #{upper_bound}"]
148
- end
149
- end
150
- end
151
- end
152
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Dependabot
4
- module Utils
5
- module Go
6
- module SharedHelper
7
- def self.path
8
- project_root = File.join(File.dirname(__FILE__), "../../../..")
9
- platform =
10
- case RbConfig::CONFIG["arch"]
11
- when /linux/ then "linux"
12
- when /darwin/ then "darwin"
13
- else raise "Invalid platform #{RbConfig::CONFIG['arch']}"
14
- end
15
- File.join(project_root, "helpers/go/go-helpers.#{platform}64")
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "rubygems_version_patch"
4
-
5
- # Go pre-release versions use 1.0.1-rc1 syntax, which Gem::Version
6
- # converts into 1.0.1.pre.rc1. We override the `to_s` method to stop that
7
- # alteration.
8
- # Best docs are at https://github.com/Masterminds/semver
9
-
10
- module Dependabot
11
- module Utils
12
- module Go
13
- class Version < Gem::Version
14
- VERSION_PATTERN = '[0-9]+[0-9a-zA-Z]*(?>\.[0-9a-zA-Z]+)*' \
15
- '(-[0-9A-Za-z-]+(\.[0-9a-zA-Z-]+)*)?' \
16
- '(\+incompatible)?'
17
- ANCHORED_VERSION_PATTERN = /\A\s*(#{VERSION_PATTERN})?\s*\z/.freeze
18
-
19
- def self.correct?(version)
20
- version = version.gsub(/^v/, "") if version.is_a?(String)
21
- version = version.to_s.split("+").first if version.to_s.include?("+")
22
- super(version)
23
- end
24
-
25
- def initialize(version)
26
- @version_string = version.to_s.gsub(/^v/, "")
27
- version = version.gsub(/^v/, "") if version.is_a?(String)
28
- version = version.to_s.split("+").first if version.to_s.include?("+")
29
- super
30
- end
31
-
32
- def inspect # :nodoc:
33
- "#<#{self.class} #{@version_string.inspect}>"
34
- end
35
-
36
- def to_s
37
- @version_string
38
- end
39
- end
40
- end
41
- end
42
- end