dependabot-nuget 0.322.2 → 0.325.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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Program.cs +0 -4
  3. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +1 -31
  4. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/DependencyFinder.cs +0 -3
  5. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/DependencyInfo.cs +1 -0
  6. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/VersionFinder.cs +64 -10
  7. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Clone/CloneWorker.cs +1 -1
  8. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/DependencySolver/MSBuildDependencySolver.cs +10 -4
  9. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +4 -4
  10. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscovery.cs +2 -2
  11. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/SdkProjectDiscovery.cs +31 -41
  12. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +3 -6
  13. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Cooldown.cs +83 -0
  14. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Job.cs +2 -1
  15. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ModifiedFilesTracker.cs +9 -1
  16. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/PullRequestBodyGenerator/DetailedPullRequestBodyGenerator.cs +6 -0
  17. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +8 -1
  18. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/UpdateHandlers/CreateSecurityUpdatePullRequestHandler.cs +1 -1
  19. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/UpdateHandlers/GroupUpdateAllVersionsHandler.cs +79 -67
  20. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/UpdateHandlers/RefreshGroupUpdatePullRequestHandler.cs +1 -1
  21. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/UpdateHandlers/RefreshSecurityUpdatePullRequestHandler.cs +1 -1
  22. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/UpdateHandlers/RefreshVersionUpdatePullRequestHandler.cs +1 -1
  23. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/FileWriters/FileWriterWorker.cs +10 -7
  24. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/FileWriters/XmlFileWriter.cs +245 -125
  25. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/LockFileUpdater.cs +4 -11
  26. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +4 -5
  27. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +1 -1
  28. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/DependencyConflictResolver.cs +2 -2
  29. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +14 -31
  30. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/NuGetHelper.cs +3 -5
  31. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProcessExtensions.cs +12 -13
  32. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/XmlExtensions.cs +3 -3
  33. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/AnalyzeWorkerTests.cs +78 -2
  34. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/VersionFinderTests.cs +126 -3
  35. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Clone/CloneWorkerTests.cs +14 -0
  36. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/DependencySolver/MSBuildDependencySolverTests.cs +1 -2
  37. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTestBase.cs +2 -2
  38. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Project.cs +1 -2
  39. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +0 -6
  40. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/SdkProjectDiscoveryTests.cs +2 -3
  41. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/MockNuGetPackage.cs +1 -2
  42. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/ApiModel/CooldownTests.cs +99 -0
  43. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/MiscellaneousTests.cs +168 -4
  44. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/PullRequestBodyGenerator/DetailedPullRequestBodyGeneratorTests.cs +71 -0
  45. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +71 -0
  46. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/UpdateHandlers/GroupUpdateAllVersionsHandlerTests.cs +70 -39
  47. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/FileWriters/FileWriterWorkerTests.cs +43 -30
  48. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/FileWriters/XmlFileWriterTests.cs +76 -3
  49. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/PackageReferenceUpdaterTests.cs +0 -2
  50. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +11 -27
  51. data/lib/dependabot/nuget.rb +3 -11
  52. metadata +8 -54
  53. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/AnalyzeCommand.cs +0 -49
  54. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/DiscoverCommand.cs +0 -60
  55. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/FrameworkCheckCommand.cs +0 -35
  56. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/UpdateCommand.cs +0 -58
  57. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Analyze.cs +0 -380
  58. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Discover.cs +0 -557
  59. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.FrameworkCheck.cs +0 -37
  60. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Update.cs +0 -226
  61. data/lib/dependabot/nuget/analysis/analysis_json_reader.rb +0 -65
  62. data/lib/dependabot/nuget/analysis/dependency_analysis.rb +0 -66
  63. data/lib/dependabot/nuget/cache_manager.rb +0 -29
  64. data/lib/dependabot/nuget/discovery/dependency_details.rb +0 -102
  65. data/lib/dependabot/nuget/discovery/dependency_file_discovery.rb +0 -122
  66. data/lib/dependabot/nuget/discovery/discovery_json_reader.rb +0 -266
  67. data/lib/dependabot/nuget/discovery/evaluation_details.rb +0 -63
  68. data/lib/dependabot/nuget/discovery/project_discovery.rb +0 -104
  69. data/lib/dependabot/nuget/discovery/property_details.rb +0 -43
  70. data/lib/dependabot/nuget/discovery/workspace_discovery.rb +0 -61
  71. data/lib/dependabot/nuget/file_fetcher.rb +0 -46
  72. data/lib/dependabot/nuget/file_parser.rb +0 -153
  73. data/lib/dependabot/nuget/file_updater.rb +0 -256
  74. data/lib/dependabot/nuget/language.rb +0 -98
  75. data/lib/dependabot/nuget/metadata_finder.rb +0 -197
  76. data/lib/dependabot/nuget/native_helpers.rb +0 -364
  77. data/lib/dependabot/nuget/nuget_config_credential_helpers.rb +0 -88
  78. data/lib/dependabot/nuget/package_manager.rb +0 -51
  79. data/lib/dependabot/nuget/update_checker/requirements_updater.rb +0 -105
  80. data/lib/dependabot/nuget/update_checker.rb +0 -210
