Skip to content

Commit d68f59d

Browse files
Merge branch 'main' into harry/pnpm-trust-downgrade-version-fallback
2 parents 88f4dff + b6958e7 commit d68f59d

File tree

4 files changed

+115
-2
lines changed

4 files changed

+115
-2
lines changed

nuget/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/FileWriters/FileWriterWorkerTests.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,52 @@ await TestAsync(
927927
);
928928
}
929929

930+
[Fact]
931+
public async Task EndToEnd_WildcardVersionShapeIsRetained()
932+
{
933+
await TestAsync(
934+
dependencyName: "Some.Dependency",
935+
oldDependencyVersion: "1.3.4",
936+
newDependencyVersion: "2.5.6",
937+
files: [
938+
("src/project.csproj", """
939+
<Project Sdk="Microsoft.NET.Sdk">
940+
<PropertyGroup>
941+
<TargetFramework>net9.0</TargetFramework>
942+
</PropertyGroup>
943+
<ItemGroup>
944+
<PackageReference Include="Some.Dependency" Version="1.*" />
945+
</ItemGroup>
946+
</Project>
947+
"""),
948+
("Directory.Build.props", "<Project />"),
949+
("Directory.Build.targets", "<Project />"),
950+
],
951+
packages: [
952+
MockNuGetPackage.CreateSimplePackage("Some.Dependency", "1.3.4", "net9.0"),
953+
MockNuGetPackage.CreateSimplePackage("Some.Dependency", "2.5.6", "net9.0"),
954+
],
955+
discoveryWorker: null, // use real worker
956+
dependencySolver: null, // use real worker
957+
fileWriter: null, // use real worker
958+
expectedFiles: [
959+
("src/project.csproj", """
960+
<Project Sdk="Microsoft.NET.Sdk">
961+
<PropertyGroup>
962+
<TargetFramework>net9.0</TargetFramework>
963+
</PropertyGroup>
964+
<ItemGroup>
965+
<PackageReference Include="Some.Dependency" Version="2.*" />
966+
</ItemGroup>
967+
</Project>
968+
"""),
969+
],
970+
expectedOperations: [
971+
new DirectUpdate() { DependencyName = "Some.Dependency", NewVersion = NuGetVersion.Parse("2.5.6"), UpdatedFiles = ["/src/project.csproj"] }
972+
]
973+
);
974+
}
975+
930976
private static async Task TestAsync(
931977
string dependencyName,
932978
string oldDependencyVersion,

nuget/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/FileWriters/XmlFileWriterTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ await TestAsync(
361361
<Project Sdk="Microsoft.NET.Sdk">
362362
<ItemGroup>
363363
<PackageReference Include="Ignored.Dependency" Version="7.0.0" />
364-
<PackageReference Include="Some.Dependency" Version="2.0.0" />
364+
<PackageReference Include="Some.Dependency" Version="2.*" />
365365
<PackageReference Include="Some.Other.Dependency" Version="8.0.0" />
366366
</ItemGroup>
367367
</Project>

nuget/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/FileWriters/XmlFileWriterTests_CreateUpdatedVersionRangeTests.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,24 @@ public class XmlFileWriterTests_CreateUpdatedVersionRangeTests
1212
[InlineData("[1.0.0]", "1.0.0", "2.0.0", "[2.0.0]")] // single exact version
1313
[InlineData("[1.0.0, 3.0.0)", "1.0.0", "2.0.0", "[2.0.0, 3.0.0)")] // narrowing of range
1414
[InlineData("[1.0.0, 2.0.0)", "1.0.0", "2.0.0", "2.0.0")] // narrowing of range to simple version string
15+
[InlineData("*", "1.0.1", "2.0.0", "*")] // wildcard is retained at major level
16+
[InlineData("1.*", "1.0.1", "2.0.0", "2.*")] // wildcard is retained at minor level
17+
[InlineData("1.0.*", "1.0.1", "2.0.0", "2.0.*")] // wildcard is retained at patch level
18+
[InlineData("1.0.0.*", "1.0.1.0", "2.0.0", "2.0.0.*")] // wildcard is retained at revision level
19+
[InlineData("1.0.0.*", "1.0.1", "2.0", "2.0.0.*")] // wildcard is retained at revision level with a shorter updated version
20+
[InlineData("10.*-*", "10.0-beta1", "11.0-beta2", "11.*-*")] // wildcard with prerelease
21+
[InlineData("10.*-preview*", "10.0-preview1", "11.0-preview4", "11.*-preview*")] // wildcard with specific prerelease
22+
[InlineData("10.0.0-preview.*", "10.0.0-preview.1", "11.0.0-preview.2", "11.0.0-preview.*")] // wildcard in prerelease
23+
[InlineData("1.2.3-*", "1.2.3-beta", "2.0.0-beta", "2.0.0-*")] // wildcard only in prerelease
24+
[InlineData("1.2.3-*", "1.2.3-beta", "2.0.0", "2.0.0")] // wildcard in prerelease superseded by stable
1525
public void CreateUpdatedVersionRange(string existingRangeString, string existingVersionString, string newVersionString, string expectedNewRangeString)
1626
{
1727
var existingRange = VersionRange.Parse(existingRangeString);
1828
var existingVersion = NuGetVersion.Parse(existingVersionString);
1929
var newVersion = NuGetVersion.Parse(newVersionString);
30+
var newRange = VersionRange.Parse(expectedNewRangeString);
31+
32+
Assert.True(newRange.Satisfies(newVersion));
2033

2134
var actualNewRangeString = XmlFileWriter.CreateUpdatedVersionRangeString(existingRange, existingVersion, newVersion);
2235

nuget/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/FileWriters/XmlFileWriter.cs

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,61 @@ public static string CreateUpdatedVersionRangeString(VersionRange existingRange,
611611
// e.g., "[2.0.0, )" => "2.0.0"
612612
if (newRange.MaxVersion is null)
613613
{
614-
return requiredVersion.ToString();
614+
var requiredVersionString = requiredVersion.ToString();
615+
var isWildcardVersion = existingRange.OriginalString?.Contains('*') == true;
616+
if (isWildcardVersion)
617+
{
618+
var oldRangeParts = existingRange.OriginalString!.Split('.');
619+
var newRangeParts = requiredVersion.ToFullString().Split('.');
620+
var rebuiltParts = new List<string>();
621+
for (int i = 0; i < oldRangeParts.Length; i++)
622+
{
623+
if (oldRangeParts[i].Contains('*'))
624+
{
625+
var dashIndex = oldRangeParts[i].IndexOf('-');
626+
var starIndex = oldRangeParts[i].IndexOf('*');
627+
if (dashIndex >= 0 && dashIndex < starIndex)
628+
{
629+
// prerelease wildcard (e.g., "3-*")
630+
if (i < newRangeParts.Length)
631+
{
632+
var newDashIndex = newRangeParts[i].IndexOf('-');
633+
if (newDashIndex >= 0)
634+
{
635+
var beforeDash = newRangeParts[i][..newDashIndex];
636+
var fromDash = oldRangeParts[i][dashIndex..];
637+
rebuiltParts.Add(beforeDash + fromDash);
638+
rebuiltParts.AddRange(oldRangeParts.Skip(i + 1));
639+
}
640+
else
641+
{
642+
// new version is stable, drop prerelease wildcard
643+
rebuiltParts.Add(newRangeParts[i]);
644+
}
645+
}
646+
else
647+
{
648+
rebuiltParts.Add("0");
649+
}
650+
}
651+
else
652+
{
653+
// version wildcard (e.g., "*", "*-*", "*-preview*")
654+
rebuiltParts.AddRange(oldRangeParts.Skip(i));
655+
}
656+
657+
break;
658+
}
659+
else
660+
{
661+
rebuiltParts.Add(i < newRangeParts.Length ? newRangeParts[i] : "0");
662+
}
663+
}
664+
665+
requiredVersionString = string.Join(".", rebuiltParts);
666+
}
667+
668+
return requiredVersionString;
615669
}
616670

617671
return newRange.ToString();

0 commit comments

Comments
 (0)