Merge pull request #5831 from livarcocc/migrate_content
[WIP] Migrate content
This commit is contained in:
commit
8986198501
27 changed files with 1338 additions and 305 deletions
|
@ -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",
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Random content.
|
|
@ -17,5 +17,13 @@
|
|||
},
|
||||
"frameworks": {
|
||||
"netstandard1.5": {}
|
||||
},
|
||||
"packOptions": {
|
||||
"files": {
|
||||
"include": ["contentitem.txt"],
|
||||
"mappings": {
|
||||
"dir/contentitem.txt": "contentitem.txt"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -97,7 +97,8 @@
|
|||
"wwwroot",
|
||||
"**/*.cshtml",
|
||||
"appsettings.json",
|
||||
"web.config"
|
||||
"web.config",
|
||||
"README.md"
|
||||
]
|
||||
},
|
||||
|
||||
|
|
|
@ -84,7 +84,6 @@
|
|||
<VersionPrefix>$(CliVersionPrefix)</VersionPrefix>
|
||||
<VersionSuffix>$(VersionSuffix)</VersionSuffix>
|
||||
<Clean>True</Clean>
|
||||
<MsbuildArgs>/p:RuntimeIdentifier=$(CoreCLRRid)</MsbuildArgs>
|
||||
</BaseTestPackageProject>
|
||||
<BaseTestPackageProject Include="TestAssets/TestPackages/dotnet-desktop-binding-redirects"
|
||||
Condition=" '$(IsDesktopAvailable)' == 'True' ">
|
||||
|
@ -96,7 +95,6 @@
|
|||
<VersionPrefix>$(CliVersionPrefix)</VersionPrefix>
|
||||
<VersionSuffix>$(VersionSuffix)</VersionSuffix>
|
||||
<Clean>True</Clean>
|
||||
<MsbuildArgs>/p:RuntimeIdentifier=$(CoreCLRRid)</MsbuildArgs>
|
||||
</BaseTestPackageProject>
|
||||
<BaseTestPackageProject Include="TestAssets/TestPackages/dotnet-hello/v1/dotnet-hello">
|
||||
<Name>dotnet-hello</Name>
|
||||
|
|
|
@ -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} }}";
|
||||
|
|
|
@ -14,7 +14,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration
|
|||
public static IEnumerable<string> GetEncompassedIncludes(this ProjectItemElement item,
|
||||
ProjectItemElement otherItem, TextWriter trace = null)
|
||||
{
|
||||
if (otherItem.IsEquivalentToExceptIncludeAndExclude(item, trace) &&
|
||||
if (otherItem.IsEquivalentToExceptIncludeUpdateAndExclude(item, trace) &&
|
||||
new HashSet<string>(otherItem.Excludes()).IsSubsetOf(new HashSet<string>(item.Excludes())))
|
||||
{
|
||||
return otherItem.IntersectIncludes(item);
|
||||
|
@ -23,6 +23,18 @@ namespace Microsoft.DotNet.ProjectJsonMigration
|
|||
return Enumerable.Empty<string>();
|
||||
}
|
||||
|
||||
public static IEnumerable<string> GetEncompassedUpdates(this ProjectItemElement item,
|
||||
ProjectItemElement otherItem, TextWriter trace = null)
|
||||
{
|
||||
if (otherItem.IsEquivalentToExceptIncludeUpdateAndExclude(item, trace) &&
|
||||
new HashSet<string>(otherItem.Excludes()).IsSubsetOf(new HashSet<string>(item.Excludes())))
|
||||
{
|
||||
return otherItem.IntersectUpdates(item);
|
||||
}
|
||||
|
||||
return Enumerable.Empty<string>();
|
||||
}
|
||||
|
||||
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<string> Updates(
|
||||
this ProjectItemElement item)
|
||||
{
|
||||
return SplitSemicolonDelimitedValues(item.Update);
|
||||
}
|
||||
|
||||
public static IEnumerable<string> Excludes(
|
||||
this ProjectItemElement item)
|
||||
{
|
||||
|
@ -141,6 +165,11 @@ namespace Microsoft.DotNet.ProjectJsonMigration
|
|||
return item.Includes().Intersect(otherItem.Includes());
|
||||
}
|
||||
|
||||
public static IEnumerable<string> IntersectUpdates(this ProjectItemElement item, ProjectItemElement otherItem)
|
||||
{
|
||||
return item.Updates().Intersect(otherItem.Updates());
|
||||
}
|
||||
|
||||
public static IEnumerable<string> 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<string> updatesToRemove)
|
||||
{
|
||||
item.Update = string.Join(";", item.Updates().Except(updatesToRemove));
|
||||
}
|
||||
|
||||
public static void UnionIncludes(this ProjectItemElement item, IEnumerable<string> includesToAdd)
|
||||
{
|
||||
item.Include = string.Join(";", item.Includes().Union(includesToAdd));
|
||||
|
|
|
@ -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<string>();
|
||||
|
||||
IncludeFiles = ExcludeFiles;
|
||||
ExcludeFiles = new List<string>();
|
||||
|
||||
BuiltInsInclude = BuiltInsExclude;
|
||||
BuiltInsExclude = new List<string>();
|
||||
|
||||
if (Mappings != null)
|
||||
{
|
||||
var newMappings = new Dictionary<string, IncludeContext>();
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -39,6 +39,7 @@ namespace Microsoft.DotNet.Internal.ProjectModel.Files
|
|||
CustomRemovePatterns = new List<string>();
|
||||
SourceBasePath = sourceBasePath;
|
||||
Option = option;
|
||||
RawObject = rawObject;
|
||||
var token = rawObject.Value<JToken>(option);
|
||||
|
||||
if (token == null)
|
||||
|
@ -117,19 +118,21 @@ namespace Microsoft.DotNet.Internal.ProjectModel.Files
|
|||
|
||||
public List<string> CustomRemovePatterns { get; }
|
||||
|
||||
public List<string> IncludePatterns { get; }
|
||||
public List<string> IncludePatterns { get; protected set; }
|
||||
|
||||
public List<string> ExcludePatterns { get; }
|
||||
public List<string> ExcludePatterns { get; protected set; }
|
||||
|
||||
public List<string> IncludeFiles { get; }
|
||||
public List<string> IncludeFiles { get; protected set; }
|
||||
|
||||
public List<string> ExcludeFiles { get; }
|
||||
public List<string> ExcludeFiles { get; protected set; }
|
||||
|
||||
public List<string> BuiltInsInclude { get; }
|
||||
public List<string> BuiltInsInclude { get; protected set; }
|
||||
|
||||
public List<string> BuiltInsExclude { get; }
|
||||
public List<string> BuiltInsExclude { get; protected set; }
|
||||
|
||||
public IDictionary<string, IncludeContext> Mappings { get; }
|
||||
public IDictionary<string, IncludeContext> Mappings { get; protected set; }
|
||||
|
||||
public JObject RawObject { get; }
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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<Project> GenerateRuntimeConfigurationFilesTransform =>
|
||||
|
@ -194,6 +201,12 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
|
|||
return copyToOutputFilesTransform.Transform(GetCopyToOutputIncludeContext(compilerOptions, projectDirectory));
|
||||
};
|
||||
|
||||
private Func<CommonCompilerOptions, string, ProjectType, IEnumerable<ProjectItemElement>> 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))
|
||||
|
|
|
@ -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<AddItemTransform<IncludeContext>, string, AddItemTransform<IncludeContext>> _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())
|
||||
{
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<string>(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<string>(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<string>(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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 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.
|
||||
/// </summary>
|
||||
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<ProjectMetadataElement> MergeMetadata(
|
||||
ICollection<ProjectMetadataElement> existingMetadataElements,
|
||||
ICollection<ProjectMetadataElement> newMetadataElements)
|
||||
{
|
||||
var mergedMetadata = new List<ProjectMetadataElement>(existingMetadataElements);
|
||||
var mergedMetadata = new List<ProjectMetadataElement>(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<ProjectItemElement> 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<ProjectItemElement> 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
|
||||
|
|
|
@ -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<string, AddItemTransform<IncludeContext>> IncludeExcludeTransformGetter =>
|
||||
(itemName) => new AddItemTransform<IncludeContext>(
|
||||
|
@ -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<IncludeContext, bool> condition = null) : base(itemName, transformMappings, condition)
|
||||
Func<IncludeContext, bool> condition = null,
|
||||
Func<string, bool> excludePatternsRule = null) : base(
|
||||
itemName,
|
||||
transformMappings,
|
||||
condition,
|
||||
excludePatternsRule: excludePatternsRule)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,12 +20,12 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Transforms
|
|||
new AddItemTransform<IncludeContext>(
|
||||
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<string, AddItemTransform<IncludeContext>> IncludeExcludeTransformGetter =>
|
||||
(itemName) => new AddItemTransform<IncludeContext>(
|
||||
|
@ -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<string, bool> _excludePatternRule;
|
||||
protected Func<string, bool> ExcludePatternRule { get; }
|
||||
private bool _emitBuiltInIncludes;
|
||||
private readonly List<ItemMetadataValue<IncludeContext>> _metadata = new List<ItemMetadataValue<IncludeContext>>();
|
||||
|
||||
|
@ -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) =>
|
||||
{
|
||||
|
|
|
@ -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"": {
|
||||
""<group>"": [""root"", ""src"", ""rootfile.cs""]
|
||||
}
|
||||
}".Replace("<group>", 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");
|
||||
}
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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<string>();
|
||||
var defaultExcludePatterns = Enumerable.Empty<string>();
|
||||
|
||||
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<string>();
|
||||
var defaultExcludePatterns = Enumerable.Empty<string>();
|
||||
|
||||
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"));
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue