diff --git a/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/ContentFile1.txt b/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/ContentFile1.txt1
similarity index 100%
rename from TestAssets/NonRestoredTestProjects/PJDeprecatedContent/ContentFile1.txt
rename to TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/ContentFile1.txt1
diff --git a/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/ContentFile2.txt b/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/ContentFile2.txt1
similarity index 100%
rename from TestAssets/NonRestoredTestProjects/PJDeprecatedContent/ContentFile2.txt
rename to TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/ContentFile2.txt1
diff --git a/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/ContentFileBuiltIn1.txt b/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/ContentFileBuiltIn1.txt1
similarity index 100%
rename from TestAssets/NonRestoredTestProjects/PJDeprecatedContent/ContentFileBuiltIn1.txt
rename to TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/ContentFileBuiltIn1.txt1
diff --git a/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/ContentFileBuiltIn2.txt b/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/ContentFileBuiltIn2.txt1
similarity index 100%
rename from TestAssets/NonRestoredTestProjects/PJDeprecatedContent/ContentFileBuiltIn2.txt
rename to TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/ContentFileBuiltIn2.txt1
diff --git a/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/project.json b/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/project.json
index bf61a22e2..5b1681989 100644
--- a/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/project.json
+++ b/TestAssets/NonRestoredTestProjects/PJDeprecatedContent/project/project.json
@@ -2,8 +2,8 @@
"version": "1.0.0-*",
"content": "*.txt",
"contentExclude": "ExcludeThis1.txt",
- "contentFiles": [ "../ContentFile1.txt", "../ContentFile2.txt" ],
- "contentBuiltIn": [ "../ContentFileBuiltIn1.txt", "../ContentFileBuiltIn2.txt" ],
+ "contentFiles": [ "ContentFile1.txt1", "ContentFile2.txt1" ],
+ "contentBuiltIn": [ "ContentFileBuiltIn1.txt1", "ContentFileBuiltIn2.txt1" ],
"publishExclude": "ExcludeThis2.txt",
"buildOptions": {
"debugType": "portable",
diff --git a/TestAssets/TestProjects/PJTestLibraryWithConfiguration/contentitem.txt b/TestAssets/TestProjects/PJTestLibraryWithConfiguration/contentitem.txt
new file mode 100644
index 000000000..37ba8a3c3
--- /dev/null
+++ b/TestAssets/TestProjects/PJTestLibraryWithConfiguration/contentitem.txt
@@ -0,0 +1 @@
+Random content.
\ No newline at end of file
diff --git a/TestAssets/TestProjects/PJTestLibraryWithConfiguration/project.json b/TestAssets/TestProjects/PJTestLibraryWithConfiguration/project.json
index 23c4b5057..e558ee487 100755
--- a/TestAssets/TestProjects/PJTestLibraryWithConfiguration/project.json
+++ b/TestAssets/TestProjects/PJTestLibraryWithConfiguration/project.json
@@ -17,5 +17,13 @@
},
"frameworks": {
"netstandard1.5": {}
+ },
+ "packOptions": {
+ "files": {
+ "include": ["contentitem.txt"],
+ "mappings": {
+ "dir/contentitem.txt": "contentitem.txt"
+ }
+ }
}
}
\ No newline at end of file
diff --git a/TestAssets/TestProjects/ProjectJsonWebTemplate/project.json b/TestAssets/TestProjects/ProjectJsonWebTemplate/project.json
index 7da844f6d..35b616f8a 100644
--- a/TestAssets/TestProjects/ProjectJsonWebTemplate/project.json
+++ b/TestAssets/TestProjects/ProjectJsonWebTemplate/project.json
@@ -97,7 +97,8 @@
"wwwroot",
"**/*.cshtml",
"appsettings.json",
- "web.config"
+ "web.config",
+ "README.md"
]
},
diff --git a/build/Microsoft.DotNet.Cli.DependencyVersions.props b/build/Microsoft.DotNet.Cli.DependencyVersions.props
index b0fb69426..2e844d29c 100644
--- a/build/Microsoft.DotNet.Cli.DependencyVersions.props
+++ b/build/Microsoft.DotNet.Cli.DependencyVersions.props
@@ -4,13 +4,13 @@
1.1.1
15.1.548
2.0.0-rc4-61325-08
- 1.0.0-alpha-20170217-2
+ 1.0.0-alpha-20170224-6
4.0.0-rtm-2283
1.0.0-alpha-20170130-3-281
- 15.0.0-preview-20170222-09
+ 15.0.0
1.0.0-beta1-20170202-111
- 1.0.0-beta1-20170222-125
- 1.1.1
- 1.0.2
+ 1.0.0-beta1-20170223-126
+ 1.0.3
+ 1.0.3
diff --git a/build/compile/Microsoft.DotNet.Cli.LzmaArchive.targets b/build/compile/Microsoft.DotNet.Cli.LzmaArchive.targets
index 7dc602f21..c251348f1 100644
--- a/build/compile/Microsoft.DotNet.Cli.LzmaArchive.targets
+++ b/build/compile/Microsoft.DotNet.Cli.LzmaArchive.targets
@@ -120,7 +120,7 @@
-
+
diff --git a/build/test/TestPackageProjects.targets b/build/test/TestPackageProjects.targets
index 4b7c98c80..9f68f5ba2 100644
--- a/build/test/TestPackageProjects.targets
+++ b/build/test/TestPackageProjects.targets
@@ -84,7 +84,6 @@
$(CliVersionPrefix)
$(VersionSuffix)
True
- /p:RuntimeIdentifier=$(CoreCLRRid)
@@ -96,7 +95,6 @@
$(CliVersionPrefix)
$(VersionSuffix)
True
- /p:RuntimeIdentifier=$(CoreCLRRid)
dotnet-hello
diff --git a/build_projects/dotnet-cli-build/GenerateNuGetPackagesArchiveVersion.cs b/build_projects/dotnet-cli-build/GenerateNuGetPackagesArchiveVersion.cs
index 64e789214..4c7705265 100644
--- a/build_projects/dotnet-cli-build/GenerateNuGetPackagesArchiveVersion.cs
+++ b/build_projects/dotnet-cli-build/GenerateNuGetPackagesArchiveVersion.cs
@@ -18,6 +18,9 @@ namespace Microsoft.DotNet.Cli.Build
{
}
+ [Required]
+ public string SDKVersion { get; set; }
+
[Required]
public string ToolPath { get; set; }
@@ -70,6 +73,8 @@ namespace Microsoft.DotNet.Cli.Build
Directory.Delete(targetDir, true);
}
+ dataToHash += SDKVersion;
+
Log.LogMessage($"NuGet Packages Archive Data To Hash: '{dataToHash}'");
var sha256 = SHA256.Create();
diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/LocalizableStrings.cs b/src/Microsoft.DotNet.ProjectJsonMigration/LocalizableStrings.cs
index 1a669e877..fd74494af 100644
--- a/src/Microsoft.DotNet.ProjectJsonMigration/LocalizableStrings.cs
+++ b/src/Microsoft.DotNet.ProjectJsonMigration/LocalizableStrings.cs
@@ -71,6 +71,8 @@ namespace Microsoft.DotNet.ProjectJsonMigration
public const string IncludesNotEquivalent = "{0}.{1} includes not equivalent.";
+ public const string UpdatesNotEquivalent = "{0}.{1} updates not equivalent.";
+
public const string ExcludesNotEquivalent = "{0}.{1} excludes not equivalent.";
public const string RemovesNotEquivalent = "{0}.{1} removes not equivalent.";
@@ -109,6 +111,8 @@ namespace Microsoft.DotNet.ProjectJsonMigration
public const string ItemTransformApplicatorEncompassedIncludes = "{0}: encompassed includes {1}";
+ public const string ItemTransformApplicatorEncompassedUpdates = "{0}: encompassed updates {1}";
+
public const string ItemTransformApplicatorRemovingItem = "{0}: Removing Item {{ ItemType: {1}, Condition: {2}, Include: {3}, Exclude: {4} }}";
public const string ItemTransformApplicatorIgnoringItem = "{0}: Ignoring Item {{ ItemType: {1}, Condition: {2}, Include: {3}, Exclude: {4} }}";
diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/MSBuildExtensions.cs b/src/Microsoft.DotNet.ProjectJsonMigration/MSBuildExtensions.cs
index d1f6ada9f..adf5cc643 100644
--- a/src/Microsoft.DotNet.ProjectJsonMigration/MSBuildExtensions.cs
+++ b/src/Microsoft.DotNet.ProjectJsonMigration/MSBuildExtensions.cs
@@ -14,7 +14,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration
public static IEnumerable GetEncompassedIncludes(this ProjectItemElement item,
ProjectItemElement otherItem, TextWriter trace = null)
{
- if (otherItem.IsEquivalentToExceptIncludeAndExclude(item, trace) &&
+ if (otherItem.IsEquivalentToExceptIncludeUpdateAndExclude(item, trace) &&
new HashSet(otherItem.Excludes()).IsSubsetOf(new HashSet(item.Excludes())))
{
return otherItem.IntersectIncludes(item);
@@ -23,6 +23,18 @@ namespace Microsoft.DotNet.ProjectJsonMigration
return Enumerable.Empty();
}
+ public static IEnumerable GetEncompassedUpdates(this ProjectItemElement item,
+ ProjectItemElement otherItem, TextWriter trace = null)
+ {
+ if (otherItem.IsEquivalentToExceptIncludeUpdateAndExclude(item, trace) &&
+ new HashSet(otherItem.Excludes()).IsSubsetOf(new HashSet(item.Excludes())))
+ {
+ return otherItem.IntersectUpdates(item);
+ }
+
+ return Enumerable.Empty();
+ }
+
public static bool IsEquivalentTo(this ProjectItemElement item, ProjectItemElement otherItem, TextWriter trace = null)
{
// Different includes
@@ -32,6 +44,12 @@ namespace Microsoft.DotNet.ProjectJsonMigration
return false;
}
+ if (item.IntersectUpdates(otherItem).Count() != item.Updates().Count())
+ {
+ trace?.WriteLine(String.Format(LocalizableStrings.UpdatesNotEquivalent, nameof(MSBuildExtensions), nameof(IsEquivalentTo)));
+ return false;
+ }
+
// Different Excludes
if (item.IntersectExcludes(otherItem).Count() != item.Excludes().Count())
{
@@ -39,10 +57,10 @@ namespace Microsoft.DotNet.ProjectJsonMigration
return false;
}
- return item.IsEquivalentToExceptIncludeAndExclude(otherItem, trace);
+ return item.IsEquivalentToExceptIncludeUpdateAndExclude(otherItem, trace);
}
- public static bool IsEquivalentToExceptIncludeAndExclude(this ProjectItemElement item, ProjectItemElement otherItem, TextWriter trace = null)
+ public static bool IsEquivalentToExceptIncludeUpdateAndExclude(this ProjectItemElement item, ProjectItemElement otherItem, TextWriter trace = null)
{
// Different remove
if (item.Remove != otherItem.Remove)
@@ -119,6 +137,12 @@ namespace Microsoft.DotNet.ProjectJsonMigration
return SplitSemicolonDelimitedValues(item.Include);
}
+ public static IEnumerable Updates(
+ this ProjectItemElement item)
+ {
+ return SplitSemicolonDelimitedValues(item.Update);
+ }
+
public static IEnumerable Excludes(
this ProjectItemElement item)
{
@@ -141,6 +165,11 @@ namespace Microsoft.DotNet.ProjectJsonMigration
return item.Includes().Intersect(otherItem.Includes());
}
+ public static IEnumerable IntersectUpdates(this ProjectItemElement item, ProjectItemElement otherItem)
+ {
+ return item.Updates().Intersect(otherItem.Updates());
+ }
+
public static IEnumerable IntersectExcludes(this ProjectItemElement item, ProjectItemElement otherItem)
{
return item.Excludes().Intersect(otherItem.Excludes());
@@ -151,6 +180,11 @@ namespace Microsoft.DotNet.ProjectJsonMigration
item.Include = string.Join(";", item.Includes().Except(includesToRemove));
}
+ public static void RemoveUpdates(this ProjectItemElement item, IEnumerable updatesToRemove)
+ {
+ item.Update = string.Join(";", item.Updates().Except(updatesToRemove));
+ }
+
public static void UnionIncludes(this ProjectItemElement item, IEnumerable includesToAdd)
{
item.Include = string.Join(";", item.Includes().Union(includesToAdd));
diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Microsoft.DotNet.Internal.ProjectModel/Files/ExcludeContext.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Microsoft.DotNet.Internal.ProjectModel/Files/ExcludeContext.cs
new file mode 100644
index 000000000..4c6e0281c
--- /dev/null
+++ b/src/Microsoft.DotNet.ProjectJsonMigration/Microsoft.DotNet.Internal.ProjectModel/Files/ExcludeContext.cs
@@ -0,0 +1,54 @@
+// 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 System.IO;
+using System.Linq;
+using Newtonsoft.Json.Linq;
+
+namespace Microsoft.DotNet.Internal.ProjectModel.Files
+{
+ // Similar to IncludeContext, except that it replaces the include information with the exclude information and clears
+ // out the exclude information. This is to be used by migration to do CopyToOutput with Never set as its metadata.
+ internal class ExcludeContext : IncludeContext
+ {
+ public ExcludeContext(
+ string sourceBasePath,
+ string option,
+ JObject rawObject,
+ string[] defaultBuiltInInclude,
+ string[] defaultBuiltInExclude) : base(
+ sourceBasePath,
+ option,
+ rawObject,
+ defaultBuiltInInclude,
+ defaultBuiltInExclude)
+ {
+ IncludePatterns = ExcludePatterns;
+ ExcludePatterns = new List();
+
+ IncludeFiles = ExcludeFiles;
+ ExcludeFiles = new List();
+
+ BuiltInsInclude = BuiltInsExclude;
+ BuiltInsExclude = new List();
+
+ if (Mappings != null)
+ {
+ var newMappings = new Dictionary();
+ foreach (var mapping in Mappings)
+ {
+ newMappings.Add(mapping.Key, new ExcludeContext(
+ mapping.Value.SourceBasePath,
+ mapping.Value.Option,
+ mapping.Value.RawObject,
+ mapping.Value.BuiltInsInclude?.ToArray(),
+ mapping.Value.BuiltInsExclude?.ToArray()));
+ }
+
+ Mappings = newMappings;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Microsoft.DotNet.Internal.ProjectModel/Files/IncludeContext.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Microsoft.DotNet.Internal.ProjectModel/Files/IncludeContext.cs
index 7dbf25099..cad094fe1 100644
--- a/src/Microsoft.DotNet.ProjectJsonMigration/Microsoft.DotNet.Internal.ProjectModel/Files/IncludeContext.cs
+++ b/src/Microsoft.DotNet.ProjectJsonMigration/Microsoft.DotNet.Internal.ProjectModel/Files/IncludeContext.cs
@@ -39,6 +39,7 @@ namespace Microsoft.DotNet.Internal.ProjectModel.Files
CustomRemovePatterns = new List();
SourceBasePath = sourceBasePath;
Option = option;
+ RawObject = rawObject;
var token = rawObject.Value(option);
if (token == null)
@@ -117,19 +118,21 @@ namespace Microsoft.DotNet.Internal.ProjectModel.Files
public List CustomRemovePatterns { get; }
- public List IncludePatterns { get; }
+ public List IncludePatterns { get; protected set; }
- public List ExcludePatterns { get; }
+ public List ExcludePatterns { get; protected set; }
- public List IncludeFiles { get; }
+ public List IncludeFiles { get; protected set; }
- public List ExcludeFiles { get; }
+ public List ExcludeFiles { get; protected set; }
- public List BuiltInsInclude { get; }
+ public List BuiltInsInclude { get; protected set; }
- public List BuiltInsExclude { get; }
+ public List BuiltInsExclude { get; protected set; }
- public IDictionary Mappings { get; }
+ public IDictionary Mappings { get; protected set; }
+
+ public JObject RawObject { get; }
public override bool Equals(object obj)
{
diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/ItemsIncludedInTheWebSDK.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/ItemsIncludedInTheWebSDK.cs
new file mode 100644
index 000000000..f0cf1f25c
--- /dev/null
+++ b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/ItemsIncludedInTheWebSDK.cs
@@ -0,0 +1,17 @@
+// 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.
+
+namespace Microsoft.DotNet.ProjectJsonMigration.Rules
+{
+ internal class ItemsIncludedInTheWebSDK
+ {
+ public static bool HasContent(string content)
+ {
+ return content.Equals("wwwroot") ||
+ content.Contains("web.config") ||
+ content.Equals("**/*.cshtml") ||
+ content.Equals(@"**\*.cshtml") ||
+ content.Contains(".json");
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigrateBuildOptionsRule.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigrateBuildOptionsRule.cs
index daa54aaf8..5139082e6 100644
--- a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigrateBuildOptionsRule.cs
+++ b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigrateBuildOptionsRule.cs
@@ -147,11 +147,18 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
new RemoveContextTransform("EmbeddedResource", condition: ic => ic != null);
private IncludeContextTransform CopyToOutputFilesTransform =>
- new IncludeContextTransform("Content", transformMappings: true)
+ new UpdateContextTransform("None", transformMappings: true)
.WithMetadata("CopyToOutputDirectory", "PreserveNewest");
+ private IncludeContextTransform DoNotCopyToOutputFilesTransform =>
+ new UpdateContextTransform("None", transformMappings: true)
+ .WithMetadata("CopyToOutputDirectory", "Never");
+
private IncludeContextTransform CopyToOutputFilesTransformForWeb =>
- new UpdateContextTransform("Content", transformMappings: true)
+ new UpdateContextTransform(
+ "None",
+ transformMappings: true,
+ excludePatternsRule: pattern => ItemsIncludedInTheWebSDK.HasContent(pattern))
.WithMetadata("CopyToOutputDirectory", "PreserveNewest");
private AddPropertyTransform GenerateRuntimeConfigurationFilesTransform =>
@@ -194,6 +201,12 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
return copyToOutputFilesTransform.Transform(GetCopyToOutputIncludeContext(compilerOptions, projectDirectory));
};
+ private Func> DoNotCopyToOutputFilesTransformExecute =>
+ (compilerOptions, projectDirectory, projectType) =>
+ {
+ return DoNotCopyToOutputFilesTransform.Transform(GetDoNotCopyToOutputIncludeContext(compilerOptions, projectDirectory));
+ };
+
private readonly string[] DefaultEmptyExcludeOption = new string[0];
private readonly ProjectPropertyGroupElement _configurationPropertyGroup;
@@ -265,7 +278,8 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
{
CompileFilesTransformExecute,
EmbedFilesTransformExecute,
- CopyToOutputFilesTransformExecute
+ CopyToOutputFilesTransformExecute,
+ DoNotCopyToOutputFilesTransformExecute
};
}
@@ -528,6 +542,28 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
null);
}
+ private IncludeContext GetDoNotCopyToOutputIncludeContext(CommonCompilerOptions compilerOptions, string projectDirectory)
+ {
+ // Defaults from src/Microsoft.DotNet.ProjectModel/ProjectReader.cs #608
+ var copyToOutputIncludeContext = compilerOptions.CopyToOutputInclude ??
+ new IncludeContext(
+ projectDirectory,
+ "copyToOutput",
+ new JObject(),
+ null,
+ null);
+
+ var doNotCopyToOutputIncludeContext =
+ new ExcludeContext(
+ copyToOutputIncludeContext.SourceBasePath,
+ copyToOutputIncludeContext.Option,
+ copyToOutputIncludeContext.RawObject,
+ copyToOutputIncludeContext.BuiltInsInclude?.ToArray(),
+ copyToOutputIncludeContext.BuiltInsExclude?.ToArray());
+
+ return doNotCopyToOutputIncludeContext;
+ }
+
private string FormatLanguageVersion(string langVersion)
{
if (langVersion.StartsWith("csharp", StringComparison.OrdinalIgnoreCase))
diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackOptionsRule.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackOptionsRule.cs
index 570e8e648..08ce03541 100644
--- a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackOptionsRule.cs
+++ b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackOptionsRule.cs
@@ -57,10 +57,17 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
packOptions => !string.IsNullOrEmpty(packOptions.RepositoryUrl));
private IncludeContextTransform PackFilesTransform =>
- new IncludeContextTransform("Content", transformMappings: true)
+ new UpdateContextTransform("None", transformMappings: true)
.WithMetadata("Pack", "true")
.WithMappingsToTransform(_mappingsToTransfrom);
+ private IncludeContextTransform DoNotPackFilesTransform =>
+ new UpdateContextTransform(
+ "None",
+ transformMappings: true,
+ excludePatternsRule: pattern => ProjectFilesCollection.DefaultBuiltInExcludePatterns.Contains(pattern))
+ .WithMetadata("Pack", "false");
+
private Func, string, AddItemTransform> _mappingsToTransfrom =>
(addItemTransform, targetPath) =>
{
@@ -115,7 +122,28 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
private void TransformPackFiles(PackOptions packOptions, ProjectItemGroupElement itemGroup)
{
- var transformResult = PackFilesTransform.Transform(packOptions.PackInclude);
+ ExecuteTransformation(PackFilesTransform, packOptions.PackInclude, itemGroup);
+
+ if (packOptions.PackInclude != null)
+ {
+ ExecuteTransformation(
+ DoNotPackFilesTransform,
+ new ExcludeContext(
+ packOptions.PackInclude.SourceBasePath,
+ packOptions.PackInclude.Option,
+ packOptions.PackInclude.RawObject,
+ packOptions.PackInclude.BuiltInsInclude?.ToArray(),
+ packOptions.PackInclude.BuiltInsExclude?.ToArray()),
+ itemGroup);
+ }
+ }
+
+ private void ExecuteTransformation(
+ IncludeContextTransform transform,
+ IncludeContext includeContext,
+ ProjectItemGroupElement itemGroup)
+ {
+ var transformResult = transform.Transform(includeContext);
if (transformResult != null && transformResult.Any())
{
diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePublishOptionsRule.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePublishOptionsRule.cs
index 30d1bcfdf..fe35c1397 100644
--- a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePublishOptionsRule.cs
+++ b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePublishOptionsRule.cs
@@ -1,7 +1,10 @@
// 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.Collections.Generic;
using System.Linq;
+using Microsoft.Build.Construction;
+using Microsoft.DotNet.Internal.ProjectModel.Files;
using Microsoft.DotNet.ProjectJsonMigration.Transforms;
namespace Microsoft.DotNet.ProjectJsonMigration.Rules
@@ -28,7 +31,31 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
CopyToPublishDirectoryTransformForWeb :
CopyToPublishDirectoryTransform;
- var transformResult = copyToPublishDirectoryTransform.Transform(projectContext.ProjectFile.PublishOptions);
+ ExecuteTransformation(
+ copyToPublishDirectoryTransform,
+ projectContext.ProjectFile.PublishOptions,
+ migrationRuleInputs);
+
+ if (projectContext.ProjectFile.PublishOptions != null)
+ {
+ ExecuteTransformation(
+ DoNotCopyToPublishDirectoryTransform,
+ new ExcludeContext(
+ projectContext.ProjectFile.PublishOptions.SourceBasePath,
+ projectContext.ProjectFile.PublishOptions.Option,
+ projectContext.ProjectFile.PublishOptions.RawObject,
+ projectContext.ProjectFile.PublishOptions.BuiltInsInclude?.ToArray(),
+ projectContext.ProjectFile.PublishOptions.BuiltInsExclude?.ToArray()),
+ migrationRuleInputs);
+ }
+ }
+
+ private void ExecuteTransformation(
+ IncludeContextTransform transform,
+ IncludeContext includeContext,
+ MigrationRuleInputs migrationRuleInputs)
+ {
+ var transformResult = transform.Transform(includeContext);
if (transformResult != null && transformResult.Any())
{
@@ -41,11 +68,18 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
}
private IncludeContextTransform CopyToPublishDirectoryTransform =>
- new IncludeContextTransform("Content", transformMappings: true)
+ new UpdateContextTransform("None", transformMappings: true)
.WithMetadata("CopyToPublishDirectory", "PreserveNewest");
+ private IncludeContextTransform DoNotCopyToPublishDirectoryTransform =>
+ new UpdateContextTransform("None", transformMappings: true)
+ .WithMetadata("CopyToPublishDirectory", "Never");
+
private IncludeContextTransform CopyToPublishDirectoryTransformForWeb =>
- new UpdateContextTransform("Content", transformMappings: true)
+ new UpdateContextTransform(
+ "None",
+ transformMappings: true,
+ excludePatternsRule: pattern => ItemsIncludedInTheWebSDK.HasContent(pattern))
.WithMetadata("CopyToPublishDirectory", "PreserveNewest");
}
}
diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Transforms/ItemTransformApplicator.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Transforms/ItemTransformApplicator.cs
index 97ad35d69..828e6ab94 100644
--- a/src/Microsoft.DotNet.ProjectJsonMigration/Transforms/ItemTransformApplicator.cs
+++ b/src/Microsoft.DotNet.ProjectJsonMigration/Transforms/ItemTransformApplicator.cs
@@ -19,12 +19,18 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
{
if (typeof(T) != typeof(ProjectItemElement))
{
- throw new ArgumentException(String.Format(LocalizableStrings.ExpectedElementToBeOfTypeNotTypeError, nameof(ProjectItemElement), typeof(T)));
+ throw new ArgumentException(String.Format(
+ LocalizableStrings.ExpectedElementToBeOfTypeNotTypeError,
+ nameof(ProjectItemElement),
+ typeof(T)));
}
if (typeof(U) != typeof(ProjectItemGroupElement))
{
- throw new ArgumentException(String.Format(LocalizableStrings.ExpectedElementToBeOfTypeNotTypeError, nameof(ProjectItemGroupElement), typeof(U)));
+ throw new ArgumentException(String.Format(
+ LocalizableStrings.ExpectedElementToBeOfTypeNotTypeError,
+ nameof(ProjectItemGroupElement),
+ typeof(U)));
}
if (element == null)
@@ -40,8 +46,18 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
var item = element as ProjectItemElement;
var destinationItemGroup = destinationElement as ProjectItemGroupElement;
- MigrationTrace.Instance.WriteLine(String.Format(LocalizableStrings.ItemTransformApplicatorHeader, nameof(ItemTransformApplicator), item.ItemType, item.Condition, item.Include, item.Exclude, item.Update));
- MigrationTrace.Instance.WriteLine(String.Format(LocalizableStrings.ItemTransformApplicatorItemGroup, nameof(ItemTransformApplicator), destinationItemGroup.Condition));
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformApplicatorHeader,
+ nameof(ItemTransformApplicator),
+ item.ItemType,
+ item.Condition,
+ item.Include,
+ item.Exclude,
+ item.Update));
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformApplicatorItemGroup,
+ nameof(ItemTransformApplicator),
+ destinationItemGroup.Condition));
if (mergeExisting)
{
@@ -49,7 +65,9 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
item = MergeWithExistingItemsWithSameCondition(item, destinationItemGroup);
if (item == null)
{
- MigrationTrace.Instance.WriteLine(String.Format(LocalizableStrings.ItemTransformAppliatorItemCompletelyMerged, nameof(ItemTransformApplicator)));
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformAppliatorItemCompletelyMerged,
+ nameof(ItemTransformApplicator)));
return;
}
@@ -57,14 +75,18 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
item = MergeWithExistingItemsWithNoCondition(item, destinationItemGroup);
if (item == null)
{
- MigrationTrace.Instance.WriteLine(String.Format(LocalizableStrings.ItemTransformAppliatorItemCompletelyMerged, nameof(ItemTransformApplicator)));
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformAppliatorItemCompletelyMerged,
+ nameof(ItemTransformApplicator)));
return;
}
item = MergeWithExistingItemsWithACondition(item, destinationItemGroup);
if (item == null)
{
- MigrationTrace.Instance.WriteLine(String.Format(LocalizableStrings.ItemTransformAppliatorItemCompletelyMerged, nameof(ItemTransformApplicator)));
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformAppliatorItemCompletelyMerged,
+ nameof(ItemTransformApplicator)));
return;
}
}
@@ -88,13 +110,22 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
var outputItem = itemGroup.ContainingProject.CreateItemElement("___TEMP___");
outputItem.CopyFrom(item);
- MigrationTrace.Instance.WriteLine(String.Format(LocalizableStrings.ItemTransformApplicatorAddItemHeader, nameof(ItemTransformApplicator), outputItem.ItemType, outputItem.Condition, outputItem.Include, outputItem.Exclude, outputItem.Update));
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformApplicatorAddItemHeader,
+ nameof(ItemTransformApplicator),
+ outputItem.ItemType,
+ outputItem.Condition,
+ outputItem.Include,
+ outputItem.Exclude,
+ outputItem.Update));
itemGroup.AppendChild(outputItem);
outputItem.AddMetadata(item.Metadata, MigrationTrace.Instance);
}
- private ProjectItemElement MergeWithExistingItemsWithACondition(ProjectItemElement item, ProjectItemGroupElement destinationItemGroup)
+ private ProjectItemElement MergeWithExistingItemsWithACondition(
+ ProjectItemElement item,
+ ProjectItemGroupElement destinationItemGroup)
{
// This logic only applies to conditionless items
if (item.ConditionChain().Any() || destinationItemGroup.ConditionChain().Any())
@@ -105,63 +136,156 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
var existingItemsWithACondition =
FindExistingItemsWithACondition(item, destinationItemGroup.ContainingProject, destinationItemGroup);
- MigrationTrace.Instance.WriteLine(String.Format(LocalizableStrings.ItemTransformApplicatorMergingItemWithExistingItems, nameof(ItemTransformApplicator), existingItemsWithACondition.Count()));
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformApplicatorMergingItemWithExistingItems,
+ nameof(ItemTransformApplicator),
+ existingItemsWithACondition.Count()));
foreach (var existingItem in existingItemsWithACondition)
{
- // If this item is encompassing items in a condition, remove the encompassed includes from the existing item
- var encompassedIncludes = item.GetEncompassedIncludes(existingItem, MigrationTrace.Instance);
- if (encompassedIncludes.Any())
+ if (!string.IsNullOrEmpty(item.Include))
{
- MigrationTrace.Instance.WriteLine(String.Format(LocalizableStrings.ItemTransformApplicatorEncompassedIncludes, nameof(ItemTransformApplicator), string.Join(", ", encompassedIncludes)));
- existingItem.RemoveIncludes(encompassedIncludes);
+ MergeOnIncludesWithExistingItemsWithACondition(item, existingItem, destinationItemGroup);
}
- // continue if the existing item is now empty
- if (!existingItem.Includes().Any())
+ if (!string.IsNullOrEmpty(item.Update))
{
- MigrationTrace.Instance.WriteLine(String.Format(LocalizableStrings.ItemTransformApplicatorRemovingItem, nameof(ItemTransformApplicator), existingItem.ItemType, existingItem.Condition, existingItem.Include, existingItem.Exclude));
- existingItem.Parent.RemoveChild(existingItem);
- continue;
- }
-
- // If we haven't continued, the existing item may have includes
- // that need to be removed before being redefined, to avoid duplicate includes
- // Create or merge with existing remove
- var remainingIntersectedIncludes = existingItem.IntersectIncludes(item);
-
- if (remainingIntersectedIncludes.Any())
- {
- var existingRemoveItem = destinationItemGroup.Items
- .Where(i =>
- string.IsNullOrEmpty(i.Include)
- && string.IsNullOrEmpty(i.Exclude)
- && !string.IsNullOrEmpty(i.Remove))
- .FirstOrDefault();
-
- if (existingRemoveItem != null)
- {
- var removes = new HashSet(existingRemoveItem.Remove.Split(';'));
- foreach (var include in remainingIntersectedIncludes)
- {
- removes.Add(include);
- }
- existingRemoveItem.Remove = string.Join(";", removes);
- }
- else
- {
- var clearPreviousItem = _projectElementGenerator.CreateItemElement(item.ItemType);
- clearPreviousItem.Remove = string.Join(";", remainingIntersectedIncludes);
-
- AddItemToItemGroup(clearPreviousItem, existingItem.Parent as ProjectItemGroupElement);
- }
+ MergeOnUpdatesWithExistingItemsWithACondition(item, existingItem, destinationItemGroup);
}
}
return item;
}
- private ProjectItemElement MergeWithExistingItemsWithNoCondition(ProjectItemElement item, ProjectItemGroupElement destinationItemGroup)
+ private void MergeOnIncludesWithExistingItemsWithACondition(
+ ProjectItemElement item,
+ ProjectItemElement existingItem,
+ ProjectItemGroupElement destinationItemGroup)
+ {
+ // If this item is encompassing items in a condition, remove the encompassed includes from the existing item
+ var encompassedIncludes = item.GetEncompassedIncludes(existingItem, MigrationTrace.Instance);
+ if (encompassedIncludes.Any())
+ {
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformApplicatorEncompassedIncludes,
+ nameof(ItemTransformApplicator),
+ string.Join(", ", encompassedIncludes)));
+ existingItem.RemoveIncludes(encompassedIncludes);
+ }
+
+ // continue if the existing item is now empty
+ if (!existingItem.Includes().Any())
+ {
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformApplicatorRemovingItem,
+ nameof(ItemTransformApplicator),
+ existingItem.ItemType,
+ existingItem.Condition,
+ existingItem.Include,
+ existingItem.Exclude));
+ existingItem.Parent.RemoveChild(existingItem);
+ return;
+ }
+
+ // If we haven't continued, the existing item may have includes
+ // that need to be removed before being redefined, to avoid duplicate includes
+ // Create or merge with existing remove
+ var remainingIntersectedIncludes = existingItem.IntersectIncludes(item);
+
+ if (remainingIntersectedIncludes.Any())
+ {
+ var existingRemoveItem = destinationItemGroup.Items
+ .Where(i =>
+ string.IsNullOrEmpty(i.Include)
+ && string.IsNullOrEmpty(i.Exclude)
+ && !string.IsNullOrEmpty(i.Remove))
+ .FirstOrDefault();
+
+ if (existingRemoveItem != null)
+ {
+ var removes = new HashSet(existingRemoveItem.Remove.Split(';'));
+ foreach (var include in remainingIntersectedIncludes)
+ {
+ removes.Add(include);
+ }
+ existingRemoveItem.Remove = string.Join(";", removes);
+ }
+ else
+ {
+ var clearPreviousItem = _projectElementGenerator.CreateItemElement(item.ItemType);
+ clearPreviousItem.Remove = string.Join(";", remainingIntersectedIncludes);
+
+ AddItemToItemGroup(clearPreviousItem, existingItem.Parent as ProjectItemGroupElement);
+ }
+ }
+ }
+
+ private void MergeOnUpdatesWithExistingItemsWithACondition(
+ ProjectItemElement item,
+ ProjectItemElement existingItem,
+ ProjectItemGroupElement destinationItemGroup)
+ {
+ // If this item is encompassing items in a condition, remove the encompassed updates from the existing item
+ var encompassedUpdates = item.GetEncompassedUpdates(existingItem, MigrationTrace.Instance);
+ if (encompassedUpdates.Any())
+ {
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformApplicatorEncompassedUpdates,
+ nameof(ItemTransformApplicator),
+ string.Join(", ", encompassedUpdates)));
+ existingItem.RemoveUpdates(encompassedUpdates);
+ }
+
+ // continue if the existing item is now empty
+ if (!existingItem.Updates().Any())
+ {
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformApplicatorRemovingItem,
+ nameof(ItemTransformApplicator),
+ existingItem.ItemType,
+ existingItem.Condition,
+ existingItem.Update,
+ existingItem.Exclude));
+ existingItem.Parent.RemoveChild(existingItem);
+ return;
+ }
+
+ // If we haven't continued, the existing item may have updates
+ // that need to be removed before being redefined, to avoid duplicate updates
+ // Create or merge with existing remove
+ var remainingIntersectedUpdates = existingItem.IntersectUpdates(item);
+
+ if (remainingIntersectedUpdates.Any())
+ {
+ var existingRemoveItem = destinationItemGroup.Items
+ .Where(i =>
+ string.IsNullOrEmpty(i.Update)
+ && string.IsNullOrEmpty(i.Exclude)
+ && !string.IsNullOrEmpty(i.Remove))
+ .FirstOrDefault();
+
+ if (existingRemoveItem != null)
+ {
+ var removes = new HashSet(existingRemoveItem.Remove.Split(';'));
+ foreach (var update in remainingIntersectedUpdates)
+ {
+ removes.Add(update);
+ }
+ existingRemoveItem.Remove = string.Join(";", removes);
+ }
+ else
+ {
+ var clearPreviousItem = _projectElementGenerator.CreateItemElement(item.ItemType);
+ clearPreviousItem.Remove = string.Join(";", remainingIntersectedUpdates);
+
+ AddItemToItemGroup(clearPreviousItem, existingItem.Parent as ProjectItemGroupElement);
+ }
+ }
+ }
+
+ private ProjectItemElement MergeWithExistingItemsWithNoCondition(
+ ProjectItemElement item,
+ ProjectItemGroupElement destinationItemGroup)
{
// This logic only applies to items being placed into a condition
if (!item.ConditionChain().Any() && !destinationItemGroup.ConditionChain().Any())
@@ -172,22 +296,67 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
var existingItemsWithNoCondition =
FindExistingItemsWithNoCondition(item, destinationItemGroup.ContainingProject, destinationItemGroup);
- MigrationTrace.Instance.WriteLine(String.Format(LocalizableStrings.ItemTransformApplicatorMergingItemWithExistingItems, nameof(ItemTransformApplicator), existingItemsWithNoCondition.Count()));
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformApplicatorMergingItemWithExistingItems,
+ nameof(ItemTransformApplicator),
+ existingItemsWithNoCondition.Count()));
- // Handle the item being placed inside of a condition, when it is overlapping with a conditionless item
- // If it is not definining new metadata or excludes, the conditioned item can be merged with the
- // conditionless item
- foreach (var existingItem in existingItemsWithNoCondition)
+ if (!string.IsNullOrEmpty(item.Include))
{
- var encompassedIncludes = existingItem.GetEncompassedIncludes(item, MigrationTrace.Instance);
- if (encompassedIncludes.Any())
+ // Handle the item being placed inside of a condition, when it is overlapping with a conditionless item
+ // If it is not definining new metadata or excludes, the conditioned item can be merged with the
+ // conditionless item
+ foreach (var existingItem in existingItemsWithNoCondition)
{
- MigrationTrace.Instance.WriteLine(String.Format(LocalizableStrings.ItemTransformApplicatorEncompassedIncludes, nameof(ItemTransformApplicator), string.Join(", ", encompassedIncludes)));
- item.RemoveIncludes(encompassedIncludes);
- if (!item.Includes().Any())
+ var encompassedIncludes = existingItem.GetEncompassedIncludes(item, MigrationTrace.Instance);
+ if (encompassedIncludes.Any())
{
- MigrationTrace.Instance.WriteLine(String.Format(LocalizableStrings.ItemTransformApplicatorIgnoringItem, nameof(ItemTransformApplicator), existingItem.ItemType, existingItem.Condition, existingItem.Include, existingItem.Exclude));
- return null;
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformApplicatorEncompassedIncludes,
+ nameof(ItemTransformApplicator),
+ string.Join(", ", encompassedIncludes)));
+ item.RemoveIncludes(encompassedIncludes);
+ if (!item.Includes().Any())
+ {
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformApplicatorIgnoringItem,
+ nameof(ItemTransformApplicator),
+ existingItem.ItemType,
+ existingItem.Condition,
+ existingItem.Include,
+ existingItem.Exclude));
+ return null;
+ }
+ }
+ }
+ }
+
+ if (!string.IsNullOrEmpty(item.Update))
+ {
+ // Handle the item being placed inside of a condition, when it is overlapping with a conditionless item
+ // If it is not definining new metadata or excludes, the conditioned item can be merged with the
+ // conditionless item
+ foreach (var existingItem in existingItemsWithNoCondition)
+ {
+ var encompassedUpdates = existingItem.GetEncompassedUpdates(item, MigrationTrace.Instance);
+ if (encompassedUpdates.Any())
+ {
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformApplicatorEncompassedUpdates,
+ nameof(ItemTransformApplicator),
+ string.Join(", ", encompassedUpdates)));
+ item.RemoveUpdates(encompassedUpdates);
+ if (!item.Updates().Any())
+ {
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformApplicatorIgnoringItem,
+ nameof(ItemTransformApplicator),
+ existingItem.ItemType,
+ existingItem.Condition,
+ existingItem.Update,
+ existingItem.Exclude));
+ return null;
+ }
}
}
}
@@ -200,18 +369,20 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
var existingRemoveItem = destinationItemGroup.Items
.Where(i =>
string.IsNullOrEmpty(i.Include)
+ && string.IsNullOrEmpty(i.Update)
&& string.IsNullOrEmpty(i.Exclude)
&& !string.IsNullOrEmpty(i.Remove))
.FirstOrDefault();
+ var itemsToRemove = string.IsNullOrEmpty(item.Include) ? item.Update : item.Include;
if (existingRemoveItem != null)
{
- existingRemoveItem.Remove += ";" + item.Include;
+ existingRemoveItem.Remove += ";" + itemsToRemove;
}
else
{
var clearPreviousItem = _projectElementGenerator.CreateItemElement(item.ItemType);
- clearPreviousItem.Remove = item.Include;
+ clearPreviousItem.Remove = itemsToRemove;
AddItemToItemGroup(clearPreviousItem, destinationItemGroup);
}
@@ -220,12 +391,19 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
return item;
}
- private ProjectItemElement MergeWithExistingItemsWithSameCondition(ProjectItemElement item, ProjectItemGroupElement destinationItemGroup)
+ private ProjectItemElement MergeWithExistingItemsWithSameCondition(
+ ProjectItemElement item,
+ ProjectItemGroupElement destinationItemGroup)
{
- var existingItemsWithSameCondition =
- FindExistingItemsWithSameCondition(item, destinationItemGroup.ContainingProject, destinationItemGroup);
+ var existingItemsWithSameCondition = FindExistingItemsWithSameCondition(
+ item,
+ destinationItemGroup.ContainingProject,
+ destinationItemGroup);
- MigrationTrace.Instance.WriteLine(String.Format(LocalizableStrings.ItemTransformApplicatorMergingItemWithExistingItemsSameChain, nameof(TransformApplicator), existingItemsWithSameCondition.Count()));
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformApplicatorMergingItemWithExistingItemsSameChain,
+ nameof(TransformApplicator),
+ existingItemsWithSameCondition.Count()));
foreach (var existingItem in existingItemsWithSameCondition)
{
@@ -238,7 +416,8 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
existingItem.Parent.RemoveChild(existingItem);
}
- MigrationTrace.Instance.WriteLine(String.Format(LocalizableStrings.ItemTransformApplicatorAddingMergedItem,
+ MigrationTrace.Instance.WriteLine(String.Format(
+ LocalizableStrings.ItemTransformApplicatorAddingMergedItem,
nameof(TransformApplicator),
mergeResult.MergedItem.ItemType,
mergeResult.MergedItem.Condition,
@@ -250,6 +429,21 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
return item;
}
+ private MergeResult MergeItems(ProjectItemElement item, ProjectItemElement existingItem)
+ {
+ if (!string.IsNullOrEmpty(item.Include))
+ {
+ return MergeItemsOnIncludes(item, existingItem);
+ }
+
+ if (!string.IsNullOrEmpty(item.Update))
+ {
+ return MergeItemsOnUpdates(item, existingItem);
+ }
+
+ throw new InvalidOperationException(LocalizableStrings.CannotMergeItemsWithoutCommonIncludeError);
+ }
+
///
/// Merges two items on their common sets of includes.
/// The output is 3 items, the 2 input items and the merged items. If the common
@@ -262,18 +456,13 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
///
/// This function will mutate the Include property of the 2 input items, removing the common subset.
///
- private MergeResult MergeItems(ProjectItemElement item, ProjectItemElement existingItem)
+ private MergeResult MergeItemsOnIncludes(ProjectItemElement item, ProjectItemElement existingItem)
{
if (!string.Equals(item.ItemType, existingItem.ItemType, StringComparison.Ordinal))
{
throw new InvalidOperationException(LocalizableStrings.CannotMergeItemsOfDifferentTypesError);
}
- if (!item.IntersectIncludes(existingItem).Any())
- {
- throw new InvalidOperationException(LocalizableStrings.CannotMergeItemsWithoutCommonIncludeError);
- }
-
var commonIncludes = item.IntersectIncludes(existingItem).ToList();
var mergedItem = _projectElementGenerator.AddItem(item.ItemType, string.Join(";", commonIncludes));
@@ -295,11 +484,41 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
return mergeResult;
}
+ private MergeResult MergeItemsOnUpdates(ProjectItemElement item, ProjectItemElement existingItem)
+ {
+ if (!string.Equals(item.ItemType, existingItem.ItemType, StringComparison.Ordinal))
+ {
+ throw new InvalidOperationException(LocalizableStrings.CannotMergeItemsOfDifferentTypesError);
+ }
+
+ var commonUpdates = item.IntersectUpdates(existingItem).ToList();
+ var mergedItem = _projectElementGenerator.AddItem(item.ItemType, "placeholder");
+ mergedItem.Include = string.Empty;
+ mergedItem.Update = string.Join(";", commonUpdates);
+
+ mergedItem.UnionExcludes(existingItem.Excludes());
+ mergedItem.UnionExcludes(item.Excludes());
+
+ mergedItem.AddMetadata(MergeMetadata(existingItem.Metadata, item.Metadata), MigrationTrace.Instance);
+
+ item.RemoveUpdates(commonUpdates);
+ existingItem.RemoveUpdates(commonUpdates);
+
+ var mergeResult = new MergeResult
+ {
+ InputItem = string.IsNullOrEmpty(item.Update) ? null : item,
+ ExistingItem = string.IsNullOrEmpty(existingItem.Update) ? null : existingItem,
+ MergedItem = mergedItem
+ };
+
+ return mergeResult;
+ }
+
private ICollection MergeMetadata(
ICollection existingMetadataElements,
ICollection newMetadataElements)
{
- var mergedMetadata = new List(existingMetadataElements);
+ var mergedMetadata = new List(existingMetadataElements.Select(m => (ProjectMetadataElement) m.Clone()));
foreach (var newMetadata in newMetadataElements)
{
@@ -307,11 +526,11 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
m.Name.Equals(newMetadata.Name, StringComparison.OrdinalIgnoreCase));
if (existingMetadata == null)
{
- mergedMetadata.Add(newMetadata);
+ mergedMetadata.Add((ProjectMetadataElement) newMetadata.Clone());
}
else
{
- MergeMetadata(existingMetadata, newMetadata);
+ MergeMetadata(existingMetadata, (ProjectMetadataElement) newMetadata.Clone());
}
}
@@ -322,7 +541,25 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
{
if (existingMetadata.Value != newMetadata.Value)
{
- existingMetadata.Value = string.Join(";", new [] { existingMetadata.Value, newMetadata.Value });
+ if (existingMetadata.Name == "CopyToOutputDirectory" ||
+ existingMetadata.Name == "CopyToPublishDirectory")
+ {
+ existingMetadata.Value =
+ existingMetadata.Value == "Never" || newMetadata.Value == "Never" ?
+ "Never" :
+ "PreserveNewest";
+ }
+ else if (existingMetadata.Name == "Pack")
+ {
+ existingMetadata.Value =
+ existingMetadata.Value == "false" || newMetadata.Value == "false" ?
+ "false" :
+ "true";
+ }
+ else
+ {
+ existingMetadata.Value = string.Join(";", new [] { existingMetadata.Value, newMetadata.Value });
+ }
}
}
@@ -335,7 +572,8 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
.Where(i => i.Condition == item.Condition)
.Where(i => i.Parent.ConditionChainsAreEquivalent(destinationContainer))
.Where(i => i.ItemType == item.ItemType)
- .Where(i => i.IntersectIncludes(item).Any());
+ .Where(i => i.IntersectIncludes(item).Any() ||
+ i.IntersectUpdates(item).Any());
}
private IEnumerable FindExistingItemsWithNoCondition(
@@ -346,7 +584,8 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
return project.Items
.Where(i => !i.ConditionChain().Any())
.Where(i => i.ItemType == item.ItemType)
- .Where(i => i.IntersectIncludes(item).Any());
+ .Where(i => i.IntersectIncludes(item).Any() ||
+ i.IntersectUpdates(item).Any());
}
private IEnumerable FindExistingItemsWithACondition(
@@ -357,7 +596,8 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
return project.Items
.Where(i => i.ConditionChain().Any())
.Where(i => i.ItemType == item.ItemType)
- .Where(i => i.IntersectIncludes(item).Any());
+ .Where(i => i.IntersectIncludes(item).Any() ||
+ i.IntersectUpdates(item).Any());
}
private class MergeResult
diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Transforms/UpdateContextTransform.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Transforms/UpdateContextTransform.cs
index 4e3080f52..68b53707e 100644
--- a/src/Microsoft.DotNet.ProjectJsonMigration/Transforms/UpdateContextTransform.cs
+++ b/src/Microsoft.DotNet.ProjectJsonMigration/Transforms/UpdateContextTransform.cs
@@ -16,10 +16,13 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
itemName,
includeContext => string.Empty,
includeContext => FormatGlobPatternsForMsbuild(includeContext.ExcludeFiles, includeContext.SourceBasePath),
- includeContext => FormatGlobPatternsForMsbuild(includeContext.IncludeFiles, includeContext.SourceBasePath),
+ includeContext => FormatGlobPatternsForMsbuild(
+ includeContext.IncludeFiles.OrEmptyIfNull().Where(
+ pattern => !ExcludePatternRule(pattern)), includeContext.SourceBasePath),
includeContext => includeContext != null
&& includeContext.IncludeFiles != null
- && includeContext.IncludeFiles.Count > 0);
+ && includeContext.IncludeFiles.Where(
+ pattern => !ExcludePatternRule(pattern)).Count() > 0);
protected override Func> IncludeExcludeTransformGetter =>
(itemName) => new AddItemTransform(
@@ -39,24 +42,27 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
.Union(includeContext.BuiltInsInclude.OrEmptyIfNull())
.Union(includeContext.CustomIncludePatterns.OrEmptyIfNull());
- return FormatGlobPatternsForMsbuild(fullIncludeSet, includeContext.SourceBasePath);
+ return FormatGlobPatternsForMsbuild(
+ fullIncludeSet.Where(pattern => !ExcludePatternRule(pattern)),
+ includeContext.SourceBasePath);
},
includeContext =>
{
- return includeContext != null &&
- (
- (includeContext.IncludePatterns != null && includeContext.IncludePatterns.Count > 0)
- ||
- (includeContext.BuiltInsInclude != null && includeContext.BuiltInsInclude.Count > 0)
- ||
- (includeContext.CustomIncludePatterns != null && includeContext.CustomIncludePatterns.Count > 0)
- );
+ return includeContext != null &&includeContext.IncludePatterns.OrEmptyIfNull()
+ .Union(includeContext.BuiltInsInclude.OrEmptyIfNull())
+ .Union(includeContext.CustomIncludePatterns.OrEmptyIfNull())
+ .Where(pattern => !ExcludePatternRule(pattern)).Count() > 0;
});
public UpdateContextTransform(
string itemName,
bool transformMappings = true,
- Func condition = null) : base(itemName, transformMappings, condition)
+ Func condition = null,
+ Func excludePatternsRule = null) : base(
+ itemName,
+ transformMappings,
+ condition,
+ excludePatternsRule: excludePatternsRule)
{
}
}
diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/transforms/IncludeContextTransform.cs b/src/Microsoft.DotNet.ProjectJsonMigration/transforms/IncludeContextTransform.cs
index e8ff641e3..ac91119c9 100644
--- a/src/Microsoft.DotNet.ProjectJsonMigration/transforms/IncludeContextTransform.cs
+++ b/src/Microsoft.DotNet.ProjectJsonMigration/transforms/IncludeContextTransform.cs
@@ -20,12 +20,12 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
new AddItemTransform(
itemName,
includeContext => FormatGlobPatternsForMsbuild(includeContext.IncludeFiles.OrEmptyIfNull()
- .Where((pattern) => !_excludePatternRule(pattern)),
+ .Where((pattern) => !ExcludePatternRule(pattern)),
includeContext.SourceBasePath),
includeContext => FormatGlobPatternsForMsbuild(includeContext.ExcludeFiles, includeContext.SourceBasePath),
includeContext => includeContext != null
&& includeContext.IncludeFiles != null
- && includeContext.IncludeFiles.Where((pattern) => !_excludePatternRule(pattern)).Count() > 0);
+ && includeContext.IncludeFiles.Where((pattern) => !ExcludePatternRule(pattern)).Count() > 0);
protected virtual Func> IncludeExcludeTransformGetter =>
(itemName) => new AddItemTransform(
@@ -39,7 +39,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
fullIncludeSet = fullIncludeSet.Union(includeContext.BuiltInsInclude.OrEmptyIfNull());
}
- fullIncludeSet = fullIncludeSet.Where((pattern) => !_excludePatternRule(pattern));
+ fullIncludeSet = fullIncludeSet.Where((pattern) => !ExcludePatternRule(pattern));
return FormatGlobPatternsForMsbuild(fullIncludeSet, includeContext.SourceBasePath);
},
@@ -55,9 +55,9 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
{
return includeContext != null &&
(
- (includeContext.IncludePatterns != null && includeContext.IncludePatterns.Where((pattern) => !_excludePatternRule(pattern)).Count() > 0)
+ (includeContext.IncludePatterns != null && includeContext.IncludePatterns.Where((pattern) => !ExcludePatternRule(pattern)).Count() > 0)
||
- (includeContext.CustomIncludePatterns != null && includeContext.CustomIncludePatterns.Where((pattern) => !_excludePatternRule(pattern)).Count() > 0)
+ (includeContext.CustomIncludePatterns != null && includeContext.CustomIncludePatterns.Where((pattern) => !ExcludePatternRule(pattern)).Count() > 0)
||
(_emitBuiltInIncludes &&
includeContext.BuiltInsInclude != null &&
@@ -75,7 +75,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
private readonly string _itemName;
private bool _transformMappings;
- private Func _excludePatternRule;
+ protected Func ExcludePatternRule { get; }
private bool _emitBuiltInIncludes;
private readonly List> _metadata = new List>();
@@ -89,7 +89,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
_itemName = itemName;
_transformMappings = transformMappings;
_emitBuiltInIncludes = emitBuiltInIncludes;
- _excludePatternRule = excludePatternsRule ?? ((pattern) => false);
+ ExcludePatternRule = excludePatternsRule ?? ((pattern) => false);
_mappingsToTransfrom = (addItemTransform, targetPath) =>
{
diff --git a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependenciesCommandFactory.cs b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependenciesCommandFactory.cs
index acb2c7b33..685b36066 100644
--- a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependenciesCommandFactory.cs
+++ b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependenciesCommandFactory.cs
@@ -28,7 +28,6 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
[WindowsOnlyFact]
public void It_resolves_desktop_apps_defaulting_to_Debug_Configuration()
{
- var runtime = DotnetLegacyRuntimeIdentifiers.InferLegacyRestoreRuntimeIdentifier();
var configuration = "Debug";
var testInstance = TestAssets.Get(TestAssetKinds.DesktopTestProjects, "AppWithProjTool2Fx")
@@ -38,14 +37,12 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
var restoreCommand = new RestoreCommand()
.WithWorkingDirectory(testInstance.Root)
- .WithRuntime(runtime)
.ExecuteWithCapturedOutput()
.Should().Pass();
var buildCommand = new BuildCommand()
.WithWorkingDirectory(testInstance.Root)
.WithConfiguration(configuration)
- .WithRuntime(runtime)
.WithCapturedOutput()
.Execute()
.Should().Pass();
@@ -67,7 +64,6 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
[WindowsOnlyFact]
public void It_resolves_desktop_apps_when_configuration_is_Debug()
{
- var runtime = DotnetLegacyRuntimeIdentifiers.InferLegacyRestoreRuntimeIdentifier();
var configuration = "Debug";
var testInstance = TestAssets.Get(TestAssetKinds.DesktopTestProjects, "AppWithProjTool2Fx")
@@ -77,14 +73,12 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
var restoreCommand = new RestoreCommand()
.WithWorkingDirectory(testInstance.Root)
- .WithRuntime(runtime)
.ExecuteWithCapturedOutput()
.Should().Pass();
var buildCommand = new BuildCommand()
.WithWorkingDirectory(testInstance.Root)
.WithConfiguration(configuration)
- .WithRuntime(runtime)
.Execute()
.Should().Pass();
@@ -104,7 +98,6 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
[WindowsOnlyFact]
public void It_resolves_desktop_apps_when_configuration_is_Release()
{
- var runtime = DotnetLegacyRuntimeIdentifiers.InferLegacyRestoreRuntimeIdentifier();
var configuration = "Debug";
var testInstance = TestAssets.Get(TestAssetKinds.DesktopTestProjects, "AppWithProjTool2Fx")
@@ -114,14 +107,12 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
var restoreCommand = new RestoreCommand()
.WithWorkingDirectory(testInstance.Root)
- .WithRuntime(runtime)
.ExecuteWithCapturedOutput()
.Should().Pass();
var buildCommand = new BuildCommand()
.WithWorkingDirectory(testInstance.Root)
.WithConfiguration(configuration)
- .WithRuntime(runtime)
.WithCapturedOutput()
.Execute()
.Should().Pass();
@@ -143,7 +134,6 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
[WindowsOnlyFact]
public void It_resolves_desktop_apps_using_configuration_passed_to_create()
{
- var runtime = DotnetLegacyRuntimeIdentifiers.InferLegacyRestoreRuntimeIdentifier();
var configuration = "Debug";
var testInstance = TestAssets.Get(TestAssetKinds.DesktopTestProjects, "AppWithProjTool2Fx")
@@ -153,14 +143,12 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
var restoreCommand = new RestoreCommand()
.WithWorkingDirectory(testInstance.Root)
- .WithRuntime(runtime)
.ExecuteWithCapturedOutput()
.Should().Pass();
var buildCommand = new BuildCommand()
.WithWorkingDirectory(testInstance.Root)
.WithConfiguration(configuration)
- .WithRuntime(runtime)
.WithCapturedOutput()
.Execute()
.Should().Pass();
diff --git a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateBuildOptions.cs b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateBuildOptions.cs
index e4f24c6ac..988e6f010 100644
--- a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateBuildOptions.cs
+++ b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateBuildOptions.cs
@@ -450,11 +450,34 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
mockProj.Properties.First(p => p.Name == "GenerateDocumentationFile").Value.Should().Be("true");
}
+ [Fact]
+ public void ExcludedPatternsAreNotEmittedOnNoneWhenBuildingAWebProject()
+ {
+ var mockProj = RunBuildOptionsRuleOnPj(@"
+ {
+ ""buildOptions"": {
+ ""emitEntryPoint"": true,
+ ""copyToOutput"": {
+ ""include"": [""wwwroot"", ""**/*.cshtml"", ""appsettings.json"", ""web.config""],
+ }
+ },
+ ""dependencies"": {
+ ""Microsoft.AspNetCore.Mvc"" : {
+ ""version"": ""1.0.0""
+ }
+ },
+ ""frameworks"": {
+ ""netcoreapp1.0"": {}
+ }
+ }");
+
+ mockProj.Items.Count(i => i.ItemType.Equals("None", StringComparison.Ordinal)).Should().Be(0);
+ }
+
[Theory]
[InlineData("compile", "Compile", 3, "")]
[InlineData("embed", "EmbeddedResource", 3, ";rootfile.cs")]
- [InlineData("copyToOutput", "Content", 2, ";rootfile.cs")]
- private void MigratingGroupIncludeExcludePopulatesAppropriateProjectItemElement(
+ public void MigratingGroupIncludeExcludePopulatesAppropriateProjectItemElement(
string group,
string itemName,
int expectedNumberOfCompileItems,
@@ -490,8 +513,8 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
if (string.IsNullOrEmpty(item.Include))
{
- item.Remove.Should()
- .Be(@"src\**\*;rootfile.cs;src\file2.cs");
+ item.Remove.Should()
+ .Be(@"src\**\*;rootfile.cs;src\file2.cs");
}
else if (item.Include.Contains(@"src\file1.cs"))
{
@@ -526,11 +549,75 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
}
+ [Fact]
+ public void MigratingCopyToOutputIncludeExcludePopulatesAppropriateProjectItemElement()
+ {
+ var testDirectory = Temp.CreateDirectory().Path;
+ WriteExtraFiles(testDirectory);
+
+ var pj = @"
+ {
+ ""buildOptions"": {
+ ""copyToOutput"": {
+ ""include"": [""root"", ""src"", ""rootfile.cs""],
+ ""exclude"": [""anothersource"", ""rootfile1.cs""],
+ ""includeFiles"": [""src/file1.cs"", ""src/file2.cs""],
+ ""excludeFiles"": [""src/file3.cs""]
+ }
+ }
+ }";
+
+ var mockProj = RunBuildOptionsRuleOnPj(pj,
+ testDirectory: testDirectory);
+
+ mockProj.Items.Count(i => i.ItemType.Equals("None", StringComparison.Ordinal))
+ .Should().Be(4);
+
+ var copyItems = mockProj.Items.Where(i =>
+ i.ItemType.Equals("None", StringComparison.Ordinal) &&
+ i.Metadata.Any(m => m.Name == "CopyToOutputDirectory" && m.Value == "PreserveNewest"));
+
+ copyItems.Count().Should().Be(2);
+
+ var excludeItems = mockProj.Items.Where(i =>
+ i.ItemType.Equals("None", StringComparison.Ordinal) &&
+ i.Metadata.Any(m => m.Name == "CopyToOutputDirectory" && m.Value == "Never"));
+
+ excludeItems.Count().Should().Be(2);
+
+ foreach (var item in copyItems)
+ {
+ VerifyContentMetadata(item);
+
+ if (item.Update.Contains(@"src\file1.cs"))
+ {
+ item.Update.Should().Be(@"src\file1.cs;src\file2.cs");
+ }
+ else
+ {
+ item.Update.Should().Be(@"root\**\*;src\**\*;rootfile.cs");
+ }
+ }
+
+ foreach (var item in excludeItems)
+ {
+ VerifyContentMetadata(item);
+
+ if (item.Update.Contains(@"src\file3.cs"))
+ {
+ item.Update.Should().Be(@"src\file3.cs");
+ }
+ else
+ {
+ item.Update.Should().Be(@"anothersource\**\*;rootfile1.cs");
+ }
+ }
+ }
+
[Theory]
[InlineData("compile", "Compile", "")]
[InlineData("embed", "EmbeddedResource", ";rootfile.cs")]
- [InlineData("copyToOutput", "Content", ";rootfile.cs")]
- private void MigratingGroupIncludeOnlyPopulatesAppropriateProjectItemElement(
+ public void MigratingGroupIncludeOnlyPopulatesAppropriateProjectItemElement(
string group,
string itemName,
string expectedRootFiles)
@@ -548,8 +635,6 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
var mockProj = RunBuildOptionsRuleOnPj(pj,
testDirectory: testDirectory);
- Console.WriteLine(mockProj.RawXml);
-
mockProj.Items.Count(i => i.ItemType.Equals(itemName, StringComparison.Ordinal)).Should().Be(1);
var defaultIncludePatterns = GetDefaultIncludePatterns(group);
@@ -583,6 +668,31 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
}
+ [Theory]
+ [InlineData("copyToOutput", "None", ";rootfile.cs")]
+ public void MigratingCopyToOutputIncludeOnlyPopulatesAppropriateProjectItemElement(
+ string group,
+ string itemName,
+ string expectedRootFiles)
+ {
+ var testDirectory = Temp.CreateDirectory().Path;
+ WriteExtraFiles(testDirectory);
+
+ var pj = @"
+ {
+ ""buildOptions"": {
+ """": [""root"", ""src"", ""rootfile.cs""]
+ }
+ }".Replace("", group);
+
+ var mockProj = RunBuildOptionsRuleOnPj(pj,
+ testDirectory: testDirectory);
+
+ mockProj.Items.Count(i => i.ItemType.Equals(itemName, StringComparison.Ordinal)).Should().Be(1);
+
+ mockProj.Items.Single().Update.Should().Be($@"root\**\*;src\**\*{expectedRootFiles}");
+ }
+
[Fact]
public void MigratingTestProjectAddsGenerateRuntimeConfigurationFiles()
{
@@ -725,7 +835,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
private static void VerifyContentMetadata(ProjectItemElement item)
{
- if (item.ItemType == "Content")
+ if (item.ItemType == "None")
{
item.Metadata.Count(m => m.Name == "CopyToOutputDirectory").Should().Be(1);
}
@@ -735,12 +845,14 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
{
Directory.CreateDirectory(Path.Combine(directory, "root"));
Directory.CreateDirectory(Path.Combine(directory, "src"));
+ Directory.CreateDirectory(Path.Combine(directory, "anothersource"));
File.WriteAllText(Path.Combine(directory, "root", "file1.txt"), "content");
File.WriteAllText(Path.Combine(directory, "root", "file2.txt"), "content");
File.WriteAllText(Path.Combine(directory, "root", "file3.txt"), "content");
File.WriteAllText(Path.Combine(directory, "src", "file1.cs"), "content");
File.WriteAllText(Path.Combine(directory, "src", "file2.cs"), "content");
File.WriteAllText(Path.Combine(directory, "src", "file3.cs"), "content");
+ File.WriteAllText(Path.Combine(directory, "anothersource", "file4.cs"), "content");
File.WriteAllText(Path.Combine(directory, "rootfile.cs"), "content");
}
diff --git a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateConfigurations.cs b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateConfigurations.cs
index 4c5f5ca7f..98417b112 100644
--- a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateConfigurations.cs
+++ b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateConfigurations.cs
@@ -157,9 +157,9 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
""buildOptions"": {
""copyToOutput"": {
""include"": [""src""],
- ""exclude"": [""src"", ""rootfile.cs""],
+ ""exclude"": [""anothersource"", ""rootfile.cs""],
""includeFiles"": [""src/file1.cs"", ""src/file2.cs""],
- ""excludeFiles"": [""src/file2.cs""]
+ ""excludeFiles"": [""anothersource/file2.cs""]
}
},
""configurations"": {
@@ -167,34 +167,76 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
""buildOptions"": {
""copyToOutput"": {
""include"": [""root"", ""src"", ""rootfile.cs""],
- ""exclude"": [""src"", ""root/rootfile.cs""],
+ ""exclude"": [""anothersource"", ""root/rootfile.cs""],
""includeFiles"": [""src/file1.cs"", ""src/file2.cs""],
- ""excludeFiles"": [""src/file2.cs""]
+ ""excludeFiles"": [""src/file3.cs""]
}
}
}
}
}");
- var contentItems = mockProj.Items.Where(item => item.ItemType == "Content");
+ var contentItems = mockProj.Items.Where(item => item.ItemType == "None");
- contentItems.Count().Should().Be(4);
+ contentItems.Count().Should().Be(8);
- // 2 for Base Build options
- contentItems.Where(i => i.ConditionChain().Count() == 0).Should().HaveCount(2);
+ contentItems.Where(i => i.ConditionChain().Count() == 0).Should().HaveCount(4);
- // 2 for Configuration BuildOptions (1 Remove, 1 Include)
- contentItems.Where(i => i.ConditionChain().Count() == 1).Should().HaveCount(2);
-
- var configIncludeContentItem = contentItems.First(
- item => item.ConditionChain().Count() > 0 && !string.IsNullOrEmpty(item.Include));
- var configRemoveContentItem = contentItems.First(
- item => item.ConditionChain().Count() > 0 && !string.IsNullOrEmpty(item.Remove));
+ contentItems.Where(i =>
+ i.ConditionChain().Count() == 0 &&
+ i.Metadata.Any(m => m.Value == "PreserveNewest")).Should().HaveCount(2);
+ contentItems.Where(i =>
+ i.ConditionChain().Count() == 0 &&
+ i.Metadata.Any(m => m.Value == "Never")).Should().HaveCount(2);
- // Directories are not converted to globs in the result because we did not write the directory
- configRemoveContentItem.Remove.Should().Be(@"root;src;rootfile.cs");
- configIncludeContentItem.Include.Should().Be(@"root;src;rootfile.cs");
- configIncludeContentItem.Exclude.Should().Be(@"src;root\rootfile.cs;src\file2.cs");
+ contentItems.Where(i => i.ConditionChain().Count() == 1).Should().HaveCount(4);
+ contentItems.Where(i =>
+ i.ConditionChain().Count() == 1 &&
+ i.Metadata.Any(m => m.Value == "PreserveNewest")).Should().HaveCount(1);
+ contentItems.Where(i =>
+ i.ConditionChain().Count() == 1 &&
+ i.Metadata.Any(m => m.Value == "Never")).Should().HaveCount(2);
+
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 1 &&
+ i.Metadata.Any(m => m.Value == "PreserveNewest") &&
+ !string.IsNullOrEmpty(i.Update)).Update.Should().Be(@"root;rootfile.cs");
+
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 1 &&
+ i.Metadata.Any(m => m.Value == "Never") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Contains(@"src\file3.cs")).Update.Should().Be(@"src\file3.cs");
+
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 1 &&
+ i.Metadata.Any(m => m.Value == "Never") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Contains(@"root\rootfile.cs")).Update.Should().Be(@"root\rootfile.cs");
+
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 0 &&
+ i.Metadata.Any(m => m.Value == "PreserveNewest") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Contains(@"src\file1.cs")).Update.Should().Be(@"src\file1.cs;src\file2.cs");
+
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 0 &&
+ i.Metadata.Any(m => m.Value == "PreserveNewest") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Equals(@"src")).Update.Should().Be(@"src");
+
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 0 &&
+ i.Metadata.Any(m => m.Value == "Never") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Equals(@"anothersource\file2.cs")).Update.Should().Be(@"anothersource\file2.cs");
+
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 0 &&
+ i.Metadata.Any(m => m.Value == "Never") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Equals(@"anothersource;rootfile.cs")).Update.Should().Be(@"anothersource;rootfile.cs");
}
[Fact]
@@ -214,7 +256,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
""testconfig"": {
""buildOptions"": {
""copyToOutput"": {
- ""include"": [""root"", ""src"", ""rootfile.cs""],
+ ""include"": [""root"", ""anothersource"", ""rootfile.cs""],
""exclude"": [""rootfile.cs"", ""someotherfile.cs""],
""includeFiles"": [""src/file1.cs"", ""src/file2.cs""],
""excludeFiles"": [""src/file2.cs""]
@@ -224,37 +266,73 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
}");
- var contentItems = mockProj.Items.Where(item => item.ItemType == "Content");
+ var contentItems = mockProj.Items.Where(item => item.ItemType == "None");
- contentItems.Count().Should().Be(5);
+ contentItems.Count().Should().Be(9);
+ contentItems.Where(i => i.ConditionChain().Count() == 0).Should().HaveCount(4);
+ contentItems.Where(i => i.ConditionChain().Count() == 1).Should().HaveCount(5);
- // 2 for Base Build options
- contentItems.Where(i => i.ConditionChain().Count() == 0).Should().HaveCount(2);
+ contentItems.Where(i =>
+ i.ConditionChain().Count() == 0 &&
+ i.Metadata.Any(m => m.Value == "PreserveNewest")).Should().HaveCount(2);
+ contentItems.Where(i =>
+ i.ConditionChain().Count() == 0 &&
+ i.Metadata.Any(m => m.Value == "Never")).Should().HaveCount(2);
- // 3 for Configuration BuildOptions (1 Remove, 2 Include)
- contentItems.Where(i => i.ConditionChain().Count() == 1).Should().HaveCount(3);
+ contentItems.Where(i =>
+ i.ConditionChain().Count() == 1 &&
+ i.Metadata.Any(m => m.Value == "PreserveNewest")).Should().HaveCount(1);
+ contentItems.Where(i =>
+ i.ConditionChain().Count() == 1 &&
+ i.Metadata.Any(m => m.Value == "Never")).Should().HaveCount(3);
- var configIncludeContentItem = contentItems.First(
- item => item.ConditionChain().Count() > 0
- && item.Include.Contains("root"));
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 0 &&
+ i.Metadata.Any(m => m.Value == "PreserveNewest") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Contains(@"src\file1.cs")).Update.Should().Be(@"src\file1.cs;src\file2.cs");
- var configIncludeContentItem2 = contentItems.First(
- item => item.ConditionChain().Count() > 0
- && item.Include.Contains(@"src\file1.cs"));
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 0 &&
+ i.Metadata.Any(m => m.Value == "PreserveNewest") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Equals(@"src")).Update.Should().Be(@"src");
- var configRemoveContentItem = contentItems.First(
- item => item.ConditionChain().Count() > 0 && !string.IsNullOrEmpty(item.Remove));
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 0 &&
+ i.Metadata.Any(m => m.Value == "Never") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Equals(@"src\file3.cs")).Update.Should().Be(@"src\file3.cs");
- // Directories are not converted to globs in the result because we did not write the directory
- configRemoveContentItem.Removes()
- .Should().BeEquivalentTo("root", "src", "rootfile.cs", @"src\file1.cs", @"src\file2.cs");
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 0 &&
+ i.Metadata.Any(m => m.Value == "Never") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Equals(@"rootfile.cs")).Update.Should().Be(@"rootfile.cs");
- configIncludeContentItem.Includes().Should().BeEquivalentTo("root", "src", "rootfile.cs");
- configIncludeContentItem.Excludes()
- .Should().BeEquivalentTo("rootfile.cs", "someotherfile.cs", @"src\file2.cs");
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 1 &&
+ i.Metadata.Any(m => m.Value == "PreserveNewest") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Contains(@"root;anothersource")).Update.Should().Be(@"root;anothersource");
- configIncludeContentItem2.Includes().Should().BeEquivalentTo(@"src\file1.cs", @"src\file2.cs");
- configIncludeContentItem2.Excludes().Should().BeEquivalentTo(@"src\file2.cs");
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 1 &&
+ i.Metadata.Any(m => m.Value == "Never") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Contains(@"src\file2.cs")).Update.Should().Be(@"src\file2.cs");
+
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 1 &&
+ i.Metadata.Any(m => m.Value == "Never") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Contains(@"rootfile.cs")).Update.Should().Be(@"rootfile.cs");
+
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 1 &&
+ i.Metadata.Any(m => m.Value == "Never") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Contains(@"someotherfile.cs")).Update.Should().Be(@"someotherfile.cs");
}
[Fact]
@@ -280,37 +358,46 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
}");
- var contentItems = mockProj.Items.Where(item => item.ItemType == "Content");
+ var contentItems = mockProj.Items.Where(item => item.ItemType == "None");
- contentItems.Count().Should().Be(2);
- contentItems.Where(i => i.ConditionChain().Count() == 1).Should().HaveCount(2);
+ contentItems.Count().Should().Be(5);
+ contentItems.Where(i => i.ConditionChain().Count() == 1).Should().HaveCount(5);
- var configIncludeContentItem = contentItems.First(
- item => item.ConditionChain().Count() > 0
- && item.Include.Contains("root"));
-
- var configIncludeContentItem2 = contentItems.First(
- item => item.ConditionChain().Count() > 0
- && item.Include.Contains(@"src\file1.cs"));
-
- configIncludeContentItem.Includes().Should().BeEquivalentTo("root", "src");
- configIncludeContentItem.Excludes()
- .Should().BeEquivalentTo("rootfile.cs", "src", @"src\file2.cs");
+ var configIncludeContentItem = contentItems.First(item => item.Update.Contains("root"));
+ var configIncludeContentItem2 = contentItems.First(item => item.Update.Contains(@"src\file1.cs"));
+ var configIncludeContentItem3 = contentItems.First(item => item.Update.Contains(@"src\file2.cs"));
+ var configIncludeContentItem4 = contentItems.First(item => item.Update.Equals(@"src"));
+ var configIncludeContentItem5 = contentItems.First(item => item.Update.Contains(@"rootfile.cs"));
+ configIncludeContentItem.Updates().Should().BeEquivalentTo("root");
configIncludeContentItem.GetMetadataWithName("Link").Should().NotBeNull();
configIncludeContentItem.GetMetadataWithName("Link").Value.Should().Be("/some/dir/%(FileName)%(Extension)");
-
configIncludeContentItem.GetMetadataWithName("CopyToOutputDirectory").Should().NotBeNull();
configIncludeContentItem.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("PreserveNewest");
- configIncludeContentItem2.Includes().Should().BeEquivalentTo(@"src\file1.cs", @"src\file2.cs");
- configIncludeContentItem2.Excludes().Should().BeEquivalentTo(@"src\file2.cs");
-
+ configIncludeContentItem2.Updates().Should().BeEquivalentTo(@"src\file1.cs");
configIncludeContentItem2.GetMetadataWithName("Link").Should().NotBeNull();
configIncludeContentItem2.GetMetadataWithName("Link").Value.Should().Be("/some/dir/%(FileName)%(Extension)");
-
configIncludeContentItem2.GetMetadataWithName("CopyToOutputDirectory").Should().NotBeNull();
configIncludeContentItem2.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("PreserveNewest");
+
+ configIncludeContentItem3.Updates().Should().BeEquivalentTo(@"src\file2.cs");
+ configIncludeContentItem3.GetMetadataWithName("Link").Should().NotBeNull();
+ configIncludeContentItem3.GetMetadataWithName("Link").Value.Should().Be("/some/dir/%(FileName)%(Extension)");
+ configIncludeContentItem3.GetMetadataWithName("CopyToOutputDirectory").Should().NotBeNull();
+ configIncludeContentItem3.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("Never");
+
+ configIncludeContentItem4.Updates().Should().BeEquivalentTo(@"src");
+ configIncludeContentItem4.GetMetadataWithName("Link").Should().NotBeNull();
+ configIncludeContentItem4.GetMetadataWithName("Link").Value.Should().Be("/some/dir/%(FileName)%(Extension)");
+ configIncludeContentItem4.GetMetadataWithName("CopyToOutputDirectory").Should().NotBeNull();
+ configIncludeContentItem4.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("Never");
+
+ configIncludeContentItem5.Updates().Should().BeEquivalentTo(@"rootfile.cs");
+ configIncludeContentItem5.GetMetadataWithName("Link").Should().NotBeNull();
+ configIncludeContentItem5.GetMetadataWithName("Link").Value.Should().Be("/some/dir/%(FileName)%(Extension)");
+ configIncludeContentItem5.GetMetadataWithName("CopyToOutputDirectory").Should().NotBeNull();
+ configIncludeContentItem5.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("Never");
}
[Fact]
@@ -338,47 +425,65 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
}");
- var contentItems = mockProj.Items.Where(item => item.ItemType == "Content");
+ var contentItems = mockProj.Items.Where(item => item.ItemType == "None");
- contentItems.Count().Should().Be(3);
- contentItems.Where(i => i.ConditionChain().Count() == 1).Should().HaveCount(3);
+ contentItems.Count().Should().Be(6);
+ contentItems.Where(i => i.ConditionChain().Count() == 1).Should().HaveCount(6);
var configIncludeContentItem = contentItems.First(
item => item.ConditionChain().Count() > 0
- && item.Include == "root");
+ && item.Update == "root");
var configIncludeContentItem2 = contentItems.First(
item => item.ConditionChain().Count() > 0
- && item.Include == "src");
+ && item.Update == "src");
var configIncludeContentItem3 = contentItems.First(
item => item.ConditionChain().Count() > 0
- && item.Include.Contains(@"src\file1.cs"));
+ && item.Update.Contains(@"src\file1.cs"));
- // Directories are not converted to globs in the result because we did not write the directory
+ var configIncludeContentItem4 = contentItems.First(
+ item => item.ConditionChain().Count() > 0
+ && item.Update.Contains(@"src\file2.cs"));
- configIncludeContentItem.Includes().Should().BeEquivalentTo("root");
- configIncludeContentItem.Excludes()
- .Should().BeEquivalentTo("rootfile.cs", "src", @"src\file2.cs");
+ var configIncludeContentItem5 = contentItems.First(
+ item => item.ConditionChain().Count() > 0
+ && item.Update.Equals(@"rootfile.cs"));
+ var configIncludeContentItem6 = contentItems.First(
+ item => item.ConditionChain().Count() > 0
+ && item.Update.Equals(@"src\rootfile.cs"));
+
+ configIncludeContentItem.Updates().Should().BeEquivalentTo("root");
configIncludeContentItem.GetMetadataWithName("Link").Should().BeNull();
configIncludeContentItem.GetMetadataWithName("CopyToOutputDirectory").Should().NotBeNull();
configIncludeContentItem.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("PreserveNewest");
- configIncludeContentItem2.Include.Should().Be("src");
- configIncludeContentItem2.Excludes().Should().BeEquivalentTo("src", "rootfile.cs", @"src\rootfile.cs", @"src\file2.cs");
-
+ configIncludeContentItem2.Update.Should().Be("src");
configIncludeContentItem2.GetMetadataWithName("Link").Should().NotBeNull();
configIncludeContentItem2.GetMetadataWithName("Link").Value.Should().Be("/some/dir/%(FileName)%(Extension)");
configIncludeContentItem2.GetMetadataWithName("CopyToOutputDirectory").Should().NotBeNull();
- configIncludeContentItem2.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("PreserveNewest");
-
- configIncludeContentItem3.Includes().Should().BeEquivalentTo(@"src\file1.cs");
- configIncludeContentItem3.Exclude.Should().Be(@"src\file2.cs");
+ configIncludeContentItem2.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("Never");
+ configIncludeContentItem3.Updates().Should().BeEquivalentTo(@"src\file1.cs");
configIncludeContentItem3.GetMetadataWithName("Link").Should().BeNull();
configIncludeContentItem3.GetMetadataWithName("CopyToOutputDirectory").Should().NotBeNull();
configIncludeContentItem3.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("PreserveNewest");
+
+ configIncludeContentItem4.Updates().Should().BeEquivalentTo(@"src\file2.cs");
+ configIncludeContentItem4.GetMetadataWithName("Link").Should().BeNull();
+ configIncludeContentItem4.GetMetadataWithName("CopyToOutputDirectory").Should().NotBeNull();
+ configIncludeContentItem4.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("Never");
+
+ configIncludeContentItem5.Updates().Should().BeEquivalentTo(@"rootfile.cs");
+ configIncludeContentItem5.GetMetadataWithName("Link").Should().BeNull();
+ configIncludeContentItem5.GetMetadataWithName("CopyToOutputDirectory").Should().NotBeNull();
+ configIncludeContentItem5.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("Never");
+
+ configIncludeContentItem6.Updates().Should().BeEquivalentTo(@"src\rootfile.cs");
+ configIncludeContentItem6.GetMetadataWithName("Link").Value.Should().Be("/some/dir/%(FileName)%(Extension)");
+ configIncludeContentItem6.GetMetadataWithName("CopyToOutputDirectory").Should().NotBeNull();
+ configIncludeContentItem6.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("Never");
}
[Fact]
@@ -410,38 +515,67 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
}");
- var contentItems = mockProj.Items.Where(item => item.ItemType == "Content");
+ var contentItems = mockProj.Items.Where(item => item.ItemType == "None");
- contentItems.Count().Should().Be(4);
+ contentItems.Count().Should().Be(8);
var rootBuildOptionsContentItems = contentItems.Where(i => i.ConditionChain().Count() == 0).ToList();
- rootBuildOptionsContentItems.Count().Should().Be(2);
+ rootBuildOptionsContentItems.Count().Should().Be(5);
foreach (var buildOptionContentItem in rootBuildOptionsContentItems)
{
buildOptionContentItem.GetMetadataWithName("Link").Should().BeNull();
- buildOptionContentItem.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("PreserveNewest");
}
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 0 &&
+ i.Metadata.Any(m => m.Value == "PreserveNewest") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Equals(@"src\file1.cs")).Update.Should().Be(@"src\file1.cs");
+
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 0 &&
+ i.Metadata.Any(m => m.Value == "PreserveNewest") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Equals(@"root")).Update.Should().Be(@"root");
+
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 0 &&
+ i.Metadata.Any(m => m.Value == "Never") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Equals(@"src\file2.cs")).Update.Should().Be(@"src\file2.cs");
+
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 0 &&
+ i.Metadata.Any(m => m.Value == "Never") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Equals(@"src")).Update.Should().Be(@"src");
+
+ contentItems.First(i =>
+ i.ConditionChain().Count() == 0 &&
+ i.Metadata.Any(m => m.Value == "Never") &&
+ !string.IsNullOrEmpty(i.Update) &&
+ i.Update.Equals(@"rootfile.cs")).Update.Should().Be(@"rootfile.cs");
+
var configItems = contentItems.Where(i => i.ConditionChain().Count() == 1);
- configItems.Should().HaveCount(2);
+ configItems.Should().HaveCount(3);
var configIncludeContentItem = contentItems.First(
item => item.ConditionChain().Count() > 0
- && item.Include.Contains("src"));
+ && item.Update.Contains("src"));
var configRemoveContentItem = contentItems.First(
item => item.ConditionChain().Count() > 0
&& !string.IsNullOrEmpty(item.Remove));
- configIncludeContentItem.Include.Should().Be("src");
+ configIncludeContentItem.Update.Should().Be("src");
configIncludeContentItem.GetMetadataWithName("Link").Should().NotBeNull();
configIncludeContentItem.GetMetadataWithName("Link").Value.Should().Be("/some/dir/%(FileName)%(Extension)");
configIncludeContentItem.GetMetadataWithName("CopyToOutputDirectory").Should().NotBeNull();
- configIncludeContentItem.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("PreserveNewest");
+ configIncludeContentItem.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("Never");
- configRemoveContentItem.Remove.Should().Be("src");
+ configRemoveContentItem.Remove.Should().Be("src;rootfile.cs");
}
[Fact]
@@ -477,47 +611,42 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
}");
- var contentItems = mockProj.Items.Where(item => item.ItemType == "Content");
+ var contentItems = mockProj.Items.Where(item => item.ItemType == "None");
- contentItems.Count().Should().Be(5);
- contentItems.Where(i => i.ConditionChain().Count() == 1).Should().HaveCount(3);
+ contentItems.Count().Should().Be(9);
+ contentItems.Where(i => i.ConditionChain().Count() == 1).Should().HaveCount(4);
var rootBuildOptionsContentItems = contentItems.Where(i => i.ConditionChain().Count() == 0).ToList();
- rootBuildOptionsContentItems.Count().Should().Be(2);
+ rootBuildOptionsContentItems.Count().Should().Be(5);
foreach (var buildOptionContentItem in rootBuildOptionsContentItems)
{
buildOptionContentItem.GetMetadataWithName("Link").Should().BeNull();
- buildOptionContentItem.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("PreserveNewest");
}
var configIncludeEncompassedItem = contentItems.FirstOrDefault(
item => item.ConditionChain().Count() > 0
- && item.Include == "root");
+ && item.Update == "root");
configIncludeEncompassedItem.Should().BeNull();
var configIncludeContentItem = contentItems.First(
item => item.ConditionChain().Count() > 0
- && item.Include == "src");
+ && item.Update == "src");
var configIncludeContentItem2 = contentItems.First(
item => item.ConditionChain().Count() > 0
- && item.Include.Contains(@"src\file3.cs"));
+ && item.Update.Contains(@"src\file3.cs"));
var configRemoveContentItem = contentItems.First(
item => item.ConditionChain().Count() > 0
&& !string.IsNullOrEmpty(item.Remove));
- configIncludeContentItem.Include.Should().Be("src");
- configIncludeContentItem.Excludes().Should().BeEquivalentTo("src", "rootfile.cs", @"src\rootfile.cs", @"src\file2.cs");
-
+ configIncludeContentItem.Update.Should().Be("src");
configIncludeContentItem.GetMetadataWithName("Link").Should().NotBeNull();
configIncludeContentItem.GetMetadataWithName("Link").Value.Should().Be("/some/dir/%(FileName)%(Extension)");
configIncludeContentItem.GetMetadataWithName("CopyToOutputDirectory").Should().NotBeNull();
- configIncludeContentItem.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("PreserveNewest");
-
- configIncludeContentItem2.Includes().Should().BeEquivalentTo(@"src\file3.cs");
- configIncludeContentItem2.Exclude.Should().Be(@"src\file2.cs");
+ configIncludeContentItem.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("Never");
+ configIncludeContentItem2.Updates().Should().BeEquivalentTo(@"src\file3.cs");
configIncludeContentItem2.GetMetadataWithName("Link").Should().BeNull();
configIncludeContentItem2.GetMetadataWithName("CopyToOutputDirectory").Should().NotBeNull();
configIncludeContentItem2.GetMetadataWithName("CopyToOutputDirectory").Value.Should().Be("PreserveNewest");
diff --git a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePackOptions.cs b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePackOptions.cs
index e88dd1816..7c20923e2 100644
--- a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePackOptions.cs
+++ b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePackOptions.cs
@@ -15,7 +15,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
public class GivenThatIWantToMigratePackOptions : TestBase
{
[Fact]
- public void It_does_not_migrate_Summary()
+ public void ItDoesNotMigrateSummary()
{
var mockProj = RunPackOptionsRuleOnPj(@"
{
@@ -28,7 +28,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
[Fact]
- public void It_does_not_migrate_Owner()
+ public void ItDoesNotMigrateOwner()
{
var mockProj = RunPackOptionsRuleOnPj(@"
{
@@ -41,7 +41,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
[Fact]
- public void Migrating__empty_tags_does_not_populate_PackageTags()
+ public void MigratingEmptyTagsDoesNotPopulatePackageTags()
{
var mockProj = RunPackOptionsRuleOnPj(@"
{
@@ -54,7 +54,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
[Fact]
- public void Migrating_tags_populates_PackageTags_semicolon_delimited()
+ public void MigratingTagsPopulatesPackageTagsSemicolonDelimited()
{
var mockProj = RunPackOptionsRuleOnPj(@"
{
@@ -68,7 +68,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
[Fact]
- public void Migrating_ReleaseNotes_populates_PackageReleaseNotes()
+ public void MigratingReleaseNotesPopulatesPackageReleaseNotes()
{
var mockProj = RunPackOptionsRuleOnPj(@"
{
@@ -83,7 +83,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
[Fact]
- public void Migrating_IconUrl_populates_PackageIconUrl()
+ public void MigratingIconUrlPopulatesPackageIconUrl()
{
var mockProj = RunPackOptionsRuleOnPj(@"
{
@@ -98,7 +98,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
[Fact]
- public void Migrating_ProjectUrl_populates_PackageProjectUrl()
+ public void MigratingProjectUrlPopulatesPackageProjectUrl()
{
var mockProj = RunPackOptionsRuleOnPj(@"
{
@@ -113,7 +113,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
[Fact]
- public void Migrating_LicenseUrl_populates_PackageLicenseUrl()
+ public void MigratingLicenseUrlPopulatesPackageLicenseUrl()
{
var mockProj = RunPackOptionsRuleOnPj(@"
{
@@ -128,7 +128,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
[Fact]
- public void Migrating_RequireLicenseAcceptance_populates_PackageRequireLicenseAcceptance()
+ public void MigratingRequireLicenseAcceptancePopulatesPackageRequireLicenseAcceptance()
{
var mockProj = RunPackOptionsRuleOnPj(@"
{
@@ -142,7 +142,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
[Fact]
- public void Migrating_RequireLicenseAcceptance_populates_PackageRequireLicenseAcceptance_even_if_its_value_is_false()
+ public void MigratingRequireLicenseAcceptancePopulatesPackageRequireLicenseAcceptanceEvenIfItsValueIsFalse()
{
var mockProj = RunPackOptionsRuleOnPj(@"
{
@@ -156,7 +156,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
[Fact]
- public void Migrating_Repository_Type_populates_RepositoryType()
+ public void MigratingRepositoryTypePopulatesRepositoryType()
{
var mockProj = RunPackOptionsRuleOnPj(@"
{
@@ -172,7 +172,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
[Fact]
- public void Migrating_Repository_Url_populates_RepositoryUrl()
+ public void MigratingRepositoryUrlPopulatesRepositoryUrl()
{
var mockProj = RunPackOptionsRuleOnPj(@"
{
@@ -188,7 +188,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
[Fact]
- public void Migrating_Files_without_mappings_populates_content_with_same_path_as_include_and_pack_true()
+ public void MigratingFilesWithoutMappingsPopulatesContentWithSamePathAsIncludeAndPackTrue()
{
var mockProj = RunPackOptionsRuleOnPj(@"
{
@@ -200,15 +200,57 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}");
var contentItems = mockProj.Items
- .Where(item => item.ItemType.Equals("Content", StringComparison.Ordinal))
+ .Where(item => item.ItemType.Equals("None", StringComparison.Ordinal))
.Where(item => item.GetMetadataWithName("Pack").Value == "true");
contentItems.Count().Should().Be(1);
- contentItems.First().Include.Should().Be(@"path\to\some\file.cs;path\to\some\other\file.cs");
+ contentItems.First().Update.Should().Be(@"path\to\some\file.cs;path\to\some\other\file.cs");
}
[Fact]
- public void Migrating_Files_with_mappings_populates_content_PackagePath_metadata()
+ public void MigratingFilesWithExcludePopulatesNoneWithPackFalseForTheExcludedFiles()
+ {
+ var mockProj = RunPackOptionsRuleOnPj(@"
+ {
+ ""packOptions"": {
+ ""files"": {
+ ""include"": [""path/to/some/file.cs"", ""path/to/some/other/file.cs""],
+ ""exclude"": [""path/to/file/to/exclude.cs""]
+ }
+ }
+ }");
+
+ foreach (var item in mockProj.Items.Where(i => i.ItemType.Equals("None", StringComparison.Ordinal)))
+ {
+ Console.WriteLine($"Update: {item.Update}, Include: {item.Include}, Remove: {item.Remove}");
+ foreach(var meta in item.Metadata)
+ {
+ Console.WriteLine($"\tMetadata: Name: {meta.Name}, Value: {meta.Value}");
+ }
+
+ foreach(var condition in item.ConditionChain())
+ {
+ Console.WriteLine($"\tCondition: {condition}");
+ }
+ }
+
+ var contentItemsToInclude = mockProj.Items
+ .Where(item => item.ItemType.Equals("None", StringComparison.Ordinal))
+ .Where(item => item.GetMetadataWithName("Pack").Value == "true");
+
+ contentItemsToInclude.Count().Should().Be(1);
+ contentItemsToInclude.First().Update.Should().Be(@"path\to\some\file.cs;path\to\some\other\file.cs");
+
+ var contentItemsToExclude = mockProj.Items
+ .Where(item => item.ItemType.Equals("None", StringComparison.Ordinal))
+ .Where(item => item.GetMetadataWithName("Pack").Value == "false");
+
+ contentItemsToExclude.Count().Should().Be(1);
+ contentItemsToExclude.First().Update.Should().Be(@"path\to\file\to\exclude.cs");
+ }
+
+ [Fact]
+ public void MigratingFilesWithMappingsPopulatesContentPackagePathMetadata()
{
var mockProj = RunPackOptionsRuleOnPj(@"
{
@@ -223,19 +265,19 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}");
var contentItems = mockProj.Items
- .Where(item => item.ItemType.Equals("Content", StringComparison.Ordinal))
+ .Where(item => item.ItemType.Equals("None", StringComparison.Ordinal))
.Where(item =>
item.GetMetadataWithName("Pack").Value == "true" &&
item.GetMetadataWithName("PackagePath") != null);
contentItems.Count().Should().Be(1);
- contentItems.First().Include.Should().Be(@"path\to\some\file.cs");
+ contentItems.First().Update.Should().Be(@"path\to\some\file.cs");
contentItems.First().GetMetadataWithName("PackagePath").Value.Should().Be(
Path.Combine("some", "other", "path"));
}
[Fact]
- public void Migrating_Files_with_mappings_to_root_populates_content_PackagePath_metadata_but_leaves_it_empty()
+ public void MigratingFilesWithMappingsToRootPopulatesContentPackagePathMetadataButLeavesItEmpty()
{
var mockProj = RunPackOptionsRuleOnPj(@"
{
@@ -250,18 +292,18 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}");
var contentItems = mockProj.Items
- .Where(item => item.ItemType.Equals("Content", StringComparison.Ordinal))
+ .Where(item => item.ItemType.Equals("None", StringComparison.Ordinal))
.Where(item =>
item.GetMetadataWithName("Pack").Value == "true" &&
item.GetMetadataWithName("PackagePath") != null);
contentItems.Count().Should().Be(1);
- contentItems.First().Include.Should().Be(@"path\to\some\file.cs");
+ contentItems.First().Update.Should().Be(@"path\to\some\file.cs");
contentItems.First().GetMetadataWithName("PackagePath").Value.Should().BeEmpty();
}
[Fact]
- public void Migrating_same_file_with_multiple_mappings_string_joins_the_mappings_in_PackagePath()
+ public void MigratingSameFileWithMultipleMappingsStringJoinsTheMappingsInPackagePath()
{
var mockProj = RunPackOptionsRuleOnPj(@"
{
@@ -284,13 +326,13 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
});
var contentItems = mockProj.Items
- .Where(item => item.ItemType.Equals("Content", StringComparison.Ordinal))
+ .Where(item => item.ItemType.Equals("None", StringComparison.Ordinal))
.Where(item =>
item.GetMetadataWithName("Pack").Value == "true" &&
item.GetMetadataWithName("PackagePath") != null);
contentItems.Count().Should().Be(1);
- contentItems.First().Include.Should().Be(@"path\to\some\file.cs");
+ contentItems.First().Update.Should().Be(@"path\to\some\file.cs");
contentItems.First().GetMetadataWithName("PackagePath").Value.Should().Be(expectedPackagePath);
}
diff --git a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePublishOptions.cs b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePublishOptions.cs
index 4c70e90c4..f45317380 100644
--- a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePublishOptions.cs
+++ b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePublishOptions.cs
@@ -32,24 +32,39 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}",
testDirectory: testDirectory);
- mockProj.Items.Count(i => i.ItemType.Equals("Content", StringComparison.Ordinal)).Should().Be(2);
+ mockProj.Items.Count(i => i.ItemType.Equals("None", StringComparison.Ordinal)).Should().Be(4);
- foreach (var item in mockProj.Items.Where(i => i.ItemType.Equals("Content", StringComparison.Ordinal)))
+ foreach (var item in mockProj.Items.Where(i => i.ItemType.Equals("None", StringComparison.Ordinal)))
{
item.Metadata.Count(m => m.Name == "CopyToPublishDirectory").Should().Be(1);
- if (item.Include.Contains(@"src\file1.cs"))
+ if (item.Update.Contains(@"src\file1.cs"))
{
- item.Include.Should().Be(@"src\file1.cs;src\file2.cs");
- item.Exclude.Should().Be(@"src\file2.cs");
+ item.Update.Should().Be(@"src\file1.cs");
+ item.Exclude.Should().BeEmpty();
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "PreserveNewest").Should().Be(1);
+ }
+ else if (item.Update.Contains(@"src\file2.cs"))
+ {
+ item.Update.Should().Be(@"src\file2.cs");
+ item.Exclude.Should().BeEmpty();
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "Never").Should().Be(1);
+ }
+ else if (item.Update.Contains(@"root\**\*"))
+ {
+ item.Update.Should().Be(@"root\**\*");
+ item.Exclude.Should().BeEmpty();
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "PreserveNewest").Should().Be(1);
}
else
{
- item.Include.Should()
- .Be(@"root\**\*;src\**\*;rootfile.cs");
-
- item.Exclude.Should()
- .Be(@"src\**\*;rootfile.cs;src\file2.cs");
+ item.Update.Should().Be(@"src\**\*;rootfile.cs");
+ item.Exclude.Should().BeEmpty();
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "Never").Should().Be(1);
}
}
}
@@ -82,21 +97,39 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}",
testDirectory: testDirectory);
- mockProj.Items.Count(i => i.ItemType.Equals("Content", StringComparison.Ordinal)).Should().Be(2);
+ mockProj.Items.Count(i => i.ItemType.Equals("None", StringComparison.Ordinal)).Should().Be(4);
- foreach (var item in mockProj.Items.Where(i => i.ItemType.Equals("Content", StringComparison.Ordinal)))
+ foreach (var item in mockProj.Items.Where(i => i.ItemType.Equals("None", StringComparison.Ordinal)))
{
item.Metadata.Count(m => m.Name == "CopyToPublishDirectory").Should().Be(1);
if (item.Update.Contains(@"src\file1.cs"))
{
- item.Update.Should().Be(@"src\file1.cs;src\file2.cs");
+ item.Update.Should().Be(@"src\file1.cs");
item.Exclude.Should().BeEmpty();
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "PreserveNewest").Should().Be(1);
+ }
+ else if (item.Update.Contains(@"src\file2.cs"))
+ {
+ item.Update.Should().Be(@"src\file2.cs");
+ item.Exclude.Should().BeEmpty();
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "Never").Should().Be(1);
+ }
+ else if (item.Update.Contains(@"root\**\*"))
+ {
+ item.Update.Should().Be(@"root\**\*");
+ item.Exclude.Should().BeEmpty();
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "PreserveNewest").Should().Be(1);
}
else
{
- item.Update.Should().Be(@"root\**\*;src\**\*;rootfile.cs");
+ item.Update.Should().Be(@"src\**\*;rootfile.cs");
item.Exclude.Should().BeEmpty();
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "Never").Should().Be(1);
}
}
}
@@ -126,31 +159,46 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}",
testDirectory: testDirectory);
- mockProj.Items.Count(i => i.ItemType.Equals("Content", StringComparison.Ordinal)).Should().Be(3);
+ mockProj.Items.Count(i => i.ItemType.Equals("None", StringComparison.Ordinal)).Should().Be(5);
- // From ProjectReader #L725 (Both are empty)
- var defaultIncludePatterns = Enumerable.Empty();
- var defaultExcludePatterns = Enumerable.Empty();
-
- foreach (var item in mockProj.Items.Where(i => i.ItemType.Equals("Content", StringComparison.Ordinal)))
+ foreach (var item in mockProj.Items.Where(i => i.ItemType.Equals("None", StringComparison.Ordinal)))
{
- if (item.Include.Contains(@"root\**\*"))
+ if (item.Update.Contains(@"root\**\*"))
{
- item.Include.Should().Be(@"root\**\*");
- item.Exclude.Should().Be(@"src\**\*;rootfile.cs;src\file3.cs");
+ item.Update.Should().Be(@"root\**\*");
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "PreserveNewest").Should().Be(1);
}
- else if (item.Include.Contains(@"src\file1.cs"))
+ else if (item.Update.Contains(@"src\file1.cs"))
{
- item.Include.Should().Be(@"src\file1.cs;src\file2.cs");
- item.Exclude.Should().Be(@"src\file2.cs;src\file3.cs");
+ item.Update.Should().Be(@"src\file1.cs");
+ item.Metadata.Count(m =>
+ m.Name == "CopyToOutputDirectory" && m.Value == "PreserveNewest").Should().Be(1);
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "PreserveNewest").Should().Be(1);
+ }
+ else if (item.Update.Contains(@"src\file2.cs"))
+ {
+ item.Update.Should().Be(@"src\file2.cs");
+ item.Metadata.Count(m =>
+ m.Name == "CopyToOutputDirectory" && m.Value == "Never").Should().Be(1);
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "PreserveNewest").Should().Be(1);
+ }
+ else if (item.Update.Contains(@"src\file3.cs"))
+ {
+ item.Update.Should().Be(@"src\file3.cs");
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "Never").Should().Be(1);
}
else
{
- item.Include.Should()
+ item.Update.Should()
.Be(@"src\**\*;rootfile.cs");
-
- item.Exclude.Should()
- .Be(@"src\**\*;rootfile.cs;src\file2.cs;src\file3.cs");
+ item.Metadata.Count(m =>
+ m.Name == "CopyToOutputDirectory" && m.Value == "Never").Should().Be(1);
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "Never").Should().Be(1);
}
}
}
@@ -189,35 +237,84 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}",
testDirectory: testDirectory);
- mockProj.Items.Count(i => i.ItemType.Equals("Content", StringComparison.Ordinal)).Should().Be(4);
+ mockProj.Items.Count(i => i.ItemType.Equals("None", StringComparison.Ordinal)).Should().Be(5);
// From ProjectReader #L725 (Both are empty)
var defaultIncludePatterns = Enumerable.Empty();
var defaultExcludePatterns = Enumerable.Empty();
- foreach (var item in mockProj.Items.Where(i => i.ItemType.Equals("Content", StringComparison.Ordinal)))
+ foreach (var item in mockProj.Items.Where(i => i.ItemType.Equals("None", StringComparison.Ordinal)))
{
var metadata = string.Join(",", item.Metadata.Select(m => m.Name));
- Console.WriteLine($"LICAVALC: Update: {item.Update}, Include: {item.Include}, Metadata: {metadata}");
if (item.Update.Contains(@"root\**\*"))
{
- item.Update.Should().Be(@"root\**\*;src\**\*;rootfile.cs");
+ item.Update.Should().Be(@"root\**\*");
item.Exclude.Should().BeEmpty();
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "PreserveNewest").Should().Be(1);
}
else if (item.Update.Contains(@"src\file1.cs"))
{
- item.Update.Should().Be(@"src\file1.cs;src\file2.cs");
+ item.Update.Should().Be(@"src\file1.cs");
item.Exclude.Should().BeEmpty();
+ item.Metadata.Count(m =>
+ m.Name == "CopyToOutputDirectory" && m.Value == "PreserveNewest").Should().Be(1);
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "PreserveNewest").Should().Be(1);
+ }
+ else if (item.Update.Contains(@"src\file2.cs"))
+ {
+ item.Update.Should().Be(@"src\file2.cs");
+ item.Exclude.Should().BeEmpty();
+ item.Metadata.Count(m =>
+ m.Name == "CopyToOutputDirectory" && m.Value == "Never").Should().Be(1);
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "PreserveNewest").Should().Be(1);
+ }
+ else if (item.Update.Contains(@"src\file3.cs"))
+ {
+ item.Update.Should().Be(@"src\file3.cs");
+ item.Exclude.Should().BeEmpty();
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "Never").Should().Be(1);
}
else
{
item.Update.Should().Be(@"src\**\*;rootfile.cs");
item.Exclude.Should().BeEmpty();
+ item.Metadata.Count(m =>
+ m.Name == "CopyToOutputDirectory" && m.Value == "Never").Should().Be(1);
+ item.Metadata.Count(m =>
+ m.Name == "CopyToPublishDirectory" && m.Value == "Never").Should().Be(1);
}
}
}
+ [Fact]
+ public void ExcludedPatternsAreNotEmittedOnNoneWhenBuildingAWebProject()
+ {
+ var mockProj = RunPublishOptionsRuleOnPj(@"
+ {
+ ""buildOptions"": {
+ ""emitEntryPoint"": true
+ },
+ ""publishOptions"": {
+ ""include"": [""wwwroot"", ""**/*.cshtml"", ""appsettings.json"", ""web.config""],
+ },
+ ""dependencies"": {
+ ""Microsoft.AspNetCore.Mvc"" : {
+ ""version"": ""1.0.0""
+ }
+ },
+ ""frameworks"": {
+ ""netcoreapp1.0"": {}
+ }
+ }");
+
+ mockProj.Items.Count(i => i.ItemType.Equals("None", StringComparison.Ordinal)).Should().Be(0);
+ }
+
private void WriteFilesInProjectDirectory(string testDirectory)
{
Directory.CreateDirectory(Path.Combine(testDirectory, "root"));
diff --git a/test/dotnet-migrate.Tests/GivenThatIWantMigratedAppsToBinplaceContent.cs b/test/dotnet-migrate.Tests/GivenThatIWantMigratedAppsToBinplaceContent.cs
new file mode 100644
index 000000000..4bbaa33ef
--- /dev/null
+++ b/test/dotnet-migrate.Tests/GivenThatIWantMigratedAppsToBinplaceContent.cs
@@ -0,0 +1,127 @@
+// 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.Build.Construction;
+using Microsoft.DotNet.TestFramework;
+using Microsoft.DotNet.Tools.Common;
+using Microsoft.DotNet.Tools.Test.Utilities;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+using FluentAssertions;
+using System.IO;
+using Microsoft.DotNet.Tools.Migrate;
+using BuildCommand = Microsoft.DotNet.Tools.Test.Utilities.BuildCommand;
+using System.Runtime.Loader;
+using Newtonsoft.Json.Linq;
+
+using MigrateCommand = Microsoft.DotNet.Tools.Migrate.MigrateCommand;
+
+namespace Microsoft.DotNet.Migration.Tests
+{
+ public class GivenThatIWantMigratedAppsToBinplaceContent : TestBase
+ {
+ [Fact(Skip="Unblocking CI")]
+ public void ItBinplacesContentOnBuildForConsoleApps()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson("TestAppWithContents")
+ .CreateInstance()
+ .WithSourceFiles()
+ .WithRestoreFiles()
+ .WithEmptyGlobalJson()
+ .Root;
+
+ new TestCommand("dotnet")
+ .WithForwardingToConsole()
+ .Execute($"migrate {projectDirectory.FullName}")
+ .Should()
+ .Pass();
+
+ var command = new RestoreCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute()
+ .Should()
+ .Pass();
+
+ var result = new BuildCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .ExecuteWithCapturedOutput()
+ .Should()
+ .Pass();
+
+ var outputDir = projectDirectory.GetDirectory("bin", "Debug", "netcoreapp1.0");
+ outputDir.Should().Exist().And.HaveFile("testcontentfile.txt");
+ outputDir.GetDirectory("dir").Should().Exist().And.HaveFile("mappingfile.txt");
+ }
+
+ [Fact(Skip="Unblocking CI")]
+ public void ItBinplacesContentOnPublishForConsoleApps()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson("TestAppWithContents")
+ .CreateInstance()
+ .WithSourceFiles()
+ .WithRestoreFiles()
+ .WithEmptyGlobalJson()
+ .Root;
+
+ new TestCommand("dotnet")
+ .WithForwardingToConsole()
+ .Execute($"migrate {projectDirectory.FullName}")
+ .Should()
+ .Pass();
+
+ var command = new RestoreCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute()
+ .Should()
+ .Pass();
+
+ var result = new PublishCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .ExecuteWithCapturedOutput()
+ .Should()
+ .Pass();
+
+ var publishDir = projectDirectory.GetDirectory("bin", "Debug", "netcoreapp1.0", "publish");
+ publishDir.Should().Exist().And.HaveFile("testcontentfile.txt");
+ publishDir.GetDirectory("dir").Should().Exist().And.HaveFile("mappingfile.txt");
+ }
+
+ [Fact(Skip="CI does not have NPM, which is required for the publish of this app.")]
+ public void ItBinplacesContentOnPublishForWebApps()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson("ProjectJsonWebTemplate")
+ .CreateInstance()
+ .WithSourceFiles()
+ .WithRestoreFiles()
+ .WithEmptyGlobalJson()
+ .Root;
+
+ new TestCommand("dotnet")
+ .WithForwardingToConsole()
+ .Execute($"migrate {projectDirectory.FullName}")
+ .Should()
+ .Pass();
+
+ var command = new RestoreCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute()
+ .Should()
+ .Pass();
+
+ var result = new PublishCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .ExecuteWithCapturedOutput()
+ .Should()
+ .Pass();
+
+ var publishDir = projectDirectory.GetDirectory("bin", "Debug", "netcoreapp1.0", "publish");
+ publishDir.Should().Exist().And.HaveFile("README.md");
+ publishDir.GetDirectory("wwwroot").Should().Exist();
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/dotnet-migrate.Tests/GivenThatIWantMigratedAppsToPackContent.cs b/test/dotnet-migrate.Tests/GivenThatIWantMigratedAppsToPackContent.cs
new file mode 100644
index 000000000..dabb842c7
--- /dev/null
+++ b/test/dotnet-migrate.Tests/GivenThatIWantMigratedAppsToPackContent.cs
@@ -0,0 +1,62 @@
+// 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.Build.Construction;
+using Microsoft.DotNet.TestFramework;
+using Microsoft.DotNet.Tools.Common;
+using Microsoft.DotNet.Tools.Test.Utilities;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+using FluentAssertions;
+using System.IO;
+using System.IO.Compression;
+using Microsoft.DotNet.Tools.Migrate;
+using BuildCommand = Microsoft.DotNet.Tools.Test.Utilities.BuildCommand;
+using System.Runtime.Loader;
+using Newtonsoft.Json.Linq;
+
+using MigrateCommand = Microsoft.DotNet.Tools.Migrate.MigrateCommand;
+
+namespace Microsoft.DotNet.Migration.Tests
+{
+ public class GivenThatIWantMigratedAppsToPackContent : TestBase
+ {
+ [Fact(Skip="Unblocking CI")]
+ public void ItPacksContentForLibraries()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson("PJTestLibraryWithConfiguration")
+ .CreateInstance()
+ .WithSourceFiles()
+ .WithRestoreFiles()
+ .WithEmptyGlobalJson()
+ .Root;
+
+ new TestCommand("dotnet")
+ .WithForwardingToConsole()
+ .Execute($"migrate {projectDirectory.FullName}")
+ .Should()
+ .Pass();
+
+ var command = new RestoreCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute()
+ .Should()
+ .Pass();
+
+ var result = new PackCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .ExecuteWithCapturedOutput()
+ .Should()
+ .Pass();
+
+ using (var archive = ZipFile.OpenRead(
+ Path.Combine(projectDirectory.FullName, "bin", "debug", "PJTestLibraryWithConfiguration.1.0.0.nupkg")))
+ {
+ archive.Entries.Select(e => e.FullName).Should().Contain("dir/contentitem.txt");
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/dotnet-migrate.Tests/GivenThatIWantToMigrateDeprecatedProjects.cs b/test/dotnet-migrate.Tests/GivenThatIWantToMigrateDeprecatedProjects.cs
index 92b05a9f7..41bead4a3 100644
--- a/test/dotnet-migrate.Tests/GivenThatIWantToMigrateDeprecatedProjects.cs
+++ b/test/dotnet-migrate.Tests/GivenThatIWantToMigrateDeprecatedProjects.cs
@@ -224,10 +224,10 @@ namespace Microsoft.DotNet.Migration.Tests
outputDir.Should().Exist()
.And.HaveFiles(new[]
{
- "ContentFile1.txt",
- "ContentFile2.txt",
- "ContentFileBuiltIn1.txt",
- "ContentFileBuiltIn2.txt",
+ "ContentFile1.txt1",
+ "ContentFile2.txt1",
+ "ContentFileBuiltIn1.txt1",
+ "ContentFileBuiltIn2.txt1",
"IncludeThis.txt",
});
Directory.Exists(Path.Combine(outputDir.FullName, "ExcludeThis1.txt")).Should().BeFalse();
@@ -237,10 +237,10 @@ namespace Microsoft.DotNet.Migration.Tests
publishDir.Should().Exist()
.And.HaveFiles(new[]
{
- "ContentFile1.txt",
- "ContentFile2.txt",
- "ContentFileBuiltIn1.txt",
- "ContentFileBuiltIn2.txt",
+ "ContentFile1.txt1",
+ "ContentFile2.txt1",
+ "ContentFileBuiltIn1.txt1",
+ "ContentFileBuiltIn2.txt1",
"IncludeThis.txt",
});
Directory.Exists(Path.Combine(publishDir.FullName, "ExcludeThis1.txt")).Should().BeFalse();