dependabot-nuget 0.280.0 → 0.281.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/AnalyzeCommand.cs +4 -6
  3. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/DiscoverCommand.cs +4 -6
  4. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/FrameworkCheckCommand.cs +4 -7
  5. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +4 -6
  6. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/UpdateCommand.cs +3 -5
  7. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Analyze.cs +0 -3
  8. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.FrameworkCheck.cs +0 -1
  9. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Run.cs +1 -2
  10. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Update.cs +3 -6
  11. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +9 -9
  12. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/CompatabilityChecker.cs +2 -2
  13. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/DependencyFinder.cs +1 -1
  14. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/NuGetContext.cs +2 -2
  15. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/VersionFinder.cs +5 -5
  16. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DirectoryPackagesPropsDiscovery.cs +1 -1
  17. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +3 -3
  18. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DotNetToolsJsonDiscovery.cs +1 -1
  19. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/GlobalJsonDiscovery.cs +1 -1
  20. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscovery.cs +1 -1
  21. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/SdkProjectDiscovery.cs +2 -2
  22. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ErrorType.cs +1 -1
  23. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/DotNetToolsJsonBuildFile.cs +2 -2
  24. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/GlobalJsonBuildFile.cs +2 -2
  25. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/JsonBuildFile.cs +2 -2
  26. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/FrameworkChecker/CompatabilityChecker.cs +1 -1
  27. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +2 -2
  28. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectManager.cs +5 -5
  29. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/DotNetToolsJsonUpdater.cs +1 -1
  30. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/GlobalJsonUpdater.cs +1 -1
  31. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/LockFileUpdater.cs +2 -2
  32. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +2 -2
  33. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/SdkPackageUpdater.cs +11 -11
  34. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +11 -3
  35. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ConsoleLogger.cs +9 -0
  36. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/DependencyConflictResolver.cs +14 -16
  37. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ILogger.cs +6 -0
  38. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +11 -10
  39. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/NuGetHelper.cs +1 -1
  40. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/AnalyzeWorkerTestBase.cs +1 -1
  41. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/AnalyzeWorkerTests.cs +1 -1
  42. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/CompatibilityCheckerTests.cs +7 -7
  43. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTestBase.cs +1 -1
  44. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Files/DotNetToolsJsonBuildFileTests.cs +1 -1
  45. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Files/GlobalJsonBuildFileTests.cs +1 -1
  46. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/FrameworkChecker/CompatibilityCheckerFacts.cs +4 -4
  47. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +1 -1
  48. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestLogger.cs +11 -0
  49. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/ExpectedUpdateOperationResult.cs +8 -0
  50. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +14 -6
  51. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.DirsProj.cs +1 -1
  52. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.Mixed.cs +1 -1
  53. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +144 -8
  54. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.Sdk.cs +1 -1
  55. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +16 -16
  56. data/lib/dependabot/nuget/file_updater.rb +1 -0
  57. data/lib/dependabot/nuget/native_helpers.rb +10 -16
  58. metadata +12 -9
  59. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/Logger.cs +0 -21
@@ -5,7 +5,7 @@ internal static class LockFileUpdater
5
5
  public static async Task UpdateLockFileAsync(
6
6
  string repoRootPath,
7
7
  string projectPath,
8
- Logger logger)
8
+ ILogger logger)
9
9
  {
10
10
  var projectDirectory = Path.GetDirectoryName(projectPath);
11
11
  var lockPath = Path.Combine(projectDirectory, "packages.lock.json");
@@ -23,6 +23,6 @@ internal static class LockFileUpdater
23
23
  {
24
24
  logger.Log($" Lock file update failed.\nSTDOUT:\n{stdout}\nSTDERR:\n{stderr}");
25
25
  }
26
- }, retainMSBuildSdks: true);
26
+ }, logger, retainMSBuildSdks: true);
27
27
  }
28
28
  }
@@ -22,7 +22,7 @@ internal static class PackagesConfigUpdater
22
22
  string previousDependencyVersion,
23
23
  string newDependencyVersion,
24
24
  string packagesConfigPath,
25
- Logger logger
25
+ ILogger logger
26
26
  )
27
27
  {
28
28
  logger.Log($" Found {NuGetHelper.PackagesConfigFileName}; running with NuGet.exe");
@@ -92,7 +92,7 @@ internal static class PackagesConfigUpdater
92
92
  await projectBuildFile.SaveAsync();
93
93
  }
94
94
 
