Skip to content

Commit 2aeddfa

Browse files
committed
add support for testcase found by copilot
1 parent 904281b commit 2aeddfa

File tree

2 files changed

+39
-9
lines changed

2 files changed

+39
-9
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public class XmlFileWriterTests_CreateUpdatedVersionRangeTests
2020
[InlineData("10.*-*", "10.0-beta1", "11.0-beta2", "11.*-*")] // wildcard with prerelease
2121
[InlineData("10.*-preview*", "10.0-preview1", "11.0-preview4", "11.*-preview*")] // wildcard with specific prerelease
2222
[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 superceded by stable
2325
public void CreateUpdatedVersionRange(string existingRangeString, string existingVersionString, string newVersionString, string expectedNewRangeString)
2426
{
2527
var existingRange = VersionRange.Parse(existingRangeString);

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

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -612,29 +612,57 @@ public static string CreateUpdatedVersionRangeString(VersionRange existingRange,
612612
if (newRange.MaxVersion is null)
613613
{
614614
var requiredVersionString = requiredVersion.ToString();
615-
var oldRangeParts = existingRange.OriginalString?.Split('.').ToList() ?? [];
616-
var isWildcardVersion = oldRangeParts.Any(p => p.Contains('*'));
615+
var isWildcardVersion = existingRange.OriginalString?.Contains('*') == true;
617616
if (isWildcardVersion)
618617
{
619-
// retain wildcard format
618+
var oldRangeParts = existingRange.OriginalString!.Split('.');
620619
var newRangeParts = requiredVersion.ToFullString().Split('.');
621620
var rebuiltParts = new List<string>();
622-
for (int i = 0; i < oldRangeParts.Count; i++)
621+
for (int i = 0; i < oldRangeParts.Length; i++)
623622
{
624623
if (oldRangeParts[i].Contains('*'))
625624
{
626-
// as soon as we hit a wildcard we're done
627-
rebuiltParts.AddRange(oldRangeParts.Skip(i));
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+
628657
break;
629658
}
630659
else
631660
{
632-
rebuiltParts.Add(newRangeParts[i]);
661+
rebuiltParts.Add(i < newRangeParts.Length ? newRangeParts[i] : "0");
633662
}
634663
}
635664

636-
var rebuiltWildcardVersion = string.Join(".", rebuiltParts);
637-
requiredVersionString = rebuiltWildcardVersion;
665+
requiredVersionString = string.Join(".", rebuiltParts);
638666
}
639667

640668
return requiredVersionString;

0 commit comments

Comments
 (0)