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.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/lib/NuGetUpdater/.gitignore +1 -0
  3. data/helpers/lib/NuGetUpdater/Directory.Build.targets +17 -0
  4. data/helpers/lib/NuGetUpdater/Directory.Packages.props +26 -17
  5. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Packaging/NuGet.Packaging.csproj +0 -1
  6. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/DiscoverCommand.cs +7 -3
  7. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +1 -1
  8. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Analyze.cs +3 -1
  9. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Discover.cs +88 -47
  10. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +31 -16
  11. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/CompatabilityChecker.cs +1 -1
  12. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementArrayConverter.cs +39 -0
  13. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/VersionFinder.cs +1 -1
  14. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Clone/ShellGitCommandHandler.cs +1 -1
  15. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/DependencyDiscovery.props +7 -0
  16. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/DependencyDiscovery.targets +10 -0
  17. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +64 -53
  18. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DotNetToolsJsonDiscovery.cs +2 -2
  19. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/GlobalJsonDiscovery.cs +2 -2
  20. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscovery.cs +17 -5
  21. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscoveryResult.cs +3 -1
  22. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/ProjectDiscoveryResult.cs +3 -0
  23. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/SdkProjectDiscovery.cs +429 -12
  24. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/WorkspaceDiscoveryResult.cs +0 -1
  25. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +12 -2
  26. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/JsonBuildFile.cs +1 -1
  27. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/FrameworkChecker/CompatabilityChecker.cs +2 -2
  28. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/NuGetUpdater.Core.csproj +7 -2
  29. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Job.cs +23 -0
  30. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +43 -58
  31. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/TargetFrameworkReporter.targets +13 -0
  32. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectManager.cs +13 -43
  33. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/DotNetToolsJsonUpdater.cs +4 -4
  34. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/GlobalJsonUpdater.cs +5 -5
  35. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/LockFileUpdater.cs +3 -10
  36. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +40 -33
  37. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +12 -11
  38. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +16 -12
  39. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/CollectionExtensions.cs +17 -0
  40. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ConsoleLogger.cs +1 -1
  41. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/DependencyConflictResolver.cs +19 -19
  42. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ILogger.cs +11 -1
  43. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +74 -20
  44. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/NuGetHelper.cs +1 -17
  45. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathComparer.cs +31 -0
  46. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathHelper.cs +46 -10
  47. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProjectHelper.cs +96 -0
  48. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/AnalyzeWorkerTests.cs +135 -3
  49. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTestBase.cs +71 -38
  50. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.PackagesConfig.cs +66 -4
  51. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Proj.cs +11 -5
  52. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Project.cs +808 -222
  53. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +477 -97
  54. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/ExpectedDiscoveryResults.cs +5 -9
  55. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/SdkProjectDiscoveryTests.cs +494 -0
  56. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/MockNuGetPackage.cs +46 -1
  57. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/NuGetUpdater.Core.Test.csproj +0 -1
  58. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +401 -77
  59. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +35 -2
  60. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/UpdatedDependencyListTests.cs +60 -2
  61. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TemporaryDirectory.cs +3 -2
  62. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestLogger.cs +1 -1
  63. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/BindingRedirectsTests.cs +1 -1
  64. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +8 -4
  65. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs +40 -0
  66. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +1 -1
  67. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/AssertEx.cs +1 -1
  68. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/LinuxOnlyAttribute.cs +12 -0
  69. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +8 -5
  70. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/PathHelperTests.cs +49 -3
  71. data/lib/dependabot/nuget/analysis/analysis_json_reader.rb +3 -1
  72. data/lib/dependabot/nuget/file_fetcher.rb +12 -393
  73. data/lib/dependabot/nuget/file_parser.rb +23 -54
  74. data/lib/dependabot/nuget/file_updater.rb +21 -16
  75. data/lib/dependabot/nuget/native_discovery/native_dependency_file_discovery.rb +2 -9
  76. data/lib/dependabot/nuget/native_discovery/native_discovery_json_reader.rb +183 -80
  77. data/lib/dependabot/nuget/native_discovery/native_project_discovery.rb +25 -3
  78. data/lib/dependabot/nuget/native_discovery/native_workspace_discovery.rb +1 -11
  79. data/lib/dependabot/nuget/native_helpers.rb +13 -4
  80. data/lib/dependabot/nuget/native_update_checker/native_update_checker.rb +17 -4
  81. metadata +15 -12
  82. data/helpers/lib/NuGetUpdater/NuGetProjects/Directory.Packages.props +0 -29
  83. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementConverter.cs +0 -17
  84. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DirectoryPackagesPropsDiscovery.cs +0 -69
  85. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DirectoryPackagesPropsDiscoveryResult.cs +0 -11
  86. data/lib/dependabot/nuget/file_fetcher/import_paths_finder.rb +0 -73
  87. data/lib/dependabot/nuget/file_fetcher/sln_project_paths_finder.rb +0 -60
  88. 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.Log(" Running 'PackageReference' project direct XML update");
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.Log($" Unable to resolve dependency conflicts for {projectFile.Path}.");
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.Log($" Package [{dependencyName}] Does not exist as a dependency in [{projectPath}].");
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.Log($" Package [{dependencyName}] already meets the requested dependency version in [{projectPath}].");
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.Log($" Pinning [{dependencyName}/{newDependencyVersion}] as a package version.");
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.Log($" Transitive dependency [{dependencyName}/{newDependencyVersion}] was not pinned.");
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.Log(" New PackageVersion element added.");
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.Log(" Adding version attribute to element.");
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.Log($" Updating version attribute of [{versionAttribute.Value}].");
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.Log(" Existing PackageVersion element version was already correct.");
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.Log($" Adding [{dependencyName}/{newDependencyVersion}] as a top-level package reference.");
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.Log($" Transitive dependency [{dependencyName}/{newDependencyVersion}] was not added.\nSTDOUT:\n{stdout}\nSTDERR:\n{stderr}");
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.Log($" The following target frameworks could not find packages to upgrade: {string.Join(", ", unupgradableTfms)}");
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.Log($" Package [{packageName}] tried to update to version [{packageVersion}], but found conflicting package version of [{existingVersion}].");
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.Log($" Root package [{dependencyName}/{previousDependencyVersion}] was not updated; skipping dependencies.");
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.Log($" Unable to resolve dependency conflicts for {projectFile.Path}.");
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.Log($" Unable to resolve requested dependency for {dependencyName} in {projectFile.Path}.");
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.Log($" Inconsistent resolution for {dependencyName}; attempted upgrade to {newDependencyVersion} but resolved {specificResolvedDependency.Version}.");
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.Log($" Found unsupported [{packageNode.Name}] version attribute value [{versionAttribute.Value}] in [{buildFile.RelativePath}].");
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.Log($" Found incorrect [{packageNode.Name}] version attribute in [{buildFile.RelativePath}].");
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.Log($" Found incorrect peer [{packageNode.Name}] version attribute in [{buildFile.RelativePath}].");
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.Log($" Found correct [{packageNode.Name}] version attribute in [{buildFile.RelativePath}].");
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.Log($" Found unsupported [{packageNode.Name}] version node value [{versionValue}] in [{buildFile.RelativePath}].");
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.Log($" Found incorrect [{packageNode.Name}] version node in [{buildFile.RelativePath}].");
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.Log($" Found incorrect peer [{packageNode.Name}] version node in [{buildFile.RelativePath}].");
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.Log($" Found correct [{packageNode.Name}] version node in [{buildFile.RelativePath}].");
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.Log(" Found package reference but was unable to locate version information.");
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.Log($" Found unsupported version property [{propertyElement.Name}] value [{propertyContents}] in [{buildFile.RelativePath}].");
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.Log($" Found incorrect version property [{propertyElement.Name}] in [{buildFile.RelativePath}].");
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.Log($" Found incorrect peer version property [{propertyElement.Name}] in [{buildFile.RelativePath}].");
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.Log($" Found correct version property [{propertyElement.Name}] in [{buildFile.RelativePath}].");
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.Log($" Package [{dependencyName}] could not be updated in [{projectPath}] because it would cause a dependency conflict.");
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.Log($" Saved [{buildFile.RelativePath}].");
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.Log($" Found '{NuGetHelper.PackagesConfigFileName}' project; running NuGet.exe update");
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.Log($" Project [{projectPath}] does not reference this dependency.");
46
+ logger.Info($" Project [{projectPath}] does not reference this dependency.");
46
47
  return;
