From 3e6e1ddcd08eb7542c0fca37553f205ef28668d9 Mon Sep 17 00:00:00 2001 From: Bryan Thornbury Date: Thu, 22 Sep 2016 12:51:23 -0700 Subject: [PATCH] add support for conditioned csproj references, add tests --- .../Rules/MigrateProjectDependenciesRule.cs | 55 +++++----- ...enThatIWantToMigrateProjectDependencies.cs | 101 +++++++++++++++++- 2 files changed, 129 insertions(+), 27 deletions(-) diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigrateProjectDependenciesRule.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigrateProjectDependenciesRule.cs index 1fd386688..1d8b1e8f1 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigrateProjectDependenciesRule.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigrateProjectDependenciesRule.cs @@ -37,7 +37,6 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules var migratedXProjDependencyPaths = MigrateXProjProjectDependencies(migrationSettings, migrationRuleInputs); var migratedXProjDependencyNames = migratedXProjDependencyPaths.Select(p => Path.GetFileNameWithoutExtension(p)); - AddPropertyTransformsToCommonPropertyGroup(migrationRuleInputs.CommonPropertyGroup); MigrateProjectJsonProjectDependencies( possibleProjectDependencies, @@ -46,14 +45,6 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules migrationRuleInputs.OutputMSBuildProject); } - private void ThrowIfUnresolvedDependencies(IEnumerable projectContexts, List projectDependencies, IEnumerable migratedXProjDependencyNames) - { - foreach (var projectContext in projectContexts) - { - var projectExports = projectContext.CreateExporter("_").GetDependencies(LibraryType.Project); - } - } - private IEnumerable MigrateXProjProjectDependencies(MigrationSettings migrationSettings, MigrationRuleInputs migrationRuleInputs) { var xproj = migrationRuleInputs.ProjectXproj; @@ -63,26 +54,38 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules return Enumerable.Empty(); } - var projectReferenceItems = xproj.Items.Where(i => i.ItemType == "ProjectReference"); - - IEnumerable projectReferences = new List(); - foreach (var projectReferenceItem in projectReferenceItems) + var csprojTransformedReferences = new List(); + + var csprojReferenceItems = xproj.Items + .Where(i => i.ItemType == "ProjectReference") + .Where(p => + p.Includes().Any( + include => string.Equals(Path.GetExtension(include), ".csproj", StringComparison.OrdinalIgnoreCase))); + + foreach (var csprojReferenceItem in csprojReferenceItems) { - projectReferences = projectReferences.Union(projectReferenceItem.Includes()); + var conditionChain = csprojReferenceItem.ConditionChain(); + var condition = string.Join(" and ", conditionChain); + + var referenceInclude = string.Join(";", csprojReferenceItem.Includes() + .Where(include => + string.Equals(Path.GetExtension(include), ".csproj", StringComparison.OrdinalIgnoreCase))); + + var transformItem = ProjectDependencyStringTransform.Transform(referenceInclude); + transformItem.Condition = condition; + + csprojTransformedReferences.Add(transformItem); + } + + + MigrationTrace.Instance.WriteLine($"{nameof(MigrateProjectDependenciesRule)}: Migrating {csprojTransformedReferences.Count()} xproj to csproj references"); + + foreach (var csprojTransformedReference in csprojTransformedReferences) + { + _transformApplicator.Execute(csprojTransformedReference, migrationRuleInputs.CommonItemGroup); } - var csprojReferences = projectReferences - .Where(p => string.Equals(Path.GetExtension(p), ".csproj", StringComparison.OrdinalIgnoreCase)); - - MigrationTrace.Instance.WriteLine($"{nameof(MigrateProjectDependenciesRule)}: Migrating {csprojReferences.Count()} xproj to csproj references"); - - var csprojReferenceTransforms = csprojReferences.Select(r => ProjectDependencyStringTransform.Transform(r)); - foreach (var csprojReferenceTransform in csprojReferenceTransforms) - { - _transformApplicator.Execute(csprojReferenceTransform, migrationRuleInputs.CommonItemGroup); - } - - return csprojReferences; + return csprojTransformedReferences.SelectMany(r => r.Includes()); } public void MigrateProjectJsonProjectDependencies( diff --git a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateProjectDependencies.cs b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateProjectDependencies.cs index 175aeb7e5..f5cb968cc 100644 --- a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateProjectDependencies.cs +++ b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateProjectDependencies.cs @@ -104,7 +104,6 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests } } "; - Console.WriteLine(projectJson); var testDirectory = Temp.CreateDirectory().Path; var migratedProj = TemporaryProjectFileRuleRunner.RunRules(new IMigrationRule[] @@ -116,5 +115,105 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests migratedProjectReferenceItems.Should().HaveCount(expectedMigratedReferences.Length); migratedProjectReferenceItems.Select(m => m.Include).Should().BeEquivalentTo(expectedMigratedReferences); } + + public void It_migrates_csproj_ProjectReference_in_xproj_including_condition_on_ProjectReference() + { + var projectReference = "some/to.csproj"; + var xproj = ProjectRootElement.Create(); + var csprojReferenceItem = xproj.AddItem("ProjectReference", projectReference); + csprojReferenceItem.Condition = " '$(Foo)' == 'bar' "; + + var projectReferenceName = Path.GetFileNameWithoutExtension(projectReference); + + var projectJson = @" + { + ""dependencies"": {" + + $"\"{projectReferenceName}\"" + @": { + ""target"" : ""project"" + } + } + } + "; + + var testDirectory = Temp.CreateDirectory().Path; + var migratedProj = TemporaryProjectFileRuleRunner.RunRules(new IMigrationRule[] + { + new MigrateProjectDependenciesRule() + }, projectJson, testDirectory, xproj); + + var migratedProjectReferenceItems = migratedProj.Items.Where(i => i.ItemType == "ProjectReference"); + migratedProjectReferenceItems.Should().HaveCount(1); + + var migratedProjectReferenceItem = migratedProjectReferenceItems.First(); + migratedProjectReferenceItem.Include.Should().Be(projectReference); + migratedProjectReferenceItem.Condition.Should().Be(" '$(Foo)' == 'bar' "); + } + + public void It_migrates_csproj_ProjectReference_in_xproj_including_condition_on_ProjectReference_parent() + { + var projectReference = "some/to.csproj"; + var xproj = ProjectRootElement.Create(); + var csprojReferenceItem = xproj.AddItem("ProjectReference", projectReference); + csprojReferenceItem.Parent.Condition = " '$(Foo)' == 'bar' "; + + var projectReferenceName = Path.GetFileNameWithoutExtension(projectReference); + + var projectJson = @" + { + ""dependencies"": {" + + $"\"{projectReferenceName}\"" + @": { + ""target"" : ""project"" + } + } + } + "; + + var testDirectory = Temp.CreateDirectory().Path; + var migratedProj = TemporaryProjectFileRuleRunner.RunRules(new IMigrationRule[] + { + new MigrateProjectDependenciesRule() + }, projectJson, testDirectory, xproj); + + var migratedProjectReferenceItems = migratedProj.Items.Where(i => i.ItemType == "ProjectReference"); + migratedProjectReferenceItems.Should().HaveCount(1); + + var migratedProjectReferenceItem = migratedProjectReferenceItems.First(); + migratedProjectReferenceItem.Include.Should().Be(projectReference); + migratedProjectReferenceItem.Condition.Should().Be(" '$(Foo)' == 'bar' "); + } + + public void It_migrates_csproj_ProjectReference_in_xproj_including_condition_on_ProjectReference_parent_and_item() + { + var projectReference = "some/to.csproj"; + var xproj = ProjectRootElement.Create(); + var csprojReferenceItem = xproj.AddItem("ProjectReference", projectReference); + csprojReferenceItem.Parent.Condition = " '$(Foo)' == 'bar' "; + csprojReferenceItem.Condition = " '$(Bar)' == 'foo' "; + + var projectReferenceName = Path.GetFileNameWithoutExtension(projectReference); + + var projectJson = @" + { + ""dependencies"": {" + + $"\"{projectReferenceName}\"" + @": { + ""target"" : ""project"" + } + } + } + "; + + var testDirectory = Temp.CreateDirectory().Path; + var migratedProj = TemporaryProjectFileRuleRunner.RunRules(new IMigrationRule[] + { + new MigrateProjectDependenciesRule() + }, projectJson, testDirectory, xproj); + + var migratedProjectReferenceItems = migratedProj.Items.Where(i => i.ItemType == "ProjectReference"); + migratedProjectReferenceItems.Should().HaveCount(1); + + var migratedProjectReferenceItem = migratedProjectReferenceItems.First(); + migratedProjectReferenceItem.Include.Should().Be(projectReference); + migratedProjectReferenceItem.Condition.Should().Be(" '$(Foo)' == 'bar' and '$(Bar)' == 'foo'"); + } } }