diff options
author | Alan McGovern <alan@xamarin.com> | 2014-01-29 00:40:25 +0400 |
---|---|---|
committer | Alan McGovern <alan@xamarin.com> | 2014-01-29 00:40:25 +0400 |
commit | d5611e8dc60099b979f3f371c84fc28f581302f6 (patch) | |
tree | 79274409d798fccf159e3d2412df477d1101d5fa /mcs/class/Microsoft.Build.Utilities | |
parent | f25566d57beb37669573088b72028fedb6f180a9 (diff) |
[Microsoft.Build.Utilities] Fix the escaping/unescaping of ItemSpec
This should hopefully fix compilation of projects using files with
names like 'foo@2x.png' in various places like embedded resources
or content items which must be copied to the output directory.
With tests.
Diffstat (limited to 'mcs/class/Microsoft.Build.Utilities')
3 files changed, 50 insertions, 6 deletions
diff --git a/mcs/class/Microsoft.Build.Utilities/Makefile b/mcs/class/Microsoft.Build.Utilities/Makefile index 79888a2a3b4..0951df6adba 100644 --- a/mcs/class/Microsoft.Build.Utilities/Makefile +++ b/mcs/class/Microsoft.Build.Utilities/Makefile @@ -13,7 +13,7 @@ LIB_MCS_FLAGS = \ /r:System.dll \ /r:$(XBUILD_FRAMEWORK) -TEST_MCS_FLAGS = /r:$(XBUILD_FRAMEWORK) -r:System.dll -r:System.Core.dll +TEST_MCS_FLAGS = /r:$(XBUILD_ENGINE) /r:$(XBUILD_FRAMEWORK) -r:System.dll -r:System.Core.dll include $(XBUILD_DIR)/xbuild_test.make include ../../build/library.make diff --git a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TaskItem.cs b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TaskItem.cs index a65cb37bedd..bbda9528245 100644 --- a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TaskItem.cs +++ b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TaskItem.cs @@ -64,7 +64,6 @@ namespace Microsoft.Build.Utilities if (itemSpec == null) throw new ArgumentNullException ("itemSpec"); - this.itemSpec = itemSpec; this.metadata = CollectionsUtil.CreateCaseInsensitiveHashtable (); // FIXME: hack @@ -108,9 +107,9 @@ namespace Microsoft.Build.Utilities public string GetMetadata (string metadataName) { if (ReservedNameUtils.IsReservedMetadataName (metadataName)) - return ReservedNameUtils.GetReservedMetadata (ItemSpec, metadataName, metadata); + return MSBuildUtils.Unescape (ReservedNameUtils.GetReservedMetadata (ItemSpec, metadataName, metadata)); else if (metadata.Contains (metadataName)) - return (string) metadata [metadataName]; + return MSBuildUtils.Unescape ((string)metadata [metadataName]); else return String.Empty; } @@ -153,8 +152,8 @@ namespace Microsoft.Build.Utilities } public string ItemSpec { - get { return itemSpec; } - set { itemSpec = value; } + get { return MSBuildUtils.Unescape (itemSpec); } + set { itemSpec = MSBuildUtils.Escape (value); } } public int MetadataCount { diff --git a/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/TaskItemTest.cs b/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/TaskItemTest.cs index 2032f7c3572..8f23aaba4e9 100644 --- a/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/TaskItemTest.cs +++ b/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/TaskItemTest.cs @@ -28,6 +28,7 @@ using System; using System.Collections; using System.Collections.Specialized; +using System.IO; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using NUnit.Framework; @@ -116,6 +117,50 @@ namespace MonoTests.Microsoft.Build.Utilities { } [Test] + public void TestCtor_EscapedSpecialChar () + { + // If we instantiate with the *escaped* metadata, it's unescaped automatically + var metadata = "foo@2x.png"; + var escapedMetadata = global::Microsoft.Build.BuildEngine.Utilities.Escape ("foo@2x.png"); + var item = new TaskItem (escapedMetadata); + item.SetMetadata ("mine", escapedMetadata); + + Assert.AreEqual (metadata, item.ItemSpec, "#1"); + Assert.AreEqual (metadata, item.GetMetadata ("Identity"), "#2"); + Assert.AreEqual (Path.GetFileNameWithoutExtension (metadata), item.GetMetadata ("FileName"), "#3"); + Assert.IsTrue (item.GetMetadata ("FullPath").EndsWith (metadata), "#4"); + Assert.AreEqual (metadata, item.GetMetadata ("mine"), "#5"); + } + + [Test] + public void TestCtor_EscapedSpecialChar_BrokenEscaping () + { + // This is badly escaped, but MSBuild does not care. + var metadata = "foo%4@2x.png"; + var item = new TaskItem (metadata); + + Assert.AreEqual (metadata, item.ItemSpec, "#1"); + Assert.AreEqual (metadata, item.GetMetadata ("Identity"), "#2"); + Assert.AreEqual (Path.GetFileNameWithoutExtension (metadata), item.GetMetadata ("FileName"), "#3"); + Assert.IsTrue (item.GetMetadata ("FullPath").EndsWith (metadata), "#4"); + } + + [Test] + public void TestCtor_UnescapedSpecialChar () + { + // If we instantiate with unescaped metadata, we get the same value back + var metadata = "foo@2x.png"; + var item = new TaskItem (metadata); + item.SetMetadata ("mine", metadata); + + Assert.AreEqual (metadata, item.ItemSpec, "#1"); + Assert.AreEqual (metadata, item.GetMetadata ("Identity"), "#2"); + Assert.AreEqual (Path.GetFileNameWithoutExtension (metadata), item.GetMetadata ("FileName"), "#3"); + Assert.IsTrue (item.GetMetadata ("FullPath").EndsWith (metadata), "#4"); + Assert.AreEqual (metadata, item.GetMetadata ("mine"), "#5"); + } + + [Test] public void TestCopyConstructor () { item1 = new TaskItem ("itemSpec"); |