95
- private static void RunNugetUpdate(List<string> updateArgs, List<string> restoreArgs, string projectDirectory, Logger logger)
95
+ private static void RunNugetUpdate(List<string> updateArgs, List<string> restoreArgs, string projectDirectory, ILogger logger)
96
96
  {
97
97
  var outputBuilder = new StringBuilder();
98
98
  var writer = new StringWriter(outputBuilder);
@@ -15,7 +15,7 @@ internal static class SdkPackageUpdater
15
15
  string previousDependencyVersion,
16
16
  string newDependencyVersion,
17
17
  bool isTransitive,
18
- Logger logger)
18
+ ILogger logger)
19
19
  {
20
20
  // SDK-style project, modify the XML directly
21
21
  logger.Log(" Running for SDK-style project");
@@ -64,7 +64,7 @@ internal static class SdkPackageUpdater
64
64
  Dependency[] topLevelDependencies,
65
65
  string dependencyName,
66
66
  string newDependencyVersion,
67
- Logger logger)
67
+ ILogger logger)
68
68
  {
69
69
  var newDependencyNuGetVersion = NuGetVersion.Parse(newDependencyVersion);
70
70
 
@@ -124,7 +124,7 @@ internal static class SdkPackageUpdater
124
124
  return true;
125
125
  }
126
126
 
127
- private static async Task UpdateTransitiveDependencyAsync(string repoRootPath, string projectPath, string dependencyName, string newDependencyVersion, ImmutableArray<ProjectBuildFile> buildFiles, Logger logger)
127
+ private static async Task UpdateTransitiveDependencyAsync(string repoRootPath, string projectPath, string dependencyName, string newDependencyVersion, ImmutableArray<ProjectBuildFile> buildFiles, ILogger logger)
128
128
  {
129
129
  var directoryPackagesWithPinning = buildFiles.OfType<ProjectBuildFile>()
130
130
  .FirstOrDefault(bf => IsCpmTransitivePinningEnabled(bf));
@@ -160,7 +160,7 @@ internal static class SdkPackageUpdater
160
160
  return isTransitivePinningEnabled is not null && string.Equals(isTransitivePinningEnabled, "true", StringComparison.OrdinalIgnoreCase);
161
161
  }
162
162
 
163
- private static void PinTransitiveDependency(ProjectBuildFile directoryPackages, string dependencyName, string newDependencyVersion, Logger logger)
163
+ private static void PinTransitiveDependency(ProjectBuildFile directoryPackages, string dependencyName, string newDependencyVersion, ILogger logger)
164
164
  {
165
165
  var existingPackageVersionElement = directoryPackages.ItemNodes
166
166
  .Where(e => e.Name.Equals("PackageVersion", StringComparison.OrdinalIgnoreCase) &&
@@ -223,7 +223,7 @@ internal static class SdkPackageUpdater
223
223
  directoryPackages.Update(updatedXml);
224
224
  }
225
225
 
226
- private static async Task AddTransitiveDependencyAsync(string repoRootPath, string projectPath, string dependencyName, string newDependencyVersion, Logger logger)
226
+ private static async Task AddTransitiveDependencyAsync(string repoRootPath, string projectPath, string dependencyName, string newDependencyVersion, ILogger logger)
227
227
  {
228
228
  var projectDirectory = Path.GetDirectoryName(projectPath)!;
229
229
  await MSBuildHelper.SidelineGlobalJsonAsync(projectDirectory, repoRootPath, async () =>
@@ -237,7 +237,7 @@ internal static class SdkPackageUpdater
237
237
  {
238
238
  logger.Log($" Transitive dependency [{dependencyName}/{newDependencyVersion}] was not added.\nSTDOUT:\n{stdout}\nSTDERR:\n{stderr}");
239
239
  }
240
- }, retainMSBuildSdks: true);
240
+ }, logger, retainMSBuildSdks: true);
241
241
  }
242
242
 
243
243
  /// <summary>
@@ -250,7 +250,7 @@ internal static class SdkPackageUpdater
250
250
  string[] tfms,
251
251
  string dependencyName,
252
252
  string newDependencyVersion,
253
- Logger logger)
253
+ ILogger logger)
254
254
  {
255
255
  var newDependency = new[] { new Dependency(dependencyName, newDependencyVersion, DependencyType.Unknown) };
256
256
  var tfmsAndDependencies = new Dictionary<string, Dependency[]>();
@@ -305,7 +305,7 @@ internal static class SdkPackageUpdater
305
305
  string previousDependencyVersion,
306
306
  string newDependencyVersion,
307
307
  IDictionary<string, string> peerDependencies,
308
- Logger logger)
308
+ ILogger logger)
309
309
  {
310
310
 
311
311
  var result = TryUpdateDependencyVersion(buildFiles, dependencyName, previousDependencyVersion, newDependencyVersion, logger);
@@ -376,7 +376,7 @@ internal static class SdkPackageUpdater
376
376
  string dependencyName,
377
377
  string? previousDependencyVersion,
378
378
  string newDependencyVersion,
379
- Logger logger)
379
+ ILogger logger)
380
380
  {
381
381
  var foundCorrect = false;
382
382
  var foundUnsupported = false;
@@ -619,7 +619,7 @@ internal static class SdkPackageUpdater
619
619
  StringComparison.OrdinalIgnoreCase) &&
