dependabot-nuget 0.289.0 → 0.291.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/lib/NuGetUpdater/Directory.Packages.props +1 -1
  3. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/AnalyzeCommand.cs +7 -3
  4. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +1 -1
  5. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Analyze.cs +26 -1
  6. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Discover.cs +2 -1
  7. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Run.cs +0 -6
  8. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Update.cs +1 -1
  9. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +6 -1
  10. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/CompatabilityChecker.cs +24 -9
  11. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/DependencyFinder.cs +2 -0
  12. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/NuGetContext.cs +0 -13
  13. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementConverter.cs +17 -0
  14. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +44 -5
  15. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscovery.cs +2 -2
  16. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/ProjectDiscoveryResult.cs +2 -0
  17. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/SdkProjectDiscovery.cs +19 -11
  18. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ErrorType.cs +1 -0
  19. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +3 -0
  20. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Advisory.cs +13 -0
  21. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/AllowedUpdate.cs +18 -1
  22. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/CommitOptions.cs +8 -0
  23. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Condition.cs +19 -0
  24. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/DependencyGroup.cs +8 -0
  25. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/GroupPullRequest.cs +9 -0
  26. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Job.cs +13 -10
  27. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/PullRequest.cs +11 -0
  28. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/RequirementsUpdateStrategy.cs +15 -0
  29. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +24 -4
  30. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/VersionConverter.cs +19 -0
  31. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectManager.cs +2 -1
  32. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/LockFileUpdater.cs +3 -2
  33. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +43 -18
  34. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +13 -12
  35. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +1 -1
  36. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/JsonHelper.cs +2 -0
  37. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +40 -14
  38. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/NuGetHelper.cs +2 -2
  39. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProcessExtensions.cs +45 -7
  40. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProjectHelper.cs +2 -2
  41. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/AnalyzeWorkerTestBase.cs +5 -2
  42. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.DotNetToolsJson.cs +45 -1
  43. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.GlobalJson.cs +35 -1
  44. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Project.cs +0 -4
  45. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +41 -0
  46. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/ExpectedDiscoveryResults.cs +1 -0
  47. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/SdkProjectDiscoveryTests.cs +1 -1
  48. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/MockNuGetPackage.cs +2 -1
  49. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/MiscellaneousTests.cs +85 -0
  50. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +7 -31
  51. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +340 -0
  52. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TemporaryDirectory.cs +18 -7
  53. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/PackagesConfigUpdaterTests.cs +24 -0
  54. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +0 -12
  55. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.DotNetTools.cs +84 -0
  56. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.GlobalJson.cs +66 -0
  57. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs +55 -0
  58. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +0 -6
  59. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +785 -755
  60. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/PathHelperTests.cs +2 -2
  61. data/lib/dependabot/nuget/analysis/analysis_json_reader.rb +1 -1
  62. data/lib/dependabot/nuget/analysis/dependency_analysis.rb +3 -3
  63. data/lib/dependabot/nuget/discovery/dependency_details.rb +10 -3
  64. data/lib/dependabot/nuget/discovery/dependency_file_discovery.rb +8 -12
  65. data/lib/dependabot/nuget/discovery/discovery_json_reader.rb +214 -29
  66. data/lib/dependabot/nuget/discovery/project_discovery.rb +41 -8
  67. data/lib/dependabot/nuget/discovery/workspace_discovery.rb +14 -19
  68. data/lib/dependabot/nuget/file_fetcher.rb +3 -3
  69. data/lib/dependabot/nuget/file_parser.rb +92 -3
  70. data/lib/dependabot/nuget/file_updater.rb +13 -13
  71. data/lib/dependabot/nuget/language.rb +82 -0
  72. data/lib/dependabot/nuget/native_helpers.rb +37 -5
  73. data/lib/dependabot/nuget/package_manager.rb +51 -0
  74. data/lib/dependabot/nuget/update_checker/requirements_updater.rb +23 -27
  75. data/lib/dependabot/nuget/update_checker.rb +116 -190
  76. metadata +20 -29
  77. data/lib/dependabot/nuget/discovery/directory_packages_props_discovery.rb +0 -43
  78. data/lib/dependabot/nuget/http_response_helpers.rb +0 -19
  79. data/lib/dependabot/nuget/native_discovery/native_dependency_details.rb +0 -102
  80. data/lib/dependabot/nuget/native_discovery/native_dependency_file_discovery.rb +0 -122
  81. data/lib/dependabot/nuget/native_discovery/native_discovery_json_reader.rb +0 -277
  82. data/lib/dependabot/nuget/native_discovery/native_evaluation_details.rb +0 -63
  83. data/lib/dependabot/nuget/native_discovery/native_project_discovery.rb +0 -104
  84. data/lib/dependabot/nuget/native_discovery/native_property_details.rb +0 -43
  85. data/lib/dependabot/nuget/native_discovery/native_workspace_discovery.rb +0 -61
  86. data/lib/dependabot/nuget/native_update_checker/native_requirements_updater.rb +0 -105
  87. data/lib/dependabot/nuget/native_update_checker/native_update_checker.rb +0 -214
  88. data/lib/dependabot/nuget/nuget_client.rb +0 -223
  89. data/lib/dependabot/nuget/update_checker/compatibility_checker.rb +0 -116
  90. data/lib/dependabot/nuget/update_checker/dependency_finder.rb +0 -297
  91. data/lib/dependabot/nuget/update_checker/nupkg_fetcher.rb +0 -221
  92. data/lib/dependabot/nuget/update_checker/nuspec_fetcher.rb +0 -110
  93. data/lib/dependabot/nuget/update_checker/property_updater.rb +0 -196
  94. data/lib/dependabot/nuget/update_checker/repository_finder.rb +0 -466
  95. data/lib/dependabot/nuget/update_checker/tfm_comparer.rb +0 -34
  96. data/lib/dependabot/nuget/update_checker/tfm_finder.rb +0 -30
  97. data/lib/dependabot/nuget/update_checker/version_finder.rb +0 -449
