dependabot-nuget 0.288.0 → 0.290.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/helpers/lib/NuGetUpdater/Directory.Packages.props +19 -17
- data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Packaging/NuGet.Packaging.csproj +0 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/AnalyzeCommand.cs +7 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Analyze.cs +29 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Discover.cs +25 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Run.cs +0 -6
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +33 -16
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/CompatabilityChecker.cs +25 -10
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/NuGetContext.cs +0 -13
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementArrayConverter.cs +39 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/VersionFinder.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Clone/ShellGitCommandHandler.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +60 -66
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DotNetToolsJsonDiscovery.cs +2 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/GlobalJsonDiscovery.cs +2 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscovery.cs +11 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscoveryResult.cs +1 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/ProjectDiscoveryResult.cs +2 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/SdkProjectDiscovery.cs +54 -11
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/WorkspaceDiscoveryResult.cs +0 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +1 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/JsonBuildFile.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/FrameworkChecker/CompatabilityChecker.cs +2 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Advisory.cs +13 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/AllowedUpdate.cs +18 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/CommitOptions.cs +8 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Condition.cs +19 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/DependencyGroup.cs +8 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/GroupPullRequest.cs +9 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Job.cs +13 -10
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/PullRequest.cs +11 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/RequirementsUpdateStrategy.cs +15 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +67 -58
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/VersionConverter.cs +19 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectManager.cs +15 -44
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/DotNetToolsJsonUpdater.cs +4 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/GlobalJsonUpdater.cs +5 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/LockFileUpdater.cs +2 -10
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +38 -33
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +25 -23
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +16 -12
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ConsoleLogger.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/DependencyConflictResolver.cs +19 -19
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ILogger.cs +11 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/JsonHelper.cs +2 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +18 -17
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/NuGetHelper.cs +1 -17
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathHelper.cs +17 -9
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProjectHelper.cs +96 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/AnalyzeWorkerTestBase.cs +5 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/AnalyzeWorkerTests.cs +87 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTestBase.cs +2 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.DotNetToolsJson.cs +45 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.GlobalJson.cs +35 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.PackagesConfig.cs +16 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Proj.cs +6 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Project.cs +143 -36
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +184 -48
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/ExpectedDiscoveryResults.cs +5 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/SdkProjectDiscoveryTests.cs +32 -10
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/MiscellaneousTests.cs +85 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +402 -102
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +342 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/UpdatedDependencyListTests.cs +60 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TemporaryDirectory.cs +18 -7
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestLogger.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/BindingRedirectsTests.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/PackagesConfigUpdaterTests.cs +24 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +4 -14
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.DotNetTools.cs +84 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.GlobalJson.cs +66 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs +95 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +1 -7
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/AssertEx.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/LinuxOnlyAttribute.cs +12 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +558 -711
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/PathHelperTests.cs +47 -2
- data/lib/dependabot/nuget/analysis/analysis_json_reader.rb +4 -2
- data/lib/dependabot/nuget/analysis/dependency_analysis.rb +3 -3
- data/lib/dependabot/nuget/discovery/dependency_details.rb +10 -3
- data/lib/dependabot/nuget/discovery/dependency_file_discovery.rb +8 -12
- data/lib/dependabot/nuget/discovery/discovery_json_reader.rb +214 -29
- data/lib/dependabot/nuget/discovery/project_discovery.rb +41 -8
- data/lib/dependabot/nuget/discovery/workspace_discovery.rb +14 -19
- data/lib/dependabot/nuget/file_fetcher.rb +11 -393
- data/lib/dependabot/nuget/file_parser.rb +23 -61
- data/lib/dependabot/nuget/file_updater.rb +28 -23
- data/lib/dependabot/nuget/native_helpers.rb +14 -5
- data/lib/dependabot/nuget/update_checker/requirements_updater.rb +23 -27
- data/lib/dependabot/nuget/update_checker.rb +116 -190
- metadata +20 -32
- data/helpers/lib/NuGetUpdater/NuGetProjects/Directory.Packages.props +0 -29
- data/lib/dependabot/nuget/discovery/directory_packages_props_discovery.rb +0 -43
- data/lib/dependabot/nuget/file_fetcher/import_paths_finder.rb +0 -73
- data/lib/dependabot/nuget/file_fetcher/sln_project_paths_finder.rb +0 -60
- data/lib/dependabot/nuget/http_response_helpers.rb +0 -19
- data/lib/dependabot/nuget/native_discovery/native_dependency_details.rb +0 -102
- data/lib/dependabot/nuget/native_discovery/native_dependency_file_discovery.rb +0 -129
- data/lib/dependabot/nuget/native_discovery/native_discovery_json_reader.rb +0 -171
- data/lib/dependabot/nuget/native_discovery/native_evaluation_details.rb +0 -63
- data/lib/dependabot/nuget/native_discovery/native_project_discovery.rb +0 -82
- data/lib/dependabot/nuget/native_discovery/native_property_details.rb +0 -43
- data/lib/dependabot/nuget/native_discovery/native_workspace_discovery.rb +0 -68
- data/lib/dependabot/nuget/native_update_checker/native_requirements_updater.rb +0 -105
- data/lib/dependabot/nuget/native_update_checker/native_update_checker.rb +0 -201
- data/lib/dependabot/nuget/nuget_client.rb +0 -223
- data/lib/dependabot/nuget/update_checker/compatibility_checker.rb +0 -116
- data/lib/dependabot/nuget/update_checker/dependency_finder.rb +0 -297
- data/lib/dependabot/nuget/update_checker/nupkg_fetcher.rb +0 -221
- data/lib/dependabot/nuget/update_checker/nuspec_fetcher.rb +0 -110
- data/lib/dependabot/nuget/update_checker/property_updater.rb +0 -196
- data/lib/dependabot/nuget/update_checker/repository_finder.rb +0 -466
- data/lib/dependabot/nuget/update_checker/tfm_comparer.rb +0 -34
- data/lib/dependabot/nuget/update_checker/tfm_finder.rb +0 -30
- data/lib/dependabot/nuget/update_checker/version_finder.rb +0 -449
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3ca35ae6f3d02ce8507984f89e7c929eb75cec515b39af94db530d6600f0caa
|
4
|
+
data.tar.gz: cbd548418a3e25163af5d8543109b520b6c9bd9e2bf5a5869421f8fe838128d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9395fb4eea720fbcba3b0cef278344b41a9ace7315ce62f5cb193bb05af2aa23553130dab3112cb900d39ad12cadd321e64291d72e4e21e4bbee2f2b7610626a
|
7
|
+
data.tar.gz: d74843dc18cab2fd6a58a31f1df2a4172cb308a3a2e452db7056727666e9f153b611046c25bd78f7c0679abe8be4eb57462886d87c8010ba21ac0a2ee316120e
|
@@ -5,36 +5,38 @@
|
|
5
5
|
</PropertyGroup>
|
6
6
|
|
7
7
|
<PropertyGroup>
|
8
|
-
<MSBuildPackageVersion>17.
|
8
|
+
<MSBuildPackageVersion>17.12.6</MSBuildPackageVersion>
|
9
9
|
</PropertyGroup>
|
10
10
|
|
11
11
|
<ItemGroup>
|
12
|
-
<PackageVersion Include="DiffPlex" Version="1.7.
|
13
|
-
|
12
|
+
<PackageVersion Include="DiffPlex" Version="1.7.2" />
|
14
13
|
<PackageVersion Include="GuiLabs.Language.Xml" Version="1.2.93" />
|
15
|
-
|
14
|
+
<PackageVersion Include="Microsoft.Build.Locator" Version="1.7.8" />
|
16
15
|
<PackageVersion Include="Microsoft.Build" Version="$(MSBuildPackageVersion)" />
|
17
16
|
<PackageVersion Include="Microsoft.Build.Framework" Version="$(MSBuildPackageVersion)" />
|
18
|
-
<PackageVersion Include="Microsoft.Build.
|
17
|
+
<PackageVersion Include="Microsoft.Build.Tasks.Core" Version="$(MSBuildPackageVersion)" />
|
19
18
|
<PackageVersion Include="Microsoft.Build.Utilities.Core" Version="$(MSBuildPackageVersion)" />
|
20
|
-
|
21
|
-
<PackageVersion Include="Microsoft.
|
22
|
-
|
23
|
-
<PackageVersion Include="Microsoft.
|
24
|
-
|
19
|
+
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.12.0" />
|
20
|
+
<PackageVersion Include="Microsoft.CSharp" Version="4.7.0" />
|
21
|
+
<PackageVersion Include="Microsoft.Extensions.FileProviders.Abstractions" Version="9.0.0" />
|
22
|
+
<PackageVersion Include="Microsoft.Extensions.FileSystemGlobbing" Version="9.0.0" />
|
23
|
+
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
|
24
|
+
<PackageVersion Include="Microsoft.VisualStudio.Setup.Configuration.Interop" Version="3.12.2149" />
|
25
|
+
<PackageVersion Include="Microsoft.Web.Xdt" Version="3.1.0" />
|
25
26
|
<PackageVersion Include="MSBuild.StructuredLogger" Version="2.2.386" />
|
26
|
-
|
27
|
-
<PackageVersion Include="NuGet.Core" Version="2.14.0
|
28
|
-
|
27
|
+
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
|
28
|
+
<PackageVersion Include="NuGet.Core" Version="2.14.0" Aliases="CoreV2" />
|
29
29
|
<PackageVersion Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
|
30
|
+
<PackageVersion Include="System.ComponentModel.Composition" Version="9.0.0" />
|
30
31
|
<PackageVersion Include="System.Net.Http" Version="4.3.4" />
|
31
32
|
<PackageVersion Include="System.Formats.Asn1" Version="8.0.1" />
|
32
|
-
<PackageVersion Include="System.Security.Cryptography.Pkcs" Version="
|
33
|
+
<PackageVersion Include="System.Security.Cryptography.Pkcs" Version="9.0.0" />
|
34
|
+
<PackageVersion Include="System.Security.Cryptography.ProtectedData" Version="9.0.0" />
|
33
35
|
<PackageVersion Include="System.Text.Json" Version="8.0.4" />
|
34
36
|
<PackageVersion Include="System.Text.RegularExpressions" Version="4.3.1" />
|
35
|
-
|
36
|
-
<PackageVersion Include="xunit" Version="2.
|
37
|
-
<PackageVersion Include="xunit.runner.visualstudio" Version="2.
|
37
|
+
<PackageVersion Include="System.Threading.Tasks.Dataflow" Version="9.0.0" />
|
38
|
+
<PackageVersion Include="xunit" Version="2.9.2" />
|
39
|
+
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
|
38
40
|
</ItemGroup>
|
39
41
|
|
40
42
|
</Project>
|
@@ -7,6 +7,7 @@ namespace NuGetUpdater.Cli.Commands;
|
|
7
7
|
|
8
8
|
internal static class AnalyzeCommand
|
9
9
|
{
|
10
|
+
internal static readonly Option<FileInfo> JobPathOption = new("--job-path") { IsRequired = true };
|
10
11
|
internal static readonly Option<DirectoryInfo> RepoRootOption = new("--repo-root") { IsRequired = true };
|
11
12
|
internal static readonly Option<FileInfo> DependencyFilePathOption = new("--dependency-file-path") { IsRequired = true };
|
12
13
|
internal static readonly Option<FileInfo> DiscoveryFilePathOption = new("--discovery-file-path") { IsRequired = true };
|
@@ -16,6 +17,7 @@ internal static class AnalyzeCommand
|
|
16
17
|
{
|
17
18
|
Command command = new("analyze", "Determines how to update a dependency based on the workspace discovery information.")
|
18
19
|
{
|
20
|
+
JobPathOption,
|
19
21
|
RepoRootOption,
|
20
22
|
DependencyFilePathOption,
|
21
23
|
DiscoveryFilePathOption,
|
@@ -24,11 +26,13 @@ internal static class AnalyzeCommand
|
|
24
26
|
|
25
27
|
command.TreatUnmatchedTokensAsErrors = true;
|
26
28
|
|
27
|
-
command.SetHandler(async (repoRoot, discoveryPath, dependencyPath, analysisDirectory) =>
|
29
|
+
command.SetHandler(async (jobPath, repoRoot, discoveryPath, dependencyPath, analysisDirectory) =>
|
28
30
|
{
|
29
|
-
var
|
31
|
+
var logger = new ConsoleLogger();
|
32
|
+
var experimentsManager = await ExperimentsManager.FromJobFileAsync(jobPath.FullName, logger);
|
33
|
+
var worker = new AnalyzeWorker(experimentsManager, logger);
|
30
34
|
await worker.RunAsync(repoRoot.FullName, discoveryPath.FullName, dependencyPath.FullName, analysisDirectory.FullName);
|
31
|
-
}, RepoRootOption, DiscoveryFilePathOption, DependencyFilePathOption, AnalysisFolderOption);
|
35
|
+
}, JobPathOption, RepoRootOption, DiscoveryFilePathOption, DependencyFilePathOption, AnalysisFolderOption);
|
32
36
|
|
33
37
|
return command;
|
34
38
|
}
|
@@ -36,7 +36,7 @@ internal static class RunCommand
|
|
36
36
|
var logger = new ConsoleLogger();
|
37
37
|
var experimentsManager = await ExperimentsManager.FromJobFileAsync(jobPath.FullName, logger);
|
38
38
|
var discoverWorker = new DiscoveryWorker(experimentsManager, logger);
|
39
|
-
var analyzeWorker = new AnalyzeWorker(logger);
|
39
|
+
var analyzeWorker = new AnalyzeWorker(experimentsManager, logger);
|
40
40
|
var updateWorker = new UpdaterWorker(experimentsManager, logger);
|
41
41
|
var worker = new RunWorker(apiHandler, discoverWorker, analyzeWorker, updateWorker, logger);
|
42
42
|
await worker.RunAsync(jobPath, repoContentsPath, baseCommitSha, outputPath);
|
@@ -26,6 +26,8 @@ public partial class EntryPointTests
|
|
26
26
|
await RunAsync(path =>
|
27
27
|
[
|
28
28
|
"analyze",
|
29
|
+
"--job-path",
|
30
|
+
Path.Combine(path, "job.json"),
|
29
31
|
"--repo-root",
|
30
32
|
path,
|
31
33
|
"--discovery-file-path",
|
@@ -94,7 +96,9 @@ public partial class EntryPointTests
|
|
94
96
|
"TargetFrameworks": [
|
95
97
|
"net8.0"
|
96
98
|
],
|
97
|
-
"ReferencedProjectPaths": []
|
99
|
+
"ReferencedProjectPaths": [],
|
100
|
+
"ImportedFiles": [],
|
101
|
+
"AdditionalFiles": []
|
98
102
|
}
|
99
103
|
],
|
100
104
|
"DirectoryPackagesProps": null,
|
@@ -142,6 +146,8 @@ public partial class EntryPointTests
|
|
142
146
|
await RunAsync(path =>
|
143
147
|
[
|
144
148
|
"analyze",
|
149
|
+
"--job-path",
|
150
|
+
Path.Combine(path, "job.json"),
|
145
151
|
"--repo-root",
|
146
152
|
path,
|
147
153
|
"--discovery-file-path",
|
@@ -229,6 +235,8 @@ public partial class EntryPointTests
|
|
229
235
|
await RunAsync(path =>
|
230
236
|
[
|
231
237
|
"analyze",
|
238
|
+
"--job-path",
|
239
|
+
Path.Combine(path, "job.json"),
|
232
240
|
"--repo-root",
|
233
241
|
path,
|
234
242
|
"--discovery-file-path",
|
@@ -306,8 +314,16 @@ public partial class EntryPointTests
|
|
306
314
|
);
|
307
315
|
}
|
308
316
|
|
309
|
-
private static async Task RunAsync(
|
317
|
+
private static async Task RunAsync(
|
318
|
+
Func<string, string[]> getArgs,
|
319
|
+
string dependencyName,
|
320
|
+
TestFile[] initialFiles,
|
321
|
+
ExpectedAnalysisResult expectedResult,
|
322
|
+
MockNuGetPackage[]? packages = null,
|
323
|
+
ExperimentsManager? experimentsManager = null
|
324
|
+
)
|
310
325
|
{
|
326
|
+
experimentsManager ??= new ExperimentsManager();
|
311
327
|
var actualResult = await RunAnalyzerAsync(dependencyName, initialFiles, async path =>
|
312
328
|
{
|
313
329
|
var sb = new StringBuilder();
|
@@ -320,8 +336,19 @@ public partial class EntryPointTests
|
|
320
336
|
|
321
337
|
try
|
322
338
|
{
|
339
|
+
await UpdateWorkerTestBase.MockJobFileInDirectory(path, experimentsManager);
|
323
340
|
await UpdateWorkerTestBase.MockNuGetPackagesInDirectory(packages, path);
|
324
341
|
var args = getArgs(path);
|
342
|
+
|
343
|
+
// manually pull out the experiments manager for the validate step below
|
344
|
+
for (int i = 0; i < args.Length - 1; i++)
|
345
|
+
{
|
346
|
+
if (args[i] == "--job-path")
|
347
|
+
{
|
348
|
+
experimentsManager = await ExperimentsManager.FromJobFileAsync(args[i + 1], new TestLogger());
|
349
|
+
}
|
350
|
+
}
|
351
|
+
|
325
352
|
var result = await Program.Main(args);
|
326
353
|
if (result != 0)
|
327
354
|
{
|
@@ -66,6 +66,9 @@ public partial class EntryPointTests
|
|
66
66
|
Properties = [
|
67
67
|
new("TargetFramework", "net8.0", "path/to/some directory with spaces/project.csproj"),
|
68
68
|
],
|
69
|
+
ReferencedProjectPaths = [],
|
70
|
+
ImportedFiles = [],
|
71
|
+
AdditionalFiles = [],
|
69
72
|
}
|
70
73
|
]
|
71
74
|
}
|
@@ -156,6 +159,11 @@ public partial class EntryPointTests
|
|
156
159
|
new("Some.Package", "7.0.1", DependencyType.PackagesConfig, TargetFrameworks: ["net45"]),
|
157
160
|
],
|
158
161
|
Properties = [],
|
162
|
+
ReferencedProjectPaths = [],
|
163
|
+
ImportedFiles = [],
|
164
|
+
AdditionalFiles = [
|
165
|
+
"packages.config"
|
166
|
+
],
|
159
167
|
}
|
160
168
|
]
|
161
169
|
}
|
@@ -223,6 +231,11 @@ public partial class EntryPointTests
|
|
223
231
|
new("Some.Package", "7.0.1", DependencyType.PackagesConfig, TargetFrameworks: ["net45"])
|
224
232
|
],
|
225
233
|
Properties = [],
|
234
|
+
ReferencedProjectPaths = [],
|
235
|
+
ImportedFiles = [],
|
236
|
+
AdditionalFiles = [
|
237
|
+
"packages.config"
|
238
|
+
],
|
226
239
|
}
|
227
240
|
]
|
228
241
|
}
|
@@ -291,6 +304,11 @@ public partial class EntryPointTests
|
|
291
304
|
new("Some.Package", "7.0.1", DependencyType.PackagesConfig, TargetFrameworks: ["net45"])
|
292
305
|
],
|
293
306
|
Properties = [],
|
307
|
+
ReferencedProjectPaths = [],
|
308
|
+
ImportedFiles = [],
|
309
|
+
AdditionalFiles = [
|
310
|
+
"packages.config"
|
311
|
+
],
|
294
312
|
}
|
295
313
|
]
|
296
314
|
}
|
@@ -359,11 +377,13 @@ public partial class EntryPointTests
|
|
359
377
|
new("ManagePackageVersionsCentrally", "false", "path/to/my.csproj"),
|
360
378
|
new("TargetFramework", "net8.0", "path/to/my.csproj"),
|
361
379
|
],
|
380
|
+
ReferencedProjectPaths = [],
|
381
|
+
ImportedFiles = [
|
382
|
+
"../Directory.Build.props"
|
383
|
+
],
|
384
|
+
AdditionalFiles = [],
|
362
385
|
}
|
363
386
|
],
|
364
|
-
ImportedFiles = [
|
365
|
-
"Directory.Build.props"
|
366
|
-
]
|
367
387
|
}
|
368
388
|
);
|
369
389
|
}
|
@@ -373,7 +393,8 @@ public partial class EntryPointTests
|
|
373
393
|
TestFile[] initialFiles,
|
374
394
|
ExpectedWorkspaceDiscoveryResult expectedResult,
|
375
395
|
MockNuGetPackage[]? packages = null,
|
376
|
-
ExperimentsManager? experimentsManager = null
|
396
|
+
ExperimentsManager? experimentsManager = null
|
397
|
+
)
|
377
398
|
{
|
378
399
|
experimentsManager ??= new ExperimentsManager();
|
379
400
|
var actualResult = await RunDiscoveryAsync(initialFiles, async path =>
|
@@ -16,31 +16,33 @@ public partial class AnalyzeWorker : IAnalyzeWorker
|
|
16
16
|
{
|
17
17
|
public const string AnalysisDirectoryName = "./.dependabot/analysis";
|
18
18
|
|
19
|
+
private readonly ExperimentsManager _experimentsManager;
|
19
20
|
private readonly ILogger _logger;
|
20
21
|
|
21
22
|
internal static readonly JsonSerializerOptions SerializerOptions = new()
|
22
23
|
{
|
23
24
|
WriteIndented = true,
|
24
|
-
Converters = { new JsonStringEnumConverter(), new
|
25
|
+
Converters = { new JsonStringEnumConverter(), new RequirementArrayConverter() },
|
25
26
|
};
|
26
27
|
|
27
|
-
public AnalyzeWorker(ILogger logger)
|
28
|
+
public AnalyzeWorker(ExperimentsManager experimentsManager, ILogger logger)
|
28
29
|
{
|
30
|
+
_experimentsManager = experimentsManager;
|
29
31
|
_logger = logger;
|
30
32
|
}
|
31
33
|
|
32
34
|
public async Task RunAsync(string repoRoot, string discoveryPath, string dependencyPath, string analysisDirectory)
|
33
35
|
{
|
34
36
|
var analysisResult = await RunWithErrorHandlingAsync(repoRoot, discoveryPath, dependencyPath);
|
35
|
-
var dependencyInfo = await
|
37
|
+
var dependencyInfo = await DeserializeDependencyInfoFileAsync(dependencyPath);
|
36
38
|
await WriteResultsAsync(analysisDirectory, dependencyInfo.Name, analysisResult, _logger);
|
37
39
|
}
|
38
40
|
|
39
41
|
internal async Task<AnalysisResult> RunWithErrorHandlingAsync(string repoRoot, string discoveryPath, string dependencyPath)
|
40
42
|
{
|
41
43
|
AnalysisResult analysisResult;
|
42
|
-
var discovery = await
|
43
|
-
var dependencyInfo = await
|
44
|
+
var discovery = await DeserializeWorkspaceDiscoveryResultFileAsync(discoveryPath);
|
45
|
+
var dependencyInfo = await DeserializeDependencyInfoFileAsync(dependencyPath);
|
44
46
|
|
45
47
|
try
|
46
48
|
{
|
@@ -68,7 +70,7 @@ public partial class AnalyzeWorker : IAnalyzeWorker
|
|
68
70
|
{
|
69
71
|
var startingDirectory = PathHelper.JoinPath(repoRoot, discovery.Path);
|
70
72
|
|
71
|
-
_logger.
|
73
|
+
_logger.Info($"Starting analysis of {dependencyInfo.Name}...");
|
72
74
|
|
73
75
|
// We need to find all projects which have the given dependency. Even in cases that they
|
74
76
|
// have it transitively may require that peer dependencies be updated in the project.
|
@@ -97,7 +99,7 @@ public partial class AnalyzeWorker : IAnalyzeWorker
|
|
97
99
|
AnalysisResult analysisResult;
|
98
100
|
if (isUpdateNecessary)
|
99
101
|
{
|
100
|
-
_logger.
|
102
|
+
_logger.Info($" Determining multi-dependency property.");
|
101
103
|
var multiDependencies = DetermineMultiDependencyDetails(
|
102
104
|
discovery,
|
103
105
|
dependencyInfo.Name,
|
@@ -117,7 +119,7 @@ public partial class AnalyzeWorker : IAnalyzeWorker
|
|
117
119
|
.ToImmutableArray()
|
118
120
|
: projectFrameworks;
|
119
121
|
|
120
|
-
_logger.
|
122
|
+
_logger.Info($" Finding updated version.");
|
121
123
|
updatedVersion = await FindUpdatedVersionAsync(
|
122
124
|
startingDirectory,
|
123
125
|
dependencyInfo,
|
@@ -127,7 +129,7 @@ public partial class AnalyzeWorker : IAnalyzeWorker
|
|
127
129
|
_logger,
|
128
130
|
CancellationToken.None);
|
129
131
|
|
130
|
-
_logger.
|
132
|
+
_logger.Info($" Finding updated peer dependencies.");
|
131
133
|
if (updatedVersion is null)
|
132
134
|
{
|
133
135
|
updatedDependencies = [];
|
@@ -173,7 +175,7 @@ public partial class AnalyzeWorker : IAnalyzeWorker
|
|
173
175
|
UpdatedDependencies = updatedDependencies,
|
174
176
|
};
|
175
177
|
|
176
|
-
_logger.
|
178
|
+
_logger.Info($"Analysis complete.");
|
177
179
|
return analysisResult;
|
178
180
|
}
|
179
181
|
|
@@ -197,13 +199,28 @@ public partial class AnalyzeWorker : IAnalyzeWorker
|
|
197
199
|
!d.IsTransitive));
|
198
200
|
}
|
199
201
|
|
200
|
-
|
202
|
+
private static Task<WorkspaceDiscoveryResult> DeserializeWorkspaceDiscoveryResultFileAsync(string path)
|
201
203
|
{
|
202
|
-
|
203
|
-
|
204
|
-
|
204
|
+
return DeserializeJsonFileAsync(path, nameof(WorkspaceDiscoveryResult), json => JsonSerializer.Deserialize<WorkspaceDiscoveryResult>(json, SerializerOptions));
|
205
|
+
}
|
206
|
+
|
207
|
+
private static Task<DependencyInfo> DeserializeDependencyInfoFileAsync(string path)
|
208
|
+
{
|
209
|
+
return DeserializeJsonFileAsync(path, nameof(DependencyInfo), DeserializeDependencyInfo);
|
210
|
+
}
|
211
|
+
|
212
|
+
internal static DependencyInfo? DeserializeDependencyInfo(string content)
|
213
|
+
{
|
214
|
+
return JsonSerializer.Deserialize<DependencyInfo>(content, SerializerOptions);
|
215
|
+
}
|
216
|
+
|
217
|
+
private static async Task<T> DeserializeJsonFileAsync<T>(string filePath, string fileType, Func<string, T?> deserializer)
|
218
|
+
{
|
219
|
+
var json = File.Exists(filePath)
|
220
|
+
? await File.ReadAllTextAsync(filePath)
|
221
|
+
: throw new FileNotFoundException($"{fileType} file not found.", filePath);
|
205
222
|
|
206
|
-
return
|
223
|
+
return deserializer(json)
|
207
224
|
?? throw new InvalidOperationException($"{fileType} file is empty.");
|
208
225
|
}
|
209
226
|
|
@@ -468,7 +485,7 @@ public partial class AnalyzeWorker : IAnalyzeWorker
|
|
468
485
|
|
469
486
|
var resultPath = Path.Combine(analysisDirectory, $"{dependencyName}.json");
|
470
487
|
|
471
|
-
logger.
|
488
|
+
logger.Info($" Writing analysis result to [{resultPath}].");
|
472
489
|
|
473
490
|
var resultJson = JsonSerializer.Serialize(result, SerializerOptions);
|
474
491
|
await File.WriteAllTextAsync(path: resultPath, resultJson);
|
@@ -68,7 +68,7 @@ internal static class CompatibilityChecker
|
|
68
68
|
var incompatibleFrameworks = projectFrameworks.Where(f => !compatibleFrameworks.Contains(f)).ToArray();
|
69
69
|
if (incompatibleFrameworks.Length > 0)
|
70
70
|
{
|
71
|
-
logger.
|
71
|
+
logger.Info($"The package {package} is not compatible. Incompatible project frameworks: {string.Join(", ", incompatibleFrameworks.Select(f => f.GetShortFolderName()))}");
|
72
72
|
return false;
|
73
73
|
}
|
74
74
|
|
@@ -80,9 +80,9 @@ internal static class CompatibilityChecker
|
|
80
80
|
NuGetContext nugetContext,
|
81
81
|
CancellationToken cancellationToken)
|
82
82
|
{
|
83
|
-
var
|
84
|
-
var readers = File.Exists(
|
85
|
-
? ReadPackage(
|
83
|
+
var packagePath = GetPackagePath(package, nugetContext);
|
84
|
+
var readers = File.Exists(packagePath)
|
85
|
+
? ReadPackage(packagePath)
|
86
86
|
: await DownloadPackageAsync(package, nugetContext, cancellationToken);
|
87
87
|
return readers;
|
88
88
|
}
|
@@ -134,10 +134,10 @@ internal static class CompatibilityChecker
|
|
134
134
|
return (isDevDependency, tfms.ToImmutableArray());
|
135
135
|
}
|
136
136
|
|
137
|
-
internal static PackageReaders ReadPackage(string
|
137
|
+
internal static PackageReaders ReadPackage(string packagePath)
|
138
138
|
{
|
139
139
|
var stream = new FileStream(
|
140
|
-
|
140
|
+
packagePath,
|
141
141
|
FileMode.Open,
|
142
142
|
FileAccess.Read,
|
143
143
|
FileShare.Read,
|
@@ -194,8 +194,8 @@ internal static class CompatibilityChecker
|
|
194
194
|
context.Logger,
|
195
195
|
cancellationToken);
|
196
196
|
|
197
|
-
var
|
198
|
-
var isDownloaded = await downloader.CopyNupkgFileToAsync(
|
197
|
+
var packagePath = GetPackagePath(package, context);
|
198
|
+
var isDownloaded = await downloader.CopyNupkgFileToAsync(packagePath, cancellationToken);
|
199
199
|
if (!isDownloaded)
|
200
200
|
{
|
201
201
|
continue;
|
@@ -207,6 +207,21 @@ internal static class CompatibilityChecker
|
|
207
207
|
return null;
|
208
208
|
}
|
209
209
|
|
210
|
-
internal static string
|
211
|
-
|
210
|
+
internal static string GetPackagePath(PackageIdentity package, NuGetContext context)
|
211
|
+
{
|
212
|
+
// https://learn.microsoft.com/en-us/nuget/consume-packages/managing-the-global-packages-and-cache-folders
|
213
|
+
var nugetPackagesPath = Environment.GetEnvironmentVariable("NUGET_PACKAGES");
|
214
|
+
if (nugetPackagesPath is null)
|
215
|
+
{
|
216
|
+
// n.b., this path should never be hit during a unit test
|
217
|
+
nugetPackagesPath = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".nuget", "packages");
|
218
|
+
}
|
219
|
+
|
220
|
+
var normalizedName = package.Id.ToLowerInvariant();
|
221
|
+
var normalizedVersion = package.Version.ToNormalizedString().ToLowerInvariant();
|
222
|
+
var packageDirectory = Path.Join(nugetPackagesPath, normalizedName, normalizedVersion);
|
223
|
+
Directory.CreateDirectory(packageDirectory);
|
224
|
+
var packagePath = Path.Join(packageDirectory, $"{normalizedName}.{normalizedVersion}.nupkg");
|
225
|
+
return packagePath;
|
226
|
+
}
|
212
227
|
}
|
@@ -20,7 +20,6 @@ internal record NuGetContext : IDisposable
|
|
20
20
|
public IMachineWideSettings MachineWideSettings { get; }
|
21
21
|
public ImmutableArray<PackageSource> PackageSources { get; }
|
22
22
|
public NuGet.Common.ILogger Logger { get; }
|
23
|
-
public string TempPackageDirectory { get; }
|
24
23
|
|
25
24
|
public NuGetContext(string? currentDirectory = null, NuGet.Common.ILogger? logger = null)
|
26
25
|
{
|
@@ -37,23 +36,11 @@ internal record NuGetContext : IDisposable
|
|
37
36
|
.Where(p => p.IsEnabled)
|
38
37
|
.ToImmutableArray();
|
39
38
|
Logger = logger ?? NullLogger.Instance;
|
40
|
-
TempPackageDirectory = Path.Combine(Path.GetTempPath(), $"dependabot-packages_{Guid.NewGuid():d}");
|
41
|
-
Directory.CreateDirectory(TempPackageDirectory);
|
42
39
|
}
|
43
40
|
|
44
41
|
public void Dispose()
|
45
42
|
{
|
46
43
|
SourceCacheContext.Dispose();
|
47
|
-
if (Directory.Exists(TempPackageDirectory))
|
48
|
-
{
|
49
|
-
try
|
50
|
-
{
|
51
|
-
Directory.Delete(TempPackageDirectory, recursive: true);
|
52
|
-
}
|
53
|
-
catch
|
54
|
-
{
|
55
|
-
}
|
56
|
-
}
|
57
44
|
}
|
58
45
|
|
59
46
|
private readonly Dictionary<PackageIdentity, string?> _packageInfoUrlCache = new();
|
@@ -0,0 +1,39 @@
|
|
1
|
+
using System.Collections.Immutable;
|
2
|
+
using System.Text.Json;
|
3
|
+
using System.Text.Json.Serialization;
|
4
|
+
|
5
|
+
namespace NuGetUpdater.Core.Analyze;
|
6
|
+
|
7
|
+
public class RequirementArrayConverter : JsonConverter<ImmutableArray<Requirement>>
|
8
|
+
{
|
9
|
+
public override ImmutableArray<Requirement> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
10
|
+
{
|
11
|
+
var requirements = new List<Requirement>();
|
12
|
+
var requirementStrings = JsonSerializer.Deserialize<string[]>(ref reader, options) ?? [];
|
13
|
+
foreach (var requirementString in requirementStrings)
|
14
|
+
{
|
15
|
+
try
|
16
|
+
{
|
17
|
+
var requirement = Requirement.Parse(requirementString);
|
18
|
+
requirements.Add(requirement);
|
19
|
+
}
|
20
|
+
catch (ArgumentException)
|
21
|
+
{
|
22
|
+
// couldn't parse, nothing to do
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
return requirements.ToImmutableArray();
|
27
|
+
}
|
28
|
+
|
29
|
+
public override void Write(Utf8JsonWriter writer, ImmutableArray<Requirement> value, JsonSerializerOptions options)
|
30
|
+
{
|
31
|
+
writer.WriteStartArray();
|
32
|
+
foreach (var requirement in value)
|
33
|
+
{
|
34
|
+
writer.WriteStringValue(requirement.ToString());
|
35
|
+
}
|
36
|
+
|
37
|
+
writer.WriteEndArray();
|
38
|
+
}
|
39
|
+
}
|
@@ -62,7 +62,7 @@ internal static class VersionFinder
|
|
62
62
|
var feed = await sourceRepository.GetResourceAsync<MetadataResource>();
|
63
63
|
if (feed is null)
|
64
64
|
{
|
65
|
-
logger.
|
65
|
+
logger.Warn($"Failed to get MetadataResource for [{source.Source}]");
|
66
66
|
continue;
|
67
67
|
}
|
68
68
|
|
@@ -13,7 +13,7 @@ public class ShellGitCommandHandler : IGitCommandHandler
|
|
13
13
|
|
14
14
|
public async Task RunGitCommandAsync(IReadOnlyCollection<string> args, string? workingDirectory = null)
|
15
15
|
{
|
16
|
-
_logger.
|
16
|
+
_logger.Info($"Running command: git {string.Join(" ", args)}{(workingDirectory is null ? "" : $" in directory {workingDirectory}")}");
|
17
17
|
var (exitCode, stdout, stderr) = await ProcessEx.RunAsync("git", args, workingDirectory);
|
18
18
|
HandleErrorsFromOutput(stdout, stderr);
|
19
19
|
}
|