620
620
  (e.GetAttributeOrSubElementValue("Version", StringComparison.OrdinalIgnoreCase) ?? e.GetAttributeOrSubElementValue("VersionOverride", StringComparison.OrdinalIgnoreCase)) is not null);
621
621
 
622
- private static async Task<bool> AreDependenciesCoherentAsync(string repoRootPath, string projectPath, string dependencyName, Logger logger, ImmutableArray<ProjectBuildFile> buildFiles, string[] tfms)
622
+ private static async Task<bool> AreDependenciesCoherentAsync(string repoRootPath, string projectPath, string dependencyName, ILogger logger, ImmutableArray<ProjectBuildFile> buildFiles, string[] tfms)
623
623
  {
624
624
  var updatedTopLevelDependencies = MSBuildHelper.GetTopLevelPackageDependencyInfos(buildFiles).ToArray();
625
625
  foreach (var tfm in tfms)
@@ -636,7 +636,7 @@ internal static class SdkPackageUpdater
636
636
  return true;
637
637
  }
638
638
 
639
- private static async Task SaveBuildFilesAsync(ImmutableArray<ProjectBuildFile> buildFiles, Logger logger)
639
+ private static async Task SaveBuildFilesAsync(ImmutableArray<ProjectBuildFile> buildFiles, ILogger logger)
640
640
  {
641
641
  foreach (var buildFile in buildFiles)
642
642
  {
@@ -9,7 +9,7 @@ namespace NuGetUpdater.Core;
9
9
 
10
10
  public class UpdaterWorker
11
11
  {
12
- private readonly Logger _logger;
12
+ private readonly ILogger _logger;
13
13
  private readonly HashSet<string> _processedProjectPaths = new(StringComparer.OrdinalIgnoreCase);
14
14
 
15
15
  internal static readonly JsonSerializerOptions SerializerOptions = new()
@@ -18,7 +18,7 @@ public class UpdaterWorker
18
18
  Converters = { new JsonStringEnumConverter() },
19
19
  };
20
20
 
21
- public UpdaterWorker(Logger logger)
21
+ public UpdaterWorker(ILogger logger)
22
22
  {
23
23
  _logger = logger;
24
24
  }
@@ -70,6 +70,14 @@ public class UpdaterWorker
70
70
  ErrorDetails = ex.Dependencies,
71
71
  };
72
72
  }
73
+ catch (Exception ex)
74
+ {
75
+ result = new()
76
+ {
77
+ ErrorType = ErrorType.Unknown,
78
+ ErrorDetails = ex.ToString(),
79
+ };
80
+ }
73
81
 
74
82
  return result;
75
83
  }
@@ -114,7 +122,7 @@ public class UpdaterWorker
114
122
  return new UpdateOperationResult();
115
123
  }
116
124
 