@@ -1,7 +1,8 @@
1
- # typed: strict
1
+ # typed: strong
2
2
  # frozen_string_literal: true
3
3
 
4
- require "dependabot/nuget/file_parser"
4
+ require "dependabot/nuget/analysis/analysis_json_reader"
5
+ require "dependabot/nuget/discovery/discovery_json_reader"
5
6
  require "dependabot/update_checkers"
6
7
  require "dependabot/update_checkers/base"
7
8
  require "sorbet-runtime"
@@ -11,38 +12,22 @@ module Dependabot
11
12
  class UpdateChecker < Dependabot::UpdateCheckers::Base
12
13
  extend T::Sig
13
14
 
14
- require_relative "update_checker/version_finder"
15
- require_relative "update_checker/property_updater"
16
15
  require_relative "update_checker/requirements_updater"
17
- require_relative "update_checker/dependency_finder"
18
-
19
- require_relative "native_update_checker/native_update_checker"
20
-
21
- PROPERTY_REGEX = /\$\((?<property>.*?)\)/
22
-
23
- sig { returns(T::Boolean) }
24
- def self.native_analysis_enabled?
25
- Dependabot::Experiments.enabled?(:nuget_native_analysis)
26
- end
27
16
 
28
17
  sig { override.returns(T.nilable(String)) }
29
18
  def latest_version
30
- return native_update_checker.latest_version if UpdateChecker.native_analysis_enabled?
31
-
32
19
  # No need to find latest version for transitive dependencies unless they have a vulnerability.
33
20
  return dependency.version if !dependency.top_level? && !vulnerable?
34
21
 
35
22
  # if no update sources have the requisite package, then we can only assume that the current version is correct
36
23
  @latest_version = T.let(
37
- latest_version_details&.fetch(:version)&.to_s || dependency.version,
24
+ update_analysis.dependency_analysis.updated_version,
38
25
  T.nilable(String)
39
26
  )
