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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a5bc4fadeb9304062a219b58603032397a0584a20602d3c30d25a2f1e5328b7f
4
- data.tar.gz: 32b77e4b44277cc4b732ac1b4a4fcb42ed1fd76353e3814c7143866e67ec54dd
3
+ metadata.gz: 57ac8d719c97356820825e8cfb0fdd08634a55e4fcdd5bb8e23beb6245c5a7f6
4
+ data.tar.gz: 51d2e076ebda6dc107b137513784a016b7828f957133f11964a53e353746e5e0
5
5
  SHA512:
6
- metadata.gz: cc23968f8183bae3b790486a323f66412268a4704794419dde9e5642cc7c7b2a3d92f6b130e5d5f538f09125c97133634e70f30dfaf268f88d955519d8ff28f3
7
- data.tar.gz: e96052d19ae2cb0a934cf914f202ca3c134a480665a59531d0d0561d0f77f406a5fa36e888029677479ae564d2a09cad60726887c211713f305d9e3040f9b59e
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.include?(VCPKG_JSON_FILENAME)
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? { |f| f.name == VCPKG_JSON_FILENAME }
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, VCPKG_JSON_FILENAME
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 [] # TODO
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 << parse_baseline_dependency(baseline:, dependency_file:)
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(baseline: String, dependency_file: Dependabot::DependencyFile).returns(Dependabot::Dependency) }
82
- def parse_baseline_dependency(baseline:, dependency_file:)
83
- Dependabot::Dependency.new(
84
- name: VCPKG_DEFAULT_BASELINE_DEPENDENCY_NAME,
85
- version: baseline,
86
- package_manager: "vcpkg",
87
- requirements: [{
88
- requirement: nil,
89
- groups: [],
90
- source: {
91
- type: "git",
92
- url: VCPKG_DEFAULT_BASELINE_URL,
93
- ref: VCPKG_DEFAULT_BASELINE_DEFAULT_BRANCH
94
- },
95
- file: dependency_file.name
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
- return [] unless vcpkg_json_file&.then { |file| file_changed?(file) }
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
- [updated_file(
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, VCPKG_JSON_FILENAME
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
- content["builtin-baseline"] = new_baseline
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 { params(content: T::Hash[String, T.untyped], dependency: Dependabot::Dependency).void }
77
- def update_port_dependency_in_content(content, dependency)
78
- # Update the dependencies array
79
- dependencies_array = content["dependencies"]
80
- return unless dependencies_array.is_a?(Array)
81
-
82
- # Find and update the specific dependency using more functional approach
83
- target_dep = dependencies_array.find { _1.is_a?(Hash) && _1["name"] == dependency.name }
84
- target_dep&.[]=("version>=", dependency.version)
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
@@ -39,5 +39,7 @@ module Dependabot
39
39
  VCPKG_DEFAULT_BASELINE_URL = "https://github.com/microsoft/vcpkg.git"
40
40
 
41
41
  VCPKG_DEFAULT_BASELINE_DEFAULT_BRANCH = "master"
42
+
43
+ VCPKG_SUPPORTED_REGISTRY_TYPES = %w(git builtin).freeze
42
44
  end
43
45
  end
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.359.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.359.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.359.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.359.0
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