Skip to content

Commit 1b84f70

Browse files
committed
C#: Use NuGet version sorting instead of lexicographic directory name sorting for finding newest package version.
1 parent 4274af4 commit 1b84f70

File tree

7 files changed

+20
-3
lines changed

7 files changed

+20
-3
lines changed

csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ codeql_csharp_library(
1616
"//csharp/extractor/Semmle.Extraction.CSharp",
1717
"//csharp/extractor/Semmle.Util",
1818
"@paket.main//newtonsoft.json",
19+
"@paket.main//nuget.versioning",
1920
],
2021
)

csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ private void AddNetFrameworkDlls(ISet<AssemblyLookupLocation> dllLocations, ISet
283283
{
284284
foreach (var fp in frameworkPaths)
285285
{
286-
dotnetFrameworkVersionVariantCount += NugetPackageRestorer.GetOrderedPackageVersionSubDirectories(fp.Path!).Length;
286+
dotnetFrameworkVersionVariantCount += nugetPackageRestorer.GetOrderedPackageVersionSubDirectories(fp.Path!).Length;
287287
}
288288

289289
var folder = nugetPackageRestorer.GetNewestNugetPackageVersionFolder(frameworkPath.Path, ".NET Framework");

csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System.Text.RegularExpressions;
1111
using System.Threading;
1212
using System.Threading.Tasks;
13+
using NuGet.Versioning;
1314
using Semmle.Util;
1415
using Semmle.Util.Logging;
1516

@@ -87,11 +88,22 @@ public string GetNewestNugetPackageVersionFolder(string packagePath, string pack
8788
return selectedFrameworkFolder;
8889
}
8990

90-
public static DirectoryInfo[] GetOrderedPackageVersionSubDirectories(string packagePath)
91+
public DirectoryInfo[] GetOrderedPackageVersionSubDirectories(string packagePath)
9192
{
93+
// Only consider directories with valid NuGet version names.
9294
return new DirectoryInfo(packagePath)
9395
.EnumerateDirectories("*", new EnumerationOptions { MatchCasing = MatchCasing.CaseInsensitive, RecurseSubdirectories = false })
94-
.OrderByDescending(d => d.Name) // TODO: Improve sorting to handle pre-release versions.
96+
.SelectMany(d =>
97+
{
98+
if (NuGetVersion.TryParse(d.Name, out var version))
99+
{
100+
return new[] { new { Directory = d, NuGetVersion = version } };
101+
}
102+
logger.LogInfo($"Ignoring package directory '{d.FullName}' as it does not have a valid NuGet version name.");
103+
return [];
104+
})
105+
.OrderByDescending(dw => dw.NuGetVersion)
106+
.Select(dw => dw.Directory)
95107
.ToArray();
96108
}
97109

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
Newtonsoft.Json
2+
NuGet.Versioning

csharp/paket.dependencies

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ strategy: max
77
nuget Basic.CompilerLog.Util 0.9.21
88
nuget Mono.Posix.NETStandard
99
nuget Newtonsoft.Json
10+
nuget NuGet.Versioning
1011
nuget xunit
1112
nuget xunit.runner.visualstudio
1213
nuget xunit.runner.utility

csharp/paket.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

csharp/paket.main.bzl

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)