Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan McGovern <alan@xamarin.com>2014-01-29 00:40:25 +0400
committerAlan McGovern <alan@xamarin.com>2014-01-29 00:40:25 +0400
commitd5611e8dc60099b979f3f371c84fc28f581302f6 (patch)
tree79274409d798fccf159e3d2412df477d1101d5fa /mcs/class/Microsoft.Build.Utilities
parentf25566d57beb37669573088b72028fedb6f180a9 (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')
-rw-r--r--mcs/class/Microsoft.Build.Utilities/Makefile2
-rw-r--r--mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TaskItem.cs9
-rw-r--r--mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/TaskItemTest.cs45
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");