117
- internal static async Task WriteResultFile(UpdateOperationResult result, string resultOutputPath, Logger logger)
125
+ internal static async Task WriteResultFile(UpdateOperationResult result, string resultOutputPath, ILogger logger)
118
126
  {
119
127
  logger.Log($" Writing update result to [{resultOutputPath}].");
120
128
 
@@ -0,0 +1,9 @@
1
+ namespace NuGetUpdater.Core;
2
+
3
+ public sealed class ConsoleLogger : ILogger
4
+ {
5
+ public void Log(string message)
6
+ {
7
+ Console.WriteLine(message);
8
+ }
9
+ }
@@ -55,7 +55,7 @@ public class PackageManager
55
55
  string CurrentDirectory = currentDirectory ?? Environment.CurrentDirectory;
56
56
  SourceCacheContext SourceCacheContext = new SourceCacheContext();
57
57
  PackageDownloadContext PackageDownloadContext = new PackageDownloadContext(SourceCacheContext);
58
- ILogger Logger = NullLogger.Instance;
58
+ var Logger = NullLogger.Instance;
59
59
 
60
60
  IMachineWideSettings MachineWideSettings = new NuGet.CommandLine.CommandLineMachineWideSettings();
61
61
  ISettings Settings = NuGet.Configuration.Settings.LoadDefaultSettings(
@@ -328,7 +328,7 @@ public class PackageManager
328
328
  }
329
329
 
330
330
  // Method to update the version of a desired package based off framework
331
- public async Task<string> UpdateVersion(List<PackageToUpdate> existingPackages, PackageToUpdate package, string targetFramework, string projectDirectory)
331
+ public async Task<string> UpdateVersion(List<PackageToUpdate> existingPackages, PackageToUpdate package, string targetFramework, string projectDirectory, ILogger logger)
332
332
  {
333
333
  // Bool to track if the package was in the original existing list
334
334
  bool inExisting = true;
@@ -392,12 +392,12 @@ public class PackageManager
392
392
  existingPackage.CurrentVersion = dependency.CurrentVersion;
393
393
 
394
394
  // If the family is compatible with the dependency's version, update with the dependency version
395
- if (await AreAllParentsCompatibleAsync(existingPackages, existingPackage, targetFramework, projectDirectory) == true)
395
+ if (await AreAllParentsCompatibleAsync(existingPackages, existingPackage, targetFramework, projectDirectory, logger) == true)
396
396
  {
397
397
  existingPackage.CurrentVersion = dependencyOldVersion;
398
398
  string NewVersion = dependency.CurrentVersion;
399
399
  existingPackage.NewVersion = dependency.CurrentVersion;
400
- await UpdateVersion(existingPackages, existingPackage, targetFramework, projectDirectory);
400
+ await UpdateVersion(existingPackages, existingPackage, targetFramework, projectDirectory, logger);
401
401
  }
402
402
  // If not, resort to putting version back to normal and remove new version
403
403
  else
@@ -417,7 +417,7 @@ public class PackageManager
417
417
  dependency.IsSpecific = true;
418
418
  }
419
419
 
420
- await UpdateVersion(existingPackages, dependency, targetFramework, projectDirectory);
420
+ await UpdateVersion(existingPackages, dependency, targetFramework, projectDirectory, logger);
421
421
  }
422
422
  }
423
423
 
@@ -432,7 +432,7 @@ public class PackageManager
432
432
  if (!isCompatible)
