From 89fba856e856f5475714c01394273bb74129c3f0 Mon Sep 17 00:00:00 2001 From: Livar Cunha Date: Wed, 11 Jan 2017 19:30:05 -0800 Subject: [PATCH] Adding ranges to the source mappings so that we can specify the origin should match this range and migrate to that version. We use this to handle LTS/FTS migration and will use that for the LTS uplift. --- .../ConstantPackageVersions.cs | 1 + .../PackageConstants.cs | 254 ++++++++++++++---- .../MigratePackageDependenciesAndToolsRule.cs | 10 +- .../Rules/GivenThatIWantToMigrateTools.cs | 21 +- 4 files changed, 227 insertions(+), 59 deletions(-) diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/ConstantPackageVersions.cs b/src/Microsoft.DotNet.ProjectJsonMigration/ConstantPackageVersions.cs index 292f1ad47..7a3b5b8bf 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/ConstantPackageVersions.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/ConstantPackageVersions.cs @@ -6,6 +6,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration internal class ConstantPackageVersions { public const string AspNetToolsVersion = "1.0.0-msbuild3-final"; + public const string AspNet110ToolsVersion = "1.1.0-msbuild3-final"; public const string TestSdkPackageVersion = "15.0.0-preview-20170106-08"; public const string XUnitPackageVersion = "2.2.0-beta4-build3444"; public const string XUnitRunnerPackageVersion = "2.2.0-beta4-build1194"; diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/PackageConstants.cs b/src/Microsoft.DotNet.ProjectJsonMigration/PackageConstants.cs index 2a65db310..5273ddbfe 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/PackageConstants.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/PackageConstants.cs @@ -26,55 +26,215 @@ namespace Microsoft.DotNet.ProjectJsonMigration public const string DotnetTestXunit = "dotnet-test-xunit"; public const string DotnetTestMSTest = "dotnet-test-mstest"; - public static readonly IDictionary ProjectDependencyPackages = - new Dictionary { - {"Microsoft.EntityFrameworkCore.Tools", new PackageDependencyInfo { - Name = "Microsoft.EntityFrameworkCore.Tools", - Version = ConstantPackageVersions.AspNetToolsVersion } }, - { "Microsoft.AspNetCore.Razor.Tools", null }, - { "Microsoft.AspNetCore.Razor.Design", null }, - { "Microsoft.VisualStudio.Web.CodeGenerators.Mvc", new PackageDependencyInfo { - Name = "Microsoft.VisualStudio.Web.CodeGeneration.Design", - Version = ConstantPackageVersions.AspNetToolsVersion } }, - { "Microsoft.VisualStudio.Web.CodeGeneration.Tools", null}, - { TestSdkPackageName, new PackageDependencyInfo { - Name = TestSdkPackageName, - Version = ConstantPackageVersions.TestSdkPackageVersion } }, - { XUnitPackageName, new PackageDependencyInfo { - Name = XUnitPackageName, - Version = ConstantPackageVersions.XUnitPackageVersion } }, - { XUnitRunnerPackageName, new PackageDependencyInfo { - Name = XUnitRunnerPackageName, - Version = ConstantPackageVersions.XUnitRunnerPackageVersion } }, - { MstestTestAdapterName, new PackageDependencyInfo { - Name = MstestTestAdapterName, - Version = ConstantPackageVersions.MstestTestAdapterVersion } }, - { MstestTestFrameworkName, new PackageDependencyInfo { - Name = MstestTestFrameworkName, - Version = ConstantPackageVersions.MstestTestFrameworkVersion } }, - { DotnetTestXunit, null }, - { DotnetTestMSTest, null }, + public static readonly IDictionary ProjectDependencyPackages = + new Dictionary { + { + new PackageDependencyInfo { + Name = "Microsoft.EntityFrameworkCore.Tools", + Version = "[1.0.0-*,)" + }, + new PackageDependencyInfo { + Name = "Microsoft.EntityFrameworkCore.Tools", + Version = ConstantPackageVersions.AspNetToolsVersion } + }, + { + new PackageDependencyInfo + { + Name = "Microsoft.AspNetCore.Razor.Tools", + Version = "[1.0.0-*,)" + }, + null + }, + { + new PackageDependencyInfo + { + Name = "Microsoft.AspNetCore.Razor.Design", + Version = "[1.0.0-*,)" + }, + null + }, + // I hate to do this, but ordering here matters. The higher version needs to come first, otherwise + // the lower version mapping will match to it. + { + new PackageDependencyInfo + { + Name = "Microsoft.VisualStudio.Web.CodeGenerators.Mvc", + Version = "[1.1.0-*,)" + }, + new PackageDependencyInfo + { + Name = "Microsoft.VisualStudio.Web.CodeGeneration.Design", + Version = ConstantPackageVersions.AspNet110ToolsVersion + } + }, + { + new PackageDependencyInfo + { + Name = "Microsoft.VisualStudio.Web.CodeGenerators.Mvc", + Version = "[1.0.0-*,1.1.0)" + }, + new PackageDependencyInfo + { + Name = "Microsoft.VisualStudio.Web.CodeGeneration.Design", + Version = ConstantPackageVersions.AspNetToolsVersion + } + }, + { + new PackageDependencyInfo + { + Name = "Microsoft.VisualStudio.Web.CodeGeneration.Tools", + Version = "[1.0.0-*,)" + }, + null + }, + { + new PackageDependencyInfo + { + Name = TestSdkPackageName, + Version = "[1.0.0-*,)" + }, + new PackageDependencyInfo + { + Name = TestSdkPackageName, + Version = ConstantPackageVersions.TestSdkPackageVersion + } + }, + { + new PackageDependencyInfo + { + Name = XUnitPackageName, + Version = "[1.0.0-*,)" + }, + new PackageDependencyInfo + { + Name = XUnitPackageName, + Version = ConstantPackageVersions.XUnitPackageVersion + } + }, + { + new PackageDependencyInfo + { + Name = XUnitRunnerPackageName, + Version = "[1.0.0-*,)" + }, + new PackageDependencyInfo { + Name = XUnitRunnerPackageName, + Version = ConstantPackageVersions.XUnitRunnerPackageVersion + } + }, + { + new PackageDependencyInfo + { + Name = MstestTestAdapterName, + Version = "[1.0.0-*,)" + }, + new PackageDependencyInfo + { + Name = MstestTestAdapterName, + Version = ConstantPackageVersions.MstestTestAdapterVersion + } + }, + { + new PackageDependencyInfo + { + Name = MstestTestFrameworkName, + Version = "[1.0.0-*,)" + }, + new PackageDependencyInfo { + Name = MstestTestFrameworkName, + Version = ConstantPackageVersions.MstestTestFrameworkVersion + } + }, + { + new PackageDependencyInfo + { + Name = DotnetTestXunit, + Version = "[1.0.0-*,)" + }, + null + }, + { + new PackageDependencyInfo + { + Name = DotnetTestMSTest, + Version = "[1.0.0-*,)" + }, + null + }, }; - public static readonly IDictionary ProjectToolPackages = - new Dictionary { - {"Microsoft.EntityFrameworkCore.Tools", new PackageDependencyInfo { - Name = "Microsoft.EntityFrameworkCore.Tools.DotNet", - Version = ConstantPackageVersions.AspNetToolsVersion } }, - { "Microsoft.AspNetCore.Razor.Tools", null }, - { "Microsoft.VisualStudio.Web.CodeGeneration.Tools", new PackageDependencyInfo { - Name = "Microsoft.VisualStudio.Web.CodeGeneration.Tools", - Version = ConstantPackageVersions.AspNetToolsVersion } }, - { "Microsoft.DotNet.Watcher.Tools", new PackageDependencyInfo { - Name = "Microsoft.DotNet.Watcher.Tools", - Version = ConstantPackageVersions.AspNetToolsVersion } }, - { "Microsoft.Extensions.SecretManager.Tools", new PackageDependencyInfo { - Name = "Microsoft.Extensions.SecretManager.Tools", - Version = ConstantPackageVersions.AspNetToolsVersion } }, - { "Microsoft.AspNetCore.Server.IISIntegration.Tools", null}, - { "BundlerMinifier.Core", new PackageDependencyInfo { - Name = "BundlerMinifier.Core", - Version = ConstantPackageVersions.BundleMinifierToolVersion } } + public static readonly IDictionary ProjectToolPackages = + new Dictionary { + { + new PackageDependencyInfo + { + Name = "Microsoft.EntityFrameworkCore.Tools", + Version = "[1.0.0-*,)" + }, + new PackageDependencyInfo { + Name = "Microsoft.EntityFrameworkCore.Tools.DotNet", + Version = ConstantPackageVersions.AspNetToolsVersion + } + }, + { + new PackageDependencyInfo + { + Name = "Microsoft.AspNetCore.Razor.Tools", + Version = "[1.0.0-*,)" + }, + null + }, + { + new PackageDependencyInfo + { + Name = "Microsoft.VisualStudio.Web.CodeGeneration.Tools", + Version = "[1.0.0-*,)" + }, + new PackageDependencyInfo { + Name = "Microsoft.VisualStudio.Web.CodeGeneration.Tools", + Version = ConstantPackageVersions.AspNetToolsVersion + } + }, + { + new PackageDependencyInfo + { + Name = "Microsoft.DotNet.Watcher.Tools", + Version = "[1.0.0-*,)" + }, + new PackageDependencyInfo { + Name = "Microsoft.DotNet.Watcher.Tools", + Version = ConstantPackageVersions.AspNetToolsVersion + } + }, + { + new PackageDependencyInfo + { + Name = "Microsoft.Extensions.SecretManager.Tools", + Version = "[1.0.0-*,)" + }, + new PackageDependencyInfo { + Name = "Microsoft.Extensions.SecretManager.Tools", + Version = ConstantPackageVersions.AspNetToolsVersion + } + }, + { + new PackageDependencyInfo + { + Name = "Microsoft.AspNetCore.Server.IISIntegration.Tools", + Version = "[1.0.0-*,)" + }, + null + }, + { + new PackageDependencyInfo{ + Name = "BundlerMinifier.Core", + Version = "[1.0.0-*,)" + }, + new PackageDependencyInfo { + Name = "BundlerMinifier.Core", + Version = ConstantPackageVersions.BundleMinifierToolVersion + } + } }; } } \ No newline at end of file diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesAndToolsRule.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesAndToolsRule.cs index 3bfa3c356..aa3ae1e09 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesAndToolsRule.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesAndToolsRule.cs @@ -13,6 +13,7 @@ using Microsoft.DotNet.Internal.ProjectModel; using Microsoft.DotNet.Tools.Common; using NuGet.Frameworks; using NuGet.LibraryModel; +using NuGet.Versioning; namespace Microsoft.DotNet.ProjectJsonMigration.Rules { @@ -274,14 +275,17 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules private PackageDependencyInfo ToPackageDependencyInfo( ProjectLibraryDependency dependency, - IDictionary dependencyToVersionMap) + IDictionary dependencyToVersionMap) { var name = dependency.Name; var version = dependency.LibraryRange?.VersionRange?.OriginalString; - if (dependencyToVersionMap.ContainsKey(name)) + var possibleMappings = dependencyToVersionMap.Where(c => c.Key.Name == name); + if (possibleMappings.Any()) { - var dependencyInfo = dependencyToVersionMap[name]; + var possibleVersions = possibleMappings.Select(p => VersionRange.Parse(p.Key.Version)); + var bestMatchVersion = possibleVersions.First(p => p.Satisfies(dependency.LibraryRange?.VersionRange?.ToNonSnapshotRange().MinVersion)); + var dependencyInfo = possibleMappings.First(c => c.Key.Version == bestMatchVersion.OriginalString).Value; if (dependencyInfo == null) { return null; diff --git a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateTools.cs b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateTools.cs index 27ed9fb96..8808fb36f 100644 --- a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateTools.cs +++ b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateTools.cs @@ -12,19 +12,22 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests public class GivenThatIWantToMigrateTools : PackageDependenciesTestBase { [Theory] - [InlineData("Microsoft.EntityFrameworkCore.Tools", "Microsoft.EntityFrameworkCore.Tools", ConstantPackageVersions.AspNetToolsVersion)] - [InlineData("Microsoft.VisualStudio.Web.CodeGenerators.Mvc", "Microsoft.VisualStudio.Web.CodeGeneration.Design", ConstantPackageVersions.AspNetToolsVersion)] - public void It_migrates_project_dependencies_to_a_new_name_and_version( + [InlineData("Microsoft.EntityFrameworkCore.Tools", "1.0.0-preview2-final", "Microsoft.EntityFrameworkCore.Tools", ConstantPackageVersions.AspNetToolsVersion)] + [InlineData("Microsoft.VisualStudio.Web.CodeGenerators.Mvc", "1.0.0-preview2-final", "Microsoft.VisualStudio.Web.CodeGeneration.Design", ConstantPackageVersions.AspNetToolsVersion)] + [InlineData("Microsoft.VisualStudio.Web.CodeGenerators.Mvc", "1.0.0-*", "Microsoft.VisualStudio.Web.CodeGeneration.Design", ConstantPackageVersions.AspNetToolsVersion)] + [InlineData("Microsoft.VisualStudio.Web.CodeGenerators.Mvc", "1.0.0-preview3-final", "Microsoft.VisualStudio.Web.CodeGeneration.Design", ConstantPackageVersions.AspNetToolsVersion)] + [InlineData("Microsoft.VisualStudio.Web.CodeGenerators.Mvc", "1.1.0-preview4-final", "Microsoft.VisualStudio.Web.CodeGeneration.Design", "1.1.0-msbuild3-final")] + public void ItMigratesProjectDependenciesToANewNameAndVersion( string sourceToolName, + string sourceVersion, string targetToolName, string targetVersion) { - const string anyVersion = "1.0.0-preview2-final"; - var mockProj = RunPackageDependenciesRuleOnPj("{ \"dependencies\": { \"" + sourceToolName + "\" : { \"version\": \"" + anyVersion + "\", \"type\": \"build\" } } }"); + var mockProj = RunPackageDependenciesRuleOnPj("{ \"dependencies\": { \"" + sourceToolName + "\" : { \"version\": \"" + sourceVersion + "\", \"type\": \"build\" } } }"); var packageRef = mockProj.Items.First(i => i.Include == targetToolName && i.ItemType == "PackageReference"); - packageRef.GetMetadataWithName("Version").Value.Should().Be(ConstantPackageVersions.AspNetToolsVersion); + packageRef.GetMetadataWithName("Version").Value.Should().Be(targetVersion); packageRef.GetMetadataWithName("PrivateAssets").Value.Should().NotBeNull().And.Be("All"); } @@ -35,7 +38,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests [InlineData("Microsoft.VisualStudio.Web.CodeGeneration.Tools")] [InlineData("dotnet-test-xunit")] [InlineData("dotnet-test-mstest")] - public void It_does_not_migrate_project_tool_dependency_that_is_no_longer_needed(string dependencyName) + public void ItDoesNotMigrateProjectToolDependencyThatIsNoLongerNeeded(string dependencyName) { var mockProj = RunPackageDependenciesRuleOnPj(@" { @@ -59,7 +62,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests [InlineData("Microsoft.DotNet.Watcher.Tools", "Microsoft.DotNet.Watcher.Tools", ConstantPackageVersions.AspNetToolsVersion)] [InlineData("Microsoft.Extensions.SecretManager.Tools", "Microsoft.Extensions.SecretManager.Tools", ConstantPackageVersions.AspNetToolsVersion)] [InlineData("BundlerMinifier.Core", "BundlerMinifier.Core", ConstantPackageVersions.BundleMinifierToolVersion)] - public void It_migrates_asp_project_tools_to_a_new_name_and_version( + public void ItMigratesAspProjectToolsToANewNameAndVersion( string sourceToolName, string targetToolName, string targetVersion) @@ -73,7 +76,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests [Theory] [InlineData("Microsoft.AspNetCore.Razor.Tools")] [InlineData("Microsoft.AspNetCore.Server.IISIntegration.Tools")] - public void It_does_not_migrate_asp_project_tool(string toolName) + public void ItDoesNotMigrateAspProjectTool(string toolName) { var mockProj = RunPackageDependenciesRuleOnPj(@" {