Skip to content

Commit

Permalink
MatchOnMetadata PR feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
sfoslund committed Apr 17, 2020
1 parent f1c5d97 commit ea92b7f
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 36 deletions.
4 changes: 4 additions & 0 deletions ref/Microsoft.Build/net/Microsoft.Build.cs
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,10 @@ public GlobResult(Microsoft.Build.Construction.ProjectItemElement itemElement, S
public Microsoft.Build.Globbing.IMSBuildGlob MsBuildGlob { get { throw null; } set { } }
public System.Collections.Generic.IEnumerable<string> Removes { get { throw null; } set { } }
}
public static partial class MatchOnMetadataConstants
{
public const Microsoft.Build.Evaluation.MatchOnMetadataOptions MatchOnMetadataOptionsDefaultValue = Microsoft.Build.Evaluation.MatchOnMetadataOptions.CaseSensitive;
}
public enum MatchOnMetadataOptions
{
CaseInsensitive = 1,
Expand Down
4 changes: 4 additions & 0 deletions ref/Microsoft.Build/netstandard/Microsoft.Build.cs
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,10 @@ public GlobResult(Microsoft.Build.Construction.ProjectItemElement itemElement, S
public Microsoft.Build.Globbing.IMSBuildGlob MsBuildGlob { get { throw null; } set { } }
public System.Collections.Generic.IEnumerable<string> Removes { get { throw null; } set { } }
}
public static partial class MatchOnMetadataConstants
{
public const Microsoft.Build.Evaluation.MatchOnMetadataOptions MatchOnMetadataOptionsDefaultValue = Microsoft.Build.Evaluation.MatchOnMetadataOptions.CaseSensitive;
}
public enum MatchOnMetadataOptions
{
CaseInsensitive = 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ internal override void ExecuteTask(Lookup lookup)
HashSet<string> keepMetadata = null;
HashSet<string> removeMetadata = null;
HashSet<string> matchOnMetadata = null;
MatchOnMetadataOptions matchOnMetadataOptions = MatchOnMetadataOptions.CaseSensitive;
MatchOnMetadataOptions matchOnMetadataOptions = MatchOnMetadataConstants.MatchOnMetadataOptionsDefaultValue;

if (!String.IsNullOrEmpty(child.KeepMetadata))
{
Expand Down
38 changes: 11 additions & 27 deletions src/Build/Evaluation/ItemSpec.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,36 +89,20 @@ public override bool IsMatch(string itemToMatch)

public override bool IsMatchOnMetadata(IItem item, IEnumerable<string> metadata, MatchOnMetadataOptions options)
{
switch (options)
{
case MatchOnMetadataOptions.CaseSensitive:
return IsCaseSensitiveMetadataMatch(item, metadata, ReferencedItems);
case MatchOnMetadataOptions.CaseInsensitive:
return IsCaseInsensitiveMetadataMatch(item, metadata, ReferencedItems);
case MatchOnMetadataOptions.PathLike:
return IsPathLikeMetadataMatch(item, metadata, ReferencedItems, ProjectDirectory);
default:
ErrorUtilities.ThrowInternalErrorUnreachable();
return false;
}
}

private static bool IsCaseSensitiveMetadataMatch(IItem item, IEnumerable<string> metadata, List<ReferencedItem> referencedItems)
{
return referencedItems.Any(referencedItem =>
metadata.All(m => item.GetMetadataValue(m).Equals(referencedItem.Item.GetMetadataValue(m)) && !item.GetMetadataValue(m).Equals(string.Empty)));
}

private static bool IsCaseInsensitiveMetadataMatch(IItem item, IEnumerable<string> metadata, List<ReferencedItem> referencedItems)
{
return referencedItems.Any(referencedItem =>
metadata.All(m => String.Equals(item.GetMetadataValue(m), referencedItem.Item.GetMetadataValue(m), StringComparison.OrdinalIgnoreCase) && !item.GetMetadataValue(m).Equals(string.Empty)));
return ReferencedItems.Any(referencedItem =>
metadata.All(m => !item.GetMetadataValue(m).Equals(string.Empty) && MetadataComparer(options, item.GetMetadataValue(m), referencedItem.Item.GetMetadataValue(m))));
}

private static bool IsPathLikeMetadataMatch(IItem item, IEnumerable<string> metadata, List<ReferencedItem> referencedItems, string projectDirectory)
private bool MetadataComparer(MatchOnMetadataOptions options, string itemMetadata, string referencedItemMetadata)
{
return referencedItems.Any(referencedItem =>
metadata.All(m => !item.GetMetadataValue(m).Equals(string.Empty) && FileUtilities.ComparePathsNoThrow(item.GetMetadataValue(m), referencedItem.Item.GetMetadataValue(m), projectDirectory)));
if (options.Equals(MatchOnMetadataOptions.PathLike))
{
return FileUtilities.ComparePathsNoThrow(itemMetadata, referencedItemMetadata, ProjectDirectory);
}
else
{
return String.Equals(itemMetadata, referencedItemMetadata, options.Equals(MatchOnMetadataOptions.CaseInsensitive) ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
}
}

public override IMSBuildGlob ToMSBuildGlob()
Expand Down
4 changes: 4 additions & 0 deletions src/Build/Evaluation/LazyItemEvaluator.RemoveOperation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,4 +89,8 @@ public enum MatchOnMetadataOptions
CaseInsensitive,
PathLike
}

public static class MatchOnMetadataConstants {
public const MatchOnMetadataOptions MatchOnMetadataOptionsDefaultValue = MatchOnMetadataOptions.CaseSensitive;
}
}
9 changes: 1 addition & 8 deletions src/Shared/UnitTests/FileUtilities_Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -287,14 +287,7 @@ public void HasExtension_UsesOrdinalIgnoreCase()

var result = FileUtilities.HasExtension("foo.ini", new string[] { ".INI" });

if (FileUtilities.GetIsFileSystemCaseSensitive())
{
result.ShouldBeFalse();
}
else
{
result.ShouldBeTrue();
}
result.ShouldBe(!FileUtilities.GetIsFileSystemCaseSensitive());
}
finally
{
Expand Down

0 comments on commit ea92b7f

Please sign in to comment.