433
433
  {
434
434
  // Attempt to find and update to a compatible version between the two
435
- NuGetVersion compatibleVersion = await FindCompatibleVersionAsync(existingPackages, parent, package, targetFramework);
435
+ NuGetVersion compatibleVersion = await FindCompatibleVersionAsync(existingPackages, parent, package, targetFramework, logger);
436
436
  if (compatibleVersion == null)
437
437
  {
438
438
  return "Failed to update";
@@ -440,7 +440,7 @@ public class PackageManager
440
440
 
441
441
  // If a version is found, update to that version
442
442
  parent.NewVersion = compatibleVersion.ToString();
443
- await UpdateVersion(existingPackages, parent, targetFramework, projectDirectory);
443
+ await UpdateVersion(existingPackages, parent, targetFramework, projectDirectory, logger);
444
444
  }
445
445
 
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
@@ -455,7 +455,6 @@ public class PackageManager
455
455
  {
456
456
  // Create a NugetContext instance to get the latest versions of the parent
457
457
  NuGetContext nugetContext = new NuGetContext(Path.GetDirectoryName(projectPath));
458
- Logger logger = null;
459
458
 
460
459
  string currentVersionString = parent.CurrentVersion;
461
460
  NuGetVersion currentVersionParent = NuGetVersion.Parse(currentVersionString);
@@ -487,7 +486,7 @@ public class PackageManager
487
486
  {
488
487
  parent.NewVersion = parentVersion;
489
488
  parent.CurrentVersion = null;
490
- await UpdateVersion(existingPackages, parent, targetFramework, projectDirectory);
489
+ await UpdateVersion(existingPackages, parent, targetFramework, projectDirectory, logger);
491
490
  package.IsSpecific = true;
492
491
  return "Success";
493
492
  }
@@ -557,7 +556,7 @@ public class PackageManager
557
556
  }
558
557
 
559
558
  // Method to find a compatible version with the child for the parent to update to
560
- public async Task<NuGetVersion> FindCompatibleVersionAsync(List<PackageToUpdate> existingPackages, PackageToUpdate possibleParent, PackageToUpdate possibleDependency, string targetFramework)
559
+ public async Task<NuGetVersion> FindCompatibleVersionAsync(List<PackageToUpdate> existingPackages, PackageToUpdate possibleParent, PackageToUpdate possibleDependency, string targetFramework, ILogger logger)
561
560
  {
562
561
  string packageId = possibleParent.PackageName;
563
562
  string currentVersionString = possibleParent.CurrentVersion;
@@ -567,7 +566,6 @@ public class PackageManager
567
566
 
568
567
  // Create a NugetContext instance to get the latest versions of the parent
569
568
  NuGetContext nugetContext = new NuGetContext(Path.GetDirectoryName(projectPath));
570
- Logger logger = null;
571
569
 
572
570
  var result = await VersionFinder.GetVersionsAsync(possibleParent.PackageName, CurrentVersion, nugetContext, logger, CancellationToken.None);
573
571
  var versions = result.GetVersions();
@@ -618,7 +616,7 @@ public class PackageManager
618
616
  if (await IsCompatibleAsync(possibleParent, possibleDependency, targetFramework, nugetContext.CurrentDirectory))
619
617
  {
620
618
  // Check if parents are compatible, recursively
621
- if (await AreAllParentsCompatibleAsync(existingPackages, possibleParent, targetFramework, nugetContext.CurrentDirectory))
619
+ if (await AreAllParentsCompatibleAsync(existingPackages, possibleParent, targetFramework, nugetContext.CurrentDirectory, logger))
622
620
  {
623
621
  // If compatible, return the new version
624
622
  if (Regex.IsMatch(possibleParent.NewVersion, @"[a-zA-Z]"))
@@ -635,7 +633,7 @@ public class PackageManager
635
633
  }
636
634
 
637
635
  // Method to determine if all the parents of a given package are compatible with the parent's desired version
638
- public async Task<bool> AreAllParentsCompatibleAsync(List<PackageToUpdate> existingPackages, PackageToUpdate possibleParent, string targetFramework, string projectDirectory)
636
+ public async Task<bool> AreAllParentsCompatibleAsync(List<PackageToUpdate> existingPackages, PackageToUpdate possibleParent, string targetFramework, string projectDirectory, ILogger logger)
639
637
  {
640
638
  // Get the possibleParent parentPackages
641
639
  HashSet<PackageToUpdate> parentPackages = GetParentPackages(possibleParent);
@@ -649,18 +647,18 @@ public class PackageManager
649
647
  if (!isCompatible)
650
648
  {
651
649
  // Find a compatible version if possible
652
- NuGetVersion compatibleVersion = await FindCompatibleVersionAsync(existingPackages, parent, possibleParent, targetFramework);
650
+ NuGetVersion compatibleVersion = await FindCompatibleVersionAsync(existingPackages, parent, possibleParent, targetFramework, logger);
653
651
  if (compatibleVersion == null)
654
652
  {
655
653
  return false;
656
654
  }
657
655
 
658
656
  parent.NewVersion = compatibleVersion.ToString();
659
- await UpdateVersion(existingPackages, parent, targetFramework, projectDirectory);
657
+ await UpdateVersion(existingPackages, parent, targetFramework, projectDirectory, logger);
660
658
  }
661
659
 
662
660
  // Recursively check if all ancestors are compatible
663
- if (!await AreAllParentsCompatibleAsync(existingPackages, parent, targetFramework, projectDirectory))
661
+ if (!await AreAllParentsCompatibleAsync(existingPackages, parent, targetFramework, projectDirectory, logger))
664
662
  {
665
663
  return false;
666
664
  }
@@ -0,0 +1,6 @@
1
+ namespace NuGetUpdater.Core;
2
+
3
+ public interface ILogger
4
+ {
5
+ void Log(string message);
6
+ }
@@ -44,13 +44,14 @@ internal static partial class MSBuildHelper
44
44
  }
45
45
  }
46
46
 
47
- public static async Task SidelineGlobalJsonAsync(string currentDirectory, string rootDirectory, Func<Task> action, bool retainMSBuildSdks = false)
47
+ public static async Task SidelineGlobalJsonAsync(string currentDirectory, string rootDirectory, Func<Task> action, ILogger? logger = null, bool retainMSBuildSdks = false)
48
48
  {
49
+ logger ??= new ConsoleLogger();
49
50
  var candidateDirectories = PathHelper.GetAllDirectoriesToRoot(currentDirectory, rootDirectory);
50
51
  var globalJsonPaths = candidateDirectories.Select(d => Path.Combine(d, "global.json")).Where(File.Exists).Select(p => (p, p + Guid.NewGuid().ToString())).ToArray();
51
52
  foreach (var (globalJsonPath, tempGlobalJsonPath) in globalJsonPaths)
52
53
  {
53
- Console.WriteLine($"Temporarily removing `global.json` from `{Path.GetDirectoryName(globalJsonPath)}`{(retainMSBuildSdks ? " and retaining MSBuild SDK declarations" : string.Empty)}.");
54
+ logger.Log($"Temporarily removing `global.json` from `{Path.GetDirectoryName(globalJsonPath)}`{(retainMSBuildSdks ? " and retaining MSBuild SDK declarations" : string.Empty)}.");
54
55
  File.Move(globalJsonPath, tempGlobalJsonPath);
55
56
  if (retainMSBuildSdks)
56
57
  {
@@ -78,7 +79,7 @@ internal static partial class MSBuildHelper
78
79
  {
79
80
  foreach (var (globalJsonpath, tempGlobalJsonPath) in globalJsonPaths)
80
81
  {
81
- Console.WriteLine($"Restoring `global.json` to `{Path.GetDirectoryName(globalJsonpath)}`.");
82
+ logger.Log($"Restoring `global.json` to `{Path.GetDirectoryName(globalJsonpath)}`.");
82
83
  File.Move(tempGlobalJsonPath, globalJsonpath, overwrite: retainMSBuildSdks);
83
84
  }
84
85
  }
@@ -316,7 +317,7 @@ internal static partial class MSBuildHelper
316
317
  return false;
317
318
  }
318
319
 
319
- internal static async Task<bool> DependenciesAreCoherentAsync(string repoRoot, string projectPath, string targetFramework, Dependency[] packages, Logger logger)
320
+ internal static async Task<bool> DependenciesAreCoherentAsync(string repoRoot, string projectPath, string targetFramework, Dependency[] packages, ILogger logger)
320
321
  {
321
322
  var tempDirectory = Directory.CreateTempSubdirectory("package-dependency-coherence_");
322
323
  try
@@ -339,7 +340,7 @@ internal static partial class MSBuildHelper
339
340
  return Environment.GetEnvironmentVariable("UseNewNugetPackageResolver") == "true";
340
341
  }
341
342
 
342
- internal static async Task<Dependency[]?> ResolveDependencyConflicts(string repoRoot, string projectPath, string targetFramework, Dependency[] packages, Dependency[] update, Logger logger)
343
+ internal static async Task<Dependency[]?> ResolveDependencyConflicts(string repoRoot, string projectPath, string targetFramework, Dependency[] packages, Dependency[] update, ILogger logger)
343
344
  {
344
345
  if (UseNewDependencySolver())
345
346
  {
@@ -351,7 +352,7 @@ internal static partial class MSBuildHelper
351
352
  }
352
353
  }
353
354
 
354
- internal static async Task<Dependency[]?> ResolveDependencyConflictsNew(string repoRoot, string projectPath, string targetFramework, Dependency[] packages, Dependency[] update, Logger logger)
355
+ internal static async Task<Dependency[]?> ResolveDependencyConflictsNew(string repoRoot, string projectPath, string targetFramework, Dependency[] packages, Dependency[] update, ILogger logger)
355
356
  {
356
357
  var tempDirectory = Directory.CreateTempSubdirectory("package-dependency-coherence_");
357
358
  PackageManager packageManager = new PackageManager(repoRoot, projectPath);
@@ -417,7 +418,7 @@ internal static partial class MSBuildHelper
417
418
  // Update all to new versions
418
419
  foreach (var package in existingDuplicate)
419
420
  {
420
- string updateResult = await packageManager.UpdateVersion(existingDuplicate, package, targetFramework, Path.GetDirectoryName(projectPath));
421
+ string updateResult = await packageManager.UpdateVersion(existingDuplicate, package, targetFramework, Path.GetDirectoryName(projectPath), logger);
421
422
  }
422
423
  }
423
424
 
@@ -433,7 +434,7 @@ internal static partial class MSBuildHelper
433
434
  // Update all to new versions
434
435
  foreach (var package in existingPackages)
435
436
  {
436
- string updateResult = await packageManager.UpdateVersion(existingPackages, package, targetFramework, Path.GetDirectoryName(projectPath));
437
+ string updateResult = await packageManager.UpdateVersion(existingPackages, package, targetFramework, Path.GetDirectoryName(projectPath), logger);
437
438
  }
438
439
  }
439
440
 
@@ -509,7 +510,7 @@ internal static partial class MSBuildHelper
509
510
  }
510
511
  }
511
512
 
512
- internal static async Task<Dependency[]?> ResolveDependencyConflictsOld(string repoRoot, string projectPath, string targetFramework, Dependency[] packages, Logger logger)
513
+ internal static async Task<Dependency[]?> ResolveDependencyConflictsOld(string repoRoot, string projectPath, string targetFramework, Dependency[] packages, ILogger logger)
513
514
  {
514
515
  var tempDirectory = Directory.CreateTempSubdirectory("package-dependency-coherence_");
515
516
  try
@@ -762,7 +763,7 @@ internal static partial class MSBuildHelper
762
763
  string projectPath,
763
764
  string targetFramework,
764
765
  IReadOnlyCollection<Dependency> packages,
765
- Logger? logger = null)
766
+ ILogger? logger = null)
766
767
  {
767
768
  var tempDirectory = Directory.CreateTempSubdirectory("package-dependency-resolution_");
768
769
  try
@@ -20,7 +20,7 @@ internal static class NuGetHelper
20
20
  return false;
21
21
  }
