Skip to content

Commit b41e9fa

Browse files
committed
Merge remote-tracking branch 'refs/remotes/origin/dev'
2 parents 98d266e + dd23c69 commit b41e9fa

7 files changed

Lines changed: 56 additions & 49 deletions

File tree

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System.Linq.Expressions;
5+
using System.Reflection;
6+
7+
namespace NuGet.Server.DataServices
8+
{
9+
public class NormalizeVersionInterceptor : ExpressionVisitor
10+
{
11+
private static readonly MemberInfo _versionMember = typeof(ODataPackage).GetProperty("Version");
12+
private static readonly MemberInfo _normalizedVersionMember = typeof(ODataPackage).GetProperty("NormalizedVersion");
13+
14+
protected override Expression VisitBinary(BinaryExpression node)
15+
{
16+
// Change equality comparisons on Version to normalized comparisons on NormalizedVersion
17+
if (node.NodeType == ExpressionType.Equal)
18+
{
19+
// Figure out which side is the target
20+
ConstantExpression constSide = (node.Left as ConstantExpression) ?? (node.Right as ConstantExpression);
21+
if (constSide != null && constSide.Type == typeof(string))
22+
{
23+
MemberExpression memberSide = (node.Right as MemberExpression) ?? (node.Left as MemberExpression);
24+
if (memberSide != null && memberSide.Member == _versionMember)
25+
{
26+
// We have a "Package.Version == <constant>" expression!
27+
28+
// Transform the constant version into a normalized version
29+
SemanticVersion semanticVersion;
30+
if (SemanticVersion.TryParse((string) constSide.Value, out semanticVersion))
31+
{
32+
// Create a new expression that checks the new constant against NormalizedVersion instead
33+
return Expression.MakeBinary(
34+
ExpressionType.Equal,
35+
left: Expression.Constant(semanticVersion.ToNormalizedString()),
36+
right: Expression.MakeMemberAccess(memberSide.Expression, _normalizedVersionMember));
37+
}
38+
}
39+
}
40+
}
41+
return node;
42+
}
43+
}
44+
}

src/NuGet.Server/DataServices/ODataPackage.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public class ODataPackage
1818

1919
public string Version { get; set; }
2020

21+
public string NormalizedVersion { get; set; }
22+
2123
public bool IsPrerelease { get; set; }
2224

2325
public string Title { get; set; }

src/NuGet.Server/DataServices/PackageContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public IQueryable<ODataPackage> Packages
2222
.GetPackages()
2323
.Select(package => package.AsODataPackage())
2424
.AsQueryable()
25-
.InterceptWith(new PackageIdComparisonVisitor());
25+
.InterceptWith(new NormalizeVersionInterceptor());
2626
}
2727
}
2828
}

src/NuGet.Server/DataServices/PackageExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public static ODataPackage AsODataPackage(this IPackage package)
2323
{
2424
Id = package.Id,
2525
Version = package.Version.ToString(),
26+
NormalizedVersion = package.Version.ToNormalizedString(),
2627
IsPrerelease = !package.IsReleaseVersion(),
2728
Title = package.Title,
2829
Authors = string.Join(",", package.Authors),
@@ -59,6 +60,7 @@ public static ODataPackage AsODataPackage(this ServerPackage package)
5960
{
6061
Id = package.Id,
6162
Version = package.Version.ToString(),
63+
NormalizedVersion = package.Version.ToNormalizedString(),
6264
IsPrerelease = !package.IsReleaseVersion(),
6365
Title = package.Title,
6466
Authors = string.Join(",", package.Authors),

src/NuGet.Server/DataServices/PackageIdComparisonVisitor.cs

Lines changed: 0 additions & 44 deletions
This file was deleted.

src/NuGet.Server/DataServices/Packages.svc.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ public IQueryable<ODataPackage> Search(string searchTerm, string targetFramework
119119
return Repository
120120
.Search(searchTerm, targetFrameworks, includePrerelease)
121121
.Select(package => package.AsODataPackage())
122-
.AsQueryable();
122+
.AsQueryable()
123+
.InterceptWith(new NormalizeVersionInterceptor());
123124
}
124125

125126
[WebGet]
@@ -129,7 +130,8 @@ public IQueryable<ODataPackage> FindPackagesById(string id)
129130
.FindPackagesById(id)
130131
.Where(package => package.Listed)
131132
.Select(package => package.AsODataPackage())
132-
.AsQueryable();
133+
.AsQueryable()
134+
.InterceptWith(new NormalizeVersionInterceptor());
133135
}
134136

135137
[WebGet]
@@ -173,7 +175,8 @@ public IQueryable<ODataPackage> GetUpdates(
173175
return Repository
174176
.GetUpdatesCore(packagesToUpdate, includePrerelease, includeAllVersions, targetFrameworkValues, versionConstraintsList)
175177
.Select(package => package.AsODataPackage())
176-
.AsQueryable();
178+
.AsQueryable()
179+
.InterceptWith(new NormalizeVersionInterceptor());
177180
}
178181
}
179182
}

src/NuGet.Server/NuGet.Server.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@
8080
<Compile Include="DataServices\ODataPackage.cs" />
8181
<Compile Include="DataServices\PackageContext.cs" />
8282
<Compile Include="DataServices\PackageExtensions.cs" />
83-
<Compile Include="DataServices\PackageIdComparisonVisitor.cs" />
83+
<Compile Include="DataServices\NormalizeVersionInterceptor.cs" />
8484
<Compile Include="Core\ServiceResolver.cs" />
8585
<Compile Include="Infrastructure\JsonNetPackagesSerializer.cs" />
8686
<Compile Include="Infrastructure\IPackagesSerializer.cs" />

0 commit comments

Comments
 (0)