@@ -1,105 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- #######################################################################
5
- # For more details on Dotnet version constraints, see: #
6
- # https://docs.microsoft.com/en-us/nuget/reference/package-versioning #
7
- #######################################################################
8
-
9
- require "sorbet-runtime"
10
-
11
- require "dependabot/update_checkers/base"
12
- require "dependabot/nuget/discovery/dependency_details"
13
- require "dependabot/nuget/version"
14
-
15
- module Dependabot
16
- module Nuget
17
- class UpdateChecker < Dependabot::UpdateCheckers::Base
18
- class RequirementsUpdater
19
- extend T::Sig
20
-
21
- sig do
22
- params(
23
- requirements: T::Array[T::Hash[Symbol, T.untyped]],
24
- dependency_details: T.nilable(Dependabot::Nuget::DependencyDetails)
25
- )
26
- .void
27
- end
28
- def initialize(requirements:, dependency_details:)
29
- @requirements = requirements
30
- @dependency_details = dependency_details
31
- end
32
-
33
- sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
34
- def updated_requirements
35
- return requirements unless clean_version
36
-
37
- # NOTE: Order is important here. The FileUpdater needs the updated
38
- # requirement at index `i` to correspond to the previous requirement
39
- # at the same index.
40
- requirements.map do |req|
41
- next req if req.fetch(:requirement).nil?
42
- next req if req.fetch(:requirement).include?(",")
43
-
44
- new_req =
45
- if req.fetch(:requirement).include?("*")
46
- update_wildcard_requirement(req.fetch(:requirement))
47
- else
48
- # Since range requirements are excluded by the line above we can
49
- # replace anything that looks like a version with the new
50
- # version
51
- req[:requirement].sub(
52
- /#{Nuget::Version::VERSION_PATTERN}/o,
53
- clean_version.to_s
54
- )
55
- end
56
-
57
- next req if new_req == req.fetch(:requirement)
58
-
59
- new_source = req[:source]&.dup
60
- unless @dependency_details.nil?
61
- new_source = {
62
- type: "nuget_repo",
63
- source_url: @dependency_details.info_url
64
- }
65
- end
66
-
67
- req.merge({ requirement: new_req, source: new_source })
68
- end
69
- end
70
-
71
- private
72
-
73
- sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
74
- attr_reader :requirements
75
-
76
- sig { returns(T.class_of(Dependabot::Nuget::Version)) }
77
- def version_class
78
- Dependabot::Nuget::Version
79
- end
80
-
81
- sig { returns(T.nilable(Dependabot::Nuget::Version)) }
82
- def clean_version
83
- return unless @dependency_details&.version
84
-
85
- version_class.new(@dependency_details.version)
86
- end
87
-
88
- sig { params(req_string: String).returns(String) }
89
- def update_wildcard_requirement(req_string)
90
- return req_string if req_string == "*-*"
91
-
92
- return req_string if req_string == "*"
93
-
94
- precision = T.must(req_string.split("*").first).split(/\.|\-/).count
95
- wildcard_section = req_string.partition(/(?=[.\-]\*)/).last
96
-
97
- version_parts = T.must(clean_version).segments.first(precision)
98
- version = version_parts.join(".")
99
-
100
- version + wildcard_section
101
- end
102
- end
103
- end
104
- end
105
- end
@@ -1,210 +0,0 @@
1
- # typed: strong
2
- # frozen_string_literal: true
3
-
4
- require "dependabot/nuget/analysis/analysis_json_reader"
5
- require "dependabot/nuget/discovery/discovery_json_reader"
6
- require "dependabot/update_checkers"
7
- require "dependabot/update_checkers/base"
8
- require "sorbet-runtime"
9
-
10
- module Dependabot
11
- module Nuget
12
- class UpdateChecker < Dependabot::UpdateCheckers::Base
13
- extend T::Sig
14
-
15
- require_relative "update_checker/requirements_updater"
16
-
17
- sig { override.returns(T.nilable(String)) }
18
- def latest_version
19
- # No need to find latest version for transitive dependencies unless they have a vulnerability.
20
- return dependency.version if !dependency.top_level? && !vulnerable?
21
-
22
- # if no update sources have the requisite package, then we can only assume that the current version is correct
23
- @latest_version = T.let(
24
- update_analysis.dependency_analysis.updated_version,
25
- T.nilable(String)
26
- )
27
- end
28
-
29
- sig { override.returns(T.nilable(T.any(String, Gem::Version))) }
30
- def latest_resolvable_version
31
- # We always want a full unlock since any package update could update peer dependencies as well.
32
- # To force a full unlock instead of an own unlock, we return nil.
33
- nil
34
- end
35
-
36
- sig { override.returns(Dependabot::Nuget::Version) }
37
- def lowest_security_fix_version
38
- update_analysis.dependency_analysis.numeric_updated_version
39
- end
40
-
41
- sig { override.returns(T.nilable(Dependabot::Nuget::Version)) }
42
- def lowest_resolvable_security_fix_version
43
- return nil if version_comes_from_multi_dependency_property?
44
-
45
- update_analysis.dependency_analysis.numeric_updated_version
46
- end
47
-
48
- sig { override.returns(NilClass) }
49
- def latest_resolvable_version_with_no_unlock
50
- # Irrelevant, since Nuget has a single dependency file
51
- nil
52
- end
53
-
54
- sig { override.returns(T::Array[T::Hash[Symbol, T.untyped]]) }
55
- def updated_requirements
56
- dep_details = updated_dependency_details.find { |d| d.name.casecmp?(dependency.name) }
57
- RequirementsUpdater.new(
58
- requirements: dependency.requirements,
59
- dependency_details: dep_details
60
- ).updated_requirements
61
- end
62
-
63
- sig { returns(T::Boolean) }
64
- def up_to_date?
65
- !update_analysis.dependency_analysis.can_update
66
- end
67
-
68
- sig { returns(T::Boolean) }
69
- def requirements_unlocked_or_can_be?
70
- update_analysis.dependency_analysis.can_update
71
- end
72
-
73
- private
74
-
75
- sig { returns(String) }
76
- def job_file_path
77
- ENV.fetch("DEPENDABOT_JOB_PATH")
78
- end
79
-
80
- sig { returns(AnalysisJsonReader) }
81
- def update_analysis
82
- @update_analysis ||= T.let(request_analysis, T.nilable(AnalysisJsonReader))
83
- end
84
-
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")
90
- end
91
-
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
- )
99
- end
100
- end
101
-
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
106
- )
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)
140
-
141
- begin
142
- Dir.mkdir(dependency_directory)
143
- rescue StandardError
144
- nil?
145
- end
146
-
147
- Dependabot.logger.info("Writing dependency info: #{dependency_info}")
148
- File.write(dependency_file_path, dependency_info)
149
- end
150
-
151
- sig { returns(Dependabot::FileParsers::Base::DependencySet) }
152
- def discovered_dependencies
153
- DiscoveryJsonReader.load_discovery_for_dependency_file_paths(dependency_file_paths).dependency_set
154
- end
155
-
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
160
- end
161
-
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
183
-
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
192
- )
193
- end
194
- end
195
-
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]))
200
- end
201
-
202
- sig { returns(T::Boolean) }
203
- def version_comes_from_multi_dependency_property?
204
- update_analysis.dependency_analysis.version_comes_from_multi_dependency_property
205
- end
206
- end
207
- end
208
- end
209
-
210
- Dependabot::UpdateCheckers.register("nuget", Dependabot::Nuget::UpdateChecker)