22
22
 
23
- internal static async Task<bool> DownloadNuGetPackagesAsync(string repoRoot, string projectPath, IReadOnlyCollection<Dependency> packages, Logger logger)
23
+ internal static async Task<bool> DownloadNuGetPackagesAsync(string repoRoot, string projectPath, IReadOnlyCollection<Dependency> packages, ILogger logger)
24
24
  {
25
25
  var tempDirectory = Directory.CreateTempSubdirectory("msbuild_sdk_restore_");
26
26
  try
@@ -36,7 +36,7 @@ public class AnalyzeWorkerTestBase
36
36
  var discoveryPath = Path.GetFullPath(DiscoveryWorker.DiscoveryResultFileName, directoryPath);
37
37
  var dependencyPath = Path.GetFullPath(relativeDependencyPath, directoryPath);
38
38
 
39
- var worker = new AnalyzeWorker(new Logger(verbose: true));
39
+ var worker = new AnalyzeWorker(new TestLogger());
40
40
  var result = await worker.RunWithErrorHandlingAsync(directoryPath, discoveryPath, dependencyPath);
41
41
  return result;
42
42
  });
@@ -739,7 +739,7 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
739
739
  ErrorDetails = "<some package feed>",
740
740
  UpdatedVersion = "",
741
741
  UpdatedDependencies = [],
