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
@@ -4,9 +4,11 @@
4
4
  require "dependabot/dependency"
5
5
  require "dependabot/file_parsers"
6
6
  require "dependabot/file_parsers/base"
7
- require "dependabot/nuget/native_discovery/native_discovery_json_reader"
7
+ require "dependabot/nuget/discovery/discovery_json_reader"
8
8
  require "dependabot/nuget/native_helpers"
9
9
  require "sorbet-runtime"
10
+ require "dependabot/nuget/package_manager"
11
+ require "dependabot/nuget/language"
10
12
 
11
13
  # For details on how dotnet handles version constraints, see:
12
14
  # https://docs.microsoft.com/en-us/nuget/reference/package-versioning
@@ -22,14 +24,42 @@ module Dependabot
22
24
  dependencies
23
25
  end
24
26
 
27
+ sig { returns(Ecosystem) }
28
+ def ecosystem
29
+ @ecosystem ||= T.let(
30
+ Ecosystem.new(
31
+ name: ECOSYSTEM,
32
+ package_manager: package_manager,
33
+ language: language
34
+ ),
35
+ T.nilable(Ecosystem)
36
+ )
37
+ end
38
+
25
39
  private
26
40
 
41
+ sig { returns(T.nilable(T::Array[String])) }
42
+ def content_json
43
+ @content_json ||= T.let(begin
44
+ directory = source&.directory || "/"
45
+ discovery_json_reader = DiscoveryJsonReader.run_discovery_in_directory(
46
+ repo_contents_path: T.must(repo_contents_path),
47
+ directory: directory,
48
+ credentials: credentials
49
+ )
50
+
51
+ discovery_json_reader.workspace_discovery&.projects&.map do |framework|
52
+ T.let(framework.instance_variable_get(:@target_frameworks), T::Array[String]).compact.join(",")
53
+ end
54
+ end, T.nilable(T::Array[String]))
55
+ end
56
+
27
57
  sig { returns(T::Array[Dependabot::Dependency]) }
28
58
  def dependencies
