From 5aded80a7b355fbe54cd8897388600c2df814beb Mon Sep 17 00:00:00 2001 From: Justin Goshi Date: Sat, 28 Jan 2017 15:14:17 -1000 Subject: [PATCH] Migration: excluded files need to be removed (#5485) * WIP * Implement Remove attribute * Enable tests * Fix test * Try a shorter test name * Try more shortened test names * Shorten some more * Merge issues * Try shortinging names more * Fix test errors related to test asset renaming --- .../project.json | 20 ---- .../Program.cs | 0 .../project.json | 0 .../Helper1.cs | 0 .../Helper2.cs | 0 .../project/IncludeThis.cs | 0 .../project/Program.cs | 0 .../project/project.json | 0 .../HelperBuiltIn1.cs | 0 .../HelperBuiltIn2.cs | 0 .../project/IncludeThis.cs | 0 .../project/Program.cs | 0 .../project/project.json | 0 .../ExcludeThis1.cs | 0 .../ExcludeThis2.cs | 0 .../Program.cs | 0 .../project.json | 0 .../ContentFile1.txt | 0 .../ContentFile2.txt | 0 .../ContentFileBuiltIn1.txt | 0 .../ContentFileBuiltIn2.txt | 0 .../project/ExcludeThis1.txt | 0 .../project/ExcludeThis2.txt | 0 .../project/IncludeThis.txt | 0 .../project/Program.cs | 0 .../project/project.json | 0 .../Program.cs | 2 +- .../PJDeprecatedNamedResource/project.json | 20 ++++ .../Content1.txt | 0 .../Content2.txt | 0 .../Program.cs | 0 .../project.json | 0 .../Strings1.resx | 0 .../Strings2.resx | 0 .../project}/Program.cs | 0 .../project/Resources/Strings.resx | 0 .../project/project.json | 0 .../Strings1.resx | 0 .../Strings2.resx | 0 .../project/Program.cs | 0 .../project/Resources/Strings.resx | 0 .../project/project.json | 0 .../Exclude1.resx | 0 .../Exclude2.resx | 0 .../Program.cs | 0 .../project.json | 0 .../Rules/CleanOutputProjectRule.cs | 4 +- .../Rules/MigrateBuildOptionsRule.cs | 72 ++++++++---- .../transforms/ConditionalTransform.cs | 73 ++++++++++++ .../transforms/IncludeContextTransform.cs | 69 ----------- .../transforms/RemoveContextTransform.cs | 110 ++++++++++++++++++ .../transforms/RemoveItemTransform.cs | 69 +++++++++++ .../GivenAProjectMigrator.cs | 4 +- .../GivenThatIWantToMigrateBuildOptions.cs | 17 ++- ...venThatIWantToMigrateDeprecatedProjects.cs | 108 +++++++++-------- 55 files changed, 394 insertions(+), 174 deletions(-) delete mode 100644 TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedNamedResourceOption/project.json rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedCompilationOptions => PJDeprecatedCompilation}/Program.cs (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedCompilationOptions => PJDeprecatedCompilation}/project.json (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedCompileOptions => PJDeprecatedCompile}/Helper1.cs (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedCompileOptions => PJDeprecatedCompile}/Helper2.cs (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedCompileBuiltInOptions => PJDeprecatedCompile}/project/IncludeThis.cs (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedCompileOptions => PJDeprecatedCompile}/project/Program.cs (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedCompileOptions => PJDeprecatedCompile}/project/project.json (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedCompileBuiltInOptions => PJDeprecatedCompileBuiltIn}/HelperBuiltIn1.cs (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedCompileBuiltInOptions => PJDeprecatedCompileBuiltIn}/HelperBuiltIn2.cs (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedCompileOptions => PJDeprecatedCompileBuiltIn}/project/IncludeThis.cs (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedCompileBuiltInOptions => PJDeprecatedCompileBuiltIn}/project/Program.cs (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedCompileBuiltInOptions => PJDeprecatedCompileBuiltIn}/project/project.json (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedCompileExcludeOptions => PJDeprecatedCompileExclude}/ExcludeThis1.cs (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedCompileExcludeOptions => PJDeprecatedCompileExclude}/ExcludeThis2.cs (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedCompileExcludeOptions => PJDeprecatedCompileExclude}/Program.cs (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedCompileExcludeOptions => PJDeprecatedCompileExclude}/project.json (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedContentOptions => PJDeprecatedContent}/ContentFile1.txt (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedContentOptions => PJDeprecatedContent}/ContentFile2.txt (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedContentOptions => PJDeprecatedContent}/ContentFileBuiltIn1.txt (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedContentOptions => PJDeprecatedContent}/ContentFileBuiltIn2.txt (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedContentOptions => PJDeprecatedContent}/project/ExcludeThis1.txt (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedContentOptions => PJDeprecatedContent}/project/ExcludeThis2.txt (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedContentOptions => PJDeprecatedContent}/project/IncludeThis.txt (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedContentOptions => PJDeprecatedContent}/project/Program.cs (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedContentOptions => PJDeprecatedContent}/project/project.json (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedResourceOptions/project => PJDeprecatedNamedResource}/Program.cs (96%) create mode 100644 TestAssets/NonRestoredTestProjects/PJDeprecatedNamedResource/project.json rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedPackOptions => PJDeprecatedPack}/Content1.txt (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedPackOptions => PJDeprecatedPack}/Content2.txt (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedPackOptions => PJDeprecatedPack}/Program.cs (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedPackOptions => PJDeprecatedPack}/project.json (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedResourceBuiltInOptions => PJDeprecatedResource}/Strings1.resx (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedResourceBuiltInOptions => PJDeprecatedResource}/Strings2.resx (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedNamedResourceOption => PJDeprecatedResource/project}/Program.cs (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedResourceBuiltInOptions => PJDeprecatedResource}/project/Resources/Strings.resx (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedResourceOptions => PJDeprecatedResource}/project/project.json (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedResourceOptions => PJDeprecatedResourceBuiltIn}/Strings1.resx (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedResourceOptions => PJDeprecatedResourceBuiltIn}/Strings2.resx (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedResourceBuiltInOptions => PJDeprecatedResourceBuiltIn}/project/Program.cs (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedResourceOptions => PJDeprecatedResourceBuiltIn}/project/Resources/Strings.resx (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedResourceBuiltInOptions => PJDeprecatedResourceBuiltIn}/project/project.json (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedResourceExcludeOptions => PJDeprecatedResourceExclude}/Exclude1.resx (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedResourceExcludeOptions => PJDeprecatedResourceExclude}/Exclude2.resx (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedResourceExcludeOptions => PJDeprecatedResourceExclude}/Program.cs (100%) rename TestAssets/NonRestoredTestProjects/{PJAppWithDeprecatedResourceExcludeOptions => PJDeprecatedResourceExclude}/project.json (100%) create mode 100644 src/Microsoft.DotNet.ProjectJsonMigration/transforms/RemoveContextTransform.cs create mode 100644 src/Microsoft.DotNet.ProjectJsonMigration/transforms/RemoveItemTransform.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedNamedResourceOption/project.json b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedNamedResourceOption/project.json deleted file mode 100644 index 0bf0dfa00..000000000 --- a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedNamedResourceOption/project.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "version": "1.0.0-*", - "namedResource": [ "My.Alias", "Strings.resx" ], - "buildOptions": { - "debugType": "portable", - "emitEntryPoint": true - }, - "dependencies": {}, - "frameworks": { - "netcoreapp1.0": { - "dependencies": { - "Microsoft.NETCore.App": { - "type": "platform", - "version": "1.0.0" - } - }, - "imports": "dnxcore50" - } - } -} diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompilationOptions/Program.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedCompilation/Program.cs similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompilationOptions/Program.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedCompilation/Program.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompilationOptions/project.json b/TestAssets/NonRestoredTestProjects/PJDeprecatedCompilation/project.json similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompilationOptions/project.json rename to TestAssets/NonRestoredTestProjects/PJDeprecatedCompilation/project.json diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/Helper1.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedCompile/Helper1.cs similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/Helper1.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedCompile/Helper1.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/Helper2.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedCompile/Helper2.cs similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/Helper2.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedCompile/Helper2.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/project/IncludeThis.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedCompile/project/IncludeThis.cs similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/project/IncludeThis.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedCompile/project/IncludeThis.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/project/Program.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedCompile/project/Program.cs similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/project/Program.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedCompile/project/Program.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/project/project.json b/TestAssets/NonRestoredTestProjects/PJDeprecatedCompile/project/project.json similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/project/project.json rename to TestAssets/NonRestoredTestProjects/PJDeprecatedCompile/project/project.json diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/HelperBuiltIn1.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedCompileBuiltIn/HelperBuiltIn1.cs similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/HelperBuiltIn1.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedCompileBuiltIn/HelperBuiltIn1.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/HelperBuiltIn2.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedCompileBuiltIn/HelperBuiltIn2.cs similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/HelperBuiltIn2.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedCompileBuiltIn/HelperBuiltIn2.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/project/IncludeThis.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedCompileBuiltIn/project/IncludeThis.cs similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/project/IncludeThis.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedCompileBuiltIn/project/IncludeThis.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/project/Program.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedCompileBuiltIn/project/Program.cs similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/project/Program.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedCompileBuiltIn/project/Program.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/project/project.json b/TestAssets/NonRestoredTestProjects/PJDeprecatedCompileBuiltIn/project/project.json similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/project/project.json rename to TestAssets/NonRestoredTestProjects/PJDeprecatedCompileBuiltIn/project/project.json diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/ExcludeThis1.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedCompileExclude/ExcludeThis1.cs similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/ExcludeThis1.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedCompileExclude/ExcludeThis1.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/ExcludeThis2.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedCompileExclude/ExcludeThis2.cs similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/ExcludeThis2.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedCompileExclude/ExcludeThis2.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/Program.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedCompileExclude/Program.cs similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/Program.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedCompileExclude/Program.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/project.json b/TestAssets/NonRestoredTestProjects/PJDeprecatedCompileExclude/project.json similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/project.json rename to TestAssets/NonRestoredTestProjects/PJDeprecatedCompileExclude/project.json diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFile1.txt b/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/ContentFile1.txt similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFile1.txt rename to TestAssets/NonRestoredTestProjects/PJDeprecatedContent/ContentFile1.txt diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFile2.txt b/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/ContentFile2.txt similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFile2.txt rename to TestAssets/NonRestoredTestProjects/PJDeprecatedContent/ContentFile2.txt diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFileBuiltIn1.txt b/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/ContentFileBuiltIn1.txt similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFileBuiltIn1.txt rename to TestAssets/NonRestoredTestProjects/PJDeprecatedContent/ContentFileBuiltIn1.txt diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFileBuiltIn2.txt b/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/ContentFileBuiltIn2.txt similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFileBuiltIn2.txt rename to TestAssets/NonRestoredTestProjects/PJDeprecatedContent/ContentFileBuiltIn2.txt diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/ExcludeThis1.txt b/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/ExcludeThis1.txt similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/ExcludeThis1.txt rename to TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/ExcludeThis1.txt diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/ExcludeThis2.txt b/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/ExcludeThis2.txt similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/ExcludeThis2.txt rename to TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/ExcludeThis2.txt diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/IncludeThis.txt b/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/IncludeThis.txt similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/IncludeThis.txt rename to TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/IncludeThis.txt diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/Program.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/Program.cs similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/Program.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/Program.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/project.json b/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/project.json similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/project.json rename to TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/project.json diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/project/Program.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedNamedResource/Program.cs similarity index 96% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/project/Program.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedNamedResource/Program.cs index d0134277c..8fdd24dff 100644 --- a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/project/Program.cs +++ b/TestAssets/NonRestoredTestProjects/PJDeprecatedNamedResource/Program.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Reflection; diff --git a/TestAssets/NonRestoredTestProjects/PJDeprecatedNamedResource/project.json b/TestAssets/NonRestoredTestProjects/PJDeprecatedNamedResource/project.json new file mode 100644 index 000000000..e0c6115f7 --- /dev/null +++ b/TestAssets/NonRestoredTestProjects/PJDeprecatedNamedResource/project.json @@ -0,0 +1,20 @@ +{ + "version": "1.0.0-*", + "namedResource": [ "My.Alias", "Strings.resx" ], + "buildOptions": { + "debugType": "portable", + "emitEntryPoint": true + }, + "dependencies": {}, + "frameworks": { + "netcoreapp1.0": { + "dependencies": { + "Microsoft.NETCore.App": { + "type": "platform", + "version": "1.0.0" + } + }, + "imports": "dnxcore50" + } + } +} diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/Content1.txt b/TestAssets/NonRestoredTestProjects/PJDeprecatedPack/Content1.txt similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/Content1.txt rename to TestAssets/NonRestoredTestProjects/PJDeprecatedPack/Content1.txt diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/Content2.txt b/TestAssets/NonRestoredTestProjects/PJDeprecatedPack/Content2.txt similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/Content2.txt rename to TestAssets/NonRestoredTestProjects/PJDeprecatedPack/Content2.txt diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/Program.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedPack/Program.cs similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/Program.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedPack/Program.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/project.json b/TestAssets/NonRestoredTestProjects/PJDeprecatedPack/project.json similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/project.json rename to TestAssets/NonRestoredTestProjects/PJDeprecatedPack/project.json diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/Strings1.resx b/TestAssets/NonRestoredTestProjects/PJDeprecatedResource/Strings1.resx similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/Strings1.resx rename to TestAssets/NonRestoredTestProjects/PJDeprecatedResource/Strings1.resx diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/Strings2.resx b/TestAssets/NonRestoredTestProjects/PJDeprecatedResource/Strings2.resx similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/Strings2.resx rename to TestAssets/NonRestoredTestProjects/PJDeprecatedResource/Strings2.resx diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedNamedResourceOption/Program.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedResource/project/Program.cs similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedNamedResourceOption/Program.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedResource/project/Program.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/project/Resources/Strings.resx b/TestAssets/NonRestoredTestProjects/PJDeprecatedResource/project/Resources/Strings.resx similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/project/Resources/Strings.resx rename to TestAssets/NonRestoredTestProjects/PJDeprecatedResource/project/Resources/Strings.resx diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/project/project.json b/TestAssets/NonRestoredTestProjects/PJDeprecatedResource/project/project.json similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/project/project.json rename to TestAssets/NonRestoredTestProjects/PJDeprecatedResource/project/project.json diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/Strings1.resx b/TestAssets/NonRestoredTestProjects/PJDeprecatedResourceBuiltIn/Strings1.resx similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/Strings1.resx rename to TestAssets/NonRestoredTestProjects/PJDeprecatedResourceBuiltIn/Strings1.resx diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/Strings2.resx b/TestAssets/NonRestoredTestProjects/PJDeprecatedResourceBuiltIn/Strings2.resx similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/Strings2.resx rename to TestAssets/NonRestoredTestProjects/PJDeprecatedResourceBuiltIn/Strings2.resx diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/project/Program.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedResourceBuiltIn/project/Program.cs similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/project/Program.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedResourceBuiltIn/project/Program.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/project/Resources/Strings.resx b/TestAssets/NonRestoredTestProjects/PJDeprecatedResourceBuiltIn/project/Resources/Strings.resx similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/project/Resources/Strings.resx rename to TestAssets/NonRestoredTestProjects/PJDeprecatedResourceBuiltIn/project/Resources/Strings.resx diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/project/project.json b/TestAssets/NonRestoredTestProjects/PJDeprecatedResourceBuiltIn/project/project.json similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/project/project.json rename to TestAssets/NonRestoredTestProjects/PJDeprecatedResourceBuiltIn/project/project.json diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/Exclude1.resx b/TestAssets/NonRestoredTestProjects/PJDeprecatedResourceExclude/Exclude1.resx similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/Exclude1.resx rename to TestAssets/NonRestoredTestProjects/PJDeprecatedResourceExclude/Exclude1.resx diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/Exclude2.resx b/TestAssets/NonRestoredTestProjects/PJDeprecatedResourceExclude/Exclude2.resx similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/Exclude2.resx rename to TestAssets/NonRestoredTestProjects/PJDeprecatedResourceExclude/Exclude2.resx diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/Program.cs b/TestAssets/NonRestoredTestProjects/PJDeprecatedResourceExclude/Program.cs similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/Program.cs rename to TestAssets/NonRestoredTestProjects/PJDeprecatedResourceExclude/Program.cs diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/project.json b/TestAssets/NonRestoredTestProjects/PJDeprecatedResourceExclude/project.json similarity index 100% rename from TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/project.json rename to TestAssets/NonRestoredTestProjects/PJDeprecatedResourceExclude/project.json diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/CleanOutputProjectRule.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/CleanOutputProjectRule.cs index f31be9ba2..e419c615b 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/CleanOutputProjectRule.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/CleanOutputProjectRule.cs @@ -43,7 +43,9 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules foreach (var item in msbuildProject.Items) { - if (string.IsNullOrEmpty(item.Include) && string.IsNullOrEmpty(item.Update)) + if (string.IsNullOrEmpty(item.Include) && + string.IsNullOrEmpty(item.Remove) && + string.IsNullOrEmpty(item.Update)) { item.Parent.RemoveChild(item); } diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigrateBuildOptionsRule.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigrateBuildOptionsRule.cs index a97fe441e..1e7259bd2 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigrateBuildOptionsRule.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigrateBuildOptionsRule.cs @@ -133,9 +133,17 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules condition: ic => ic != null, emitBuiltInIncludes: false); + private RemoveContextTransform RemoveCompileFilesTransform => + new RemoveContextTransform( + "Compile", + condition: ic => ic != null); + private IncludeContextTransform EmbedFilesTransform => new IncludeContextTransform("EmbeddedResource", transformMappings: false, condition: ic => ic != null); + private RemoveContextTransform RemoveEmbedFilesTransform => + new RemoveContextTransform("EmbeddedResource", condition: ic => ic != null); + private IncludeContextTransform CopyToOutputFilesTransform => new IncludeContextTransform("Content", transformMappings: true) .WithMetadata("CopyToOutputDirectory", "PreserveNewest"); @@ -157,14 +165,22 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules projectContext => string.Empty, projectContext => File.Exists(Path.Combine(projectContext.ProjectDirectory, "App.config"))); - private Func>CompileFilesTransformExecute => + private Func> CompileFilesTransformExecute => (compilerOptions, projectDirectory, projectType) => CompileFilesTransform.Transform(compilerOptions.CompileInclude); + private Func> RemoveCompileFilesTransformExecute => + (compilerOptions, projectDirectory, projectType) => + RemoveCompileFilesTransform.Transform(compilerOptions.CompileInclude); + private Func> EmbedFilesTransformExecute => (compilerOptions, projectDirectory, projectType) => EmbedFilesTransform.Transform(GetEmbedIncludeContext(compilerOptions)); + private Func> RemoveEmbedFilesTransformExecute => + (compilerOptions, projectDirectory, projectType) => + RemoveEmbedFilesTransform.Transform(GetEmbedIncludeContext(compilerOptions)); + private Func> CopyToOutputFilesTransformExecute => (compilerOptions, projectDirectory, projectType) => { @@ -183,6 +199,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules private readonly CommonCompilerOptions _configurationBuildOptions; private List> _propertyTransforms; + private List>> _removeContextTransformExecutes; private List>> _includeContextTransformExecutes; private readonly ITransformApplicator _transformApplicator; @@ -229,6 +246,13 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules _propertyTransforms.AddRange(EmitEntryPointTransforms); _propertyTransforms.AddRange(KeyFileTransforms); + _removeContextTransformExecutes = + new List>>() + { + RemoveCompileFilesTransformExecute, + RemoveEmbedFilesTransformExecute + }; + _includeContextTransformExecutes = new List>>() { @@ -311,6 +335,19 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules } } + foreach (var removeContextTransformExecutes in _removeContextTransformExecutes) + { + var nonConfigurationOutput = + removeContextTransformExecutes(compilerOptions, projectDirectory, projectType); + var configurationOutput = + removeContextTransformExecutes(configurationCompilerOptions, projectDirectory, projectType); + + if (configurationOutput != null) + { + transformApplicator.Execute(configurationOutput, itemGroup, mergeExisting: true); + } + } + foreach (var includeContextTransformExecute in _includeContextTransformExecutes) { var nonConfigurationOutput = @@ -318,7 +355,6 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules var configurationOutput = includeContextTransformExecute(configurationCompilerOptions, projectDirectory, projectType); - if (configurationOutput != null) { transformApplicator.Execute(configurationOutput, itemGroup, mergeExisting: true); @@ -326,25 +362,6 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules } } - private void RemoveCommonIncludes(IEnumerable itemsToRemoveFrom, - IEnumerable otherItems) - { - foreach (var item1 in itemsToRemoveFrom) - { - if (item1 == null) - { - continue; - } - foreach ( - var item2 in - otherItems.Where( - i => i != null && string.Equals(i.ItemType, item1.ItemType, StringComparison.Ordinal))) - { - item1.Include = string.Join(";", item1.Includes().Except(item2.Includes())); - } - } - } - private bool PropertiesAreEqual(ProjectPropertyElement nonConfigurationOutput, ProjectPropertyElement configurationOutput) { if (configurationOutput != null && nonConfigurationOutput != null) @@ -369,6 +386,19 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules transformApplicator.Execute(transform.Transform(compilerOptions), propertyGroup, mergeExisting: true); } + foreach (var removeContextTransformExecutes in _removeContextTransformExecutes) + { + var transform = removeContextTransformExecutes(compilerOptions, projectDirectory, projectType); + + if (transform != null) + { + transformApplicator.Execute( + transform, + itemGroup, + mergeExisting: true); + } + } + foreach (var includeContextTransformExecute in _includeContextTransformExecutes) { var transform = includeContextTransformExecute(compilerOptions, projectDirectory, projectType); diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/transforms/ConditionalTransform.cs b/src/Microsoft.DotNet.ProjectJsonMigration/transforms/ConditionalTransform.cs index 099f553c2..7f5d1a984 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/transforms/ConditionalTransform.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/transforms/ConditionalTransform.cs @@ -1,7 +1,11 @@ // Copyright (c) .NET Foundation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. +using Microsoft.DotNet.Tools.Common; using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; namespace Microsoft.DotNet.ProjectJsonMigration.Transforms { @@ -25,5 +29,74 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms } public abstract U ConditionallyTransform(T source); + + protected string FormatGlobPatternsForMsbuild(IEnumerable patterns, string projectDirectory) + { + if (patterns == null) + { + return string.Empty; + } + + List mutatedPatterns = new List(patterns.Count()); + + foreach (var pattern in patterns) + { + // Do not use forward slashes + // https://github.com/Microsoft/msbuild/issues/724 + var mutatedPattern = pattern.Replace('/', '\\'); + + // MSBuild cannot copy directories + mutatedPattern = ReplaceDirectoriesWithGlobs(mutatedPattern, projectDirectory); + + mutatedPatterns.Add(mutatedPattern); + } + + return string.Join(";", mutatedPatterns); + } + + private string ReplaceDirectoriesWithGlobs(string pattern, string projectDirectory) + { + if (PatternIsDirectory(pattern, projectDirectory)) + { + return $"{pattern.TrimEnd(new char[] { '\\' })}\\**\\*"; + } + else + { + return pattern; + } + } + + private bool PatternIsDirectory(string pattern, string projectDirectory) + { + // TODO: what about /some/path/**/somedir? + // Should this even be migrated? + var path = pattern; + + if (!Path.IsPathRooted(path)) + { + path = Path.Combine(projectDirectory, path); + } + + return Directory.Exists(path); + } + + protected string ConvertTargetPathToMsbuildMetadata(string targetPath) + { + var targetIsFile = MappingsTargetPathIsFile(targetPath); + + if (targetIsFile) + { + return targetPath; + } + + return $"{targetPath}%(FileName)%(Extension)"; + } + + private bool MappingsTargetPathIsFile(string targetPath) + { + var normalizedTargetPath = PathUtility.GetPathWithDirectorySeparator(targetPath); + + return normalizedTargetPath[normalizedTargetPath.Length - 1] != Path.DirectorySeparatorChar; + } } } diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/transforms/IncludeContextTransform.cs b/src/Microsoft.DotNet.ProjectJsonMigration/transforms/IncludeContextTransform.cs index 6fd504107..e71bcf923 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/transforms/IncludeContextTransform.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/transforms/IncludeContextTransform.cs @@ -172,80 +172,11 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms return transformSet.Select(t => t.Item1.Transform(t.Item2)); } - protected string FormatGlobPatternsForMsbuild(IEnumerable patterns, string projectDirectory) - { - if (patterns == null) - { - return string.Empty; - } - - List mutatedPatterns = new List(patterns.Count()); - - foreach (var pattern in patterns) - { - // Do not use forward slashes - // https://github.com/Microsoft/msbuild/issues/724 - var mutatedPattern = pattern.Replace('/', '\\'); - - // MSBuild cannot copy directories - mutatedPattern = ReplaceDirectoriesWithGlobs(mutatedPattern, projectDirectory); - - mutatedPatterns.Add(mutatedPattern); - } - - return string.Join(";", mutatedPatterns); - } - - private string ReplaceDirectoriesWithGlobs(string pattern, string projectDirectory) - { - if (PatternIsDirectory(pattern, projectDirectory)) - { - return $"{pattern.TrimEnd(new char[] { '\\' })}\\**\\*"; - } - else - { - return pattern; - } - } - private AddItemTransform AddMappingToTransform( AddItemTransform addItemTransform, string targetPath) { return _mappingsToTransfrom(addItemTransform, targetPath); } - - private bool PatternIsDirectory(string pattern, string projectDirectory) - { - // TODO: what about /some/path/**/somedir? - // Should this even be migrated? - var path = pattern; - - if (!Path.IsPathRooted(path)) - { - path = Path.Combine(projectDirectory, path); - } - - return Directory.Exists(path); - } - - private string ConvertTargetPathToMsbuildMetadata(string targetPath) - { - var targetIsFile = MappingsTargetPathIsFile(targetPath); - - if (targetIsFile) - { - return targetPath; - } - - return $"{targetPath}%(FileName)%(Extension)"; - } - - private bool MappingsTargetPathIsFile(string targetPath) - { - var normalizedTargetPath = PathUtility.GetPathWithDirectorySeparator(targetPath); - - return normalizedTargetPath[normalizedTargetPath.Length - 1] != Path.DirectorySeparatorChar; - } } } diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/transforms/RemoveContextTransform.cs b/src/Microsoft.DotNet.ProjectJsonMigration/transforms/RemoveContextTransform.cs new file mode 100644 index 000000000..1dae3a581 --- /dev/null +++ b/src/Microsoft.DotNet.ProjectJsonMigration/transforms/RemoveContextTransform.cs @@ -0,0 +1,110 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using Microsoft.DotNet.Internal.ProjectModel.Files; +using System; +using System.IO; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Build.Construction; +using Microsoft.DotNet.Cli.Utils; +using Microsoft.DotNet.ProjectJsonMigration.Models; +using Microsoft.DotNet.Tools.Common; + +namespace Microsoft.DotNet.ProjectJsonMigration.Transforms +{ + internal class RemoveContextTransform : ConditionalTransform> + { + protected virtual Func> RemoveTransformGetter => + (itemName) => new RemoveItemTransform( + itemName, + includeContext => + { + var fullRemoveSet = includeContext.ExcludePatterns.OrEmptyIfNull() + .Union(includeContext.ExcludeFiles.OrEmptyIfNull()); + + return FormatGlobPatternsForMsbuild(fullRemoveSet, includeContext.SourceBasePath); + }, + includeContext => + { + return includeContext != null && + ( + (includeContext.ExcludePatterns != null && includeContext.ExcludePatterns.Count > 0) + || + (includeContext.ExcludeFiles != null && includeContext.ExcludeFiles.Count > 0) + ); + }); + + private Func> MappingsRemoveTransformGetter => + (itemName, targetPath) => AddMappingToTransform(RemoveTransformGetter(itemName), targetPath); + + private Func, string, RemoveItemTransform> _mappingsToTransfrom; + + private readonly string _itemName; + private readonly List> _metadata = new List>(); + + public RemoveContextTransform( + string itemName, + Func condition = null + ) : base(condition) + { + _itemName = itemName; + + _mappingsToTransfrom = (removeItemTransform, targetPath) => + { + var msbuildLinkMetadataValue = ConvertTargetPathToMsbuildMetadata(targetPath); + + return removeItemTransform.WithMetadata("Link", msbuildLinkMetadataValue); + }; + } + + public override IEnumerable ConditionallyTransform(IncludeContext source) + { + var transformSet = CreateTransformSet(source); + return transformSet.Select(t => t.Item1.Transform(t.Item2)); + } + + private IEnumerable, IncludeContext>> CreateTransformSet(IncludeContext source) + { + var transformSet = new List, IncludeContext>> + { + Tuple.Create(RemoveTransformGetter(_itemName), source) + }; + + if (source == null) + { + return transformSet; + } + + // Mappings must be executed before the transform set to prevent a the + // non-mapped items that will merge with mapped items from being encompassed + foreach (var mappingEntry in source.Mappings.OrEmptyIfNull()) + { + var targetPath = mappingEntry.Key; + var includeContext = mappingEntry.Value; + + transformSet.Insert(0, + Tuple.Create( + MappingsRemoveTransformGetter(_itemName, targetPath), + includeContext)); + } + + foreach (var metadataElement in _metadata) + { + foreach (var transform in transformSet) + { + transform.Item1.WithMetadata(metadataElement); + } + } + + return transformSet; + } + + private RemoveItemTransform AddMappingToTransform( + RemoveItemTransform removeItemTransform, + string targetPath) + { + return _mappingsToTransfrom(removeItemTransform, targetPath); + } + } +} diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/transforms/RemoveItemTransform.cs b/src/Microsoft.DotNet.ProjectJsonMigration/transforms/RemoveItemTransform.cs new file mode 100644 index 000000000..7833e4b8b --- /dev/null +++ b/src/Microsoft.DotNet.ProjectJsonMigration/transforms/RemoveItemTransform.cs @@ -0,0 +1,69 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using Microsoft.Build.Construction; +using Microsoft.DotNet.ProjectJsonMigration.Models; + +namespace Microsoft.DotNet.ProjectJsonMigration.Transforms +{ + internal class RemoveItemTransform : ConditionalTransform + { + private readonly ProjectRootElement _itemObjectGenerator = ProjectRootElement.Create(); + + private readonly string _itemName; + private readonly Func _removeValueFunc; + + private readonly List> _metadata = new List>(); + + public RemoveItemTransform( + string itemName, + Func removeValueFunc, + Func condition) + : base(condition) + { + _itemName = itemName; + _removeValueFunc = removeValueFunc; + } + + public RemoveItemTransform WithMetadata(ItemMetadataValue metadata) + { + _metadata.Add(metadata); + return this; + } + + public RemoveItemTransform WithMetadata( + string metadataName, + string metadataValue, + bool expressedAsAttribute = false) + { + _metadata.Add(new ItemMetadataValue( + metadataName, + metadataValue, + expressedAsAttribute: expressedAsAttribute)); + return this; + } + + public override ProjectItemElement ConditionallyTransform(T source) + { + string removeValue = _removeValueFunc(source); + + var item = _itemObjectGenerator.AddItem(_itemName, "PlaceHolderSinceNullOrEmptyCannotBePassedToConstructor"); + item.Include = null; + item.Remove = removeValue; + + foreach (var metadata in _metadata) + { + if (metadata.ShouldWriteMetadata(source)) + { + var metametadata = item.AddMetadata(metadata.MetadataName, metadata.GetMetadataValue(source)); + metametadata.Condition = metadata.Condition; + metametadata.ExpressedAsAttribute = metadata.ExpressedAsAttribute; + } + } + + return item; + } + } +} diff --git a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/GivenAProjectMigrator.cs b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/GivenAProjectMigrator.cs index e6ca62262..386c44d9b 100644 --- a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/GivenAProjectMigrator.cs +++ b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/GivenAProjectMigrator.cs @@ -43,7 +43,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests public void ItHasWarningWhenMigratingADeprecatedProjectJson() { var testProjectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompileOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedCompile") .CreateInstance() .WithSourceFiles() .Root @@ -69,7 +69,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests public void ItHasErrorWhenMigratingADeprecatedNamedResourceOptionProjectJson() { var testProjectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedNamedResourceOption") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedNamedResource") .CreateInstance() .WithSourceFiles() .Root diff --git a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateBuildOptions.cs b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateBuildOptions.cs index e2dd297fc..ff7321215 100644 --- a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateBuildOptions.cs +++ b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateBuildOptions.cs @@ -420,12 +420,13 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests } [Theory] - [InlineData("compile", "Compile", "")] - [InlineData("embed", "EmbeddedResource", ";rootfile.cs")] - [InlineData("copyToOutput", "Content", ";rootfile.cs")] + [InlineData("compile", "Compile", 3, "")] + [InlineData("embed", "EmbeddedResource", 3, ";rootfile.cs")] + [InlineData("copyToOutput", "Content", 2, ";rootfile.cs")] private void MigratingGroupIncludeExcludePopulatesAppropriateProjectItemElement( string group, string itemName, + int expectedNumberOfCompileItems, string expectedRootFiles) { var testDirectory = Temp.CreateDirectory().Path; @@ -446,7 +447,8 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests var mockProj = RunBuildOptionsRuleOnPj(pj, testDirectory: testDirectory); - mockProj.Items.Count(i => i.ItemType.Equals(itemName, StringComparison.Ordinal)).Should().Be(2); + mockProj.Items.Count(i => i.ItemType.Equals(itemName, StringComparison.Ordinal)) + .Should().Be(expectedNumberOfCompileItems); var defaultIncludePatterns = GetDefaultIncludePatterns(group); var defaultExcludePatterns = GetDefaultExcludePatterns(group); @@ -455,7 +457,12 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests { VerifyContentMetadata(item); - if (item.Include.Contains(@"src\file1.cs")) + if (string.IsNullOrEmpty(item.Include)) + { + item.Remove.Should() + .Be(@"src\**\*;rootfile.cs;src\file2.cs"); + } + else if (item.Include.Contains(@"src\file1.cs")) { item.Include.Should().Be(@"src\file1.cs;src\file2.cs"); item.Exclude.Should().Be(@"src\file2.cs"); diff --git a/test/dotnet-migrate.Tests/GivenThatIWantToMigrateDeprecatedProjects.cs b/test/dotnet-migrate.Tests/GivenThatIWantToMigrateDeprecatedProjects.cs index c80911fc7..5c6813bc8 100644 --- a/test/dotnet-migrate.Tests/GivenThatIWantToMigrateDeprecatedProjects.cs +++ b/test/dotnet-migrate.Tests/GivenThatIWantToMigrateDeprecatedProjects.cs @@ -15,10 +15,10 @@ namespace Microsoft.DotNet.Migration.Tests public class GivenThatIWantToMigrateDeprecatedProjects : TestBase { [Fact] - public void WhenMigratingAProjectWithDeprecatedPackOptionsWarningsArePrinted() + public void WhenMigratingDeprecatedPackOptionsWarningsArePrinted() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedPackOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedPack") .CreateInstance() .WithSourceFiles() .Root; @@ -52,10 +52,10 @@ namespace Microsoft.DotNet.Migration.Tests } [Fact] - public void WhenMigratingAProjectWithDeprecatedPackOptionsItSucceeds() + public void MigrateDeprecatedPack() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedPackOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedPack") .CreateInstance() .WithSourceFiles() .Root; @@ -82,17 +82,17 @@ namespace Microsoft.DotNet.Migration.Tests var outputDir = projectDirectory.GetDirectory("bin", "Debug"); outputDir.Should().Exist() - .And.HaveFile("PJAppWithDeprecatedPackOptions.1.0.0.nupkg"); + .And.HaveFile("PJDeprecatedPack.1.0.0.nupkg"); - var outputPackage = outputDir.GetFile("PJAppWithDeprecatedPackOptions.1.0.0.nupkg"); + var outputPackage = outputDir.GetFile("PJDeprecatedPack.1.0.0.nupkg"); var zip = ZipFile.Open(outputPackage.FullName, ZipArchiveMode.Read); - zip.Entries.Should().Contain(e => e.FullName == "PJAppWithDeprecatedPackOptions.nuspec") + zip.Entries.Should().Contain(e => e.FullName == "PJDeprecatedPack.nuspec") .And.Contain(e => e.FullName == "content/Content1.txt") .And.Contain(e => e.FullName == "content/Content2.txt"); var manifestReader = new StreamReader( - zip.Entries.First(e => e.FullName == "PJAppWithDeprecatedPackOptions.nuspec").Open()); + zip.Entries.First(e => e.FullName == "PJDeprecatedPack.nuspec").Open()); // NOTE: Commented out those that are not migrated. // https://microsoft.sharepoint.com/teams/netfx/corefx/_layouts/15/WopiFrame.aspx?sourcedoc=%7B0cfbc196-0645-4781-84c6-5dffabd76bee%7D&action=edit&wd=target%28Planning%2FMSBuild%20CLI%20integration%2Eone%7C41D470DD-CF44-4595-8E05-0CE238864B55%2FProject%2Ejson%20Migration%7CA553D979-EBC6-484B-A12E-036E0730864A%2F%29 @@ -120,10 +120,10 @@ namespace Microsoft.DotNet.Migration.Tests } [Fact] - public void WhenMigratingAProjectWithDeprecatedCompilationOptionsWarningsArePrinted() + public void WhenMigratingDeprecatedCompilationOptionsWarningsArePrinted() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompilationOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedCompilation") .CreateInstance() .WithSourceFiles() .Root; @@ -141,10 +141,10 @@ namespace Microsoft.DotNet.Migration.Tests } [Fact] - public void WhenMigratingAProjectWithDeprecatedCompilationOptionsItSucceeds() + public void MigratingDeprecatedCompilation() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompilationOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedCompilation") .CreateInstance() .WithSourceFiles() .Root; @@ -166,10 +166,10 @@ namespace Microsoft.DotNet.Migration.Tests } [Fact] - public void WhenMigratingAProjectWithDeprecatedContentOptionsWarningsArePrinted() + public void WhenMigratingDeprecatedContentOptionsWarningsArePrinted() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedContentOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedContent") .CreateInstance() .WithSourceFiles() .Root; @@ -191,10 +191,10 @@ namespace Microsoft.DotNet.Migration.Tests } [Fact] - public void WhenMigratingAProjectWithDeprecatedContentOptionsItSucceeds() + public void MigratingDeprecatedContent() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedContentOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedContent") .CreateInstance() .WithSourceFiles() .Root @@ -248,10 +248,10 @@ namespace Microsoft.DotNet.Migration.Tests } [Fact] - public void WhenMigratingAProjectWithDeprecatedCompileOptionsWarningsArePrinted() + public void WhenMigratingDeprecatedCompileOptionsWarningsArePrinted() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompileOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedCompile") .CreateInstance() .WithSourceFiles() .Root; @@ -269,10 +269,10 @@ namespace Microsoft.DotNet.Migration.Tests } [Fact] - public void WhenMigratingAProjectWithDeprecatedCompileOptionsItSucceeds() + public void MigratingDeprecatedCompile() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompileOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedCompile") .CreateInstance() .WithSourceFiles() .Root @@ -295,10 +295,10 @@ namespace Microsoft.DotNet.Migration.Tests } [Fact] - public void WhenMigratingAProjectWithDeprecatedCompileBuiltInOptionsWarningsArePrinted() + public void WhenMigratingDeprecatedCompileBuiltInOptionsWarningsArePrinted() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompileBuiltInOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedCompileBuiltIn") .CreateInstance() .WithSourceFiles() .Root; @@ -314,10 +314,10 @@ namespace Microsoft.DotNet.Migration.Tests } [Fact] - public void WhenMigratingAProjectWithDeprecatedCompileBuiltInOptionsItSucceeds() + public void MigratingDeprecatedCompileBuiltIn() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompileBuiltInOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedCompileBuiltIn") .CreateInstance() .WithSourceFiles() .Root @@ -341,10 +341,10 @@ namespace Microsoft.DotNet.Migration.Tests } [Fact] - public void WhenMigratingAProjectWithDeprecatedCompileExcludeOptionsWarningsArePrinted() + public void WhenMigratingDeprecatedCompileExcludeOptionsWarningsArePrinted() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompileExcludeOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedCompileExclude") .CreateInstance() .WithSourceFiles() .Root; @@ -360,10 +360,10 @@ namespace Microsoft.DotNet.Migration.Tests } [Fact] - public void WhenMigratingAProjectWithDeprecatedCompileExcludeOptionsItSucceeds() + public void MigratingDeprecatedCompileExclude() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompileExcludeOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedCompileExclude") .CreateInstance() .WithSourceFiles() .Root; @@ -378,18 +378,17 @@ namespace Microsoft.DotNet.Migration.Tests .Execute("restore") .Should().Pass(); - // Issue: https://github.com/dotnet/cli/issues/5461 - //new DotnetCommand() - // .WithWorkingDirectory(projectDirectory) - // .Execute("build -c Debug") - // .Should().Pass(); + new DotnetCommand() + .WithWorkingDirectory(projectDirectory) + .Execute("build -c Debug") + .Should().Pass(); } [Fact] - public void WhenMigratingAProjectWithDeprecatedResourceOptionsWarningsArePrinted() + public void WhenMigratingDeprecatedResourceOptionsWarningsArePrinted() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedResourceOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedResource") .CreateInstance() .WithSourceFiles() .Root @@ -408,10 +407,10 @@ namespace Microsoft.DotNet.Migration.Tests } [Fact] - public void WhenMigratingAProjectWithDeprecatedResourceOptionsItSucceeds() + public void MigratingDeprecatedResource() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedResourceOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedResource") .CreateInstance() .WithSourceFiles() .Root @@ -440,10 +439,10 @@ namespace Microsoft.DotNet.Migration.Tests } [Fact] - public void WhenMigratingAProjectWithDeprecatedResourceBuiltInOptionsWarningsArePrinted() + public void WhenMigratingDeprecatedResourceBuiltInOptionsWarningsArePrinted() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedResourceBuiltInOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedResourceBuiltIn") .CreateInstance() .WithSourceFiles() .Root @@ -460,10 +459,10 @@ namespace Microsoft.DotNet.Migration.Tests } [Fact] - public void WhenMigratingDeprecatedBuiltInResItSucceeds() + public void MigratingDeprecatedResourceBuiltIn() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedResourceBuiltInOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedResourceBuiltIn") .CreateInstance() .WithSourceFiles() .Root @@ -493,10 +492,10 @@ namespace Microsoft.DotNet.Migration.Tests } [Fact] - public void WhenMigratingAProjectWithDeprecatedResourceExcludeOptionsWarningsArePrinted() + public void WhenMigratingDeprecatedResourceExcludeOptionsWarningsArePrinted() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedResourceExcludeOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedResourceExclude") .CreateInstance() .WithSourceFiles() .Root; @@ -512,10 +511,10 @@ namespace Microsoft.DotNet.Migration.Tests } [Fact] - public void WhenMigratingAProjectWithDeprecatedResourceExcludeOptionsItSucceeds() + public void MigratingDeprecatedResourceExclude() { var projectDirectory = TestAssets - .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedResourceExcludeOptions") + .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJDeprecatedResourceExclude") .CreateInstance() .WithSourceFiles() .Root; @@ -530,17 +529,16 @@ namespace Microsoft.DotNet.Migration.Tests .Execute("restore") .Should().Pass(); - // Issue: https://github.com/dotnet/cli/issues/5461 - //new DotnetCommand() - // .WithWorkingDirectory(projectDirectory) - // .Execute("build -c Debug") - // .Should().Pass(); + new DotnetCommand() + .WithWorkingDirectory(projectDirectory) + .Execute("build -c Debug") + .Should().Pass(); - //var cmd = new DotnetCommand() - // .WithWorkingDirectory(projectDirectory) - // .ExecuteWithCapturedOutput("run -c Debug"); - //cmd.Should().Pass(); - //cmd.StdOut.Should().Contain("0 Resources Found:"); + var cmd = new DotnetCommand() + .WithWorkingDirectory(projectDirectory) + .ExecuteWithCapturedOutput("run -c Debug"); + cmd.Should().Pass(); + cmd.StdOut.Should().Contain("0 Resources Found:"); } } }