Skip to content

Commit

Permalink
Merge remote-tracking branch 'refs/remotes/origin/master' into release
Browse files Browse the repository at this point in the history
  • Loading branch information
maartenba committed Mar 16, 2016
2 parents 5fd074b + b41e9fa commit b7a59a4
Show file tree
Hide file tree
Showing 7 changed files with 56 additions and 49 deletions.
44 changes: 44 additions & 0 deletions src/NuGet.Server/DataServices/NormalizeVersionInterceptor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System.Linq.Expressions;
using System.Reflection;

namespace NuGet.Server.DataServices
{
public class NormalizeVersionInterceptor : ExpressionVisitor
{
private static readonly MemberInfo _versionMember = typeof(ODataPackage).GetProperty("Version");
private static readonly MemberInfo _normalizedVersionMember = typeof(ODataPackage).GetProperty("NormalizedVersion");

protected override Expression VisitBinary(BinaryExpression node)
{
// Change equality comparisons on Version to normalized comparisons on NormalizedVersion
if (node.NodeType == ExpressionType.Equal)
{
// Figure out which side is the target
ConstantExpression constSide = (node.Left as ConstantExpression) ?? (node.Right as ConstantExpression);
if (constSide != null && constSide.Type == typeof(string))
{
MemberExpression memberSide = (node.Right as MemberExpression) ?? (node.Left as MemberExpression);
if (memberSide != null && memberSide.Member == _versionMember)
{
// We have a "Package.Version == <constant>" expression!

// Transform the constant version into a normalized version
SemanticVersion semanticVersion;
if (SemanticVersion.TryParse((string) constSide.Value, out semanticVersion))
{
// Create a new expression that checks the new constant against NormalizedVersion instead
return Expression.MakeBinary(
ExpressionType.Equal,
left: Expression.Constant(semanticVersion.ToNormalizedString()),
right: Expression.MakeMemberAccess(memberSide.Expression, _normalizedVersionMember));
}
}
}
}
return node;
}
}
}
2 changes: 2 additions & 0 deletions src/NuGet.Server/DataServices/ODataPackage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ public class ODataPackage

public string Version { get; set; }

public string NormalizedVersion { get; set; }

public bool IsPrerelease { get; set; }

public string Title { get; set; }
Expand Down
2 changes: 1 addition & 1 deletion src/NuGet.Server/DataServices/PackageContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public IQueryable<ODataPackage> Packages
.GetPackages()
.Select(package => package.AsODataPackage())
.AsQueryable()
.InterceptWith(new PackageIdComparisonVisitor());
.InterceptWith(new NormalizeVersionInterceptor());
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/NuGet.Server/DataServices/PackageExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public static ODataPackage AsODataPackage(this IPackage package)
{
Id = package.Id,
Version = package.Version.ToString(),
NormalizedVersion = package.Version.ToNormalizedString(),
IsPrerelease = !package.IsReleaseVersion(),
Title = package.Title,
Authors = string.Join(",", package.Authors),
Expand Down Expand Up @@ -59,6 +60,7 @@ public static ODataPackage AsODataPackage(this ServerPackage package)
{
Id = package.Id,
Version = package.Version.ToString(),
NormalizedVersion = package.Version.ToNormalizedString(),
IsPrerelease = !package.IsReleaseVersion(),
Title = package.Title,
Authors = string.Join(",", package.Authors),
Expand Down
44 changes: 0 additions & 44 deletions src/NuGet.Server/DataServices/PackageIdComparisonVisitor.cs

This file was deleted.

9 changes: 6 additions & 3 deletions src/NuGet.Server/DataServices/Packages.svc.cs
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,8 @@ public IQueryable<ODataPackage> Search(string searchTerm, string targetFramework
return Repository
.Search(searchTerm, targetFrameworks, includePrerelease)
.Select(package => package.AsODataPackage())
.AsQueryable();
.AsQueryable()
.InterceptWith(new NormalizeVersionInterceptor());
}

[WebGet]
Expand All @@ -129,7 +130,8 @@ public IQueryable<ODataPackage> FindPackagesById(string id)
.FindPackagesById(id)
.Where(package => package.Listed)
.Select(package => package.AsODataPackage())
.AsQueryable();
.AsQueryable()
.InterceptWith(new NormalizeVersionInterceptor());
}

[WebGet]
Expand Down Expand Up @@ -173,7 +175,8 @@ public IQueryable<ODataPackage> GetUpdates(
return Repository
.GetUpdatesCore(packagesToUpdate, includePrerelease, includeAllVersions, targetFrameworkValues, versionConstraintsList)
.Select(package => package.AsODataPackage())
.AsQueryable();
.AsQueryable()
.InterceptWith(new NormalizeVersionInterceptor());
}
}
}
2 changes: 1 addition & 1 deletion src/NuGet.Server/NuGet.Server.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@
<Compile Include="DataServices\ODataPackage.cs" />
<Compile Include="DataServices\PackageContext.cs" />
<Compile Include="DataServices\PackageExtensions.cs" />
<Compile Include="DataServices\PackageIdComparisonVisitor.cs" />
<Compile Include="DataServices\NormalizeVersionInterceptor.cs" />
<Compile Include="Core\ServiceResolver.cs" />
<Compile Include="Infrastructure\JsonNetPackagesSerializer.cs" />
<Compile Include="Infrastructure\IPackagesSerializer.cs" />
Expand Down

0 comments on commit b7a59a4

Please sign in to comment.