dependabot-vcpkg 0.359.0 → 0.360.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/vcpkg/file_fetcher.rb +4 -2
- data/lib/dependabot/vcpkg/file_parser.rb +107 -21
- data/lib/dependabot/vcpkg/file_updater.rb +107 -17
- data/lib/dependabot/vcpkg.rb +2 -0
- metadata +4 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 57ac8d719c97356820825e8cfb0fdd08634a55e4fcdd5bb8e23beb6245c5a7f6
|
|
4
|
+
data.tar.gz: 51d2e076ebda6dc107b137513784a016b7828f957133f11964a53e353746e5e0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 07be584a143433a620e2988b9a3fdf52403baa7945e3eae6d51120864c6602e60806240a8339245de9e301dd625dfb6713a27c2b57d19e945ef1719cb642648e
|
|
7
|
+
data.tar.gz: de0465bde2a9ee5c0ba65de36a3024e41e9567e84cacd495bc377095d99029f86f84b4720977478dc9b1ed4c7a3b024791356f2ba702d16014f9653a29b5e681
|
|
@@ -15,12 +15,14 @@ module Dependabot
|
|
|
15
15
|
|
|
16
16
|
sig { override.params(filenames: T::Array[String]).returns(T::Boolean) }
|
|
17
17
|
def self.required_files_in?(filenames)
|
|
18
|
-
filenames.
|
|
18
|
+
filenames.any? do |filename|
|
|
19
|
+
[VCPKG_JSON_FILENAME, VCPKG_CONFIGURATION_JSON_FILENAME].include?(filename)
|
|
20
|
+
end
|
|
19
21
|
end
|
|
20
22
|
|
|
21
23
|
sig { override.returns(String) }
|
|
22
24
|
def self.required_files_message
|
|
23
|
-
"Repo must contain a vcpkg.json file."
|
|
25
|
+
"Repo must contain a vcpkg.json or vcpkg-configuration.json file."
|
|
24
26
|
end
|
|
25
27
|
|
|
26
28
|
sig { override.returns(T::Array[Dependabot::DependencyFile]) }
|
|
@@ -40,9 +40,11 @@ module Dependabot
|
|
|
40
40
|
|
|
41
41
|
sig { override.void }
|
|
42
42
|
def check_required_files
|
|
43
|
-
return if dependency_files.any?
|
|
43
|
+
return if dependency_files.any? do |f|
|
|
44
|
+
[VCPKG_JSON_FILENAME, VCPKG_CONFIGURATION_JSON_FILENAME].include?(f.name)
|
|
45
|
+
end
|
|
44
46
|
|
|
45
|
-
raise Dependabot::DependencyFileNotFound,
|
|
47
|
+
raise Dependabot::DependencyFileNotFound.new(nil, "No vcpkg manifest files found")
|
|
46
48
|
end
|
|
47
49
|
|
|
48
50
|
sig { params(dependency_file: Dependabot::DependencyFile).returns(T::Array[Dependabot::Dependency]) }
|
|
@@ -51,7 +53,7 @@ module Dependabot
|
|
|
51
53
|
|
|
52
54
|
case dependency_file.name
|
|
53
55
|
in VCPKG_JSON_FILENAME then parse_vcpkg_json(dependency_file)
|
|
54
|
-
in VCPKG_CONFIGURATION_JSON_FILENAME then
|
|
56
|
+
in VCPKG_CONFIGURATION_JSON_FILENAME then parse_vcpkg_configuration_json(dependency_file)
|
|
55
57
|
else []
|
|
56
58
|
end
|
|
57
59
|
end
|
|
@@ -64,7 +66,21 @@ module Dependabot
|
|
|
64
66
|
dependencies = []
|
|
65
67
|
|
|
66
68
|
parsed_json["builtin-baseline"]&.then do |baseline|
|
|
67
|
-
dependencies <<
|
|
69
|
+
dependencies << Dependabot::Dependency.new(
|
|
70
|
+
name: VCPKG_DEFAULT_BASELINE_DEPENDENCY_NAME,
|
|
71
|
+
version: baseline,
|
|
72
|
+
package_manager: "vcpkg",
|
|
73
|
+
requirements: [{
|
|
74
|
+
requirement: nil,
|
|
75
|
+
groups: [],
|
|
76
|
+
source: {
|
|
77
|
+
type: "git",
|
|
78
|
+
url: VCPKG_DEFAULT_BASELINE_URL,
|
|
79
|
+
ref: VCPKG_DEFAULT_BASELINE_DEFAULT_BRANCH
|
|
80
|
+
},
|
|
81
|
+
file: dependency_file.name
|
|
82
|
+
}]
|
|
83
|
+
)
|
|
68
84
|
end
|
|
69
85
|
|
|
70
86
|
parsed_json["dependencies"]&.each do |dep|
|
|
@@ -78,23 +94,29 @@ module Dependabot
|
|
|
78
94
|
raise Dependabot::DependencyFileNotParseable, T.must(dependency_files.first).path
|
|
79
95
|
end
|
|
80
96
|
|
|
81
|
-
sig { params(
|
|
82
|
-
def
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
97
|
+
sig { params(dependency_file: Dependabot::DependencyFile).returns(T::Array[Dependabot::Dependency]) }
|
|
98
|
+
def parse_vcpkg_configuration_json(dependency_file)
|
|
99
|
+
contents = T.must(dependency_file.content)
|
|
100
|
+
parsed_json = JSON.parse(contents)
|
|
101
|
+
|
|
102
|
+
dependencies = []
|
|
103
|
+
|
|
104
|
+
# Parse default-registry if it exists
|
|
105
|
+
parsed_json["default-registry"]&.then do |registry|
|
|
106
|
+
dependency = parse_registry_dependency(registry:, dependency_file:, is_default: true)
|
|
107
|
+
dependencies << dependency if dependency
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Parse registries array if it exists
|
|
111
|
+
parsed_json["registries"]&.each do |registry|
|
|
112
|
+
dependency = parse_registry_dependency(registry:, dependency_file:, is_default: false)
|
|
113
|
+
dependencies << dependency if dependency
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
dependencies.compact
|
|
117
|
+
rescue JSON::ParserError
|
|
118
|
+
Dependabot.logger.warn("Failed to parse #{dependency_file.name}: #{dependency_file.content}")
|
|
119
|
+
raise Dependabot::DependencyFileNotParseable, dependency_file.path
|
|
98
120
|
end
|
|
99
121
|
|
|
100
122
|
sig do
|
|
@@ -141,6 +163,70 @@ module Dependabot
|
|
|
141
163
|
end
|
|
142
164
|
end
|
|
143
165
|
|
|
166
|
+
sig do
|
|
167
|
+
params(
|
|
168
|
+
registry: T::Hash[String, T.untyped],
|
|
169
|
+
dependency_file: Dependabot::DependencyFile,
|
|
170
|
+
is_default: T::Boolean
|
|
171
|
+
)
|
|
172
|
+
.returns(T.nilable(Dependabot::Dependency))
|
|
173
|
+
end
|
|
174
|
+
def parse_registry_dependency(registry:, dependency_file:, is_default: false) # rubocop:disable Metrics/MethodLength
|
|
175
|
+
kind = registry["kind"]
|
|
176
|
+
baseline = registry["baseline"]
|
|
177
|
+
|
|
178
|
+
# Only track git and builtin registries
|
|
179
|
+
return nil unless VCPKG_SUPPORTED_REGISTRY_TYPES.include?(kind)
|
|
180
|
+
return nil unless baseline.is_a?(String)
|
|
181
|
+
|
|
182
|
+
case kind
|
|
183
|
+
when "git"
|
|
184
|
+
repository = registry["repository"]
|
|
185
|
+
return nil unless repository.is_a?(String)
|
|
186
|
+
|
|
187
|
+
reference = registry["reference"] || "HEAD"
|
|
188
|
+
|
|
189
|
+
Dependabot::Dependency.new(
|
|
190
|
+
name: repository,
|
|
191
|
+
version: baseline,
|
|
192
|
+
package_manager: "vcpkg",
|
|
193
|
+
requirements: [{
|
|
194
|
+
requirement: nil,
|
|
195
|
+
groups: [],
|
|
196
|
+
source: {
|
|
197
|
+
type: "git",
|
|
198
|
+
url: repository,
|
|
199
|
+
ref: reference
|
|
200
|
+
},
|
|
201
|
+
file: dependency_file.name
|
|
202
|
+
}],
|
|
203
|
+
metadata: {
|
|
204
|
+
default: is_default
|
|
205
|
+
}
|
|
206
|
+
)
|
|
207
|
+
when "builtin"
|
|
208
|
+
Dependabot::Dependency.new(
|
|
209
|
+
name: VCPKG_DEFAULT_BASELINE_DEPENDENCY_NAME,
|
|
210
|
+
version: baseline,
|
|
211
|
+
package_manager: "vcpkg",
|
|
212
|
+
requirements: [{
|
|
213
|
+
requirement: nil,
|
|
214
|
+
groups: [],
|
|
215
|
+
source: {
|
|
216
|
+
type: "git",
|
|
217
|
+
url: VCPKG_DEFAULT_BASELINE_URL,
|
|
218
|
+
ref: VCPKG_DEFAULT_BASELINE_DEFAULT_BRANCH
|
|
219
|
+
},
|
|
220
|
+
file: dependency_file.name
|
|
221
|
+
}],
|
|
222
|
+
metadata: {
|
|
223
|
+
builtin: true,
|
|
224
|
+
default: is_default
|
|
225
|
+
}
|
|
226
|
+
)
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
144
230
|
sig { params(version_string: String).returns([String, T.nilable(String)]) }
|
|
145
231
|
def parse_version_with_port(version_string)
|
|
146
232
|
if version_string.include?("#")
|
|
@@ -15,22 +15,36 @@ module Dependabot
|
|
|
15
15
|
|
|
16
16
|
sig { override.returns(T::Array[Dependabot::DependencyFile]) }
|
|
17
17
|
def updated_dependency_files
|
|
18
|
+
updated_files = []
|
|
19
|
+
|
|
20
|
+
# Handle vcpkg.json
|
|
18
21
|
vcpkg_json_file = get_original_file(VCPKG_JSON_FILENAME)
|
|
19
|
-
|
|
22
|
+
if vcpkg_json_file&.then { |file| file_changed?(file) }
|
|
23
|
+
updated_files << updated_file(
|
|
24
|
+
file: vcpkg_json_file,
|
|
25
|
+
content: updated_vcpkg_json_content(vcpkg_json_file)
|
|
26
|
+
)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Handle vcpkg-configuration.json
|
|
30
|
+
vcpkg_config_file = get_original_file(VCPKG_CONFIGURATION_JSON_FILENAME)
|
|
31
|
+
if vcpkg_config_file&.then { |file| file_changed?(file) }
|
|
32
|
+
updated_files << updated_file(
|
|
33
|
+
file: vcpkg_config_file,
|
|
34
|
+
content: updated_vcpkg_configuration_json_content(vcpkg_config_file)
|
|
35
|
+
)
|
|
36
|
+
end
|
|
20
37
|
|
|
21
|
-
|
|
22
|
-
file: vcpkg_json_file,
|
|
23
|
-
content: updated_vcpkg_json_content(vcpkg_json_file)
|
|
24
|
-
)]
|
|
38
|
+
updated_files
|
|
25
39
|
end
|
|
26
40
|
|
|
27
41
|
private
|
|
28
42
|
|
|
29
43
|
sig { override.void }
|
|
30
44
|
def check_required_files
|
|
31
|
-
return if get_original_file(VCPKG_JSON_FILENAME)
|
|
45
|
+
return if get_original_file(VCPKG_JSON_FILENAME) || get_original_file(VCPKG_CONFIGURATION_JSON_FILENAME)
|
|
32
46
|
|
|
33
|
-
raise Dependabot::DependencyFileNotFound,
|
|
47
|
+
raise Dependabot::DependencyFileNotFound.new(nil, "No vcpkg manifest files found")
|
|
34
48
|
end
|
|
35
49
|
|
|
36
50
|
sig { params(file: Dependabot::DependencyFile).returns(String) }
|
|
@@ -48,6 +62,21 @@ module Dependabot
|
|
|
48
62
|
raise Dependabot::DependencyFileNotParseable, file.path
|
|
49
63
|
end
|
|
50
64
|
|
|
65
|
+
sig { params(file: Dependabot::DependencyFile).returns(String) }
|
|
66
|
+
def updated_vcpkg_configuration_json_content(file)
|
|
67
|
+
content = T.must(file.content)
|
|
68
|
+
parsed_content = JSON.parse(content)
|
|
69
|
+
|
|
70
|
+
dependencies
|
|
71
|
+
.filter_map { |dep| [dep, dep.requirements.find { |r| r[:file] == file.name }] }
|
|
72
|
+
.select { |_, requirement| requirement }
|
|
73
|
+
.each { |dependency, _| update_registry_dependency_in_content(parsed_content, dependency, file.name) }
|
|
74
|
+
|
|
75
|
+
JSON.pretty_generate(parsed_content)
|
|
76
|
+
rescue JSON::ParserError
|
|
77
|
+
raise Dependabot::DependencyFileNotParseable, file.path
|
|
78
|
+
end
|
|
79
|
+
|
|
51
80
|
sig { params(content: T::Hash[String, T.untyped], dependency: Dependabot::Dependency, filename: String).void }
|
|
52
81
|
def update_dependency_in_content(content, dependency, filename)
|
|
53
82
|
case dependency.name
|
|
@@ -60,6 +89,60 @@ module Dependabot
|
|
|
60
89
|
|
|
61
90
|
sig { params(content: T::Hash[String, T.untyped], dependency: Dependabot::Dependency, filename: String).void }
|
|
62
91
|
def update_baseline_in_content(content, dependency, filename)
|
|
92
|
+
update_baseline_field(content, dependency, filename, "builtin-baseline")
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
sig { params(content: T::Hash[String, T.untyped], dependency: Dependabot::Dependency).void }
|
|
96
|
+
def update_port_dependency_in_content(content, dependency)
|
|
97
|
+
# Update the dependencies array
|
|
98
|
+
dependencies_array = content["dependencies"]
|
|
99
|
+
return unless dependencies_array.is_a?(Array)
|
|
100
|
+
|
|
101
|
+
# Find and update the specific dependency using more functional approach
|
|
102
|
+
target_dep = dependencies_array.find { _1.is_a?(Hash) && _1["name"] == dependency.name }
|
|
103
|
+
target_dep&.[]=("version>=", dependency.version)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
sig { params(content: T::Hash[String, T.untyped], dependency: Dependabot::Dependency, filename: String).void }
|
|
107
|
+
def update_registry_dependency_in_content(content, dependency, filename)
|
|
108
|
+
# Check if this is a default registry update based on metadata
|
|
109
|
+
if dependency.metadata[:default]
|
|
110
|
+
update_default_registry(content, dependency, filename)
|
|
111
|
+
else
|
|
112
|
+
# For registries array, find by repository URL
|
|
113
|
+
update_registry_by_name(content, dependency, filename)
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
sig { params(content: T::Hash[String, T.untyped], dependency: Dependabot::Dependency, filename: String).void }
|
|
118
|
+
def update_default_registry(content, dependency, filename)
|
|
119
|
+
default_registry = content["default-registry"]
|
|
120
|
+
return unless default_registry.is_a?(Hash)
|
|
121
|
+
|
|
122
|
+
update_baseline_field(default_registry, dependency, filename, "baseline")
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
sig { params(content: T::Hash[String, T.untyped], dependency: Dependabot::Dependency, filename: String).void }
|
|
126
|
+
def update_registry_by_name(content, dependency, filename)
|
|
127
|
+
registries = content["registries"]
|
|
128
|
+
return unless registries.is_a?(Array)
|
|
129
|
+
|
|
130
|
+
# Find registry based on dependency characteristics
|
|
131
|
+
registry = find_target_registry(registries, dependency)
|
|
132
|
+
return unless registry
|
|
133
|
+
|
|
134
|
+
update_baseline_field(registry, dependency, filename, "baseline")
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
sig do
|
|
138
|
+
params(
|
|
139
|
+
target: T::Hash[String, T.untyped],
|
|
140
|
+
dependency: Dependabot::Dependency,
|
|
141
|
+
filename: String,
|
|
142
|
+
field_name: String
|
|
143
|
+
).void
|
|
144
|
+
end
|
|
145
|
+
def update_baseline_field(target, dependency, filename, field_name)
|
|
63
146
|
# Find the requirement for this specific file
|
|
64
147
|
requirement = dependency.requirements.find { |r| r[:file] == filename }
|
|
65
148
|
return unless requirement
|
|
@@ -67,21 +150,28 @@ module Dependabot
|
|
|
67
150
|
# Extract and validate the new baseline
|
|
68
151
|
case requirement[:source]
|
|
69
152
|
in { ref: String => new_baseline }
|
|
70
|
-
|
|
153
|
+
target[field_name] = new_baseline
|
|
71
154
|
else
|
|
72
155
|
# Skip if source doesn't have the expected structure
|
|
73
156
|
end
|
|
74
157
|
end
|
|
75
158
|
|
|
76
|
-
sig
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
159
|
+
sig do
|
|
160
|
+
params(
|
|
161
|
+
registries: T::Array[T.untyped],
|
|
162
|
+
dependency: Dependabot::Dependency
|
|
163
|
+
)
|
|
164
|
+
.returns(T.nilable(T::Hash[String, T.untyped]))
|
|
165
|
+
end
|
|
166
|
+
def find_target_registry(registries, dependency)
|
|
167
|
+
if dependency.metadata[:builtin]
|
|
168
|
+
# For builtin registries, find by kind
|
|
169
|
+
registries.find { |r| r.is_a?(Hash) && r["kind"] == "builtin" }
|
|
170
|
+
else
|
|
171
|
+
# For git registries, find by repository URL
|
|
172
|
+
repository_url = dependency.requirements.first&.dig(:source, :url)
|
|
173
|
+
registries.find { |r| r.is_a?(Hash) && r["repository"] == repository_url }
|
|
174
|
+
end
|
|
85
175
|
end
|
|
86
176
|
end
|
|
87
177
|
end
|
data/lib/dependabot/vcpkg.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dependabot-vcpkg
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.360.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Dependabot
|
|
@@ -15,14 +15,14 @@ dependencies:
|
|
|
15
15
|
requirements:
|
|
16
16
|
- - '='
|
|
17
17
|
- !ruby/object:Gem::Version
|
|
18
|
-
version: 0.
|
|
18
|
+
version: 0.360.0
|
|
19
19
|
type: :runtime
|
|
20
20
|
prerelease: false
|
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
22
22
|
requirements:
|
|
23
23
|
- - '='
|
|
24
24
|
- !ruby/object:Gem::Version
|
|
25
|
-
version: 0.
|
|
25
|
+
version: 0.360.0
|
|
26
26
|
- !ruby/object:Gem::Dependency
|
|
27
27
|
name: debug
|
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -256,7 +256,7 @@ licenses:
|
|
|
256
256
|
- MIT
|
|
257
257
|
metadata:
|
|
258
258
|
bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
|
|
259
|
-
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.
|
|
259
|
+
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.360.0
|
|
260
260
|
rdoc_options: []
|
|
261
261
|
require_paths:
|
|
262
262
|
- lib
|