Skip to content

Commit cc8f616

Browse files
authored
Fix false error for transitively pinned dependency with no version (#7004)
1 parent f764cae commit cc8f616

3 files changed

Lines changed: 61 additions & 4 deletions

File tree

src/NuGet.Core/NuGet.Commands/RestoreCommand/DependencyGraphResolver.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,12 @@ public async Task<ValueTuple<bool, List<RestoreTargetGraph>, RuntimeGraph>> Reso
557557
currentGraphNode.InnerNodes.Add(newGraphNode);
558558
}
559559

560-
if (!childResolvedDependencyGraphItem.IsRootPackageReference && isCentralPackageTransitivePinningEnabled && childLibraryDependency.SuppressParent != LibraryIncludeFlags.All && !downgrades.ContainsKey(childResolvedLibraryRangeIndex) && !RemoteDependencyWalker.IsGreaterThanOrEqualTo(childResolvedDependencyGraphItem.LibraryDependency.LibraryRange.VersionRange, childLibraryDependency.LibraryRange.VersionRange))
560+
if (!childResolvedDependencyGraphItem.IsRootPackageReference
561+
&& isCentralPackageTransitivePinningEnabled
562+
&& childLibraryDependency.SuppressParent != LibraryIncludeFlags.All
563+
&& !downgrades.ContainsKey(childResolvedLibraryRangeIndex)
564+
&& childLibraryDependency.LibraryRange.VersionRange != VersionRange.All
565+
&& !RemoteDependencyWalker.IsGreaterThanOrEqualTo(childResolvedDependencyGraphItem.LibraryDependency.LibraryRange.VersionRange, childLibraryDependency.LibraryRange.VersionRange))
561566
{
562567
// This is a downgrade if:
563568
// 1. This is not a direct dependency
@@ -905,8 +910,7 @@ private async Task<Dictionary<LibraryDependencyIndex, ResolvedDependencyGraphIte
905910
FrameworkRuntimeDefinition pair,
906911
TargetFrameworkInformation projectTargetFramework,
907912
RuntimeGraph? runtimeGraph,
908-
Dictionary<LibraryDependencyIndex,
909-
VersionRange>? pinnedPackageVersions,
913+
Dictionary<LibraryDependencyIndex, VersionRange>? pinnedPackageVersions,
910914
DependencyGraphItem rootProjectDependencyGraphItem,
911915
RemoteWalkContext context,
912916
CancellationToken token)

test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/RestoreCommand_AlgorithmEquivalencyTests.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2745,6 +2745,54 @@ await SimpleTestPackageUtility.CreateFolderFeedV3Async(
27452745
result2.LockFile.Targets[0].Libraries[1].Version.Should().Be(new NuGetVersion("1.0.0"));
27462746
}
27472747

2748+
// P -> A 1.0.0
2749+
// -> B (no version)
2750+
// B is pinned to 1.0.0
2751+
[Fact]
2752+
public async Task RestoreCommand_WithTransitiveReferenceMissingVersion_VerifiesEquivalency()
2753+
{
2754+
// Arrange
2755+
using var pathContext = new SimpleTestPathContext();
2756+
2757+
var P = ProjectTestHelpers.GetPackageSpecWithProjectNameAndSpec(
2758+
"P",
2759+
pathContext.SolutionRoot,
2760+
@"
2761+
{
2762+
""restore"": {
2763+
""centralPackageVersionsManagementEnabled"": true,
2764+
""CentralPackageTransitivePinningEnabled"": true,
2765+
},
2766+
""frameworks"": {
2767+
""net472"": {
2768+
""centralPackageVersions"": {
2769+
""B"": ""[1.0.0,)"",
2770+
}
2771+
}
2772+
}
2773+
}")
2774+
.WithDependency(new LibraryDependency()
2775+
{
2776+
LibraryRange = new LibraryRange("A", VersionRange.Parse("1.0.0"), LibraryDependencyTarget.Package),
2777+
VersionCentrallyManaged = true,
2778+
});
2779+
2780+
await SimpleTestPackageUtility.CreateFolderFeedV3Async(
2781+
pathContext.PackageSource,
2782+
new SimpleTestPackageContext("A", "1.0.0")
2783+
{
2784+
Dependencies =
2785+
[
2786+
new SimpleTestPackageContext("B", "0.0.0"),
2787+
]
2788+
},
2789+
new SimpleTestPackageContext("B", "1.0.0"));
2790+
2791+
(var result, _) = await ValidateRestoreAlgorithmEquivalency(pathContext, P);
2792+
result.LockFile.Targets.Should().HaveCount(1);
2793+
result.LockFile.Targets[0].Libraries.Should().HaveCount(2);
2794+
}
2795+
27482796
// Here's why package driven dependencies should flow.
27492797
// Say we have P1 -> P2 -> P3 -> A 1.0.0 -> B 2.0.0
27502798
// -> B 1.5.0

test/TestUtilities/Test.Utility/SimpleTestSetup/SimpleTestPackageUtility.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ namespace NuGet.Test.Utility
2929

3030
public static class SimpleTestPackageUtility
3131
{
32+
private static NuGetVersion EmptyNuGetVersion = new NuGetVersion(0, 0, 0);
33+
3234
public static async Task CreateFullPackagesAsync(string repositoryDir, IDictionary<string, IEnumerable<string>> packages)
3335
{
3436
if (packages == null)
@@ -222,7 +224,10 @@ public static async Task CreatePackageAsync(Stream stream, SimpleTestPackageCont
222224
var node = new XElement(XName.Get("dependency"));
223225
groupNode.Add(node);
224226
node.Add(new XAttribute(XName.Get("id"), dependency.Id));
225-
node.Add(new XAttribute(XName.Get("version"), dependency.VersionRange.ToNormalizedString()));
227+
if (dependency.VersionRange.MinVersion != EmptyNuGetVersion)
228+
{
229+
node.Add(new XAttribute(XName.Get("version"), dependency.VersionRange.ToNormalizedString()));
230+
}
226231

227232
if (dependency.Include.Count > 0)
228233
{

0 commit comments

Comments
 (0)