dependabot-common 0.236.0 → 0.237.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.
- checksums.yaml +4 -4
- data/lib/dependabot/clients/azure.rb +3 -3
- data/lib/dependabot/config/file.rb +17 -6
- data/lib/dependabot/config/update_config.rb +23 -5
- data/lib/dependabot/dependency_file.rb +84 -14
- data/lib/dependabot/dependency_group.rb +29 -5
- data/lib/dependabot/errors.rb +101 -13
- data/lib/dependabot/file_fetchers/base.rb +227 -93
- data/lib/dependabot/metadata_finders/base/changelog_finder.rb +13 -6
- data/lib/dependabot/pull_request_creator/github.rb +11 -8
- data/lib/dependabot/pull_request_creator/message.rb +21 -2
- data/lib/dependabot/pull_request_creator/message_builder/link_and_mention_sanitizer.rb +37 -16
- data/lib/dependabot/pull_request_creator/message_builder/metadata_presenter.rb +4 -2
- data/lib/dependabot/pull_request_creator/pr_name_prefixer.rb +10 -4
- data/lib/dependabot/shared_helpers.rb +117 -33
- data/lib/dependabot/simple_instrumentor.rb +22 -3
- data/lib/dependabot/source.rb +65 -17
- data/lib/dependabot/update_checkers/version_filters.rb +12 -1
- data/lib/dependabot/utils.rb +21 -2
- data/lib/dependabot/workspace/base.rb +42 -7
- data/lib/dependabot/workspace/change_attempt.rb +31 -3
- data/lib/dependabot/workspace/git.rb +34 -4
- data/lib/dependabot/workspace.rb +16 -2
- data/lib/dependabot.rb +1 -1
- metadata +23 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e29557fff3ec856a4ebcb95a2b53dd70f91b5d7f2ea66cd6230e90dbcbbc2dc0
|
4
|
+
data.tar.gz: f6b2ce2a845422872e58b37681909fb4357bb1ebcac22c1085db113dc2429426
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 367d715ab3cb1b0c2c498555419e2212e9986c8e824128ce56695c00cdc190371fa0b7b9115258146ff0573f2e4a8461e1c66651b9d84bb2fdb7b0fe00b901ff
|
7
|
+
data.tar.gz: 4e5b3e040476f17cb7cf268ccc0cae90f17178da6a5954b14ca2a2ce280cf0f067b1ce8b88ecc8da5c04ae919cc34b670258b1555f9bfb707fb061cc8439acb3
|
@@ -271,9 +271,9 @@ module Dependabot
|
|
271
271
|
)
|
272
272
|
)
|
273
273
|
|
274
|
-
raise InternalServerError if response
|
275
|
-
raise BadGateway if response
|
276
|
-
raise ServiceNotAvailable if response
|
274
|
+
raise InternalServerError if response.status == 500
|
275
|
+
raise BadGateway if response.status == 502
|
276
|
+
raise ServiceNotAvailable if response.status == 503
|
277
277
|
end
|
278
278
|
|
279
279
|
raise Unauthorized if response&.status == 401
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require "dependabot/config/update_config"
|
@@ -10,11 +10,22 @@ module Dependabot
|
|
10
10
|
class File
|
11
11
|
extend T::Sig
|
12
12
|
|
13
|
-
|
13
|
+
sig { returns(T::Array[T::Hash[Symbol, String]]) }
|
14
|
+
attr_reader :updates
|
14
15
|
|
16
|
+
sig { returns T::Array[T.untyped] }
|
17
|
+
attr_reader :registries
|
18
|
+
|
19
|
+
sig do
|
20
|
+
params(
|
21
|
+
updates: T.nilable(T::Array[T::Hash[Symbol, String]]),
|
22
|
+
registries: T.nilable(T::Array[T.untyped])
|
23
|
+
)
|
24
|
+
.void
|
25
|
+
end
|
15
26
|
def initialize(updates:, registries: nil)
|
16
|
-
@updates = updates || []
|
17
|
-
@registries = registries || []
|
27
|
+
@updates = T.let(updates || [], T::Array[T::Hash[Symbol, String]])
|
28
|
+
@registries = T.let(registries || [], T::Array[T.untyped])
|
18
29
|
end
|
19
30
|
|
20
31
|
sig do
|
@@ -46,7 +57,7 @@ module Dependabot
|
|
46
57
|
|
47
58
|
private
|
48
59
|
|
49
|
-
PACKAGE_MANAGER_LOOKUP = {
|
60
|
+
PACKAGE_MANAGER_LOOKUP = T.let({
|
50
61
|
"bundler" => "bundler",
|
51
62
|
"cargo" => "cargo",
|
52
63
|
"composer" => "composer",
|
@@ -64,7 +75,7 @@ module Dependabot
|
|
64
75
|
"pub" => "pub",
|
65
76
|
"swift" => "swift",
|
66
77
|
"terraform" => "terraform"
|
67
|
-
}.freeze
|
78
|
+
}.freeze, T::Hash[String, String])
|
68
79
|
|
69
80
|
sig { params(cfg: T.nilable(T::Hash[Symbol, T.untyped])).returns(T::Array[IgnoreCondition]) }
|
70
81
|
def ignore_conditions(cfg)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require "dependabot/config/ignore_condition"
|
@@ -23,17 +23,17 @@ module Dependabot
|
|
23
23
|
).void
|
24
24
|
end
|
25
25
|
def initialize(ignore_conditions: nil, commit_message_options: nil)
|
26
|
-
@ignore_conditions = ignore_conditions || []
|
26
|
+
@ignore_conditions = T.let(ignore_conditions || [], T::Array[IgnoreCondition])
|
27
27
|
@commit_message_options = commit_message_options
|
28
28
|
end
|
29
29
|
|
30
30
|
sig { params(dependency: Dependency, security_updates_only: T::Boolean).returns(T::Array[String]) }
|
31
31
|
def ignored_versions_for(dependency, security_updates_only: false)
|
32
32
|
normalizer = name_normaliser_for(dependency)
|
33
|
-
dep_name = normalizer.call(dependency.name)
|
33
|
+
dep_name = T.must(normalizer).call(dependency.name)
|
34
34
|
|
35
35
|
@ignore_conditions
|
36
|
-
.select { |ic| self.class.wildcard_match?(normalizer.call(ic.dependency_name), dep_name) }
|
36
|
+
.select { |ic| self.class.wildcard_match?(T.must(normalizer).call(ic.dependency_name), dep_name) }
|
37
37
|
.map { |ic| ic.ignored_versions(dependency, security_updates_only) }
|
38
38
|
.flatten
|
39
39
|
.compact
|
@@ -53,6 +53,7 @@ module Dependabot
|
|
53
53
|
|
54
54
|
private
|
55
55
|
|
56
|
+
sig { params(dep: Dependency).returns(T.nilable(T.proc.params(arg0: String).returns(String))) }
|
56
57
|
def name_normaliser_for(dep)
|
57
58
|
name_normaliser ||= {}
|
58
59
|
name_normaliser[dep] ||= Dependency.name_normaliser_for_package_manager(dep.package_manager)
|
@@ -61,18 +62,35 @@ module Dependabot
|
|
61
62
|
class CommitMessageOptions
|
62
63
|
extend T::Sig
|
63
64
|
|
64
|
-
|
65
|
+
sig { returns(T.nilable(String)) }
|
66
|
+
attr_reader :prefix
|
65
67
|
|
68
|
+
sig { returns(T.nilable(String)) }
|
69
|
+
attr_reader :prefix_development
|
70
|
+
|
71
|
+
sig { returns(T.nilable(String)) }
|
72
|
+
attr_reader :include
|
73
|
+
|
74
|
+
sig do
|
75
|
+
params(
|
76
|
+
prefix: T.nilable(String),
|
77
|
+
prefix_development: T.nilable(String),
|
78
|
+
include: T.nilable(String)
|
79
|
+
)
|
80
|
+
.void
|
81
|
+
end
|
66
82
|
def initialize(prefix:, prefix_development:, include:)
|
67
83
|
@prefix = prefix
|
68
84
|
@prefix_development = prefix_development
|
69
85
|
@include = include
|
70
86
|
end
|
71
87
|
|
88
|
+
sig { returns(T::Boolean) }
|
72
89
|
def include_scope?
|
73
90
|
@include == "scope"
|
74
91
|
end
|
75
92
|
|
93
|
+
sig { returns(T::Hash[Symbol, String]) }
|
76
94
|
def to_h
|
77
95
|
{
|
78
96
|
prefix: @prefix,
|
@@ -1,13 +1,47 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require "pathname"
|
5
|
+
require "sorbet-runtime"
|
5
6
|
|
6
7
|
module Dependabot
|
7
8
|
class DependencyFile
|
8
|
-
|
9
|
-
|
10
|
-
|
9
|
+
extend T::Sig
|
10
|
+
|
11
|
+
sig { returns(String) }
|
12
|
+
attr_accessor :name
|
13
|
+
|
14
|
+
sig { returns(T.nilable(String)) }
|
15
|
+
attr_accessor :content
|
16
|
+
|
17
|
+
sig { returns(String) }
|
18
|
+
attr_accessor :directory
|
19
|
+
|
20
|
+
sig { returns(String) }
|
21
|
+
attr_accessor :type
|
22
|
+
|
23
|
+
sig { returns(T::Boolean) }
|
24
|
+
attr_accessor :support_file
|
25
|
+
|
26
|
+
sig { returns(T::Boolean) }
|
27
|
+
attr_accessor :vendored_file
|
28
|
+
|
29
|
+
sig { returns(T.nilable(String)) }
|
30
|
+
attr_accessor :symlink_target
|
31
|
+
|
32
|
+
sig { returns(String) }
|
33
|
+
attr_accessor :content_encoding
|
34
|
+
|
35
|
+
sig { returns(String) }
|
36
|
+
attr_accessor :operation
|
37
|
+
|
38
|
+
sig { returns(T.nilable(String)) }
|
39
|
+
attr_accessor :mode
|
40
|
+
|
41
|
+
# The directory that this file was fetched for. This is useful for multi-directory
|
42
|
+
# updates, where a set of files that are related to each other are updated together.
|
43
|
+
sig { returns(T.nilable(String)) }
|
44
|
+
attr_accessor :job_directory
|
11
45
|
|
12
46
|
class ContentEncoding
|
13
47
|
UTF_8 = "utf-8"
|
@@ -25,18 +59,36 @@ module Dependabot
|
|
25
59
|
SUBMODULE = "160000"
|
26
60
|
end
|
27
61
|
|
62
|
+
sig do
|
63
|
+
params(
|
64
|
+
name: String,
|
65
|
+
content: T.nilable(String),
|
66
|
+
directory: String,
|
67
|
+
type: String,
|
68
|
+
support_file: T::Boolean,
|
69
|
+
vendored_file: T::Boolean,
|
70
|
+
symlink_target: T.nilable(String),
|
71
|
+
content_encoding: String,
|
72
|
+
deleted: T::Boolean,
|
73
|
+
operation: String,
|
74
|
+
mode: T.nilable(String),
|
75
|
+
job_directory: T.nilable(String)
|
76
|
+
)
|
77
|
+
.void
|
78
|
+
end
|
28
79
|
def initialize(name:, content:, directory: "/", type: "file",
|
29
80
|
support_file: false, vendored_file: false, symlink_target: nil,
|
30
81
|
content_encoding: ContentEncoding::UTF_8, deleted: false,
|
31
|
-
operation: Operation::UPDATE, mode: nil)
|
82
|
+
operation: Operation::UPDATE, mode: nil, job_directory: nil)
|
32
83
|
@name = name
|
33
84
|
@content = content
|
34
|
-
@directory = clean_directory(directory)
|
85
|
+
@directory = T.let(clean_directory(directory), String)
|
35
86
|
@symlink_target = symlink_target
|
36
87
|
@support_file = support_file
|
37
88
|
@vendored_file = vendored_file
|
38
89
|
@content_encoding = content_encoding
|
39
90
|
@operation = operation
|
91
|
+
@job_directory = job_directory
|
40
92
|
|
41
93
|
# Make deleted override the operation. Deleted is kept when operation
|
42
94
|
# was introduced to keep compatibility with downstream dependants.
|
@@ -50,7 +102,7 @@ module Dependabot
|
|
50
102
|
@type = type
|
51
103
|
|
52
104
|
begin
|
53
|
-
@mode = File.stat(realpath).mode.to_s(8)
|
105
|
+
@mode = T.let(File.stat(realpath).mode.to_s(8), T.nilable(String))
|
54
106
|
rescue StandardError
|
55
107
|
@mode = mode
|
56
108
|
end
|
@@ -61,6 +113,7 @@ module Dependabot
|
|
61
113
|
raise "Only symlinked files must specify a target!" if symlink_target
|
62
114
|
end
|
63
115
|
|
116
|
+
sig { returns(T::Hash[String, T.untyped]) }
|
64
117
|
def to_h
|
65
118
|
details = {
|
66
119
|
"name" => name,
|
@@ -74,66 +127,83 @@ module Dependabot
|
|
74
127
|
"mode" => mode
|
75
128
|
}
|
76
129
|
|
130
|
+
details["job_directory"] = job_directory if job_directory
|
77
131
|
details["symlink_target"] = symlink_target if symlink_target
|
78
132
|
details
|
79
133
|
end
|
80
134
|
|
135
|
+
sig { returns(String) }
|
81
136
|
def path
|
82
137
|
Pathname.new(File.join(directory, name)).cleanpath.to_path
|
83
138
|
end
|
84
139
|
|
140
|
+
sig { returns(String) }
|
85
141
|
def realpath
|
86
142
|
(symlink_target || path).sub(%r{^/}, "")
|
87
143
|
end
|
88
144
|
|
145
|
+
sig { params(other: BasicObject).returns(T::Boolean) }
|
89
146
|
def ==(other)
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
147
|
+
case other
|
148
|
+
when DependencyFile
|
149
|
+
my_hash = to_h.reject { |k| k == "support_file" }
|
150
|
+
their_hash = other.to_h.reject { |k| k == "support_file" }
|
151
|
+
my_hash == their_hash
|
152
|
+
else
|
153
|
+
false
|
154
|
+
end
|
95
155
|
end
|
96
156
|
|
157
|
+
sig { returns(Integer) }
|
97
158
|
def hash
|
98
159
|
to_h.hash
|
99
160
|
end
|
100
161
|
|
162
|
+
sig { params(other: BasicObject).returns(T::Boolean) }
|
101
163
|
def eql?(other)
|
102
164
|
self == other
|
103
165
|
end
|
104
166
|
|
167
|
+
sig { returns(T::Boolean) }
|
105
168
|
def support_file?
|
106
169
|
@support_file
|
107
170
|
end
|
108
171
|
|
172
|
+
sig { returns(T::Boolean) }
|
109
173
|
def vendored_file?
|
110
174
|
@vendored_file
|
111
175
|
end
|
112
176
|
|
177
|
+
sig { returns(T::Boolean) }
|
113
178
|
def deleted
|
114
179
|
@operation == Operation::DELETE
|
115
180
|
end
|
116
181
|
|
182
|
+
sig { params(deleted: T::Boolean).void }
|
117
183
|
def deleted=(deleted)
|
118
184
|
@operation = deleted ? Operation::DELETE : Operation::UPDATE
|
119
185
|
end
|
120
186
|
|
187
|
+
sig { returns(T::Boolean) }
|
121
188
|
def deleted?
|
122
189
|
deleted
|
123
190
|
end
|
124
191
|
|
192
|
+
sig { returns(T::Boolean) }
|
125
193
|
def binary?
|
126
194
|
content_encoding == ContentEncoding::BASE64
|
127
195
|
end
|
128
196
|
|
197
|
+
sig { returns(String) }
|
129
198
|
def decoded_content
|
130
|
-
return Base64.decode64(content) if binary?
|
199
|
+
return Base64.decode64(T.must(content)) if binary?
|
131
200
|
|
132
|
-
content
|
201
|
+
T.must(content)
|
133
202
|
end
|
134
203
|
|
135
204
|
private
|
136
205
|
|
206
|
+
sig { params(directory: String).returns(String) }
|
137
207
|
def clean_directory(directory)
|
138
208
|
# Directory should always start with a `/`
|
139
209
|
directory.sub(%r{^/*}, "/")
|
@@ -1,23 +1,41 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require "dependabot/experiments"
|
5
5
|
require "dependabot/config/ignore_condition"
|
6
6
|
require "dependabot/logger"
|
7
7
|
|
8
|
+
require "sorbet-runtime"
|
8
9
|
require "wildcard_matcher"
|
9
10
|
require "yaml"
|
10
11
|
|
11
12
|
module Dependabot
|
12
13
|
class DependencyGroup
|
13
|
-
|
14
|
+
extend T::Sig
|
14
15
|
|
16
|
+
sig { returns(String) }
|
17
|
+
attr_reader :name
|
18
|
+
|
19
|
+
sig { returns(T::Hash[String, T.any(String, T::Array[String])]) }
|
20
|
+
attr_reader :rules
|
21
|
+
|
22
|
+
sig { returns(T::Array[Dependabot::Dependency]) }
|
23
|
+
attr_reader :dependencies
|
24
|
+
|
25
|
+
sig do
|
26
|
+
params(
|
27
|
+
name: String,
|
28
|
+
rules: T::Hash[String, T.untyped]
|
29
|
+
)
|
30
|
+
.void
|
31
|
+
end
|
15
32
|
def initialize(name:, rules:)
|
16
33
|
@name = name
|
17
34
|
@rules = rules
|
18
|
-
@dependencies = []
|
35
|
+
@dependencies = T.let([], T::Array[Dependabot::Dependency])
|
19
36
|
end
|
20
37
|
|
38
|
+
sig { params(dependency: Dependabot::Dependency).returns(T::Boolean) }
|
21
39
|
def contains?(dependency)
|
22
40
|
return true if @dependencies.include?(dependency)
|
23
41
|
return false if matches_excluded_pattern?(dependency.name)
|
@@ -25,11 +43,13 @@ module Dependabot
|
|
25
43
|
matches_pattern?(dependency.name) && matches_dependency_type?(dependency)
|
26
44
|
end
|
27
45
|
|
46
|
+
sig { returns(T::Hash[String, String]) }
|
28
47
|
def to_h
|
29
48
|
{ "name" => name }
|
30
49
|
end
|
31
50
|
|
32
51
|
# Provides a debug utility to view the group as it appears in the config file.
|
52
|
+
sig { returns(String) }
|
33
53
|
def to_config_yaml
|
34
54
|
{
|
35
55
|
"groups" => { name => rules }
|
@@ -38,18 +58,21 @@ module Dependabot
|
|
38
58
|
|
39
59
|
private
|
40
60
|
|
61
|
+
sig { params(dependency_name: String).returns(T::Boolean) }
|
41
62
|
def matches_pattern?(dependency_name)
|
42
63
|
return true unless rules.key?("patterns") # If no patterns are defined, we pass this check by default
|
43
64
|
|
44
|
-
rules["patterns"].any? { |rule| WildcardMatcher.match?(rule, dependency_name) }
|
65
|
+
T.unsafe(rules["patterns"]).any? { |rule| WildcardMatcher.match?(rule, dependency_name) }
|
45
66
|
end
|
46
67
|
|
68
|
+
sig { params(dependency_name: String).returns(T::Boolean) }
|
47
69
|
def matches_excluded_pattern?(dependency_name)
|
48
70
|
return false unless rules.key?("exclude-patterns") # If there are no exclusions, fail by default
|
49
71
|
|
50
|
-
rules["exclude-patterns"].any? { |rule| WildcardMatcher.match?(rule, dependency_name) }
|
72
|
+
T.unsafe(rules["exclude-patterns"]).any? { |rule| WildcardMatcher.match?(rule, dependency_name) }
|
51
73
|
end
|
52
74
|
|
75
|
+
sig { params(dependency: Dependabot::Dependency).returns(T::Boolean) }
|
53
76
|
def matches_dependency_type?(dependency)
|
54
77
|
return true unless rules.key?("dependency-type") # If no dependency-type is set, match by default
|
55
78
|
|
@@ -60,6 +83,7 @@ module Dependabot
|
|
60
83
|
end
|
61
84
|
end
|
62
85
|
|
86
|
+
sig { returns(T::Boolean) }
|
63
87
|
def experimental_rules_enabled?
|
64
88
|
Dependabot::Experiments.enabled?(:grouped_updates_experimental_rules)
|
65
89
|
end
|