40
27
  end
41
28
 
42
29
  sig { override.returns(T.nilable(T.any(String, Gem::Version))) }
43
30
  def latest_resolvable_version
44
- return native_update_checker.latest_resolvable_version if UpdateChecker.native_analysis_enabled?
45
-
46
31
  # We always want a full unlock since any package update could update peer dependencies as well.
47
32
  # To force a full unlock instead of an own unlock, we return nil.
48
33
  nil
@@ -50,232 +35,173 @@ module Dependabot
50
35
 
51
36
  sig { override.returns(Dependabot::Nuget::Version) }
52
37
  def lowest_security_fix_version
53
- return native_update_checker.lowest_security_fix_version if UpdateChecker.native_analysis_enabled?
54
-
55
- lowest_security_fix_version_details&.fetch(:version)
38
+ update_analysis.dependency_analysis.numeric_updated_version
56
39
  end
57
40
 
58
41
  sig { override.returns(T.nilable(Dependabot::Nuget::Version)) }
59
42
  def lowest_resolvable_security_fix_version
60
43
  return nil if version_comes_from_multi_dependency_property?
61
44
 
62
- lowest_security_fix_version
45
+ update_analysis.dependency_analysis.numeric_updated_version
63
46
  end
64
47
 
65
48
  sig { override.returns(NilClass) }
66
49
  def latest_resolvable_version_with_no_unlock
67
- return native_update_checker.latest_resolvable_version_with_no_unlock if UpdateChecker.native_analysis_enabled?
68
-
69
50
  # Irrelevant, since Nuget has a single dependency file
70
51
  nil
71
52
  end
72
53
 
73
54
  sig { override.returns(T::Array[T::Hash[Symbol, T.untyped]]) }
74
55
  def updated_requirements
75
- return native_update_checker.updated_requirements if UpdateChecker.native_analysis_enabled?
76
-
56
+ dep_details = updated_dependency_details.find { |d| d.name.casecmp?(dependency.name) }
77
57
  RequirementsUpdater.new(
78
58
  requirements: dependency.requirements,
79
- latest_version: preferred_resolvable_version_details&.fetch(:version, nil)&.to_s,
80
- source_details: preferred_resolvable_version_details&.slice(:nuspec_url, :repo_url, :source_url)
59
+ dependency_details: dep_details
81
60
  ).updated_requirements
82
61
  end
83
62
 
84
63
  sig { returns(T::Boolean) }
85
64
  def up_to_date?
86
- return native_update_checker.up_to_date? if UpdateChecker.native_analysis_enabled?
87
-
88
- # No need to update transitive dependencies unless they have a vulnerability.
89
- return true if !dependency.top_level? && !vulnerable?
90
-
91
- # If any requirements have an uninterpolated property in them then
92
- # that property couldn't be found, and we assume that the dependency
93
- # is up-to-date
94
- return true unless requirements_unlocked_or_can_be?
95
-
96
- super
65
+ !update_analysis.dependency_analysis.can_update
97
66
  end
98
67
 
99
68
  sig { returns(T::Boolean) }
100
69
  def requirements_unlocked_or_can_be?
101
- # If any requirements have an uninterpolated property in them then
102
- # that property couldn't be found, and the requirement therefore
103
- # cannot be unlocked (since we can't update that property)
104
- dependency.requirements.none? do |req|
105
- req.fetch(:requirement)&.match?(PROPERTY_REGEX)
106
- end
70
+ update_analysis.dependency_analysis.can_update
107
71
  end
108
72
 
109
73
  private
110
74
 
