dependabot-nuget 0.281.0 → 0.283.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/helpers/lib/NuGetUpdater/Directory.Common.props +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectManager.cs +11 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/{SdkPackageUpdater.cs → PackageReferenceUpdater.cs} +86 -26
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +24 -8
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +16 -15
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/DependencySolverEnvironment.cs +12 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/PackagesConfigUpdaterTests.cs +3 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/{UpdateWorkerTests.Sdk.cs → UpdateWorkerTests.PackageReference.cs} +199 -22
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +77 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +56 -18
- data/lib/dependabot/nuget/file_fetcher.rb +58 -21
- metadata +12 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a3154a8f2ecd254dc3463bcca6f6e188e033bcf1d6aea863090f348035a9fe8
|
4
|
+
data.tar.gz: 480467b2e57d224ed646f81cd6614fbad2af03154ba07fc0dc4dde36d2ab3440
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b56eff2a40277413354577fe830f472bf0c46e72ba22cd948f207de01e2c3e0990ba84f60af648ba5e833fe209f8a7cc46b1172aa44987da2a3a6669cab9df5
|
7
|
+
data.tar.gz: 3f0bec73a56ac9e6eeed3e61eee12b0dcac72875325b6e543797b893a7dcbc4e2099f318c8822c115e9db810560df61179f0df68c6008d2474d9b0569a116fb7
|
@@ -12,6 +12,6 @@
|
|
12
12
|
<CommonTargetFramework>net9.0</CommonTargetFramework>
|
13
13
|
<ImplicitUsings>enable</ImplicitUsings>
|
14
14
|
<UseArtifactsOutput>true</UseArtifactsOutput>
|
15
|
-
<ArtifactsPath>$(MSBuildThisFileDirectory)artifacts</ArtifactsPath>
|
15
|
+
<ArtifactsPath>$(MSBuildThisFileDirectory)artifacts\$(OS)</ArtifactsPath>
|
16
16
|
</PropertyGroup>
|
17
17
|
</Project>
|
@@ -18,6 +18,16 @@ internal static class BindingRedirectManager
|
|
18
18
|
private static readonly XName DependentAssemblyName = AssemblyBinding.GetQualifiedName("dependentAssembly");
|
19
19
|
private static readonly XName BindingRedirectName = AssemblyBinding.GetQualifiedName("bindingRedirect");
|
20
20
|
|
21
|
+
/// <summary>
|
22
|
+
/// Updates assembly binding redirects for a project build file.
|
23
|
+
/// </summary>
|
24
|
+
/// <remarks>
|
25
|
+
/// Assembly binding redirects are only applicable to projects targeting .NET Framework.
|
26
|
+
/// .NET Framework targets can appear in SDK-style OR non-SDK-style project files, using either packages.config OR `<PackageReference>` MSBuild items.
|
27
|
+
/// See: https://learn.microsoft.com/en-us/dotnet/framework/configure-apps/redirect-assembly-versions
|
28
|
+
/// https://learn.microsoft.com/en-us/nuget/resources/check-project-format
|
29
|
+
/// </remarks>
|
30
|
+
/// <param name="projectBuildFile">The project build file (*.xproj) to be updated</param>
|
21
31
|
public static async ValueTask UpdateBindingRedirectsAsync(ProjectBuildFile projectBuildFile)
|
22
32
|
{
|
23
33
|
var configFile = await TryGetRuntimeConfigurationFile(projectBuildFile);
|
@@ -33,7 +43,7 @@ internal static class BindingRedirectManager
|
|
33
43
|
var bindings = BindingRedirectResolver.GetBindingRedirects(projectBuildFile.Path, references.Select(static x => x.Include));
|
34
44
|
if (!bindings.Any())
|
35
45
|
{
|
36
|
-
// no bindings to update
|
46
|
+
// no bindings found in the project file, nothing to update
|
37
47
|
return;
|
38
48
|
}
|
39
49
|
|
@@ -6,7 +6,18 @@ using NuGet.Versioning;
|
|
6
6
|
|
7
7
|
namespace NuGetUpdater.Core;
|
8
8
|
|
9
|
-
|
9
|
+
/// <summary>
|
10
|
+
/// Handles package updates for projects containing `<PackageReference>` MSBuild items.
|
11
|
+
/// </summary>
|
12
|
+
/// <remarks>
|
13
|
+
/// PackageReference items can appear in both SDK-style AND non-SDK-style project files.
|
14
|
+
/// By default, PackageReference is used by [SDK-style] projects targeting .NET Core, .NET Standard, and UWP.
|
15
|
+
/// By default, packages.config is used by [non-SDK-style] projects targeting .NET Framework; However, they can be migrated to PackageReference too.
|
16
|
+
/// See: https://learn.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#project-type-support
|
17
|
+
/// https://learn.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference
|
18
|
+
/// https://learn.microsoft.com/en-us/nuget/resources/check-project-format
|
19
|
+
/// </remarks>
|
20
|
+
internal static class PackageReferenceUpdater
|
10
21
|
{
|
11
22
|
public static async Task UpdateDependencyAsync(
|
12
23
|
string repoRootPath,
|
@@ -17,8 +28,8 @@ internal static class SdkPackageUpdater
|
|
17
28
|
bool isTransitive,
|
18
29
|
ILogger logger)
|
19
30
|
{
|
20
|
-
//
|
21
|
-
logger.Log(" Running
|
31
|
+
// PackageReference project; modify the XML directly
|
32
|
+
logger.Log(" Running 'PackageReference' project direct XML update");
|
22
33
|
|
23
34
|
(ImmutableArray<ProjectBuildFile> buildFiles, string[] tfms) = await MSBuildHelper.LoadBuildFilesAndTargetFrameworksAsync(repoRootPath, projectPath);
|
24
35
|
|
@@ -30,19 +41,26 @@ internal static class SdkPackageUpdater
|
|
30
41
|
return;
|
31
42
|
}
|
32
43
|
|
33
|
-
|
44
|
+
var peerDependencies = await GetUpdatedPeerDependenciesAsync(repoRootPath, projectPath, tfms, dependencyName, newDependencyVersion, logger);
|
45
|
+
if (MSBuildHelper.UseNewDependencySolver())
|
34
46
|
{
|
35
|
-
await
|
47
|
+
await UpdateDependencyWithConflictResolution(repoRootPath, buildFiles, tfms, projectPath, dependencyName, previousDependencyVersion, newDependencyVersion, isTransitive, peerDependencies, logger);
|
36
48
|
}
|
37
49
|
else
|
38
50
|
{
|
39
|
-
|
40
|
-
if (peerDependencies is null)
|
51
|
+
if (isTransitive)
|
41
52
|
{
|
42
|
-
|
53
|
+
await UpdateTransitiveDependencyAsync(repoRootPath, projectPath, dependencyName, newDependencyVersion, buildFiles, logger);
|
43
54
|
}
|
55
|
+
else
|
56
|
+
{
|
57
|
+
if (peerDependencies is null)
|
58
|
+
{
|
59
|
+
return;
|
60
|
+
}
|
44
61
|
|
45
|
-
|
62
|
+
await UpdateTopLevelDepdendency(repoRootPath, buildFiles, tfms, dependencyName, previousDependencyVersion, newDependencyVersion, peerDependencies, logger);
|
63
|
+
}
|
46
64
|
}
|
47
65
|
|
48
66
|
if (!await AreDependenciesCoherentAsync(repoRootPath, projectPath, dependencyName, logger, buildFiles, tfms))
|
@@ -53,6 +71,61 @@ internal static class SdkPackageUpdater
|
|
53
71
|
await SaveBuildFilesAsync(buildFiles, logger);
|
54
72
|
}
|
55
73
|
|
74
|
+
public static async Task UpdateDependencyWithConflictResolution(
|
75
|
+
string repoRootPath,
|
76
|
+
ImmutableArray<ProjectBuildFile> buildFiles,
|
77
|
+
string[] targetFrameworks,
|
78
|
+
string projectPath,
|
79
|
+
string dependencyName,
|
80
|
+
string previousDependencyVersion,
|
81
|
+
string newDependencyVersion,
|
82
|
+
bool isTransitive,
|
83
|
+
IDictionary<string, string> peerDependencies,
|
84
|
+
ILogger logger)
|
85
|
+
{
|
86
|
+
var topLevelDependencies = MSBuildHelper.GetTopLevelPackageDependencyInfos(buildFiles).ToArray();
|
87
|
+
var isDependencyTopLevel = topLevelDependencies.Any(d => d.Name.Equals(dependencyName, StringComparison.OrdinalIgnoreCase));
|
88
|
+
var dependenciesToUpdate = new[] { new Dependency(dependencyName, newDependencyVersion, DependencyType.PackageReference) };
|
89
|
+
|
90
|
+
// update the initial dependency...
|
91
|
+
TryUpdateDependencyVersion(buildFiles, dependencyName, previousDependencyVersion, newDependencyVersion, logger);
|
92
|
+
|
93
|
+
// ...and the peer dependencies...
|
94
|
+
foreach (var (packageName, packageVersion) in peerDependencies.Where(kvp => string.Compare(kvp.Key, dependencyName, StringComparison.OrdinalIgnoreCase) != 0))
|
95
|
+
{
|
96
|
+
TryUpdateDependencyVersion(buildFiles, packageName, previousDependencyVersion: null, newDependencyVersion: packageVersion, logger);
|
97
|
+
}
|
98
|
+
|
99
|
+
// ...and everything else
|
100
|
+
foreach (var projectFile in buildFiles)
|
101
|
+
{
|
102
|
+
foreach (var tfm in targetFrameworks)
|
103
|
+
{
|
104
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRootPath, projectFile.Path, tfm, topLevelDependencies, dependenciesToUpdate, logger);
|
105
|
+
if (resolvedDependencies is null)
|
106
|
+
{
|
107
|
+
logger.Log($" Unable to resolve dependency conflicts for {projectFile.Path}.");
|
108
|
+
continue;
|
109
|
+
}
|
110
|
+
|
111
|
+
var isDependencyInResolutionSet = resolvedDependencies.Any(d => d.Name.Equals(dependencyName, StringComparison.OrdinalIgnoreCase));
|
112
|
+
if (isTransitive && !isDependencyTopLevel && isDependencyInResolutionSet)
|
113
|
+
{
|
114
|
+
// a transitive dependency had to be pinned; add it here
|
115
|
+
await UpdateTransitiveDependencyAsync(repoRootPath, projectPath, dependencyName, newDependencyVersion, buildFiles, logger);
|
116
|
+
}
|
117
|
+
|
118
|
+
// update all resolved dependencies that aren't the initial dependency
|
119
|
+
foreach (var resolvedDependency in resolvedDependencies
|
120
|
+
.Where(d => !d.Name.Equals(dependencyName, StringComparison.OrdinalIgnoreCase))
|
121
|
+
.Where(d => d.Version is not null))
|
122
|
+
{
|
123
|
+
TryUpdateDependencyVersion(buildFiles, resolvedDependency.Name, previousDependencyVersion: null, newDependencyVersion: resolvedDependency.Version!, logger);
|
124
|
+
}
|
125
|
+
}
|
126
|
+
}
|
127
|
+
}
|
128
|
+
|
56
129
|
/// <summary>
|
57
130
|
/// Verifies that the package does not already satisfy the requested dependency version.
|
58
131
|
/// </summary>
|
@@ -307,7 +380,7 @@ internal static class SdkPackageUpdater
|
|
307
380
|
IDictionary<string, string> peerDependencies,
|
308
381
|
ILogger logger)
|
309
382
|
{
|
310
|
-
|
383
|
+
// update dependencies...
|
311
384
|
var result = TryUpdateDependencyVersion(buildFiles, dependencyName, previousDependencyVersion, newDependencyVersion, logger);
|
312
385
|
if (result == UpdateResult.NotFound)
|
313
386
|
{
|
@@ -320,26 +393,13 @@ internal static class SdkPackageUpdater
|
|
320
393
|
TryUpdateDependencyVersion(buildFiles, packageName, previousDependencyVersion: null, newDependencyVersion: packageVersion, logger);
|
321
394
|
}
|
322
395
|
|
323
|
-
//
|
396
|
+
// ...and make them all coherent
|
324
397
|
Dependency[] updatedTopLevelDependencies = MSBuildHelper.GetTopLevelPackageDependencyInfos(buildFiles).ToArray();
|
325
398
|
foreach (ProjectBuildFile projectFile in buildFiles)
|
326
399
|
{
|
327
400
|
foreach (string tfm in targetFrameworks)
|
328
401
|
{
|
329
|
-
|
330
|
-
{
|
331
|
-
// Find the index of the dependency we are updating and revert it to the previous version
|
332
|
-
int dependencyIndex = Array.FindIndex(updatedTopLevelDependencies, d => string.Equals(d.Name, dependencyName, StringComparison.OrdinalIgnoreCase));
|
333
|
-
if (dependencyIndex != -1)
|
334
|
-
{
|
335
|
-
var originalDependency = updatedTopLevelDependencies[dependencyIndex];
|
336
|
-
updatedTopLevelDependencies[dependencyIndex] = originalDependency with { Version = previousDependencyVersion };
|
337
|
-
}
|
338
|
-
|
339
|
-
}
|
340
|
-
Dependency[] update = [new Dependency(dependencyName, newDependencyVersion, DependencyType.PackageReference)];
|
341
|
-
Dependency[]? resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRootPath, projectFile.Path, tfm, updatedTopLevelDependencies, update, logger);
|
342
|
-
|
402
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsWithBruteForce(repoRootPath, projectFile.Path, tfm, updatedTopLevelDependencies, logger);
|
343
403
|
if (resolvedDependencies is null)
|
344
404
|
{
|
345
405
|
logger.Log($" Unable to resolve dependency conflicts for {projectFile.Path}.");
|
@@ -360,7 +420,7 @@ internal static class SdkPackageUpdater
|
|
360
420
|
continue;
|
361
421
|
}
|
362
422
|
|
363
|
-
// update all
|
423
|
+
// update all versions
|
364
424
|
foreach (Dependency resolvedDependency in resolvedDependencies
|
365
425
|
.Where(d => !d.Name.Equals(dependencyName, StringComparison.OrdinalIgnoreCase))
|
366
426
|
.Where(d => d.Version is not null))
|
@@ -13,6 +13,14 @@ using Console = System.Console;
|
|
13
13
|
|
14
14
|
namespace NuGetUpdater.Core;
|
15
15
|
|
16
|
+
/// <summary>
|
17
|
+
/// Handles package updates for projects that use packages.config.
|
18
|
+
/// </summary>
|
19
|
+
/// <remarks>
|
20
|
+
/// packages.config can appear in non-SDK-style projects, but not in SDK-style projects.
|
21
|
+
/// See: https://learn.microsoft.com/en-us/nuget/reference/packages-config
|
22
|
+
/// https://learn.microsoft.com/en-us/nuget/resources/check-project-format
|
23
|
+
/// <remarks>
|
16
24
|
internal static class PackagesConfigUpdater
|
17
25
|
{
|
18
26
|
public static async Task UpdateDependencyAsync(
|
@@ -25,9 +33,8 @@ internal static class PackagesConfigUpdater
|
|
25
33
|
ILogger logger
|
26
34
|
)
|
27
35
|
{
|
28
|
-
|
29
|
-
|
30
|
-
// use NuGet.exe to perform update
|
36
|
+
// packages.config project; use NuGet.exe to perform update
|
37
|
+
logger.Log($" Found '{NuGetHelper.PackagesConfigFileName}' project; running NuGet.exe update");
|
31
38
|
|
32
39
|
// ensure local packages directory exists
|
33
40
|
var projectBuildFile = ProjectBuildFile.Open(repoRootPath, projectPath);
|
@@ -126,10 +133,10 @@ internal static class PackagesConfigUpdater
|
|
126
133
|
// and doesn't appear in the cache. The message in this case will be "Could not install package
|
127
134
|
// '<name> <version>'...the package does not contain any assembly references or content files that
|
128
135
|
// are compatible with that framework.".
|
136
|
+
// 3. Yet another possibility is that the project explicitly imports a targets file without a condition
|
137
|
+
// of `Exists(...)`.
|
129
138
|
// The solution in all cases is to run `restore` then try the update again.
|
130
|
-
if (!retryingAfterRestore &&
|
131
|
-
(fullOutput.Contains("Existing packages must be restored before performing an install or update.") ||
|
132
|
-
fullOutput.Contains("the package does not contain any assembly references or content files that are compatible with that framework.")))
|
139
|
+
if (!retryingAfterRestore && OutputIndicatesRestoreIsRequired(fullOutput))
|
133
140
|
{
|
134
141
|
retryingAfterRestore = true;
|
135
142
|
logger.Log($" Running NuGet.exe with args: {string.Join(" ", restoreArgs)}");
|
@@ -139,6 +146,8 @@ internal static class PackagesConfigUpdater
|
|
139
146
|
|
140
147
|
if (exitCodeAgain != 0)
|
141
148
|
{
|
149
|
+
MSBuildHelper.ThrowOnMissingFile(fullOutput);
|
150
|
+
MSBuildHelper.ThrowOnMissingFile(restoreOutput);
|
142
151
|
MSBuildHelper.ThrowOnMissingPackages(restoreOutput);
|
143
152
|
throw new Exception($"Unable to restore.\nOutput:\n${restoreOutput}\n");
|
144
153
|
}
|
@@ -174,6 +183,13 @@ internal static class PackagesConfigUpdater
|
|
174
183
|
}
|
175
184
|
}
|
176
185
|
|
186
|
+
private static bool OutputIndicatesRestoreIsRequired(string output)
|
187
|
+
{
|
188
|
+
return output.Contains("Existing packages must be restored before performing an install or update.")
|
189
|
+
|| output.Contains("the package does not contain any assembly references or content files that are compatible with that framework.")
|
190
|
+
|| MSBuildHelper.GetMissingFile(output) is not null;
|
191
|
+
}
|
192
|
+
|
177
193
|
private static Process[] GetLikelyNuGetSpawnedProcesses()
|
178
194
|
{
|
179
195
|
var processes = Process.GetProcesses().Where(p => p.ProcessName.StartsWith("CredentialProvider", StringComparison.OrdinalIgnoreCase) == true).ToArray();
|
@@ -206,7 +222,7 @@ internal static class PackagesConfigUpdater
|
|
206
222
|
{
|
207
223
|
// exact match was found, use it
|
208
224
|
var subpath = GetUpToIndexWithoutTrailingDirectorySeparator(hintPath, hintPathSubStringLocation);
|
209
|
-
return subpath;
|
225
|
+
return subpath.NormalizePathToUnix();
|
210
226
|
}
|
211
227
|
|
212
228
|
if (partialPathMatch is null)
|
@@ -244,7 +260,7 @@ internal static class PackagesConfigUpdater
|
|
244
260
|
}
|
245
261
|
}
|
246
262
|
|
247
|
-
return partialPathMatch;
|
263
|
+
return partialPathMatch?.NormalizePathToUnix();
|
248
264
|
}
|
249
265
|
|
250
266
|
private static bool IsHintPathNodeForDependency(this IXmlElementSyntax element, string dependencyName)
|
@@ -221,7 +221,7 @@ public class UpdaterWorker
|
|
221
221
|
}
|
222
222
|
|
223
223
|
// Some repos use a mix of packages.config and PackageReference
|
224
|
-
await
|
224
|
+
await PackageReferenceUpdater.UpdateDependencyAsync(repoRootPath, projectPath, dependencyName, previousDependencyVersion, newDependencyVersion, isTransitive, _logger);
|
225
225
|
|
226
226
|
// Update lock file if exists
|
227
227
|
if (File.Exists(Path.Combine(Path.GetDirectoryName(projectPath), "packages.lock.json")))
|
@@ -341,18 +341,6 @@ internal static partial class MSBuildHelper
|
|
341
341
|
}
|
342
342
|
|
343
343
|
internal static async Task<Dependency[]?> ResolveDependencyConflicts(string repoRoot, string projectPath, string targetFramework, Dependency[] packages, Dependency[] update, ILogger logger)
|
344
|
-
{
|
345
|
-
if (UseNewDependencySolver())
|
346
|
-
{
|
347
|
-
return await ResolveDependencyConflictsNew(repoRoot, projectPath, targetFramework, packages, update, logger);
|
348
|
-
}
|
349
|
-
else
|
350
|
-
{
|
351
|
-
return await ResolveDependencyConflictsOld(repoRoot, projectPath, targetFramework, packages, logger);
|
352
|
-
}
|
353
|
-
}
|
354
|
-
|
355
|
-
internal static async Task<Dependency[]?> ResolveDependencyConflictsNew(string repoRoot, string projectPath, string targetFramework, Dependency[] packages, Dependency[] update, ILogger logger)
|
356
344
|
{
|
357
345
|
var tempDirectory = Directory.CreateTempSubdirectory("package-dependency-coherence_");
|
358
346
|
PackageManager packageManager = new PackageManager(repoRoot, projectPath);
|
@@ -510,7 +498,7 @@ internal static partial class MSBuildHelper
|
|
510
498
|
}
|
511
499
|
}
|
512
500
|
|
513
|
-
internal static async Task<Dependency[]?>
|
501
|
+
internal static async Task<Dependency[]?> ResolveDependencyConflictsWithBruteForce(string repoRoot, string projectPath, string targetFramework, Dependency[] packages, ILogger logger)
|
514
502
|
{
|
515
503
|
var tempDirectory = Directory.CreateTempSubdirectory("package-dependency-coherence_");
|
516
504
|
try
|
@@ -713,6 +701,8 @@ internal static partial class MSBuildHelper
|
|
713
701
|
<GenerateDependencyFile>true</GenerateDependencyFile>
|
714
702
|
<RunAnalyzers>false</RunAnalyzers>
|
715
703
|
<NuGetInteractive>false</NuGetInteractive>
|
704
|
+
<DesignTimeBuild>true</DesignTimeBuild>
|
705
|
+
<TargetPlatformVersion Condition=" $(TargetFramework.Contains('-')) ">1.0</TargetPlatformVersion>
|
716
706
|
</PropertyGroup>
|
717
707
|
<ItemGroup>
|
718
708
|
{packageReferences}
|
@@ -824,13 +814,24 @@ internal static partial class MSBuildHelper
|
|
824
814
|
}
|
825
815
|
}
|
826
816
|
|
827
|
-
internal static
|
817
|
+
internal static string? GetMissingFile(string output)
|
828
818
|
{
|
829
819
|
var missingFilePattern = new Regex(@"The imported project \""(?<FilePath>.*)\"" was not found");
|
830
820
|
var match = missingFilePattern.Match(output);
|
831
821
|
if (match.Success)
|
832
822
|
{
|
833
|
-
|
823
|
+
return match.Groups["FilePath"].Value;
|
824
|
+
}
|
825
|
+
|
826
|
+
return null;
|
827
|
+
}
|
828
|
+
|
829
|
+
internal static void ThrowOnMissingFile(string output)
|
830
|
+
{
|
831
|
+
var missingFile = GetMissingFile(output);
|
832
|
+
if (missingFile is not null)
|
833
|
+
{
|
834
|
+
throw new MissingFileException(missingFile);
|
834
835
|
}
|
835
836
|
}
|
836
837
|
|
@@ -0,0 +1,12 @@
|
|
1
|
+
namespace NuGetUpdater.Core.Test;
|
2
|
+
|
3
|
+
/// <summary>
|
4
|
+
/// Prepares the environment to use the new dependency solver.
|
5
|
+
/// </summary>
|
6
|
+
public class DependencySolverEnvironment : TemporaryEnvironment
|
7
|
+
{
|
8
|
+
public DependencySolverEnvironment(bool useDependencySolver = true)
|
9
|
+
: base([("UseNewNugetPackageResolver", useDependencySolver ? "true" : "false")])
|
10
|
+
{
|
11
|
+
}
|
12
|
+
}
|
@@ -30,7 +30,7 @@ public class PackagesConfigUpdaterTests : TestBase
|
|
30
30
|
""",
|
31
31
|
"Newtonsoft.Json",
|
32
32
|
"7.0.1",
|
33
|
-
|
33
|
+
"../packages"
|
34
34
|
];
|
35
35
|
|
36
36
|
// project without namespace
|
@@ -48,7 +48,7 @@ public class PackagesConfigUpdaterTests : TestBase
|
|
48
48
|
""",
|
49
49
|
"Newtonsoft.Json",
|
50
50
|
"7.0.1",
|
51
|
-
|
51
|
+
"../packages"
|
52
52
|
];
|
53
53
|
|
54
54
|
// project with non-standard packages path
|
@@ -66,7 +66,7 @@ public class PackagesConfigUpdaterTests : TestBase
|
|
66
66
|
""",
|
67
67
|
"Newtonsoft.Json",
|
68
68
|
"7.0.1",
|
69
|
-
|
69
|
+
"../not-a-path-you-would-expect"
|
70
70
|
];
|
71
71
|
}
|
72
72
|
}
|
@@ -10,7 +10,7 @@ namespace NuGetUpdater.Core.Test.Update;
|
|
10
10
|
|
11
11
|
public partial class UpdateWorkerTests
|
12
12
|
{
|
13
|
-
public class
|
13
|
+
public class PackageReference : UpdateWorkerTestBase
|
14
14
|
{
|
15
15
|
[Theory]
|
16
16
|
[InlineData("net472")]
|
@@ -54,12 +54,12 @@ public partial class UpdateWorkerTests
|
|
54
54
|
}
|
55
55
|
|
56
56
|
[Theory]
|
57
|
-
[InlineData(
|
58
|
-
[InlineData(
|
59
|
-
public async Task UpdateVersionChildElement_InProjectFile_ForPackageReferenceIncludeTheory(
|
57
|
+
[InlineData(true)]
|
58
|
+
[InlineData(false)]
|
59
|
+
public async Task UpdateVersionChildElement_InProjectFile_ForPackageReferenceIncludeTheory(bool useDependencySolver)
|
60
60
|
{
|
61
61
|
// update Some.Package from 9.0.1 to 13.0.1
|
62
|
-
using var
|
62
|
+
using var _ = new DependencySolverEnvironment(useDependencySolver);
|
63
63
|
await TestUpdateForProject("Some.Package", "9.0.1", "13.0.1",
|
64
64
|
packages:
|
65
65
|
[
|
@@ -95,11 +95,72 @@ public partial class UpdateWorkerTests
|
|
95
95
|
);
|
96
96
|
}
|
97
97
|
|
98
|
+
[Theory]
|
99
|
+
[InlineData(true)]
|
100
|
+
[InlineData(false)]
|
101
|
+
public async Task PeerDependenciesAreUpdatedEvenWhenNotExplicit(bool useDependencySolver)
|
102
|
+
{
|
103
|
+
using var _ = new DependencySolverEnvironment(useDependencySolver);
|
104
|
+
await TestUpdateForProject("Some.Package", "1.0.0", "2.0.0",
|
105
|
+
packages:
|
106
|
+
[
|
107
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net8.0", [(null, [("Transitive.Package", "[1.0.0]")])]),
|
108
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "2.0.0", "net8.0", [(null, [("Transitive.Package", "[2.0.0]")])]),
|
109
|
+
MockNuGetPackage.CreateSimplePackage("Transitive.Package", "1.0.0", "net8.0"),
|
110
|
+
MockNuGetPackage.CreateSimplePackage("Transitive.Package", "2.0.0", "net8.0"),
|
111
|
+
],
|
112
|
+
projectFile: ("a/a.csproj", """
|
113
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
114
|
+
<PropertyGroup>
|
115
|
+
<TargetFramework>net8.0</TargetFramework>
|
116
|
+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
117
|
+
</PropertyGroup>
|
118
|
+
<ItemGroup>
|
119
|
+
<PackageReference Include="Some.Package" />
|
120
|
+
</ItemGroup>
|
121
|
+
</Project>
|
122
|
+
"""),
|
123
|
+
additionalFiles:
|
124
|
+
[
|
125
|
+
("Directory.Packages.props", """
|
126
|
+
<Project>
|
127
|
+
<ItemGroup>
|
128
|
+
<PackageVersion Include="Some.Package" Version="1.0.0" />
|
129
|
+
<PackageVersion Include="Transitive.Package" Version="1.0.0" />
|
130
|
+
</ItemGroup>
|
131
|
+
</Project>
|
132
|
+
""")
|
133
|
+
],
|
134
|
+
expectedProjectContents: """
|
135
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
136
|
+
<PropertyGroup>
|
137
|
+
<TargetFramework>net8.0</TargetFramework>
|
138
|
+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
139
|
+
</PropertyGroup>
|
140
|
+
<ItemGroup>
|
141
|
+
<PackageReference Include="Some.Package" />
|
142
|
+
</ItemGroup>
|
143
|
+
</Project>
|
144
|
+
""",
|
145
|
+
additionalFilesExpected:
|
146
|
+
[
|
147
|
+
("Directory.Packages.props", """
|
148
|
+
<Project>
|
149
|
+
<ItemGroup>
|
150
|
+
<PackageVersion Include="Some.Package" Version="2.0.0" />
|
151
|
+
<PackageVersion Include="Transitive.Package" Version="2.0.0" />
|
152
|
+
</ItemGroup>
|
153
|
+
</Project>
|
154
|
+
""")
|
155
|
+
]
|
156
|
+
);
|
157
|
+
}
|
158
|
+
|
98
159
|
[Fact]
|
99
160
|
public async Task CallingResolveDependencyConflictsNew()
|
100
161
|
{
|
101
162
|
// update Microsoft.CodeAnalysis.Common from 4.9.2 to 4.10.0
|
102
|
-
using var
|
163
|
+
using var _ = new DependencySolverEnvironment();
|
103
164
|
await TestUpdateForProject("Microsoft.CodeAnalysis.Common", "4.9.2", "4.10.0",
|
104
165
|
// initial
|
105
166
|
projectContents: $"""
|
@@ -535,11 +596,11 @@ public partial class UpdateWorkerTests
|
|
535
596
|
}
|
536
597
|
|
537
598
|
[Theory]
|
538
|
-
[InlineData(
|
539
|
-
[InlineData(
|
540
|
-
public async Task AddPackageReference_InProjectFile_ForTransientDependency(
|
599
|
+
[InlineData(true)]
|
600
|
+
[InlineData(false)]
|
601
|
+
public async Task AddPackageReference_InProjectFile_ForTransientDependency(bool useDependencySolver)
|
541
602
|
{
|
542
|
-
using var
|
603
|
+
using var _ = new DependencySolverEnvironment(useDependencySolver);
|
543
604
|
// add transient package Some.Transient.Dependency from 5.0.1 to 5.0.2
|
544
605
|
await TestUpdateForProject("Some.Transient.Dependency", "5.0.1", "5.0.2", isTransitive: true,
|
545
606
|
packages:
|
@@ -2914,12 +2975,51 @@ public partial class UpdateWorkerTests
|
|
2914
2975
|
);
|
2915
2976
|
}
|
2916
2977
|
|
2978
|
+
[Fact]
|
2979
|
+
public async Task UpdatingTransitiveDependencyWithNewSolverCanUpdateJustTheTopLevelPackage()
|
2980
|
+
{
|
2981
|
+
// we've been asked to explicitly update a transitive dependency, but we can solve it by updating the top-level package instead
|
2982
|
+
using var _ = new DependencySolverEnvironment();
|
2983
|
+
await TestUpdateForProject("Transitive.Package", "1.0.0", "2.0.0",
|
2984
|
+
isTransitive: true,
|
2985
|
+
packages:
|
2986
|
+
[
|
2987
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net8.0", [("net8.0", [("Transitive.Package", "[1.0.0]")])]),
|
2988
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "2.0.0", "net8.0", [("net8.0", [("Transitive.Package", "[2.0.0]")])]),
|
2989
|
+
MockNuGetPackage.CreateSimplePackage("Transitive.Package", "1.0.0", "net8.0"),
|
2990
|
+
MockNuGetPackage.CreateSimplePackage("Transitive.Package", "2.0.0", "net8.0"),
|
2991
|
+
],
|
2992
|
+
projectContents: """
|
2993
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
2994
|
+
<PropertyGroup>
|
2995
|
+
<TargetFramework>net8.0</TargetFramework>
|
2996
|
+
<ManagePackageVersionsCentrally>false</ManagePackageVersionsCentrally>
|
2997
|
+
</PropertyGroup>
|
2998
|
+
<ItemGroup>
|
2999
|
+
<PackageReference Include="Some.Package" Version="1.0.0" />
|
3000
|
+
</ItemGroup>
|
3001
|
+
</Project>
|
3002
|
+
""",
|
3003
|
+
expectedProjectContents: """
|
3004
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
3005
|
+
<PropertyGroup>
|
3006
|
+
<TargetFramework>net8.0</TargetFramework>
|
3007
|
+
<ManagePackageVersionsCentrally>false</ManagePackageVersionsCentrally>
|
3008
|
+
</PropertyGroup>
|
3009
|
+
<ItemGroup>
|
3010
|
+
<PackageReference Include="Some.Package" Version="2.0.0" />
|
3011
|
+
</ItemGroup>
|
3012
|
+
</Project>
|
3013
|
+
"""
|
3014
|
+
);
|
3015
|
+
}
|
3016
|
+
|
2917
3017
|
[Theory]
|
2918
|
-
[InlineData(
|
2919
|
-
[InlineData(
|
2920
|
-
public async Task NoChange_IfThereAreIncoherentVersions(
|
3018
|
+
[InlineData(true)]
|
3019
|
+
[InlineData(false)]
|
3020
|
+
public async Task NoChange_IfThereAreIncoherentVersions(bool useDependencySolver)
|
2921
3021
|
{
|
2922
|
-
using var
|
3022
|
+
using var _ = new DependencySolverEnvironment(useDependencySolver);
|
2923
3023
|
|
2924
3024
|
// trying to update `Transitive.Dependency` to 1.1.0 would normally pull `Some.Package` from 1.0.0 to 1.1.0,
|
2925
3025
|
// but the TFM doesn't allow it
|
@@ -2968,6 +3068,42 @@ public partial class UpdateWorkerTests
|
|
2968
3068
|
);
|
2969
3069
|
}
|
2970
3070
|
|
3071
|
+
[Fact]
|
3072
|
+
public async Task ProcessingProjectWithWorkloadReferencesDoesNotFail()
|
3073
|
+
{
|
3074
|
+
// enumerating the build files will fail if the Aspire workload is not installed; this test ensures we can
|
3075
|
+
// still process the update
|
3076
|
+
await TestUpdateForProject("Some.Package", "7.0.1", "13.0.1",
|
3077
|
+
packages:
|
3078
|
+
[
|
3079
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "7.0.1", "net8.0"),
|
3080
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "13.0.1", "net8.0"),
|
3081
|
+
],
|
3082
|
+
projectContents: """
|
3083
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
3084
|
+
<PropertyGroup>
|
3085
|
+
<TargetFrameworks>net8.0-ios;net8.0-android;net8.0-macos;net8.0-maccatalyst;</TargetFrameworks>
|
3086
|
+
<IsAspireHost>true</IsAspireHost>
|
3087
|
+
</PropertyGroup>
|
3088
|
+
<ItemGroup>
|
3089
|
+
<PackageReference Include="Some.Package" Version="7.0.1" />
|
3090
|
+
</ItemGroup>
|
3091
|
+
</Project>
|
3092
|
+
""",
|
3093
|
+
expectedProjectContents: """
|
3094
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
3095
|
+
<PropertyGroup>
|
3096
|
+
<TargetFrameworks>net8.0-ios;net8.0-android;net8.0-macos;net8.0-maccatalyst;</TargetFrameworks>
|
3097
|
+
<IsAspireHost>true</IsAspireHost>
|
3098
|
+
</PropertyGroup>
|
3099
|
+
<ItemGroup>
|
3100
|
+
<PackageReference Include="Some.Package" Version="13.0.1" />
|
3101
|
+
</ItemGroup>
|
3102
|
+
</Project>
|
3103
|
+
"""
|
3104
|
+
);
|
3105
|
+
}
|
3106
|
+
|
2971
3107
|
[Fact]
|
2972
3108
|
public async Task ProcessingProjectWithAspireDoesNotFailEvenThoughWorkloadIsNotInstalled()
|
2973
3109
|
{
|
@@ -3005,11 +3141,11 @@ public partial class UpdateWorkerTests
|
|
3005
3141
|
}
|
3006
3142
|
|
3007
3143
|
[Theory]
|
3008
|
-
[InlineData(
|
3009
|
-
[InlineData(
|
3010
|
-
public async Task UnresolvablePropertyDoesNotStopOtherUpdates(
|
3144
|
+
[InlineData(true)]
|
3145
|
+
[InlineData(false)]
|
3146
|
+
public async Task UnresolvablePropertyDoesNotStopOtherUpdates(bool useDependencySolver)
|
3011
3147
|
{
|
3012
|
-
using var
|
3148
|
+
using var _ = new DependencySolverEnvironment(useDependencySolver);
|
3013
3149
|
|
3014
3150
|
// the property `$(SomeUnresolvableProperty)` cannot be resolved
|
3015
3151
|
await TestUpdateForProject("Some.Package", "7.0.1", "13.0.1",
|
@@ -3044,12 +3180,53 @@ public partial class UpdateWorkerTests
|
|
3044
3180
|
);
|
3045
3181
|
}
|
3046
3182
|
|
3183
|
+
|
3184
|
+
[Theory]
|
3185
|
+
[InlineData(true)]
|
3186
|
+
[InlineData(false)]
|
3187
|
+
public async Task ProjectWithWorkloadsShouldNotFail(bool useDependencySolver)
|
3188
|
+
{
|
3189
|
+
using var _ = new DependencySolverEnvironment(useDependencySolver);
|
3190
|
+
|
3191
|
+
// the property `$(SomeUnresolvableProperty)` cannot be resolved
|
3192
|
+
await TestUpdateForProject("Some.Package", "7.0.1", "13.0.1",
|
3193
|
+
packages:
|
3194
|
+
[
|
3195
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "7.0.1", "net8.0"),
|
3196
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "13.0.1", "net8.0"),
|
3197
|
+
MockNuGetPackage.CreateSimplePackage("Some.Other.Package", "1.0.0", "net8.0"),
|
3198
|
+
],
|
3199
|
+
projectContents: """
|
3200
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
3201
|
+
<PropertyGroup>
|
3202
|
+
<TargetFrameworks>net8.0;net8.0-ios;net8.0-android;net8.0-macos;net8.0-maccatalyst</TargetFrameworks>
|
3203
|
+
</PropertyGroup>
|
3204
|
+
<ItemGroup>
|
3205
|
+
<PackageReference Include="Some.Other.Package" Version="$(SomeUnresolvableProperty)" />
|
3206
|
+
<PackageReference Include="Some.Package" Version="7.0.1" />
|
3207
|
+
</ItemGroup>
|
3208
|
+
</Project>
|
3209
|
+
""",
|
3210
|
+
expectedProjectContents: """
|
3211
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
3212
|
+
<PropertyGroup>
|
3213
|
+
<TargetFrameworks>net8.0;net8.0-ios;net8.0-android;net8.0-macos;net8.0-maccatalyst</TargetFrameworks>
|
3214
|
+
</PropertyGroup>
|
3215
|
+
<ItemGroup>
|
3216
|
+
<PackageReference Include="Some.Other.Package" Version="$(SomeUnresolvableProperty)" />
|
3217
|
+
<PackageReference Include="Some.Package" Version="13.0.1" />
|
3218
|
+
</ItemGroup>
|
3219
|
+
</Project>
|
3220
|
+
"""
|
3221
|
+
);
|
3222
|
+
}
|
3223
|
+
|
3047
3224
|
[Theory]
|
3048
|
-
[InlineData(
|
3049
|
-
[InlineData(
|
3050
|
-
public async Task UpdatingPackageAlsoUpdatesAnythingWithADependencyOnTheUpdatedPackage(
|
3225
|
+
[InlineData(true)]
|
3226
|
+
[InlineData(false)]
|
3227
|
+
public async Task UpdatingPackageAlsoUpdatesAnythingWithADependencyOnTheUpdatedPackage(bool useDependencySolver)
|
3051
3228
|
{
|
3052
|
-
using var
|
3229
|
+
using var _ = new DependencySolverEnvironment(useDependencySolver);
|
3053
3230
|
|
3054
3231
|
// updating Some.Package from 3.3.30 requires that Some.Package.Extensions also be updated
|
3055
3232
|
await TestUpdateForProject("Some.Package", "3.3.30", "3.4.3",
|
data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs
CHANGED
@@ -308,6 +308,83 @@ public partial class UpdateWorkerTests
|
|
308
308
|
);
|
309
309
|
}
|
310
310
|
|
311
|
+
[Fact]
|
312
|
+
public async Task UpdatePackageWithTargetsFileWhereProjectUsesBackslashes()
|
313
|
+
{
|
314
|
+
// The bug that caused this test to be written did not repro on Windows. The reason is that the packages
|
315
|
+
// directory is determined to be `..\packages`, but the backslash was retained. Later when packages were
|
316
|
+
// restored to that location, a directory with a name like `..?packages` would be created which didn't
|
317
|
+
// match the <Import> element's path of "..\packages\..." that had no `Condition="Exists(path)"` attribute.
|
318
|
+
await TestUpdateForProject("Some.Package", "1.0.0", "2.0.0",
|
319
|
+
packages:
|
320
|
+
[
|
321
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net45"),
|
322
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "2.0.0", "net45"),
|
323
|
+
new MockNuGetPackage("Package.With.Targets", "1.0.0", Files: [("build/SomeFile.targets", Encoding.UTF8.GetBytes("<Project />"))]),
|
324
|
+
],
|
325
|
+
// existing
|
326
|
+
projectFile: ("src/project.csproj", """
|
327
|
+
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
328
|
+
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
329
|
+
<PropertyGroup>
|
330
|
+
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
331
|
+
</PropertyGroup>
|
332
|
+
<ItemGroup>
|
333
|
+
<None Include="packages.config" />
|
334
|
+
</ItemGroup>
|
335
|
+
<ItemGroup>
|
336
|
+
<Reference Include="Some.Package">
|
337
|
+
<HintPath>..\packages\Some.Package.1.0.0\lib\net45\Some.Package.dll</HintPath>
|
338
|
+
<Private>True</Private>
|
339
|
+
</Reference>
|
340
|
+
</ItemGroup>
|
341
|
+
<Import Project="..\packages\Package.With.Targets.1.0.0\build\SomeFile.targets" />
|
342
|
+
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
343
|
+
</Project>
|
344
|
+
"""),
|
345
|
+
additionalFiles:
|
346
|
+
[
|
347
|
+
("src/packages.config", """
|
348
|
+
<?xml version="1.0" encoding="utf-8"?>
|
349
|
+
<packages>
|
350
|
+
<package id="Package.With.Targets" version="1.0.0" targetFramework="net45" />
|
351
|
+
<package id="Some.Package" version="1.0.0" targetFramework="net45" />
|
352
|
+
</packages>
|
353
|
+
""")
|
354
|
+
],
|
355
|
+
// expected
|
356
|
+
expectedProjectContents: """
|
357
|
+
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
358
|
+
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
359
|
+
<PropertyGroup>
|
360
|
+
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
361
|
+
</PropertyGroup>
|
362
|
+
<ItemGroup>
|
363
|
+
<None Include="packages.config" />
|
364
|
+
</ItemGroup>
|
365
|
+
<ItemGroup>
|
366
|
+
<Reference Include="Some.Package">
|
367
|
+
<HintPath>..\packages\Some.Package.2.0.0\lib\net45\Some.Package.dll</HintPath>
|
368
|
+
<Private>True</Private>
|
369
|
+
</Reference>
|
370
|
+
</ItemGroup>
|
371
|
+
<Import Project="..\packages\Package.With.Targets.1.0.0\build\SomeFile.targets" />
|
372
|
+
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
373
|
+
</Project>
|
374
|
+
""",
|
375
|
+
additionalFilesExpected:
|
376
|
+
[
|
377
|
+
("src/packages.config", """
|
378
|
+
<?xml version="1.0" encoding="utf-8"?>
|
379
|
+
<packages>
|
380
|
+
<package id="Package.With.Targets" version="1.0.0" targetFramework="net45" />
|
381
|
+
<package id="Some.Package" version="2.0.0" targetFramework="net45" />
|
382
|
+
</packages>
|
383
|
+
""")
|
384
|
+
]
|
385
|
+
);
|
386
|
+
}
|
387
|
+
|
311
388
|
[Fact]
|
312
389
|
public async Task UpdateSingleDependencyInPackagesConfigButNotToLatest()
|
313
390
|
{
|
@@ -442,9 +442,9 @@ public class MSBuildHelperTests : TestBase
|
|
442
442
|
}
|
443
443
|
|
444
444
|
[Fact]
|
445
|
-
public async Task
|
445
|
+
public async Task DependencyConflictsCanBeResolvedWithBruteForce()
|
446
446
|
{
|
447
|
-
var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(
|
447
|
+
var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedWithBruteForce)}_");
|
448
448
|
MockNuGetPackage[] testPackages =
|
449
449
|
[
|
450
450
|
// some base packages
|
@@ -483,7 +483,7 @@ public class MSBuildHelperTests : TestBase
|
|
483
483
|
{
|
484
484
|
new Dependency("Some.Other.Package", "1.2.0", DependencyType.PackageReference),
|
485
485
|
};
|
486
|
-
var resolvedDependencies = await MSBuildHelper.
|
486
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsWithBruteForce(repoRoot.FullName, projectPath, "net8.0", dependencies, new TestLogger());
|
487
487
|
Assert.NotNull(resolvedDependencies);
|
488
488
|
Assert.Equal(2, resolvedDependencies.Length);
|
489
489
|
Assert.Equal("Some.Package", resolvedDependencies[0].Name);
|
@@ -497,6 +497,44 @@ public class MSBuildHelperTests : TestBase
|
|
497
497
|
}
|
498
498
|
}
|
499
499
|
|
500
|
+
[Fact]
|
501
|
+
public void UpdateWithWorkloadsTargetFrameworks()
|
502
|
+
{
|
503
|
+
// Arrange
|
504
|
+
var projectContents = """
|
505
|
+
<Project>
|
506
|
+
<PropertyGroup>
|
507
|
+
<TargetFrameworks>net8.0-ios;net8.0-android;net8.0-macos;net8.0-maccatalyst;</TargetFrameworks>
|
508
|
+
</PropertyGroup>
|
509
|
+
<ItemGroup>
|
510
|
+
<PackageReference Include="Some.Package" Version="$(PackageVersion1)" />
|
511
|
+
</ItemGroup>
|
512
|
+
</Project>
|
513
|
+
""";
|
514
|
+
var propertyInfo = new Dictionary<string, Property>
|
515
|
+
{
|
516
|
+
{ "PackageVersion1", new("PackageVersion1", "1.1.1", "Packages.props") },
|
517
|
+
};
|
518
|
+
|
519
|
+
// Act
|
520
|
+
var (resultType, _, evaluatedValue, _, _) = MSBuildHelper.GetEvaluatedValue(projectContents, propertyInfo);
|
521
|
+
|
522
|
+
Assert.Equal(EvaluationResultType.Success, resultType);
|
523
|
+
|
524
|
+
// Assert
|
525
|
+
Assert.Equal("""
|
526
|
+
<Project>
|
527
|
+
<PropertyGroup>
|
528
|
+
<TargetFrameworks>net8.0-ios;net8.0-android;net8.0-macos;net8.0-maccatalyst;</TargetFrameworks>
|
529
|
+
</PropertyGroup>
|
530
|
+
<ItemGroup>
|
531
|
+
<PackageReference Include="Some.Package" Version="1.1.1" />
|
532
|
+
</ItemGroup>
|
533
|
+
</Project>
|
534
|
+
""", evaluatedValue);
|
535
|
+
}
|
536
|
+
|
537
|
+
|
500
538
|
#region
|
501
539
|
// Updating root package
|
502
540
|
// CS-Script Code to 2.0.0 requires its dependency Microsoft.CodeAnalysis.CSharp.Scripting to be 3.6.0 and its transitive dependency Microsoft.CodeAnalysis.Common to be 3.6.0
|
@@ -533,7 +571,7 @@ public class MSBuildHelperTests : TestBase
|
|
533
571
|
new Dependency("CS-Script.Core", "2.0.0", DependencyType.PackageReference),
|
534
572
|
};
|
535
573
|
|
536
|
-
var resolvedDependencies = await MSBuildHelper.
|
574
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
|
537
575
|
Assert.NotNull(resolvedDependencies);
|
538
576
|
Assert.Equal(3, resolvedDependencies.Length);
|
539
577
|
Assert.Equal("CS-Script.Core", resolvedDependencies[0].Name);
|
@@ -578,7 +616,7 @@ public class MSBuildHelperTests : TestBase
|
|
578
616
|
new Dependency("Microsoft.Bcl.AsyncInterfaces", "1.1.1", DependencyType.Unknown)
|
579
617
|
};
|
580
618
|
|
581
|
-
var resolvedDependencies = await MSBuildHelper.
|
619
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
|
582
620
|
Assert.NotNull(resolvedDependencies);
|
583
621
|
Assert.Single(resolvedDependencies);
|
584
622
|
Assert.Equal("Azure.Core", resolvedDependencies[0].Name);
|
@@ -621,7 +659,7 @@ public class MSBuildHelperTests : TestBase
|
|
621
659
|
new Dependency("Newtonsoft.Json", "13.0.1", DependencyType.Unknown)
|
622
660
|
};
|
623
661
|
|
624
|
-
var resolvedDependencies = await MSBuildHelper.
|
662
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
|
625
663
|
Assert.NotNull(resolvedDependencies);
|
626
664
|
Assert.Equal(2, resolvedDependencies.Length);
|
627
665
|
Assert.Equal("Newtonsoft.Json.Bson", resolvedDependencies[0].Name);
|
@@ -671,7 +709,7 @@ public class MSBuildHelperTests : TestBase
|
|
671
709
|
new Dependency("Microsoft.CodeAnalysis.Common", "4.10.0", DependencyType.PackageReference)
|
672
710
|
};
|
673
711
|
|
674
|
-
var resolvedDependencies = await MSBuildHelper.
|
712
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
|
675
713
|
Assert.NotNull(resolvedDependencies);
|
676
714
|
Assert.Equal(3, resolvedDependencies.Length);
|
677
715
|
Assert.Equal("Microsoft.CodeAnalysis.Compilers", resolvedDependencies[0].Name);
|
@@ -723,7 +761,7 @@ public class MSBuildHelperTests : TestBase
|
|
723
761
|
new Dependency("Microsoft.CodeAnalysis.Common", "4.10.0", DependencyType.PackageReference)
|
724
762
|
};
|
725
763
|
|
726
|
-
var resolvedDependencies = await MSBuildHelper.
|
764
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
|
727
765
|
Assert.NotNull(resolvedDependencies);
|
728
766
|
Assert.Equal(4, resolvedDependencies.Length);
|
729
767
|
Assert.Equal("Microsoft.CodeAnalysis.Compilers", resolvedDependencies[0].Name);
|
@@ -779,7 +817,7 @@ public class MSBuildHelperTests : TestBase
|
|
779
817
|
new Dependency("Newtonsoft.Json", "13.0.1", DependencyType.Unknown)
|
780
818
|
};
|
781
819
|
|
782
|
-
var resolvedDependencies = await MSBuildHelper.
|
820
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
|
783
821
|
Assert.NotNull(resolvedDependencies);
|
784
822
|
Assert.Equal(5, resolvedDependencies.Length);
|
785
823
|
Assert.Equal("Microsoft.CodeAnalysis.Compilers", resolvedDependencies[0].Name);
|
@@ -838,7 +876,7 @@ public class MSBuildHelperTests : TestBase
|
|
838
876
|
new Dependency("Buildalyzer", "7.0.1", DependencyType.PackageReference),
|
839
877
|
};
|
840
878
|
|
841
|
-
var resolvedDependencies = await MSBuildHelper.
|
879
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
|
842
880
|
Assert.NotNull(resolvedDependencies);
|
843
881
|
Assert.Equal(4, resolvedDependencies.Length);
|
844
882
|
Assert.Equal("Buildalyzer", resolvedDependencies[0].Name);
|
@@ -895,7 +933,7 @@ public class MSBuildHelperTests : TestBase
|
|
895
933
|
new Dependency("Azure.Core", "1.22.0", DependencyType.PackageReference)
|
896
934
|
};
|
897
935
|
|
898
|
-
var resolvedDependencies = await MSBuildHelper.
|
936
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
|
899
937
|
Assert.NotNull(resolvedDependencies);
|
900
938
|
Assert.Equal(4, resolvedDependencies.Length);
|
901
939
|
Assert.Equal("System.Collections.Immutable", resolvedDependencies[0].Name);
|
@@ -952,7 +990,7 @@ public class MSBuildHelperTests : TestBase
|
|
952
990
|
new Dependency("Azure.Core", "1.22.0", DependencyType.PackageReference)
|
953
991
|
};
|
954
992
|
|
955
|
-
var resolvedDependencies = await MSBuildHelper.
|
993
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
|
956
994
|
Assert.NotNull(resolvedDependencies);
|
957
995
|
Assert.Equal(5, resolvedDependencies.Length);
|
958
996
|
Assert.Equal("System.Collections.Immutable", resolvedDependencies[0].Name);
|
@@ -1007,7 +1045,7 @@ public class MSBuildHelperTests : TestBase
|
|
1007
1045
|
new Dependency("AutoMapper.Collection", "10.0.0", DependencyType.PackageReference)
|
1008
1046
|
};
|
1009
1047
|
|
1010
|
-
var resolvedDependencies = await MSBuildHelper.
|
1048
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
|
1011
1049
|
Assert.NotNull(resolvedDependencies);
|
1012
1050
|
Assert.Equal(3, resolvedDependencies.Length);
|
1013
1051
|
Assert.Equal("AutoMapper.Extensions.Microsoft.DependencyInjection", resolvedDependencies[0].Name);
|
@@ -1054,7 +1092,7 @@ public class MSBuildHelperTests : TestBase
|
|
1054
1092
|
new Dependency("Microsoft.Extensions.Caching.Memory", "8.0.0", DependencyType.PackageReference)
|
1055
1093
|
};
|
1056
1094
|
|
1057
|
-
var resolvedDependencies = await MSBuildHelper.
|
1095
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
|
1058
1096
|
Assert.NotNull(resolvedDependencies);
|
1059
1097
|
Assert.Equal(2, resolvedDependencies.Length);
|
1060
1098
|
Assert.Equal("Microsoft.EntityFrameworkCore", resolvedDependencies[0].Name);
|
@@ -1104,7 +1142,7 @@ public class MSBuildHelperTests : TestBase
|
|
1104
1142
|
new Dependency("Microsoft.EntityFrameworkCore.Analyzers", "8.0.0", DependencyType.PackageReference)
|
1105
1143
|
};
|
1106
1144
|
|
1107
|
-
var resolvedDependencies = await MSBuildHelper.
|
1145
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
|
1108
1146
|
Assert.NotNull(resolvedDependencies);
|
1109
1147
|
Assert.Equal(4, resolvedDependencies.Length);
|
1110
1148
|
Assert.Equal("Microsoft.EntityFrameworkCore.Design", resolvedDependencies[0].Name);
|
@@ -1156,7 +1194,7 @@ public class MSBuildHelperTests : TestBase
|
|
1156
1194
|
new Dependency("Microsoft.EntityFrameworkCore.Analyzers", "8.0.0", DependencyType.PackageReference)
|
1157
1195
|
};
|
1158
1196
|
|
1159
|
-
var resolvedDependencies = await MSBuildHelper.
|
1197
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
|
1160
1198
|
Assert.NotNull(resolvedDependencies);
|
1161
1199
|
Assert.Equal(3, resolvedDependencies.Length);
|
1162
1200
|
Assert.Equal("Microsoft.EntityFrameworkCore.Design", resolvedDependencies[0].Name);
|
@@ -1208,7 +1246,7 @@ public class MSBuildHelperTests : TestBase
|
|
1208
1246
|
new Dependency("System.Collections.Immutable", "8.0.0", DependencyType.PackageReference),
|
1209
1247
|
};
|
1210
1248
|
|
1211
|
-
var resolvedDependencies = await MSBuildHelper.
|
1249
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
|
1212
1250
|
Assert.NotNull(resolvedDependencies);
|
1213
1251
|
Assert.Equal(4, resolvedDependencies.Length);
|
1214
1252
|
Assert.Equal("System.Collections.Immutable", resolvedDependencies[0].Name);
|
@@ -1260,7 +1298,7 @@ public class MSBuildHelperTests : TestBase
|
|
1260
1298
|
new Dependency("System.Collections.Immutable", "8.0.0", DependencyType.PackageReference),
|
1261
1299
|
};
|
1262
1300
|
|
1263
|
-
var resolvedDependencies = await MSBuildHelper.
|
1301
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
|
1264
1302
|
Assert.NotNull(resolvedDependencies);
|
1265
1303
|
Assert.Equal(3, resolvedDependencies.Length);
|
1266
1304
|
Assert.Equal("Microsoft.CodeAnalysis.CSharp.Workspaces", resolvedDependencies[0].Name);
|
@@ -121,15 +121,11 @@ module Dependabot
|
|
121
121
|
def packages_config_files
|
122
122
|
return @packages_config_files if @packages_config_files
|
123
123
|
|
124
|
-
|
125
|
-
[*project_files.map { |f| File.dirname(f.name) }, "."].uniq
|
124
|
+
imported_project_files = imported_property_files.filter { |f| f.name.match?(/\.(cs|vb|fs)proj$/) }
|
126
125
|
|
127
|
-
@packages_config_files =
|
128
|
-
|
129
|
-
|
130
|
-
.find { |f| f.name.casecmp("packages.config").zero? }
|
131
|
-
fetch_file_from_host(File.join(dir, file.name)) if file
|
132
|
-
end
|
126
|
+
@packages_config_files = [*project_files, *imported_project_files].filter_map do |f|
|
127
|
+
named_file_next_to_project_file(f, "packages.config")
|
128
|
+
end
|
133
129
|
end
|
134
130
|
|
135
131
|
sig { returns(T::Array[Dependabot::DependencyFile]) }
|
@@ -312,6 +308,32 @@ module Dependabot
|
|
312
308
|
found_expected_file
|
313
309
|
end
|
314
310
|
|
311
|
+
sig do
|
312
|
+
params(
|
313
|
+
project_file: Dependabot::DependencyFile,
|
314
|
+
expected_file_name: String
|
315
|
+
)
|
316
|
+
.returns(T.nilable(Dependabot::DependencyFile))
|
317
|
+
end
|
318
|
+
def named_file_next_to_project_file(project_file, expected_file_name)
|
319
|
+
found_expected_file = T.let(nil, T.nilable(Dependabot::DependencyFile))
|
320
|
+
directory_path = Pathname.new(directory)
|
321
|
+
full_project_dir = Pathname.new(project_file.directory).join(project_file.name).dirname
|
322
|
+
|
323
|
+
candidate_file_path = Pathname.new(full_project_dir).join(expected_file_name).cleanpath.to_path
|
324
|
+
candidate_directory = Pathname.new(File.dirname(candidate_file_path))
|
325
|
+
relative_candidate_directory = candidate_directory.relative_path_from(directory_path)
|
326
|
+
candidate_file = repo_contents(dir: relative_candidate_directory).find do |f|
|
327
|
+
f.name.casecmp?(expected_file_name)
|
328
|
+
end
|
329
|
+
if candidate_file
|
330
|
+
found_expected_file = fetch_file_from_host(File.join(relative_candidate_directory,
|
331
|
+
candidate_file.name))
|
332
|
+
end
|
333
|
+
|
334
|
+
found_expected_file
|
335
|
+
end
|
336
|
+
|
315
337
|
sig { returns(T.nilable(Dependabot::DependencyFile)) }
|
316
338
|
def global_json
|
317
339
|
@global_json ||= T.let(fetch_file_if_present("global.json"), T.nilable(Dependabot::DependencyFile))
|
@@ -355,6 +377,7 @@ module Dependabot
|
|
355
377
|
end
|
356
378
|
def fetch_imported_property_files(file:, previously_fetched_files:)
|
357
379
|
file_id = file.directory + "/" + file.name
|
380
|
+
|
358
381
|
if @fetched_files[file_id]
|
359
382
|
T.must(@fetched_files[file_id])
|
360
383
|
else
|
@@ -363,23 +386,37 @@ module Dependabot
|
|
363
386
|
ImportPathsFinder.new(project_file: file).project_reference_paths +
|
364
387
|
ImportPathsFinder.new(project_file: file).project_file_paths
|
365
388
|
|
366
|
-
|
389
|
+
# Initialize a set to hold fetched files temporarily to avoid duplicates
|
390
|
+
fetched_files_set = Set.new([file])
|
391
|
+
|
392
|
+
paths.each do |path|
|
367
393
|
next if previously_fetched_files.map(&:name).include?(path)
|
368
394
|
next if file.name == path
|
369
395
|
next if path.include?("$(")
|
370
396
|
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
397
|
+
begin
|
398
|
+
fetched_file = fetch_file_from_host(path)
|
399
|
+
grandchild_property_files = fetch_imported_property_files(
|
400
|
+
file: fetched_file,
|
401
|
+
previously_fetched_files: previously_fetched_files + [file]
|
402
|
+
)
|
403
|
+
|
404
|
+
# Add fetched file and grandchild property files to the set
|
405
|
+
fetched_files_set << fetched_file
|
406
|
+
fetched_files_set.merge(grandchild_property_files)
|
407
|
+
rescue Dependabot::DependencyFileNotFound
|
408
|
+
# Don't worry about missing files, just skip them for now
|
409
|
+
Dependabot.logger.info("unable to find expected file #{file.name}")
|
410
|
+
nil
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
414
|
+
# Convert the set to an array and cache the fetched files
|
415
|
+
fetched_files = fetched_files_set.to_a
|
416
|
+
@fetched_files[file_id] = fetched_files
|
417
|
+
|
418
|
+
# Return the fetched files
|
419
|
+
fetched_files
|
383
420
|
end
|
384
421
|
end
|
385
422
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dependabot-nuget
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.283.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dependabot
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-10-
|
11
|
+
date: 2024-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dependabot-common
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.283.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.283.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rubyzip
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -134,28 +134,28 @@ dependencies:
|
|
134
134
|
requirements:
|
135
135
|
- - "~>"
|
136
136
|
- !ruby/object:Gem::Version
|
137
|
-
version: 1.
|
137
|
+
version: 1.67.0
|
138
138
|
type: :development
|
139
139
|
prerelease: false
|
140
140
|
version_requirements: !ruby/object:Gem::Requirement
|
141
141
|
requirements:
|
142
142
|
- - "~>"
|
143
143
|
- !ruby/object:Gem::Version
|
144
|
-
version: 1.
|
144
|
+
version: 1.67.0
|
145
145
|
- !ruby/object:Gem::Dependency
|
146
146
|
name: rubocop-performance
|
147
147
|
requirement: !ruby/object:Gem::Requirement
|
148
148
|
requirements:
|
149
149
|
- - "~>"
|
150
150
|
- !ruby/object:Gem::Version
|
151
|
-
version: 1.
|
151
|
+
version: 1.22.1
|
152
152
|
type: :development
|
153
153
|
prerelease: false
|
154
154
|
version_requirements: !ruby/object:Gem::Requirement
|
155
155
|
requirements:
|
156
156
|
- - "~>"
|
157
157
|
- !ruby/object:Gem::Version
|
158
|
-
version: 1.
|
158
|
+
version: 1.22.1
|
159
159
|
- !ruby/object:Gem::Dependency
|
160
160
|
name: rubocop-rspec
|
161
161
|
requirement: !ruby/object:Gem::Requirement
|
@@ -310,6 +310,7 @@ files:
|
|
310
310
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/RequirementTests.cs
|
311
311
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/SecurityVulnerabilityExtensionsTests.cs
|
312
312
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/VersionFinderTests.cs
|
313
|
+
- helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/DependencySolverEnvironment.cs
|
313
314
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTestBase.cs
|
314
315
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.DotNetToolsJson.cs
|
315
316
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.GlobalJson.cs
|
@@ -344,8 +345,8 @@ files:
|
|
344
345
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.DotNetTools.cs
|
345
346
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.GlobalJson.cs
|
346
347
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.Mixed.cs
|
348
|
+
- helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs
|
347
349
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs
|
348
|
-
- helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.Sdk.cs
|
349
350
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/AssertEx.cs
|
350
351
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/DiffUtil.cs
|
351
352
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/JsonHelperTests.cs
|
@@ -425,8 +426,8 @@ files:
|
|
425
426
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/DotNetToolsJsonUpdater.cs
|
426
427
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/GlobalJsonUpdater.cs
|
427
428
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/LockFileUpdater.cs
|
429
|
+
- helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs
|
428
430
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs
|
429
|
-
- helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/SdkPackageUpdater.cs
|
430
431
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdateOperationResult.cs
|
431
432
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdateResult.cs
|
432
433
|
- helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs
|
@@ -496,7 +497,7 @@ licenses:
|
|
496
497
|
- MIT
|
497
498
|
metadata:
|
498
499
|
bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
|
499
|
-
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.
|
500
|
+
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.283.0
|
500
501
|
post_install_message:
|
501
502
|
rdoc_options: []
|
502
503
|
require_paths:
|