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:
authorJonathan Pryor <jonpryor@vt.edu>2013-03-07 07:36:24 +0400
committerJonathan Pryor <jonpryor@vt.edu>2013-03-07 07:42:08 +0400
commit2d37d81770e4e4e822e1b076eb525f1591f9521a (patch)
tree737fc6b04924916689682128bcfd036645d31399 /mcs/class/Microsoft.Build.Engine
parent0ff40ae70aa2ffbdf61a9ebb5e47e4932864460a (diff)
[xbuild] Replace string.ToLower() comparison with OrdinalIgnoreCase comparison
Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=10946 The scenario is the "turkish-i problem": Have an MSBuild Task Assembly which calls ITaskItem.GetMetadata("Identity") (like, oh, the Xamarin.Android build system...). Run in a Turkish locale (tr-TR), and things fail badly: Error executing task AndroidComputeResPaths: System.ArgumentException: Invalid reserved metadata name at Mono.XBuild.Utilities.ReservedNameUtils.GetReservedMetadata (System.String itemSpec, System.String metadataName, IDictionary metadata) [0x00000] in <filename unknown>:0 at Microsoft.Build.Utilities.TaskItem.GetMetadata (System.String metadataName) [0x00000] in <filename unknown>:0 at Xamarin.Android.Tasks.AndroidComputeResPaths.Execute () [0x00000] in <filename unknown>:0 at Microsoft.Build.BuildEngine.TaskEngine.Execute () [0x00000] in <filename unknown>:0 at Microsoft.Build.BuildEngine.BuildTask.Execute () [0x00000] in <filename unknown>:0 Wat? Well, in tr-TR, "Identity".ToLower() is "ıdentity", which doesn't match match anything in GetReservedMetadata()'s `switch` statement, so it throws an ArgumentException. *BOOM*. So, if you need a culture-invariant comparison, USE IT. Related: We could have just s/ToLower/ToLowerInvariant/g, which would have fixed the problem, but would still result in lots of string temporaries that aren't really necessary. Use the appropriate string.Compare() or string.Equals() methods instead to avoid the string temporary as well.
Diffstat (limited to 'mcs/class/Microsoft.Build.Engine')
-rw-r--r--mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs8
-rw-r--r--mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConsoleLogger.cs2
-rw-r--r--mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs2
3 files changed, 8 insertions, 4 deletions
diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs
index feac4e68333..3421813ce8d 100644
--- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs
+++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs
@@ -125,7 +125,9 @@ namespace Microsoft.Build.BuildEngine {
{
if (ReservedNameUtils.IsReservedMetadataName (metadataName)) {
string metadata = ReservedNameUtils.GetReservedMetadata (FinalItemSpec, metadataName, evaluatedMetadata);
- return (metadataName.ToLower () == "fullpath") ? MSBuildUtils.Escape (metadata) : metadata;
+ return string.Equals (metadataName, "fullpath", StringComparison.OrdinalIgnoreCase)
+ ? MSBuildUtils.Escape (metadata)
+ : metadata;
}
if (evaluatedMetadata.Contains (metadataName))
@@ -138,7 +140,9 @@ namespace Microsoft.Build.BuildEngine {
{
if (ReservedNameUtils.IsReservedMetadataName (metadataName)) {
string metadata = ReservedNameUtils.GetReservedMetadata (FinalItemSpec, metadataName, unevaluatedMetadata);
- return (metadataName.ToLower () == "fullpath") ? MSBuildUtils.Escape (metadata) : metadata;
+ return string.Equals (metadataName, "fullpath", StringComparison.OrdinalIgnoreCase)
+ ? MSBuildUtils.Escape (metadata)
+ : metadata;
} else if (unevaluatedMetadata.Contains (metadataName))
return (string) unevaluatedMetadata [metadataName];
else
diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConsoleLogger.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConsoleLogger.cs
index 1b6b4003c04..2a62f4b388c 100644
--- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConsoleLogger.cs
+++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConsoleLogger.cs
@@ -149,7 +149,7 @@ namespace Microsoft.Build.BuildEngine {
bool TryParseConsoleColor (string color_str, ref ConsoleColor color)
{
- switch (color_str.ToLower ()) {
+ switch (color_str.ToLowerInvariant ()) {
case "black": color = ConsoleColor.Black; break;
case "blue": color = ConsoleColor.DarkBlue; break;
diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs
index e223bbc05cd..5c66cf72308 100644
--- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs
+++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs
@@ -390,7 +390,7 @@ namespace Microsoft.Build.BuildEngine {
internal string GetKeyForTarget (string target_name, bool include_global_properties)
{
// target name is case insensitive
- return fullFileName + ":" + target_name.ToLower () +
+ return fullFileName + ":" + target_name.ToLowerInvariant () +
(include_global_properties ? (":" + GlobalPropertiesToString (GlobalProperties))
: String.Empty);
}