111
- sig { returns(Dependabot::Nuget::NativeUpdateChecker) }
112
- def native_update_checker
113
- @native_update_checker ||=
114
- T.let(
115
- Dependabot::Nuget::NativeUpdateChecker.new(
116
- dependency: dependency,
117
- dependency_files: dependency_files,
118
- credentials: credentials,
119
- repo_contents_path: repo_contents_path,
120
- ignored_versions: ignored_versions,
121
- raise_on_ignored: raise_on_ignored,
122
- security_advisories: security_advisories,
123
- requirements_update_strategy: requirements_update_strategy,
124
- dependency_group: dependency_group,
125
- options: options
126
- ),
127
- T.nilable(Dependabot::Nuget::NativeUpdateChecker)
128
- )
75
+ sig { returns(String) }
76
+ def job_file_path
77
+ ENV.fetch("DEPENDABOT_JOB_PATH")
129
78
  end
130
79
 
131
- sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
132
- def preferred_resolvable_version_details
133
- # If this dependency is vulnerable, prefer trying to update to the
134
- # lowest_resolvable_security_fix_version. Otherwise update all the way
135
- # to the latest_resolvable_version.
136
- return lowest_security_fix_version_details if vulnerable?
137
-
138
- latest_version_details
80
+ sig { returns(AnalysisJsonReader) }
81
+ def update_analysis
82
+ @update_analysis ||= T.let(request_analysis, T.nilable(AnalysisJsonReader))
139
83
  end
140
84
 
141
- sig { override.returns(T::Boolean) }
142
- def latest_version_resolvable_with_full_unlock?
143
- if UpdateChecker.native_analysis_enabled?
144
- return native_update_checker.public_latest_version_resolvable_with_full_unlock?
145
- end
146
-
147
- # We always want a full unlock since any package update could update peer dependencies as well.
148
- return true unless version_comes_from_multi_dependency_property?
149
-
150
- property_updater.update_possible?
85
+ sig { returns(String) }
86
+ def dependency_file_path
87
+ d = File.join(Dir.tmpdir, "dependency")
88
+ FileUtils.mkdir_p(d)
89
+ File.join(d, "#{dependency.name}.json")
151
90
  end
152
91
 
153
- sig { override.returns(T::Array[Dependabot::Dependency]) }
154
- def updated_dependencies_after_full_unlock
155
- if UpdateChecker.native_analysis_enabled?
156
- return native_update_checker.public_updated_dependencies_after_full_unlock
92
+ sig { returns(T::Array[String]) }
93
+ def dependency_file_paths
94
+ dependency_files.map do |file|
95
+ DiscoveryJsonReader.dependency_file_path(
96
+ repo_contents_path: T.must(repo_contents_path),
97
+ dependency_file: file
98
+ )
157
99
  end
100
+ end
158
101
 