742
- }, new Logger(false));
742
+ }, new TestLogger());
743
743
  var discoveryContents = await File.ReadAllTextAsync(Path.Combine(temporaryDirectory.DirectoryPath, "Some.Dependency.json"));
744
744
 
745
745
  // raw result file should look like this:
@@ -30,7 +30,7 @@ public class CompatibilityCheckerTests
30
30
  projectFrameworks,
31
31
  isDevDependency,
32
32
  packageFrameworks,
33
- new Logger(verbose: false));
33
+ new TestLogger());
34
34
 
35
35
  Assert.True(result);
36
36
  }
@@ -53,7 +53,7 @@ public class CompatibilityCheckerTests
53
53
  projectFrameworks,
54
54
  isDevDependency,
55
55
  packageFrameworks,
56
- new Logger(verbose: false));
56
+ new TestLogger());
57
57
 
58
58
  Assert.False(result);
59
59
  }
@@ -76,7 +76,7 @@ public class CompatibilityCheckerTests
76
76
  projectFrameworks,
77
77
  isDevDependency,
78
78
  packageFrameworks,
79
- new Logger(verbose: false));
79
+ new TestLogger());
80
80
 
81
81
  Assert.False(result);
82
82
  }
@@ -97,7 +97,7 @@ public class CompatibilityCheckerTests
97
97
  projectFrameworks,
98
98
  isDevDependency,
99
99
  packageFrameworks,
100
- new Logger(verbose: false));
100
+ new TestLogger());
101
101
 
102
102
  Assert.True(result);
103
103
  }
@@ -118,7 +118,7 @@ public class CompatibilityCheckerTests
118
118
  projectFrameworks,
119
119
  isDevDependency,
120
120
  packageFrameworks,
121
- new Logger(verbose: false));
121
+ new TestLogger());
122
122
 
123
123
  Assert.False(result);
124
124
  }
@@ -138,7 +138,7 @@ public class CompatibilityCheckerTests
138
138
  projectFrameworks,
139
139
  isDevDependency,
140
140
  packageFrameworks,
141
- new Logger(verbose: false));
141
+ new TestLogger());
142
142
 
143
143
  Assert.False(result);
144
144
  }
@@ -161,7 +161,7 @@ public class CompatibilityCheckerTests
161
161
  projectFrameworks,
162
162
  isDevDependency,
163
163
  packageFrameworks,
164
- new Logger(verbose: false));
164
+ new TestLogger());
165
165
 
166
166
  Assert.True(result);
167
167
  }
@@ -24,7 +24,7 @@ public class DiscoveryWorkerTestBase
24
24
  {
25
25
  await UpdateWorkerTestBase.MockNuGetPackagesInDirectory(packages, directoryPath);
26
26
 
27
- var worker = new DiscoveryWorker(new Logger(verbose: true));
27
+ var worker = new DiscoveryWorker(new TestLogger());
28
28
  var result = await worker.RunWithErrorHandlingAsync(directoryPath, workspacePath);
29
29
  return result;
30
30
  });