29
59
  @dependencies ||= T.let(begin
30
- NativeDiscoveryJsonReader.debug_report_discovery_files(error_if_missing: true)
60
+ NativeHelpers.install_dotnet_sdks
31
61
  directory = source&.directory || "/"
32
- discovery_json_reader = NativeDiscoveryJsonReader.run_discovery_in_directory(
62
+ discovery_json_reader = DiscoveryJsonReader.run_discovery_in_directory(
33
63
  repo_contents_path: T.must(repo_contents_path),
34
64
  directory: directory,
35
65
  credentials: credentials
@@ -54,6 +84,65 @@ module Dependabot
54
84
  "No project file."
55
85
  )
56
86
  end
87
+
88
+ sig { returns(T.nilable(Ecosystem::VersionManager)) }
89
+ def language
90
+ # Historically new version of language is released with incremental update of
91
+ # .Net version, so we tie the language with framework version for metric collection
92
+
93
+ nomenclature = "#{language_type} #{framework_version&.join(',')}".strip.tr(" ", "-")
94
+
95
+ Dependabot.logger.info("Detected language and framework #{nomenclature}")
96
+
97
+ case language_type
98
+
99
+ when CSharpLanguage::TYPE
100
+ CSharpLanguage.new(nomenclature)
101
+
102
+ when VBLanguage::TYPE
103
+ VBLanguage.new(nomenclature)
104
+
105
+ when FSharpLanguage::TYPE
106
+ FSharpLanguage.new(nomenclature)
107
+
108
+ when DotNet::TYPE
109
+ DotNet.new(nomenclature)
110
+
111
+ end
112
+ end
113
+
114
+ sig { returns(T.nilable(T::Array[String])) }
115
+ def framework_version
116
+ content_json
117
+ rescue StandardError
118
+ nil
119
+ end
120
+
121
+ sig { returns(T.nilable(String)) }
122
+ def language_type
123
+ requirement_files = dependencies.flat_map do |dep|
124
+ dep.requirements.map { |r| T.let(r.fetch(:file), String) }
125
+ end.uniq
126
+
127
+ return "cs" if requirement_files.any? { |f| File.basename(f).match?(/\.csproj$/) }
128
+ return "vb" if requirement_files.any? { |f| File.basename(f).match?(/\.vbproj$/) }
129
+ return "fs" if requirement_files.any? { |f| File.basename(f).match?(/\.fsproj$/) }
130
+
131
+ # return a fallback to avoid falling to exception
132
+ "dotnet"
133
+ end
134
+
135
+ sig { returns(Ecosystem::VersionManager) }
136
+ def package_manager
137
+ NugetPackageManager.new(T.must(nuget_version))
138
+ end
139
+
140
+ sig { returns(T.nilable(String)) }
141
+ def nuget_version
142
+ SharedHelpers.run_shell_command("dotnet nuget --version").split("Command Line").last&.strip
143
+ rescue StandardError
144
+ nil
145
+ end
57
146
  end
58
147
  end
59
148
  end
@@ -4,9 +4,9 @@
4
4
  require "dependabot/dependency_file"
5
5
  require "dependabot/file_updaters"
6
6
  require "dependabot/file_updaters/base"
7
- require "dependabot/nuget/native_discovery/native_dependency_details"
8
- require "dependabot/nuget/native_discovery/native_discovery_json_reader"
9
- require "dependabot/nuget/native_discovery/native_workspace_discovery"
7
+ require "dependabot/nuget/discovery/dependency_details"
8
+ require "dependabot/nuget/discovery/discovery_json_reader"
9
+ require "dependabot/nuget/discovery/workspace_discovery"
10
10
  require "dependabot/nuget/native_helpers"
11
11
  require "dependabot/shared_helpers"
12
12
  require "sorbet-runtime"
@@ -57,7 +57,7 @@ module Dependabot
57
57
  try_update_projects(dependency) || try_update_json(dependency)
58
58
  end
59
59
  updated_files = dependency_files.filter_map do |f|
60
- dependency_file_path = NativeDiscoveryJsonReader.dependency_file_path(
60
+ dependency_file_path = DiscoveryJsonReader.dependency_file_path(
61
61
  repo_contents_path: T.must(repo_contents_path),
62
62
  dependency_file: f
63
63
  )
@@ -97,7 +97,7 @@ module Dependabot
97
97
  # run update for each project file
98
98
  project_files.each do |project_file|
99
99
  project_dependencies = project_dependencies(project_file)
100
- dependency_file_path = NativeDiscoveryJsonReader.dependency_file_path(
100
+ dependency_file_path = DiscoveryJsonReader.dependency_file_path(
101
101
  repo_contents_path: T.must(repo_contents_path),
102
102
  dependency_file: project_file
103
103
  )
@@ -128,7 +128,7 @@ module Dependabot
128
128
 
129
129
  # We just need to feed the updater a project file, grab the first
130
130
  project_file = T.must(project_files.first)
131
- dependency_file_path = NativeDiscoveryJsonReader.dependency_file_path(
131
+ dependency_file_path = DiscoveryJsonReader.dependency_file_path(
132
132
  repo_contents_path: T.must(repo_contents_path),
133
133
  dependency_file: project_file
134
134
  )
@@ -168,13 +168,13 @@ module Dependabot
168
168
  @update_tooling_calls
169
169
  end
170
170
 
171
- sig { returns(T.nilable(NativeWorkspaceDiscovery)) }
171
+ sig { returns(T.nilable(WorkspaceDiscovery)) }
172
172
  def workspace
173
173
  dependency_file_paths = dependency_files.map do |f|
174
- NativeDiscoveryJsonReader.dependency_file_path(repo_contents_path: T.must(repo_contents_path),
175
- dependency_file: f)
174
+ DiscoveryJsonReader.dependency_file_path(repo_contents_path: T.must(repo_contents_path),
175
+ dependency_file: f)
176
176
  end
177
- NativeDiscoveryJsonReader.load_discovery_for_dependency_file_paths(dependency_file_paths).workspace_discovery
177
+ DiscoveryJsonReader.load_discovery_for_dependency_file_paths(dependency_file_paths).workspace_discovery
178
178
  end
179
179
 
180
180
  sig { params(project_file: Dependabot::DependencyFile).returns(T::Array[String]) }
@@ -182,7 +182,7 @@ module Dependabot
182
182
  workspace&.projects&.find { |p| p.file_path == project_file.name }&.referenced_project_paths || []
183
183
  end
184
184
 
185
- sig { params(project_file: Dependabot::DependencyFile).returns(T::Array[NativeDependencyDetails]) }
185
+ sig { params(project_file: Dependabot::DependencyFile).returns(T::Array[DependencyDetails]) }
186
186
  def project_dependencies(project_file)
187
187
  workspace&.projects&.find do |p|
188
188
  full_project_file_path = File.join(project_file.directory, project_file.name)
@@ -190,12 +190,12 @@ module Dependabot
190
190
  end&.dependencies || []
191
191
  end
192
192
 
193
- sig { returns(T::Array[NativeDependencyDetails]) }
193
+ sig { returns(T::Array[DependencyDetails]) }
194
194
  def global_json_dependencies
195
195
  workspace&.global_json&.dependencies || []
196
196
  end
197
197
 
198
- sig { returns(T::Array[NativeDependencyDetails]) }
198
+ sig { returns(T::Array[DependencyDetails]) }
199
199
  def dotnet_tools_json_dependencies
200
200
  workspace&.dotnet_tools_json&.dependencies || []
201
201
  end
@@ -0,0 +1,82 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+ require "dependabot/nuget/version"
6
+ require "dependabot/ecosystem"
7
+
8
+ module Dependabot
9
+ module Nuget
10
+ class Language < Dependabot::Ecosystem::VersionManager
11
+ extend T::Sig
12
+
13
+ sig { params(language: String, raw_version: String, requirement: T.nilable(Requirement)).void }
14
+ def initialize(language, raw_version, requirement = nil)
15
+ super(language, Version.new(raw_version), [], [], requirement)
16
+ end
17
+ end
18
+
19
+ class CSharpLanguage < Dependabot::Ecosystem::VersionManager
20
+ extend T::Sig
21
+
22
+ LANGUAGE = "CSharp"
23
+ TYPE = "cs"
24
+
25
+ SUPPORTED_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
26
+
27
+ DEPRECATED_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
28
+
29
+ sig { params(language: String, requirement: T.nilable(Requirement)).void }
30
+ def initialize(language, requirement = nil)
31
+ super(language, Version.new(nil), [], [], requirement)
32
+ end
33
+ end
34
+
35
+ class VBLanguage < Dependabot::Ecosystem::VersionManager
36
+ extend T::Sig
37
+
38
+ LANGUAGE = "VB"
39
+ TYPE = "vb"
40
+
41
+ SUPPORTED_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
42
+
43
+ DEPRECATED_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
44
+
45
+ sig { params(language: String, requirement: T.nilable(Requirement)).void }
46
+ def initialize(language, requirement = nil)
47
+ super(language, Version.new(nil), [], [], requirement)
48
+ end
49
+ end
50
+
51
+ class FSharpLanguage < Dependabot::Ecosystem::VersionManager
52
+ extend T::Sig
53
+
54
+ LANGUAGE = "FSharp"
55
+ TYPE = "fs"
56
+
57
+ SUPPORTED_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
58
+
59
+ DEPRECATED_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
60
+
61
+ sig { params(language: String, requirement: T.nilable(Requirement)).void }
62
+ def initialize(language, requirement = nil)
63
+ super(language, Version.new(nil), [], [], requirement)
64
+ end
65
+ end
66
+
67
+ class DotNet < Dependabot::Ecosystem::VersionManager
68
+ extend T::Sig
69
+
70
+ TYPE = "dotnet"
71
+
72
+ SUPPORTED_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
73
+
74
+ DEPRECATED_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
75
+
76
+ sig { params(language: String, requirement: T.nilable(Requirement)).void }
77
+ def initialize(language, requirement = nil)
78
+ super(language, Version.new(nil), [], [], requirement)
79
+ end
80
+ end
81
+ end
82
+ end
@@ -81,6 +81,8 @@ module Dependabot
81
81
  fingerprint = [
82
82
  exe_path,
83
83
  "discover",
84
+ "--job-path",
85
+ "<job-path>",
84
86
  "--repo-root",
85
87
  "<repo-root>",
86
88
  "--workspace",
@@ -116,15 +118,17 @@ module Dependabot
116
118
  end
117
119
 
118
120
  sig do
119
- params(repo_root: String, discovery_file_path: String, dependency_file_path: String,
121
+ params(job_path: String, repo_root: String, discovery_file_path: String, dependency_file_path: String,
120
122
  analysis_folder_path: String).returns([String, String])
121
123
  end
122
- def self.get_nuget_analyze_tool_command(repo_root:, discovery_file_path:, dependency_file_path:,
124
+ def self.get_nuget_analyze_tool_command(job_path:, repo_root:, discovery_file_path:, dependency_file_path:,
123
125
  analysis_folder_path:)
124
126
  exe_path = File.join(native_helpers_root, "NuGetUpdater", "NuGetUpdater.Cli")
125
127
  command_parts = [
126
128
  exe_path,
127
129
  "analyze",
130
+ "--job-path",
131
+ job_path,
128
132
  "--repo-root",
129
133
  repo_root,
130
134
  "--discovery-file-path",
@@ -140,6 +144,8 @@ module Dependabot
140
144
  fingerprint = [
141
145
  exe_path,
142
146
  "analyze",
147
+ "--job-path",
148
+ "<job-path>",
143
149
  "--discovery-file-path",
144
150
  "<discovery-file-path>",
145
151
  "--dependency-file-path",
@@ -153,13 +159,14 @@ module Dependabot
153
159
 
154
160
  sig do
155
161
  params(
156
- repo_root: String, discovery_file_path: String, dependency_file_path: String,
162
+ job_path: String, repo_root: String, discovery_file_path: String, dependency_file_path: String,
157
163
  analysis_folder_path: String, credentials: T::Array[Dependabot::Credential]
158
164
  ).void
159
165
  end
160
- def self.run_nuget_analyze_tool(repo_root:, discovery_file_path:, dependency_file_path:,
166
+ def self.run_nuget_analyze_tool(job_path:, repo_root:, discovery_file_path:, dependency_file_path:,
161
167
  analysis_folder_path:, credentials:)
162
- (command, fingerprint) = get_nuget_analyze_tool_command(repo_root: repo_root,
168
+ (command, fingerprint) = get_nuget_analyze_tool_command(job_path: job_path,
169
+ repo_root: repo_root,
163
170
  discovery_file_path: discovery_file_path,
164
171
  dependency_file_path: dependency_file_path,
165
172
  analysis_folder_path: analysis_folder_path)
@@ -205,6 +212,8 @@ module Dependabot
205
212
  fingerprint = [
206
213
  exe_path,
207
214
  "update",
215
+ "--job-path",
216
+ "<job-path>",
208
217
  "--repo-root",
209
218
  "<repo-root>",
210
219
  "--solution-or-project",
@@ -260,6 +269,27 @@ module Dependabot
260
269
  end
261
270
  end
262
271
 
272
+ sig { void }
273
+ def self.install_dotnet_sdks
274
+ return unless Dependabot::Experiments.enabled?(:nuget_install_dotnet_sdks)
275
+
276
+ # environment variables are required and the following will generate an actionable error message if they're not
277
+ _dependabot_job_path = ENV.fetch("DEPENDABOT_JOB_PATH")
278
+ _dependabot_repo_contents_path = ENV.fetch("DEPENDABOT_REPO_CONTENTS_PATH")
279
+ _dotnet_install_script_path = ENV.fetch("DOTNET_INSTALL_SCRIPT_PATH")
280
+ _dotnet_install_dir = ENV.fetch("DOTNET_INSTALL_DIR")
281
+
282
+ # this environment variable is directly used
283
+ dependabot_home = ENV.fetch("DEPENDABOT_HOME")
284
+
285
+ command = [
286
+ "pwsh",
287
+ "#{dependabot_home}/dependabot-updater/bin/install-sdks.ps1"
288
+ ].join(" ")
289
+ output = SharedHelpers.run_shell_command(command)
290
+ puts output
291
+ end
292
+
263
293
  sig { params(json: T::Hash[String, T.untyped]).void }
264
294
  def self.ensure_no_errors(json)
265
295
  error_type = T.let(json.fetch("ErrorType", nil), T.nilable(String))
@@ -267,6 +297,8 @@ module Dependabot
267
297
  case error_type
268
298
  when "None", nil
269
299
  # no issue
300
+ when "DependencyFileNotParseable"
301
+ raise DependencyFileNotParseable, T.must(T.let(error_details, T.nilable(String)))
270
302
  when "AuthenticationFailure"
271
303
  raise PrivateSourceAuthenticationFailure, T.let(error_details, T.nilable(String))
272
304
  when "MissingFile"
@@ -0,0 +1,51 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+ require "dependabot/nuget/version"
6
+ require "dependabot/ecosystem"
7
+ require "dependabot/nuget/requirement"
8
+
9
+ module Dependabot
10
+ module Nuget
11
+ ECOSYSTEM = "dotnet"
12
+
13
+ SUPPORTED_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
14
+
15
+ DEPRECATED_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
16
+
17
+ class NugetPackageManager < Dependabot::Ecosystem::VersionManager
18
+ extend T::Sig
19
+
20
+ NAME = "nuget"
21
+
22
+ SUPPORTED_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
23
+
24
+ DEPRECATED_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
25
+
26
+ sig do
27
+ params(
28
+ raw_version: T.nilable(String)
29
+ ).void
30
+ end
31
+ def initialize(raw_version)
32
+ super(
33
+ NAME,
34
+ Version.new(raw_version),
35
+ SUPPORTED_VERSIONS,
36
+ DEPRECATED_VERSIONS
37
+ )
38
+ end
39
+
40
+ sig { override.returns(T::Boolean) }
41
+ def deprecated?
42
+ false
43
+ end
44
+
45
+ sig { override.returns(T::Boolean) }
46
+ def unsupported?
47
+ false
48
+ end
49
+ end
50
+ end
51
+ end
@@ -9,6 +9,7 @@
9
9
  require "sorbet-runtime"
10
10
 
11
11
  require "dependabot/update_checkers/base"
12
+ require "dependabot/nuget/discovery/dependency_details"
12
13
  require "dependabot/nuget/version"
13
14
 
14
15
  module Dependabot
@@ -20,22 +21,18 @@ module Dependabot
20
21
  sig do
21
22
  params(
22
23
  requirements: T::Array[T::Hash[Symbol, T.untyped]],
23
- latest_version: T.nilable(T.any(String, Dependabot::Nuget::Version)),
24
- source_details: T.nilable(T::Hash[Symbol, T.untyped])
24
+ dependency_details: T.nilable(Dependabot::Nuget::DependencyDetails)
25
25
  )
26
26
  .void
27
27
  end
28
- def initialize(requirements:, latest_version:, source_details:)
28
+ def initialize(requirements:, dependency_details:)
29
29
  @requirements = requirements
30
- @source_details = source_details
31
- return unless latest_version
32
-
33
- @latest_version = T.let(version_class.new(latest_version), Dependabot::Nuget::Version)
30
+ @dependency_details = dependency_details
34
31
  end
35
32
 
36
33
  sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
37
34
  def updated_requirements
38
- return requirements unless latest_version
35
+ return requirements unless clean_version
39
36
 
40
37
  # NOTE: Order is important here. The FileUpdater needs the updated
41
38
  # requirement at index `i` to correspond to the previous requirement
@@ -53,13 +50,21 @@ module Dependabot
53
50
  # version
54
51
  req[:requirement].sub(
55
52
  /#{Nuget::Version::VERSION_PATTERN}/o,
56
- latest_version.to_s
53
+ clean_version.to_s
57
54
  )
58
55
  end
59
56
 
60
57
  next req if new_req == req.fetch(:requirement)
61
58
 
62
- req.merge(requirement: new_req, source: updated_source)
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 })
63
68
  end
64
69
  end
65
70
 
@@ -68,17 +73,18 @@ module Dependabot
68
73
  sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
69
74
  attr_reader :requirements
70
75
 
71
- sig { returns(T.nilable(Dependabot::Nuget::Version)) }
72
- attr_reader :latest_version
73
-
74
- sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
75
- attr_reader :source_details
76
-
77
76
  sig { returns(T.class_of(Dependabot::Nuget::Version)) }
78
77
  def version_class
79
78
  Dependabot::Nuget::Version
80
79
  end
81
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
+
82
88
  sig { params(req_string: String).returns(String) }
83
89
  def update_wildcard_requirement(req_string)
84
90
  return req_string if req_string == "*-*"
@@ -88,21 +94,11 @@ module Dependabot
88
94
  precision = T.must(req_string.split("*").first).split(/\.|\-/).count
89
95
  wildcard_section = req_string.partition(/(?=[.\-]\*)/).last
90
96
 
91
- version_parts = T.must(latest_version).segments.first(precision)
97
+ version_parts = T.must(clean_version).segments.first(precision)
92
98
  version = version_parts.join(".")
93
99
 
94
100
  version + wildcard_section
95
101
  end
96
-
97
- sig { returns(T::Hash[Symbol, T.untyped]) }
98
- def updated_source
99
- {
100
- type: "nuget_repo",
101
- url: source_details&.fetch(:repo_url),
102
- nuspec_url: source_details&.fetch(:nuspec_url),
103
- source_url: source_details&.fetch(:source_url)
104
- }
105
- end
106
102
  end
107
103
  end
108
104
  end