dependabot-nuget 0.287.0 → 0.289.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/.gitignore +1 -0
- data/helpers/lib/NuGetUpdater/Directory.Build.targets +17 -0
- data/helpers/lib/NuGetUpdater/Directory.Packages.props +26 -17
- data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Packaging/NuGet.Packaging.csproj +0 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/DiscoverCommand.cs +7 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Analyze.cs +3 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Discover.cs +88 -47
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +31 -16
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/CompatabilityChecker.cs +1 -1
- 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/DependencyDiscovery.props +7 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/DependencyDiscovery.targets +10 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +64 -53
- 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 +17 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscoveryResult.cs +3 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/ProjectDiscoveryResult.cs +3 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/SdkProjectDiscovery.cs +429 -12
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/WorkspaceDiscoveryResult.cs +0 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +12 -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/NuGetUpdater.Core.csproj +7 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Job.cs +23 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +43 -58
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/TargetFrameworkReporter.targets +13 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectManager.cs +13 -43
- 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 +3 -10
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +40 -33
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +12 -11
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +16 -12
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/CollectionExtensions.cs +17 -0
- 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/MSBuildHelper.cs +74 -20
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/NuGetHelper.cs +1 -17
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathComparer.cs +31 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathHelper.cs +46 -10
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProjectHelper.cs +96 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/AnalyzeWorkerTests.cs +135 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTestBase.cs +71 -38
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.PackagesConfig.cs +66 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Proj.cs +11 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Project.cs +808 -222
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +477 -97
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/ExpectedDiscoveryResults.cs +5 -9
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/SdkProjectDiscoveryTests.cs +494 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/MockNuGetPackage.cs +46 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/NuGetUpdater.Core.Test.csproj +0 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +401 -77
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +35 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/UpdatedDependencyListTests.cs +60 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TemporaryDirectory.cs +3 -2
- 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/UpdateWorkerTestBase.cs +8 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs +40 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +1 -1
- 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 +8 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/PathHelperTests.cs +49 -3
- data/lib/dependabot/nuget/analysis/analysis_json_reader.rb +3 -1
- data/lib/dependabot/nuget/file_fetcher.rb +12 -393
- data/lib/dependabot/nuget/file_parser.rb +23 -54
- data/lib/dependabot/nuget/file_updater.rb +21 -16
- data/lib/dependabot/nuget/native_discovery/native_dependency_file_discovery.rb +2 -9
- data/lib/dependabot/nuget/native_discovery/native_discovery_json_reader.rb +183 -80
- data/lib/dependabot/nuget/native_discovery/native_project_discovery.rb +25 -3
- data/lib/dependabot/nuget/native_discovery/native_workspace_discovery.rb +1 -11
- data/lib/dependabot/nuget/native_helpers.rb +13 -4
- data/lib/dependabot/nuget/native_update_checker/native_update_checker.rb +17 -4
- metadata +15 -12
- data/helpers/lib/NuGetUpdater/NuGetProjects/Directory.Packages.props +0 -29
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementConverter.cs +0 -17
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DirectoryPackagesPropsDiscovery.cs +0 -69
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DirectoryPackagesPropsDiscoveryResult.cs +0 -11
- 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/native_discovery/native_directory_packages_props_discovery.rb +0 -44
@@ -30,7 +30,7 @@ internal static class PackageReferenceUpdater
|
|
30
30
|
ILogger logger)
|
31
31
|
{
|
32
32
|
// PackageReference project; modify the XML directly
|
33
|
-
logger.
|
33
|
+
logger.Info(" Running 'PackageReference' project direct XML update");
|
34
34
|
|
35
35
|
(ImmutableArray<ProjectBuildFile> buildFiles, string[] tfms) = await MSBuildHelper.LoadBuildFilesAndTargetFrameworksAsync(repoRootPath, projectPath);
|
36
36
|
|
@@ -61,6 +61,11 @@ internal static class PackageReferenceUpdater
|
|
61
61
|
}
|
62
62
|
else
|
63
63
|
{
|
64
|
+
if (peerDependencies is null)
|
65
|
+
{
|
66
|
+
return;
|
67
|
+
}
|
68
|
+
|
64
69
|
await UpdateDependencyWithConflictResolution(repoRootPath, buildFiles, tfms, projectPath, dependencyName, previousDependencyVersion, newDependencyVersion, isTransitive, peerDependencies, logger);
|
65
70
|
}
|
66
71
|
|
@@ -105,7 +110,7 @@ internal static class PackageReferenceUpdater
|
|
105
110
|
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRootPath, projectFile.Path, tfm, topLevelDependencies, dependenciesToUpdate, logger);
|
106
111
|
if (resolvedDependencies is null)
|
107
112
|
{
|
108
|
-
logger.
|
113
|
+
logger.Warn($" Unable to resolve dependency conflicts for {projectFile.Path}.");
|
109
114
|
continue;
|
110
115
|
}
|
111
116
|
|
@@ -184,14 +189,14 @@ internal static class PackageReferenceUpdater
|
|
184
189
|
// Skip updating the project if the dependency does not exist in the graph
|
185
190
|
if (!packageFound)
|
186
191
|
{
|
187
|
-
logger.
|
192
|
+
logger.Info($" Package [{dependencyName}] Does not exist as a dependency in [{projectPath}].");
|
188
193
|
return false;
|
189
194
|
}
|
190
195
|
|
191
196
|
// Skip updating the project if the dependency version meets or exceeds the newDependencyVersion
|
192
197
|
if (!needsUpdate)
|
193
198
|
{
|
194
|
-
logger.
|
199
|
+
logger.Info($" Package [{dependencyName}] already meets the requested dependency version in [{projectPath}].");
|
195
200
|
return false;
|
196
201
|
}
|
197
202
|
|
@@ -242,7 +247,7 @@ internal static class PackageReferenceUpdater
|
|
242
247
|
a.Value.Equals(dependencyName, StringComparison.OrdinalIgnoreCase)))
|
243
248
|
.FirstOrDefault();
|
244
249
|
|
245
|
-
logger.
|
250
|
+
logger.Info($" Pinning [{dependencyName}/{newDependencyVersion}] as a package version.");
|
246
251
|
|
247
252
|
var lastPackageVersion = directoryPackages.ItemNodes
|
248
253
|
.Where(e => e.Name.Equals("PackageVersion", StringComparison.OrdinalIgnoreCase))
|
@@ -250,7 +255,7 @@ internal static class PackageReferenceUpdater
|
|
250
255
|
|
251
256
|
if (lastPackageVersion is null)
|
252
257
|
{
|
253
|
-
logger.
|
258
|
+
logger.Info($" Transitive dependency [{dependencyName}/{newDependencyVersion}] was not pinned.");
|
254
259
|
return;
|
255
260
|
}
|
256
261
|
|
@@ -260,7 +265,7 @@ internal static class PackageReferenceUpdater
|
|
260
265
|
if (existingPackageVersionElement is null)
|
261
266
|
{
|
262
267
|
// need to add a new entry
|
263
|
-
logger.
|
268
|
+
logger.Info(" New PackageVersion element added.");
|
264
269
|
var leadingTrivia = lastPackageVersion.AsNode.GetLeadingTrivia();
|
265
270
|
var packageVersionElement = XmlExtensions.CreateSingleLineXmlElementSyntax("PackageVersion", new SyntaxList<SyntaxNode>(leadingTrivia))
|
266
271
|
.WithAttribute("Include", dependencyName)
|
@@ -274,19 +279,19 @@ internal static class PackageReferenceUpdater
|
|
274
279
|
if (versionAttribute is null)
|
275
280
|
{
|
276
281
|
// need to add the version
|
277
|
-
logger.
|
282
|
+
logger.Info(" Adding version attribute to element.");
|
278
283
|
updatedPackageVersionElement = existingPackageVersionElement.WithAttribute("Version", newDependencyVersion);
|
279
284
|
}
|
280
285
|
else if (!versionAttribute.Value.Equals(newDependencyVersion, StringComparison.OrdinalIgnoreCase))
|
281
286
|
{
|
282
287
|
// need to update the version
|
283
|
-
logger.
|
288
|
+
logger.Info($" Updating version attribute of [{versionAttribute.Value}].");
|
284
289
|
var updatedVersionAttribute = versionAttribute.WithValue(newDependencyVersion);
|
285
290
|
updatedPackageVersionElement = existingPackageVersionElement.ReplaceAttribute(versionAttribute, updatedVersionAttribute);
|
286
291
|
}
|
287
292
|
else
|
288
293
|
{
|
289
|
-
logger.
|
294
|
+
logger.Info(" Existing PackageVersion element version was already correct.");
|
290
295
|
return;
|
291
296
|
}
|
292
297
|
|
@@ -302,15 +307,17 @@ internal static class PackageReferenceUpdater
|
|
302
307
|
var projectDirectory = Path.GetDirectoryName(projectPath)!;
|
303
308
|
await MSBuildHelper.SidelineGlobalJsonAsync(projectDirectory, repoRootPath, async () =>
|
304
309
|
{
|
305
|
-
logger.
|
310
|
+
logger.Info($" Adding [{dependencyName}/{newDependencyVersion}] as a top-level package reference.");
|
306
311
|
|
307
312
|
// see https://learn.microsoft.com/nuget/consume-packages/install-use-packages-dotnet-cli
|
308
313
|
var (exitCode, stdout, stderr) = await ProcessEx.RunAsync("dotnet", ["add", projectPath, "package", dependencyName, "--version", newDependencyVersion], workingDirectory: projectDirectory);
|
309
314
|
MSBuildHelper.ThrowOnUnauthenticatedFeed(stdout);
|
310
315
|
if (exitCode != 0)
|
311
316
|
{
|
312
|
-
logger.
|
317
|
+
logger.Warn($" Transitive dependency [{dependencyName}/{newDependencyVersion}] was not added.\nSTDOUT:\n{stdout}\nSTDERR:\n{stderr}");
|
313
318
|
}
|
319
|
+
|
320
|
+
return exitCode;
|
314
321
|
}, logger, retainMSBuildSdks: true);
|
315
322
|
}
|
316
323
|
|
@@ -337,7 +344,7 @@ internal static class PackageReferenceUpdater
|
|
337
344
|
var unupgradableTfms = tfmsAndDependencies.Where(kvp => !kvp.Value.Any()).Select(kvp => kvp.Key);
|
338
345
|
if (unupgradableTfms.Any())
|
339
346
|
{
|
340
|
-
logger.
|
347
|
+
logger.Info($" The following target frameworks could not find packages to upgrade: {string.Join(", ", unupgradableTfms)}");
|
341
348
|
return null;
|
342
349
|
}
|
343
350
|
|
@@ -352,7 +359,7 @@ internal static class PackageReferenceUpdater
|
|
352
359
|
if (packagesAndVersions.TryGetValue(packageName, out var existingVersion) &&
|
353
360
|
existingVersion != packageVersion)
|
354
361
|
{
|
355
|
-
logger.
|
362
|
+
logger.Info($" Package [{packageName}] tried to update to version [{packageVersion}], but found conflicting package version of [{existingVersion}].");
|
356
363
|
conflictingPackageVersionsFound = true;
|
357
364
|
}
|
358
365
|
else
|
@@ -385,7 +392,7 @@ internal static class PackageReferenceUpdater
|
|
385
392
|
var result = TryUpdateDependencyVersion(buildFiles, dependencyName, previousDependencyVersion, newDependencyVersion, logger);
|
386
393
|
if (result == UpdateResult.NotFound)
|
387
394
|
{
|
388
|
-
logger.
|
395
|
+
logger.Info($" Root package [{dependencyName}/{previousDependencyVersion}] was not updated; skipping dependencies.");
|
389
396
|
return;
|
390
397
|
}
|
391
398
|
|
@@ -403,7 +410,7 @@ internal static class PackageReferenceUpdater
|
|
403
410
|
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsWithBruteForce(repoRootPath, projectFile.Path, tfm, updatedTopLevelDependencies, logger);
|
404
411
|
if (resolvedDependencies is null)
|
405
412
|
{
|
406
|
-
logger.
|
413
|
+
logger.Info($" Unable to resolve dependency conflicts for {projectFile.Path}.");
|
407
414
|
continue;
|
408
415
|
}
|
409
416
|
|
@@ -411,13 +418,13 @@ internal static class PackageReferenceUpdater
|
|
411
418
|
var specificResolvedDependency = resolvedDependencies.Where(d => d.Name.Equals(dependencyName, StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
|
412
419
|
if (specificResolvedDependency is null)
|
413
420
|
{
|
414
|
-
logger.
|
421
|
+
logger.Info($" Unable to resolve requested dependency for {dependencyName} in {projectFile.Path}.");
|
415
422
|
continue;
|
416
423
|
}
|
417
424
|
|
418
425
|
if (!newDependencyVersion.Equals(specificResolvedDependency.Version, StringComparison.OrdinalIgnoreCase))
|
419
426
|
{
|
420
|
-
logger.
|
427
|
+
logger.Info($" Inconsistent resolution for {dependencyName}; attempted upgrade to {newDependencyVersion} but resolved {specificResolvedDependency.Version}.");
|
421
428
|
continue;
|
422
429
|
}
|
423
430
|
|
@@ -474,12 +481,12 @@ internal static class PackageReferenceUpdater
|
|
474
481
|
var currentVersion = versionAttribute.Value.TrimStart('[', '(').TrimEnd(']', ')');
|
475
482
|
if (currentVersion.Contains(',') || currentVersion.Contains('*'))
|
476
483
|
{
|
477
|
-
logger.
|
484
|
+
logger.Warn($" Found unsupported [{packageNode.Name}] version attribute value [{versionAttribute.Value}] in [{buildFile.RelativePath}].");
|
478
485
|
foundUnsupported = true;
|
479
486
|
}
|
480
487
|
else if (string.Equals(currentVersion, previousDependencyVersion, StringComparison.Ordinal))
|
481
488
|
{
|
482
|
-
logger.
|
489
|
+
logger.Info($" Found incorrect [{packageNode.Name}] version attribute in [{buildFile.RelativePath}].");
|
483
490
|
updateNodes.Add(versionAttribute);
|
484
491
|
}
|
485
492
|
else if (previousDependencyVersion == null && NuGetVersion.TryParse(currentVersion, out var previousVersion))
|
@@ -489,13 +496,13 @@ internal static class PackageReferenceUpdater
|
|
489
496
|
{
|
490
497
|
previousPackageVersion = currentVersion;
|
491
498
|
|
492
|
-
logger.
|
499
|
+
logger.Info($" Found incorrect peer [{packageNode.Name}] version attribute in [{buildFile.RelativePath}].");
|
493
500
|
updateNodes.Add(versionAttribute);
|
494
501
|
}
|
495
502
|
}
|
496
503
|
else if (string.Equals(currentVersion, newDependencyVersion, StringComparison.Ordinal))
|
497
504
|
{
|
498
|
-
logger.
|
505
|
+
logger.Info($" Found correct [{packageNode.Name}] version attribute in [{buildFile.RelativePath}].");
|
499
506
|
foundCorrect = true;
|
500
507
|
}
|
501
508
|
}
|
@@ -512,12 +519,12 @@ internal static class PackageReferenceUpdater
|
|
512
519
|
var currentVersion = versionValue.TrimStart('[', '(').TrimEnd(']', ')');
|
513
520
|
if (currentVersion.Contains(',') || currentVersion.Contains('*'))
|
514
521
|
{
|
515
|
-
logger.
|
522
|
+
logger.Info($" Found unsupported [{packageNode.Name}] version node value [{versionValue}] in [{buildFile.RelativePath}].");
|
516
523
|
foundUnsupported = true;
|
517
524
|
}
|
518
525
|
else if (currentVersion == previousDependencyVersion)
|
519
526
|
{
|
520
|
-
logger.
|
527
|
+
logger.Info($" Found incorrect [{packageNode.Name}] version node in [{buildFile.RelativePath}].");
|
521
528
|
if (versionElement is XmlElementSyntax elementSyntax)
|
522
529
|
{
|
523
530
|
updateNodes.Add(elementSyntax);
|
@@ -534,7 +541,7 @@ internal static class PackageReferenceUpdater
|
|
534
541
|
{
|
535
542
|
previousPackageVersion = currentVersion;
|
536
543
|
|
537
|
-
logger.
|
544
|
+
logger.Info($" Found incorrect peer [{packageNode.Name}] version node in [{buildFile.RelativePath}].");
|
538
545
|
if (versionElement is XmlElementSyntax elementSyntax)
|
539
546
|
{
|
540
547
|
updateNodes.Add(elementSyntax);
|
@@ -548,7 +555,7 @@ internal static class PackageReferenceUpdater
|
|
548
555
|
}
|
549
556
|
else if (currentVersion == newDependencyVersion)
|
550
557
|
{
|
551
|
-
logger.
|
558
|
+
logger.Info($" Found correct [{packageNode.Name}] version node in [{buildFile.RelativePath}].");
|
552
559
|
foundCorrect = true;
|
553
560
|
}
|
554
561
|
}
|
@@ -556,7 +563,7 @@ internal static class PackageReferenceUpdater
|
|
556
563
|
else
|
557
564
|
{
|
558
565
|
// We weren't able to find the version node. Central package management?
|
559
|
-
logger.
|
566
|
+
logger.Warn(" Found package reference but was unable to locate version information.");
|
560
567
|
}
|
561
568
|
}
|
562
569
|
|
@@ -624,12 +631,12 @@ internal static class PackageReferenceUpdater
|
|
624
631
|
var currentVersion = propertyContents.TrimStart('[', '(').TrimEnd(']', ')');
|
625
632
|
if (currentVersion.Contains(',') || currentVersion.Contains('*'))
|
626
633
|
{
|
627
|
-
logger.
|
634
|
+
logger.Warn($" Found unsupported version property [{propertyElement.Name}] value [{propertyContents}] in [{buildFile.RelativePath}].");
|
628
635
|
foundUnsupported = true;
|
629
636
|
}
|
630
637
|
else if (currentVersion == previousDependencyVersion)
|
631
638
|
{
|
632
|
-
logger.
|
639
|
+
logger.Info($" Found incorrect version property [{propertyElement.Name}] in [{buildFile.RelativePath}].");
|
633
640
|
updateProperties.Add((XmlElementSyntax)propertyElement.AsNode);
|
634
641
|
}
|
635
642
|
else if (previousDependencyVersion is null && NuGetVersion.TryParse(currentVersion, out var previousVersion))
|
@@ -639,13 +646,13 @@ internal static class PackageReferenceUpdater
|
|
639
646
|
{
|
640
647
|
previousPackageVersion = currentVersion;
|
641
648
|
|
642
|
-
logger.
|
649
|
+
logger.Info($" Found incorrect peer version property [{propertyElement.Name}] in [{buildFile.RelativePath}].");
|
643
650
|
updateProperties.Add((XmlElementSyntax)propertyElement.AsNode);
|
644
651
|
}
|
645
652
|
}
|
646
653
|
else if (currentVersion == newDependencyVersion)
|
647
654
|
{
|
648
|
-
logger.
|
655
|
+
logger.Info($" Found correct version property [{propertyElement.Name}] in [{buildFile.RelativePath}].");
|
649
656
|
foundCorrect = true;
|
650
657
|
}
|
651
658
|
}
|
@@ -699,7 +706,7 @@ internal static class PackageReferenceUpdater
|
|
699
706
|
var dependenciesAreCoherent = await MSBuildHelper.DependenciesAreCoherentAsync(repoRootPath, projectPath, tfm, updatedPackages, logger);
|
700
707
|
if (!dependenciesAreCoherent)
|
701
708
|
{
|
702
|
-
logger.
|
709
|
+
logger.Warn($" Package [{dependencyName}] could not be updated in [{projectPath}] because it would cause a dependency conflict.");
|
703
710
|
return false;
|
704
711
|
}
|
705
712
|
}
|
@@ -713,7 +720,7 @@ internal static class PackageReferenceUpdater
|
|
713
720
|
{
|
714
721
|
if (await buildFile.SaveAsync())
|
715
722
|
{
|
716
|
-
logger.
|
723
|
+
logger.Info($" Saved [{buildFile.RelativePath}].");
|
717
724
|
}
|
718
725
|
}
|
719
726
|
}
|
@@ -9,6 +9,7 @@ using Microsoft.Language.Xml;
|
|
9
9
|
using NuGet.CommandLine;
|
10
10
|
|
11
11
|
using NuGetUpdater.Core.Updater;
|
12
|
+
using NuGetUpdater.Core.Utilities;
|
12
13
|
|
13
14
|
using Console = System.Console;
|
14
15
|
|
@@ -35,18 +36,18 @@ internal static class PackagesConfigUpdater
|
|
35
36
|
)
|
36
37
|
{
|
37
38
|
// packages.config project; use NuGet.exe to perform update
|
38
|
-
logger.
|
39
|
+
logger.Info($" Found '{ProjectHelper.PackagesConfigFileName}' project; running NuGet.exe update");
|
39
40
|
|
40
41
|
// ensure local packages directory exists
|
41
42
|
var projectBuildFile = ProjectBuildFile.Open(repoRootPath, projectPath);
|
42
43
|
var packagesSubDirectory = GetPathToPackagesDirectory(projectBuildFile, dependencyName, previousDependencyVersion, packagesConfigPath);
|
43
44
|
if (packagesSubDirectory is null)
|
44
45
|
{
|
45
|
-
logger.
|
46
|
+
logger.Info($" Project [{projectPath}] does not reference this dependency.");
|
46
47
|
return;
|
47
48
|
}
|
48
49
|
|
49
|
-
logger.
|
50
|
+
logger.Info($" Using packages directory [{packagesSubDirectory}] for project [{projectPath}].");
|
50
51
|
|
51
52
|
var projectDirectory = Path.GetDirectoryName(projectPath);
|
52
53
|
var packagesDirectory = PathHelper.JoinPath(projectDirectory, packagesSubDirectory);
|
@@ -74,7 +75,7 @@ internal static class PackagesConfigUpdater
|
|
74
75
|
"-NonInteractive",
|
75
76
|
};
|
76
77
|
|
77
|
-
logger.
|
78
|
+
logger.Info(" Finding MSBuild...");
|
78
79
|
var msbuildDirectory = MSBuildHelper.MSBuildPath;
|
79
80
|
if (msbuildDirectory is not null)
|
80
81
|
{
|
@@ -96,7 +97,7 @@ internal static class PackagesConfigUpdater
|
|
96
97
|
// Update binding redirects
|
97
98
|
await BindingRedirectManager.UpdateBindingRedirectsAsync(projectBuildFile, dependencyName, newDependencyVersion);
|
98
99
|
|
99
|
-
logger.
|
100
|
+
logger.Info(" Writing project file back to disk");
|
100
101
|
await projectBuildFile.SaveAsync();
|
101
102
|
}
|
102
103
|
|
@@ -118,12 +119,12 @@ internal static class PackagesConfigUpdater
|
|
118
119
|
var retryingAfterRestore = false;
|
119
120
|
|
120
121
|
doRestore:
|
121
|
-
logger.
|
122
|
+
logger.Info($" Running NuGet.exe with args: {string.Join(" ", updateArgs)}");
|
122
123
|
outputBuilder.Clear();
|
123
124
|
var result = Program.Main(updateArgs.ToArray());
|
124
125
|
var fullOutput = outputBuilder.ToString();
|
125
|
-
logger.
|
126
|
-
logger.
|
126
|
+
logger.Info($" Result: {result}");
|
127
|
+
logger.Info($" Output:\n{fullOutput}");
|
127
128
|
if (result != 0)
|
128
129
|
{
|
129
130
|
// The initial `update` command can fail for several reasons:
|
@@ -140,7 +141,7 @@ internal static class PackagesConfigUpdater
|
|
140
141
|
if (!retryingAfterRestore && OutputIndicatesRestoreIsRequired(fullOutput))
|
141
142
|
{
|
142
143
|
retryingAfterRestore = true;
|
143
|
-
logger.
|
144
|
+
logger.Info($" Running NuGet.exe with args: {string.Join(" ", restoreArgs)}");
|
144
145
|
outputBuilder.Clear();
|
145
146
|
var exitCodeAgain = Program.Main(restoreArgs.ToArray());
|
146
147
|
var restoreOutput = outputBuilder.ToString();
|
@@ -164,7 +165,7 @@ internal static class PackagesConfigUpdater
|
|
164
165
|
}
|
165
166
|
catch (Exception e)
|
166
167
|
{
|
167
|
-
logger.
|
168
|
+
logger.Info($"Error: {e}");
|
168
169
|
throw;
|
169
170
|
}
|
170
171
|
finally
|
@@ -178,7 +179,7 @@ internal static class PackagesConfigUpdater
|
|
178
179
|
var deltaSpawnedProcesses = currentSpawnedProcesses.Except(existingSpawnedProcesses).ToArray();
|
179
180
|
foreach (var credProvider in deltaSpawnedProcesses)
|
180
181
|
{
|
181
|
-
logger.
|
182
|
+
logger.Info($"Ending spawned credential provider process");
|
182
183
|
credProvider.Kill();
|
183
184
|
}
|
184
185
|
}
|
@@ -4,6 +4,7 @@ using System.Text.Json.Serialization;
|
|
4
4
|
|
5
5
|
using NuGetUpdater.Core.Analyze;
|
6
6
|
using NuGetUpdater.Core.Updater;
|
7
|
+
using NuGetUpdater.Core.Utilities;
|
7
8
|
|
8
9
|
namespace NuGetUpdater.Core;
|
9
10
|
|
@@ -114,11 +115,11 @@ public class UpdaterWorker : IUpdaterWorker
|
|
114
115
|
await RunForProjectAsync(repoRootPath, workspacePath, dependencyName, previousDependencyVersion, newDependencyVersion, isTransitive);
|
115
116
|
break;
|
116
117
|
default:
|
117
|
-
_logger.
|
118
|
+
_logger.Info($"File extension [{extension}] is not supported.");
|
118
119
|
break;
|
119
120
|
}
|
120
121
|
|
121
|
-
_logger.
|
122
|
+
_logger.Info("Update complete.");
|
122
123
|
|
123
124
|
_processedProjectPaths.Clear();
|
124
125
|
return new UpdateOperationResult();
|
@@ -126,7 +127,7 @@ public class UpdaterWorker : IUpdaterWorker
|
|
126
127
|
|
127
128
|
internal static async Task WriteResultFile(UpdateOperationResult result, string resultOutputPath, ILogger logger)
|
128
129
|
{
|
129
|
-
logger.
|
130
|
+
logger.Info($" Writing update result to [{resultOutputPath}].");
|
130
131
|
|
131
132
|
var resultJson = JsonSerializer.Serialize(result, SerializerOptions);
|
132
133
|
await File.WriteAllTextAsync(resultOutputPath, resultJson);
|
@@ -140,7 +141,7 @@ public class UpdaterWorker : IUpdaterWorker
|
|
140
141
|
string newDependencyVersion,
|
141
142
|
bool isTransitive)
|
142
143
|
{
|
143
|
-
_logger.
|
144
|
+
_logger.Info($"Running for solution [{Path.GetRelativePath(repoRootPath, solutionPath)}]");
|
144
145
|
var projectPaths = MSBuildHelper.GetProjectPathsFromSolution(solutionPath);
|
145
146
|
foreach (var projectPath in projectPaths)
|
146
147
|
{
|
@@ -156,10 +157,10 @@ public class UpdaterWorker : IUpdaterWorker
|
|
156
157
|
string newDependencyVersion,
|
157
158
|
bool isTransitive)
|
158
159
|
{
|
159
|
-
_logger.
|
160
|
+
_logger.Info($"Running for proj file [{Path.GetRelativePath(repoRootPath, projFilePath)}]");
|
160
161
|
if (!File.Exists(projFilePath))
|
161
162
|
{
|
162
|
-
_logger.
|
163
|
+
_logger.Info($"File [{projFilePath}] does not exist.");
|
163
164
|
return;
|
164
165
|
}
|
165
166
|
|
@@ -182,10 +183,10 @@ public class UpdaterWorker : IUpdaterWorker
|
|
182
183
|
string newDependencyVersion,
|
183
184
|
bool isTransitive)
|
184
185
|
{
|
185
|
-
_logger.
|
186
|
+
_logger.Info($"Running for project file [{Path.GetRelativePath(repoRootPath, projectPath)}]");
|
186
187
|
if (!File.Exists(projectPath))
|
187
188
|
{
|
188
|
-
_logger.
|
189
|
+
_logger.Info($"File [{projectPath}] does not exist.");
|
189
190
|
return;
|
190
191
|
}
|
191
192
|
|
@@ -215,18 +216,21 @@ public class UpdaterWorker : IUpdaterWorker
|
|
215
216
|
|
216
217
|
_processedProjectPaths.Add(projectPath);
|
217
218
|
|
218
|
-
_logger.
|
219
|
+
_logger.Info($"Updating project [{projectPath}]");
|
219
220
|
|
220
|
-
|
221
|
+
var additionalFiles = ProjectHelper.GetAllAdditionalFilesFromProject(projectPath, ProjectHelper.PathFormat.Full);
|
222
|
+
var packagesConfigFullPath = additionalFiles.Where(p => Path.GetFileName(p).Equals(ProjectHelper.PackagesConfigFileName, StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
|
223
|
+
if (packagesConfigFullPath is not null)
|
221
224
|
{
|
222
|
-
await PackagesConfigUpdater.UpdateDependencyAsync(repoRootPath, projectPath, dependencyName, previousDependencyVersion, newDependencyVersion,
|
225
|
+
await PackagesConfigUpdater.UpdateDependencyAsync(repoRootPath, projectPath, dependencyName, previousDependencyVersion, newDependencyVersion, packagesConfigFullPath, _logger);
|
223
226
|
}
|
224
227
|
|
225
228
|
// Some repos use a mix of packages.config and PackageReference
|
226
229
|
await PackageReferenceUpdater.UpdateDependencyAsync(repoRootPath, projectPath, dependencyName, previousDependencyVersion, newDependencyVersion, isTransitive, _experimentsManager, _logger);
|
227
230
|
|
228
231
|
// Update lock file if exists
|
229
|
-
|
232
|
+
var packagesLockFullPath = additionalFiles.Where(p => Path.GetFileName(p).Equals(ProjectHelper.PackagesLockJsonFileName, StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
|
233
|
+
if (packagesLockFullPath is not null)
|
230
234
|
{
|
231
235
|
await LockFileUpdater.UpdateLockFileAsync(repoRootPath, projectPath, _logger);
|
232
236
|
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
using Newtonsoft.Json.Linq;
|
2
|
+
|
3
|
+
namespace NuGetUpdater.Core.Utilities;
|
4
|
+
|
5
|
+
public static class CollectionExtensions
|
6
|
+
{
|
7
|
+
public static TValue GetOrAdd<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TKey key, Func<TValue> valueFactory) where TKey : notnull
|
8
|
+
{
|
9
|
+
if (!dictionary.TryGetValue(key, out var value))
|
10
|
+
{
|
11
|
+
value = valueFactory();
|
12
|
+
dictionary[key] = value;
|
13
|
+
}
|
14
|
+
|
15
|
+
return value;
|
16
|
+
}
|
17
|
+
}
|
@@ -136,7 +136,7 @@ public class PackageManager
|
|
136
136
|
}
|
137
137
|
|
138
138
|
// Method to get the dependencies of a package
|
139
|
-
public async Task<List<PackageToUpdate>> GetDependenciesAsync(PackageToUpdate package, string targetFramework, string projectDirectory)
|
139
|
+
public async Task<List<PackageToUpdate>> GetDependenciesAsync(PackageToUpdate package, string targetFramework, string projectDirectory, ILogger logger)
|
140
140
|
{
|
141
141
|
if (!NuGetVersion.TryParse(package.NewVersion, out var otherVersion))
|
142
142
|
{
|
@@ -235,24 +235,24 @@ public class PackageManager
|
|
235
235
|
}
|
236
236
|
else
|
237
237
|
{
|
238
|
-
|
238
|
+
logger.Info("No compatible framework found.");
|
239
239
|
}
|
240
240
|
}
|
241
241
|
catch (HttpRequestException ex)
|
242
242
|
{
|
243
|
-
|
243
|
+
logger.Error($"HTTP error occurred: {ex.Message}");
|
244
244
|
}
|
245
245
|
catch (ArgumentNullException ex)
|
246
246
|
{
|
247
|
-
|
247
|
+
logger.Error($"Argument is null error: {ex.ParamName}, {ex.Message}");
|
248
248
|
}
|
249
249
|
catch (InvalidOperationException ex)
|
250
250
|
{
|
251
|
-
|
251
|
+
logger.Error($"Invalid operation exception: {ex.Message}");
|
252
252
|
}
|
253
253
|
catch (Exception ex)
|
254
254
|
{
|
255
|
-
|
255
|
+
logger.Error($"An error occurred: {ex.Message}");
|
256
256
|
}
|
257
257
|
|
258
258
|
return dependencyList;
|
@@ -287,12 +287,12 @@ public class PackageManager
|
|
287
287
|
}
|
288
288
|
|
289
289
|
// Method to get the dependencies of a package and add them as a dependency
|
290
|
-
public async Task PopulatePackageDependenciesAsync(List<PackageToUpdate> packages, string targetFramework, string projectDirectory)
|
290
|
+
public async Task PopulatePackageDependenciesAsync(List<PackageToUpdate> packages, string targetFramework, string projectDirectory, ILogger logger)
|
291
291
|
{
|
292
292
|
// Loop through each package and get their dependencies
|
293
293
|
foreach (PackageToUpdate package in packages)
|
294
294
|
{
|
295
|
-
List<PackageToUpdate> dependencies = await GetDependenciesAsync(package, targetFramework, projectDirectory);
|
295
|
+
List<PackageToUpdate> dependencies = await GetDependenciesAsync(package, targetFramework, projectDirectory, logger);
|
296
296
|
|
297
297
|
if (dependencies == null)
|
298
298
|
{
|
@@ -366,7 +366,7 @@ public class PackageManager
|
|
366
366
|
package.CurrentVersion = package.NewVersion;
|
367
367
|
|
368
368
|
// Check if the current package has dependencies
|
369
|
-
List<PackageToUpdate> dependencyList = await GetDependenciesAsync(package, targetFramework, projectDirectory);
|
369
|
+
List<PackageToUpdate> dependencyList = await GetDependenciesAsync(package, targetFramework, projectDirectory, logger);
|
370
370
|
|
371
371
|
// If there are dependencies
|
372
372
|
if (dependencyList != null)
|
@@ -426,7 +426,7 @@ public class PackageManager
|
|
426
426
|
|
427
427
|
foreach (PackageToUpdate parent in parentPackages)
|
428
428
|
{
|
429
|
-
bool isCompatible = await IsCompatibleAsync(parent, package, targetFramework, projectDirectory);
|
429
|
+
bool isCompatible = await IsCompatibleAsync(parent, package, targetFramework, projectDirectory, logger);
|
430
430
|
|
431
431
|
// If the parent and package are not compatible
|
432
432
|
if (!isCompatible)
|
@@ -446,7 +446,7 @@ public class PackageManager
|
|
446
446
|
// If it's compatible and the package you updated wasn't in the existing package, check if the parent's dependencies version is the same as the current version
|
447
447
|
else if (isCompatible == true && inExisting == false)
|
448
448
|
{
|
449
|
-
List<PackageToUpdate> dependencyListParent = await GetDependenciesAsync(parent, targetFramework, projectDirectory);
|
449
|
+
List<PackageToUpdate> dependencyListParent = await GetDependenciesAsync(parent, targetFramework, projectDirectory, logger);
|
450
450
|
|
451
451
|
PackageToUpdate parentDependency = dependencyListParent.FirstOrDefault(p => string.Compare(p.PackageName, package.PackageName, StringComparison.OrdinalIgnoreCase) == 0);
|
452
452
|
|
@@ -478,7 +478,7 @@ public class PackageManager
|
|
478
478
|
parent.NewVersion = parentVersion;
|
479
479
|
|
480
480
|
// Check if the parent needs to be updated since the child isn't in the existing package list and the parent can update to a newer version to remove the dependency
|
481
|
-
List<PackageToUpdate> dependencyListParentTemp = await GetDependenciesAsync(parent, targetFramework, projectDirectory);
|
481
|
+
List<PackageToUpdate> dependencyListParentTemp = await GetDependenciesAsync(parent, targetFramework, projectDirectory, logger);
|
482
482
|
PackageToUpdate parentDependencyTemp = dependencyListParentTemp.FirstOrDefault(p => string.Compare(p.PackageName, package.PackageName, StringComparison.OrdinalIgnoreCase) == 0);
|
483
483
|
|
484
484
|
// If the newer package version of the parent has the same version as the parent's previous dependency, update
|
@@ -499,7 +499,7 @@ public class PackageManager
|
|
499
499
|
|
500
500
|
else
|
501
501
|
{
|
502
|
-
|
502
|
+
logger.Info("Current version is >= latest version");
|
503
503
|
}
|
504
504
|
}
|
505
505
|
catch
|
@@ -511,10 +511,10 @@ public class PackageManager
|
|
511
511
|
}
|
512
512
|
|
513
513
|
// Method to determine if a parent and child are compatible with their versions
|
514
|
-
public async Task<bool> IsCompatibleAsync(PackageToUpdate parent, PackageToUpdate child, string targetFramework, string projectDirectory)
|
514
|
+
public async Task<bool> IsCompatibleAsync(PackageToUpdate parent, PackageToUpdate child, string targetFramework, string projectDirectory, ILogger logger)
|
515
515
|
{
|
516
516
|
// Get the dependencies of the parent
|
517
|
-
List<PackageToUpdate> dependencies = await GetDependenciesAsync(parent, targetFramework, projectDirectory);
|
517
|
+
List<PackageToUpdate> dependencies = await GetDependenciesAsync(parent, targetFramework, projectDirectory, logger);
|
518
518
|
|
519
519
|
foreach (PackageToUpdate dependency in dependencies)
|
520
520
|
{
|
@@ -613,7 +613,7 @@ public class PackageManager
|
|
613
613
|
}
|
614
614
|
|
615
615
|
// Check if there's compatibility with parent and dependency
|
616
|
-
if (await IsCompatibleAsync(possibleParent, possibleDependency, targetFramework, nugetContext.CurrentDirectory))
|
616
|
+
if (await IsCompatibleAsync(possibleParent, possibleDependency, targetFramework, nugetContext.CurrentDirectory, logger))
|
617
617
|
{
|
618
618
|
// Check if parents are compatible, recursively
|
619
619
|
if (await AreAllParentsCompatibleAsync(existingPackages, possibleParent, targetFramework, nugetContext.CurrentDirectory, logger))
|
@@ -641,7 +641,7 @@ public class PackageManager
|
|
641
641
|
foreach (PackageToUpdate parent in parentPackages)
|
642
642
|
{
|
643
643
|
// Check compatibility between the possibleParent and current parent
|
644
|
-
bool isCompatible = await IsCompatibleAsync(parent, possibleParent, targetFramework, projectDirectory);
|
644
|
+
bool isCompatible = await IsCompatibleAsync(parent, possibleParent, targetFramework, projectDirectory, logger);
|
645
645
|
|
646
646
|
// If the possibleParent and parent are not compatible
|
647
647
|
if (!isCompatible)
|
@@ -668,7 +668,7 @@ public class PackageManager
|
|
668
668
|
}
|
669
669
|
|
670
670
|
// Method to update the existing packages with new version of the desired packages to update
|
671
|
-
public void UpdateExistingPackagesWithNewVersions(List<PackageToUpdate> existingPackages, List<PackageToUpdate> packagesToUpdate)
|
671
|
+
public void UpdateExistingPackagesWithNewVersions(List<PackageToUpdate> existingPackages, List<PackageToUpdate> packagesToUpdate, ILogger logger)
|
672
672
|
{
|
673
673
|
foreach (PackageToUpdate packageToUpdate in packagesToUpdate)
|
674
674
|
{
|
@@ -680,7 +680,7 @@ public class PackageManager
|
|
680
680
|
}
|
681
681
|
else
|
682
682
|
{
|
683
|
-
|
683
|
+
logger.Info($"Package {packageToUpdate.PackageName} not found in existing packages");
|
684
684
|
}
|
685
685
|
}
|
686
686
|
}
|