@@ -32,7 +32,7 @@ public class DotnetToolsJsonBuildFileTests
32
32
  basePath: "/",
33
33
  path: "/.config/dotnet-tools.json",
34
34
  contents: DotnetToolsJson,
35
- logger: new Logger(verbose: true));
35
+ logger: new TestLogger());
36
36
 
37
37
  [Fact]
38
38
  public void GetDependencies_ReturnsDependencies()
@@ -30,7 +30,7 @@ public class GlobalJsonBuildFileTests
30
30
  basePath: "/",
31
31
  path: "/global.json",
32
32
  contents: contents,
33
- logger: new Logger(verbose: true));
33
+ logger: new TestLogger());
34
34
 
35
35
  [Fact]
36
36
  public void GlobalJson_Malformed_DoesNotThrow()
@@ -20,7 +20,7 @@ public class CompatibilityCheckerFacts
20
20
  [InlineData("net4.8", "netstandard1.3")]
21
21
  public void PackageContainsCompatibleFramework(string projectTfm, string packageTfm)
22
22
  {
23
- var result = CompatibilityChecker.IsCompatible([projectTfm], [packageTfm], new Logger(verbose: true));
23
+ var result = CompatibilityChecker.IsCompatible([projectTfm], [packageTfm], new TestLogger());
24
24
 
25
25
  Assert.True(result);
26
26
  }
@@ -37,7 +37,7 @@ public class CompatibilityCheckerFacts
37
37
  [InlineData("net7.0", "net48")]
38
38
  public void PackageContainsIncompatibleFramework(string projectTfm, string packageTfm)
39
39
  {
40
- var result = CompatibilityChecker.IsCompatible([projectTfm], [packageTfm], new Logger(verbose: true));
40
+ var result = CompatibilityChecker.IsCompatible([projectTfm], [packageTfm], new TestLogger());
41
41
 
42
42
  Assert.False(result);
43
43
  }
@@ -48,7 +48,7 @@ public class CompatibilityCheckerFacts
48
48
  [InlineData(new[] { "net6.0", "net6.0-windows10.0.19041" }, new[] { "net6.0", ".NETStandard2.0" })]
49
49
  public void PackageContainsCompatibleFrameworks(string[] projectTfms, string[] packageTfms)
50
50
  {
51
- var result = CompatibilityChecker.IsCompatible(projectTfms, packageTfms, new Logger(verbose: true));
51
+ var result = CompatibilityChecker.IsCompatible(projectTfms, packageTfms, new TestLogger());
52
52
 
53
53
  Assert.True(result);
54
54
  }
@@ -57,7 +57,7 @@ public class CompatibilityCheckerFacts
57
57
  [InlineData(new[] { "net7.0", "net472" }, new[] { "net5.0" })]
58
58
  public void PackageContainsIncompatibleFrameworks(string[] projectTfms, string[] packageTfms)
59
59
  {
60
- var result = CompatibilityChecker.IsCompatible(projectTfms, packageTfms, new Logger(verbose: true));
60
+ var result = CompatibilityChecker.IsCompatible(projectTfms, packageTfms, new TestLogger());
61
61
 
62
62
  Assert.False(result);
63
63
  }
@@ -276,7 +276,7 @@ public class RunWorkerTests
276
276
 
277
277
  // act
278
278
  var testApiHandler = new TestApiHandler();
279
- var worker = new RunWorker(testApiHandler, new Logger(verbose: false));
279
+ var worker = new RunWorker(testApiHandler, new TestLogger());
280
280
  var repoContentsPath = new DirectoryInfo(tempDirectory.DirectoryPath);
281
281
  var actualResult = await worker.RunAsync(job, repoContentsPath, "TEST-COMMIT-SHA");
282
282
  var actualApiMessages = testApiHandler.ReceivedMessages.ToArray();
@@ -0,0 +1,11 @@
1
+ using System.Diagnostics;
2
+
3
+ namespace NuGetUpdater.Core.Test;
4
+
5
+ public class TestLogger : ILogger
6
+ {
7
+ public void Log(string message)
8
+ {
9
+ Debug.WriteLine(message);
10
+ }
11
+ }
@@ -0,0 +1,8 @@
1
+ using NuGetUpdater.Core.Updater;
2
+
3
+ namespace NuGetUpdater.Core.Test.Updater;
4
+
5
+ public record ExpectedUpdateOperationResult : UpdateOperationResult
6
+ {
7
+ public string? ErrorDetailsRegex { get; init; } = null;
8
+ }