47
48
  }
48
49
 
49
- logger.Log($" Using packages directory [{packagesSubDirectory}] for project [{projectPath}].");
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.Log(" Finding MSBuild...");
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.Log(" Writing project file back to disk");
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.Log($" Running NuGet.exe with args: {string.Join(" ", updateArgs)}");
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.Log($" Result: {result}");
126
- logger.Log($" Output:\n{fullOutput}");
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.Log($" Running NuGet.exe with args: {string.Join(" ", restoreArgs)}");
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.Log($"Error: {e}");
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.Log($"Ending spawned credential provider process");
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.Log($"File extension [{extension}] is not supported.");
118
+ _logger.Info($"File extension [{extension}] is not supported.");
118
119
  break;
119
120
  }
120
121
 
121
- _logger.Log("Update complete.");
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.Log($" Writing update result to [{resultOutputPath}].");
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.Log($"Running for solution [{Path.GetRelativePath(repoRootPath, solutionPath)}]");
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.Log($"Running for proj file [{Path.GetRelativePath(repoRootPath, projFilePath)}]");
160
+ _logger.Info($"Running for proj file [{Path.GetRelativePath(repoRootPath, projFilePath)}]");
160
161
  if (!File.Exists(projFilePath))
161
162
  {
162
- _logger.Log($"File [{projFilePath}] does not exist.");
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.Log($"Running for project file [{Path.GetRelativePath(repoRootPath, projectPath)}]");
186
+ _logger.Info($"Running for project file [{Path.GetRelativePath(repoRootPath, projectPath)}]");
186
187
  if (!File.Exists(projectPath))
187
188
  {
188
- _logger.Log($"File [{projectPath}] does not exist.");
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.Log($"Updating project [{projectPath}]");
219
+ _logger.Info($"Updating project [{projectPath}]");
219
220
 
220
- if (NuGetHelper.TryGetPackagesConfigFile(projectPath, out var packagesConfigPath))
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, packagesConfigPath, _logger);
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
- if (File.Exists(Path.Combine(Path.GetDirectoryName(projectPath), "packages.lock.json")))
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
+ }
@@ -2,7 +2,7 @@ namespace NuGetUpdater.Core;
2
2
 