159
- return property_updater.updated_dependencies if version_comes_from_multi_dependency_property?
160
-
161
- puts "Finding updated dependencies for #{dependency.name}."
162
-
163
- updated_dependency = Dependency.new(
164
- name: dependency.name,
165
- version: latest_version,
166
- requirements: updated_requirements,
167
- previous_version: dependency.version,
168
- previous_requirements: dependency.requirements,
169
- package_manager: dependency.package_manager
102
+ sig { returns(AnalysisJsonReader) }
103
+ def request_analysis
104
+ discovery_file_path = DiscoveryJsonReader.get_discovery_json_path_for_dependency_file_paths(
105
+ dependency_file_paths
170
106
  )
171
- updated_dependencies = [updated_dependency]
172
- updated_dependencies += DependencyFinder.new(
173
- dependency: updated_dependency,
174
- dependency_files: dependency_files,
175
- ignored_versions: ignored_versions,
176
- credentials: credentials,
177
- repo_contents_path: @repo_contents_path
178
- ).updated_peer_dependencies
179
- updated_dependencies
180
- end
107
+ analysis_folder_path = AnalysisJsonReader.temp_directory
108
+
109
+ write_dependency_info
110
+
111
+ NativeHelpers.run_nuget_analyze_tool(job_path: job_file_path,
112
+ repo_root: T.must(repo_contents_path),
113
+ discovery_file_path: discovery_file_path,
114
+ dependency_file_path: dependency_file_path,
115
+ analysis_folder_path: analysis_folder_path,
116
+ credentials: credentials)
117
+
118
+ analysis_json = AnalysisJsonReader.analysis_json(dependency_name: dependency.name)
119
+
120
+ AnalysisJsonReader.new(analysis_json: T.must(analysis_json))
121
+ end
122
+
123
+ sig { void }
124
+ def write_dependency_info
125
+ dependency_info = {
126
+ Name: dependency.name,
127
+ Version: dependency.version.to_s,
128
+ IsVulnerable: vulnerable?,
129
+ IgnoredVersions: ignored_versions,
130
+ Vulnerabilities: security_advisories.map do |vulnerability|
131
+ {
132
+ DependencyName: vulnerability.dependency_name,
133
+ PackageManager: vulnerability.package_manager,
134
+ VulnerableVersions: vulnerability.vulnerable_versions.map(&:to_s),
135
+ SafeVersions: vulnerability.safe_versions.map(&:to_s)
136
+ }
137
+ end
138
+ }.to_json
139
+ dependency_directory = File.dirname(dependency_file_path)
181
140
 
182
- sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
183
- def preferred_version_details
184
- return lowest_security_fix_version_details if vulnerable?
141
+ begin
142
+ Dir.mkdir(dependency_directory)
143
+ rescue StandardError
144
+ nil?
145
+ end
185
146
 
186
- latest_version_details
147
+ Dependabot.logger.info("Writing dependency info: #{dependency_info}")
148
+ File.write(dependency_file_path, dependency_info)
187
149
  end
188
150
 
189
- sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
190
- def latest_version_details
191
- @latest_version_details ||=
192
- T.let(
193
- version_finder.latest_version_details,
194
- T.nilable(T::Hash[Symbol, T.untyped])
195
- )
151
+ sig { returns(Dependabot::FileParsers::Base::DependencySet) }
152
+ def discovered_dependencies
153
+ DiscoveryJsonReader.load_discovery_for_dependency_file_paths(dependency_file_paths).dependency_set
196
154
  end
197
155
 
198
- sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
199
- def lowest_security_fix_version_details
200
- @lowest_security_fix_version_details ||=
201
- T.let(
202
- version_finder.lowest_security_fix_version_details,
203
- T.nilable(T::Hash[Symbol, T.untyped])
204
- )
156
+ sig { override.returns(T::Boolean) }
157
+ def latest_version_resolvable_with_full_unlock?
158
+ # We always want a full unlock since any package update could update peer dependencies as well.
159
+ true
205
160
  end
206
161
 
207
- sig { returns(Dependabot::Nuget::UpdateChecker::VersionFinder) }
208
- def version_finder
209
- @version_finder ||=
210
- T.let(
211
- VersionFinder.new(
212
- dependency: dependency,
213
- dependency_files: dependency_files,
214
- credentials: credentials,
215
- ignored_versions: ignored_versions,
216
- raise_on_ignored: @raise_on_ignored,
217
- security_advisories: security_advisories,
218
- repo_contents_path: @repo_contents_path
219
- ),
220
- T.nilable(Dependabot::Nuget::UpdateChecker::VersionFinder)
221
- )
222
- end
162
+ sig { override.returns(T::Array[Dependabot::Dependency]) }
163
+ def updated_dependencies_after_full_unlock
164
+ dependencies = discovered_dependencies.dependencies
165
+ updated_dependency_details.filter_map do |dependency_details|
166
+ dep = dependencies.find { |d| d.name.casecmp(dependency_details.name)&.zero? }
167
+ next unless dep
168
+
169
+ metadata = {}
170
+ # For peer dependencies, instruct updater to not directly update this dependency
171
+ metadata = { information_only: true } unless dependency.name.casecmp(dependency_details.name)&.zero?
172
+
173
+ # rebuild the new requirements with the updated dependency details
174
+ updated_reqs = dep.requirements.map do |r|
175
+ r = r.clone
176
+ r[:requirement] = dependency_details.version
177
+ r[:source] = {
178
+ type: "nuget_repo",
179
+ source_url: dependency_details.info_url
180
+ }
181
+ r
182
+ end
223
183
 
224
- sig { returns(Dependabot::Nuget::UpdateChecker::PropertyUpdater) }
225
- def property_updater
226
- @property_updater ||=
227
- T.let(
228
- PropertyUpdater.new(
229
- dependency: dependency,
230
- dependency_files: dependency_files,
231
- target_version_details: latest_version_details,
232
- credentials: credentials,
233
- ignored_versions: ignored_versions,
234
- raise_on_ignored: @raise_on_ignored,
235
- repo_contents_path: @repo_contents_path
236
- ),
237
- T.nilable(Dependabot::Nuget::UpdateChecker::PropertyUpdater)
184
+ Dependency.new(
185
+ name: dep.name,
186
+ version: dependency_details.version,
187
+ requirements: updated_reqs,
188
+ previous_version: dep.version,
189
+ previous_requirements: dep.requirements,
190
+ package_manager: dep.package_manager,
191
+ metadata: metadata
238
192
  )
239
- end
240
-
241
- sig { returns(T::Boolean) }
242
- def version_comes_from_multi_dependency_property?
243
- declarations_using_a_property.any? do |requirement|
244
- property_name = requirement.fetch(:metadata).fetch(:property_name)
245
-
246
- all_property_based_dependencies.any? do |dep|
247
- next false if dep.name == dependency.name
248
-
249
- dep.requirements.any? do |req|
250
- req.dig(:metadata, :property_name) == property_name
251
- end
252
- end
253
193
  end
254
194
  end
255
195
 
256
- sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
257
- def declarations_using_a_property
258
- @declarations_using_a_property ||=
259
- T.let(
260
- dependency.requirements
261
- .select { |req| req.dig(:metadata, :property_name) },
262
- T.nilable(T::Array[T::Hash[Symbol, T.untyped]])
263
- )
196
+ sig { returns(T::Array[Dependabot::Nuget::DependencyDetails]) }
197
+ def updated_dependency_details
198
+ @updated_dependency_details ||= T.let(update_analysis.dependency_analysis.updated_dependencies,
199
+ T.nilable(T::Array[Dependabot::Nuget::DependencyDetails]))
264
200
  end
265
201
 
266
- sig { returns(T::Array[Dependabot::Dependency]) }
267
- def all_property_based_dependencies
268
- @all_property_based_dependencies ||=
269
- T.let(
270
- Nuget::FileParser.new(
271
- dependency_files: dependency_files,
272
- repo_contents_path: repo_contents_path,
273
- source: nil
274
- ).parse.select do |dep|
275
- dep.requirements.any? { |req| req.dig(:metadata, :property_name) }
276
- end,
277
- T.nilable(T::Array[Dependabot::Dependency])
278
- )
202
+ sig { returns(T::Boolean) }
203
+ def version_comes_from_multi_dependency_property?
204
+ update_analysis.dependency_analysis.version_comes_from_multi_dependency_property
279
205
  end
280
206
  end
281
207
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-nuget
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.289.0
4
+ version: 0.291.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-12-05 00:00:00.000000000 Z
11
+ date: 2024-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dependabot-common
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.289.0
19
+ version: 0.291.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.289.0
26
+ version: 0.291.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rubyzip
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -331,6 +331,7 @@ files:
331
331
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/FrameworkChecker/SupportedFrameworkFacts.cs
332
332
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/MockNuGetPackage.cs
333
333
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/NuGetUpdater.Core.Test.csproj
334
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/MiscellaneousTests.cs
334
335
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs
335
336
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs
336
337
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/TestApiHandler.cs
@@ -370,6 +371,7 @@ files:
370
371
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/NuGetContext.cs
371
372
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/Requirement.cs
372
373
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementArrayConverter.cs
374
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementConverter.cs
373
375
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/SecurityVulnerability.cs
374
376
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/SecurityVulnerabilityExtensions.cs
375
377
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/VersionFinder.cs
@@ -413,10 +415,15 @@ files:
413
415
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/NativeResult.cs
414
416
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/NuGetUpdater.Core.csproj
415
417
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Property.cs
418
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Advisory.cs
416
419
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/AllowedUpdate.cs
420
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/CommitOptions.cs
421
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Condition.cs
417
422
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/CreatePullRequest.cs
418
423
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/DependencyFile.cs
419
424
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/DependencyFileNotFound.cs
425
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/DependencyGroup.cs
426
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/GroupPullRequest.cs
420
427
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/IncrementMetric.cs
421
428
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Job.cs
422
429
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/JobErrorBase.cs
@@ -425,9 +432,11 @@ files:
425
432
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/JobSource.cs
426
433
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/MarkAsProcessed.cs
427
434
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/PrivateSourceAuthenticationFailure.cs
435
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/PullRequest.cs
428
436
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/ReportedDependency.cs
429
437
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/ReportedRequirement.cs
430
438
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/RequirementSource.cs
439
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/RequirementsUpdateStrategy.cs
431
440
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/UnknownError.cs
432
441
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/UpdateNotPossible.cs
433
442
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/UpdatedDependencyList.cs
@@ -435,6 +444,7 @@ files:
435
444
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/IApiHandler.cs
436
445
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunResult.cs
437
446
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs
447
+ - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/VersionConverter.cs
438
448
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/TargetFrameworkReporter.targets
439
449
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/UpdateNotPossibleException.cs
440
450
  - helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectManager.cs
@@ -473,7 +483,6 @@ files:
473
483
  - lib/dependabot/nuget/cache_manager.rb
474
484
  - lib/dependabot/nuget/discovery/dependency_details.rb
475
485
  - lib/dependabot/nuget/discovery/dependency_file_discovery.rb
476
- - lib/dependabot/nuget/discovery/directory_packages_props_discovery.rb
477
486
  - lib/dependabot/nuget/discovery/discovery_json_reader.rb
478
487
  - lib/dependabot/nuget/discovery/evaluation_details.rb
479
488
  - lib/dependabot/nuget/discovery/project_discovery.rb
@@ -482,40 +491,22 @@ files:
482
491
  - lib/dependabot/nuget/file_fetcher.rb
483
492
  - lib/dependabot/nuget/file_parser.rb
484
493
  - lib/dependabot/nuget/file_updater.rb
485
- - lib/dependabot/nuget/http_response_helpers.rb
494
+ - lib/dependabot/nuget/language.rb
486
495
  - lib/dependabot/nuget/metadata_finder.rb
487
- - lib/dependabot/nuget/native_discovery/native_dependency_details.rb
488
- - lib/dependabot/nuget/native_discovery/native_dependency_file_discovery.rb
489
- - lib/dependabot/nuget/native_discovery/native_discovery_json_reader.rb
490
- - lib/dependabot/nuget/native_discovery/native_evaluation_details.rb
491
- - lib/dependabot/nuget/native_discovery/native_project_discovery.rb
492
- - lib/dependabot/nuget/native_discovery/native_property_details.rb
493
- - lib/dependabot/nuget/native_discovery/native_workspace_discovery.rb
494
496
  - lib/dependabot/nuget/native_helpers.rb
495
- - lib/dependabot/nuget/native_update_checker/native_requirements_updater.rb
496
- - lib/dependabot/nuget/native_update_checker/native_update_checker.rb
497
- - lib/dependabot/nuget/nuget_client.rb
498
497
  - lib/dependabot/nuget/nuget_config_credential_helpers.rb
498
+ - lib/dependabot/nuget/package_manager.rb
499
499
  - lib/dependabot/nuget/requirement.rb
500
500
  - lib/dependabot/nuget/update_checker.rb
501
- - lib/dependabot/nuget/update_checker/compatibility_checker.rb
502
- - lib/dependabot/nuget/update_checker/dependency_finder.rb
503
- - lib/dependabot/nuget/update_checker/nupkg_fetcher.rb
504
- - lib/dependabot/nuget/update_checker/nuspec_fetcher.rb
505
- - lib/dependabot/nuget/update_checker/property_updater.rb
506
- - lib/dependabot/nuget/update_checker/repository_finder.rb
507
501
  - lib/dependabot/nuget/update_checker/requirements_updater.rb
508
- - lib/dependabot/nuget/update_checker/tfm_comparer.rb
509
- - lib/dependabot/nuget/update_checker/tfm_finder.rb
510
- - lib/dependabot/nuget/update_checker/version_finder.rb
511
502
  - lib/dependabot/nuget/version.rb
512
503
  homepage: https://github.com/dependabot/dependabot-core
513
504
  licenses:
514
505
  - MIT
515
506
  metadata:
516
507
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
517
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.289.0
518
- post_install_message:
508
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.291.0
509
+ post_install_message:
519
510
  rdoc_options: []
520
511
  require_paths:
521
512
  - lib
@@ -531,7 +522,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
531
522
  version: 3.1.0
532
523
  requirements: []
533
524
  rubygems_version: 3.5.9
534
- signing_key:
525
+ signing_key:
535
526
  specification_version: 4
536
527
  summary: Provides Dependabot support for .NET (NuGet)
537
528
  test_files: []
@@ -1,43 +0,0 @@
1
- # typed: strong
2
- # frozen_string_literal: true
3
-
4
- require "dependabot/nuget/discovery/dependency_details"
5
- require "sorbet-runtime"
6
-
7
- module Dependabot
8
- module Nuget
9
- class DirectoryPackagesPropsDiscovery < DependencyFileDiscovery
10
- extend T::Sig
11
-
12
- sig do
13
- params(json: T.nilable(T::Hash[String, T.untyped])).returns(T.nilable(DirectoryPackagesPropsDiscovery))
14
- end
15
- def self.from_json(json)
16
- return nil if json.nil?
17
-
18
- file_path = T.let(json.fetch("FilePath"), String)
19
- is_transitive_pinning_enabled = T.let(json.fetch("IsTransitivePinningEnabled"), T::Boolean)
20
- dependencies = T.let(json.fetch("Dependencies"), T::Array[T::Hash[String, T.untyped]]).map do |dep|
21
- DependencyDetails.from_json(dep)
22
- end
23
-
24
- DirectoryPackagesPropsDiscovery.new(file_path: file_path,
25
- is_transitive_pinning_enabled: is_transitive_pinning_enabled,
26
- dependencies: dependencies)
27
- end
28
-
29
- sig do
30
- params(file_path: String,
31
- is_transitive_pinning_enabled: T::Boolean,
32
- dependencies: T::Array[DependencyDetails]).void
33
- end
34
- def initialize(file_path:, is_transitive_pinning_enabled:, dependencies:)
35
- super(file_path: file_path, dependencies: dependencies)
36
- @is_transitive_pinning_enabled = is_transitive_pinning_enabled
37
- end
38
-
39
- sig { returns(T::Boolean) }
40
- attr_reader :is_transitive_pinning_enabled
41
- end
42
- end
43
- end
@@ -1,19 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require "sorbet-runtime"
5
-
6
- module Dependabot
7
- module Nuget
8
- module HttpResponseHelpers
9
- extend T::Sig
10
-
11
- sig { params(string: String).returns(String) }
12
- def self.remove_wrapping_zero_width_chars(string)
13
- string.force_encoding("UTF-8").encode
14
- .gsub(/\A[\u200B-\u200D\uFEFF]/, "")
15
- .gsub(/[\u200B-\u200D\uFEFF]\Z/, "")
16
- end
17
- end
18
- end
19
- end