3
3
  public sealed class ConsoleLogger : ILogger
4
4
  {
5
- public void Log(string message)
5
+ public void LogRaw(string message)
6
6
  {
7
7
  Console.WriteLine(message);
8
8
  }
@@ -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
- Console.WriteLine("No compatible framework found.");
238
+ logger.Info("No compatible framework found.");
239
239
  }
240
240
  }
241
241
  catch (HttpRequestException ex)
242
242
  {
243
- Console.WriteLine($"HTTP error occurred: {ex.Message}");
243
+ logger.Error($"HTTP error occurred: {ex.Message}");
244
244
  }
245
245
  catch (ArgumentNullException ex)
246
246
  {
247
- Console.WriteLine($"Argument is null error: {ex.ParamName}, {ex.Message}");
247
+ logger.Error($"Argument is null error: {ex.ParamName}, {ex.Message}");
248
248
  }
249
249
  catch (InvalidOperationException ex)
250
250
  {
251
- Console.WriteLine($"Invalid operation exception: {ex.Message}");
251
+ logger.Error($"Invalid operation exception: {ex.Message}");
252
252
  }
253
253
  catch (Exception ex)
254
254
  {
255
- Console.WriteLine($"An error occurred: {ex.Message}");
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
- Console.WriteLine("Current version is >= latest version");
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
- Console.WriteLine($"Package {packageToUpdate.PackageName} not found in existing packages");
683
+ logger.Info($"Package {packageToUpdate.PackageName} not found in existing packages");
684
684
  }
685
685
  }
686
686
  }