From 198e553ae49884e54a7180405a344942a37bc28e Mon Sep 17 00:00:00 2001 From: Ankit Jain Date: Tue, 15 Feb 2011 20:08:05 +0530 Subject: [PATCH] [xbuild] Fix bug #671700, resource naming in presence of "Link". AssignTargetPath.cs: If 'Link' metadata is present, then use that as the target path. Add relevant test. --- .../Microsoft.Build.Tasks/AssignTargetPath.cs | 32 ++++++++----- .../AssignTargetPathTest.cs | 47 +++++++++++++++++++ 2 files changed, 66 insertions(+), 13 deletions(-) diff --git a/mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/AssignTargetPath.cs b/mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/AssignTargetPath.cs index 4b71e08ab7a..abec0635561 100644 --- a/mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/AssignTargetPath.cs +++ b/mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/AssignTargetPath.cs @@ -54,24 +54,30 @@ namespace Microsoft.Build.Tasks { assignedFiles = new ITaskItem [files.Length]; for (int i = 0; i < files.Length; i ++) { string file = files [i].ItemSpec; + string link = files [i].GetMetadata ("Link"); string afile = null; - //FIXME: Hack! - string normalized_root = Path.GetFullPath (rootFolder); - // cur dir should already be set to - // the project dir - file = Path.GetFullPath (file); + if (String.IsNullOrEmpty (link)) { + //FIXME: Hack! + string normalized_root = Path.GetFullPath (rootFolder); - if (file.StartsWith (normalized_root)) { - afile = Path.GetFullPath (file).Substring ( - normalized_root.Length); - // skip over "root/" - if (afile [0] == '\\' || - afile [0] == '/') - afile = afile.Substring (1); + // cur dir should already be set to + // the project dir + file = Path.GetFullPath (file); + if (file.StartsWith (normalized_root)) { + afile = Path.GetFullPath (file).Substring ( + normalized_root.Length); + // skip over "root/" + if (afile [0] == '\\' || + afile [0] == '/') + afile = afile.Substring (1); + + } else { + afile = Path.GetFileName (file); + } } else { - afile = Path.GetFileName (file); + afile = link; } assignedFiles [i] = new TaskItem (files [i]); diff --git a/mcs/class/Microsoft.Build.Tasks/Test/Microsoft.Build.Tasks/AssignTargetPathTest.cs b/mcs/class/Microsoft.Build.Tasks/Test/Microsoft.Build.Tasks/AssignTargetPathTest.cs index 959c8991b77..6524e0b1f2e 100755 --- a/mcs/class/Microsoft.Build.Tasks/Test/Microsoft.Build.Tasks/AssignTargetPathTest.cs +++ b/mcs/class/Microsoft.Build.Tasks/Test/Microsoft.Build.Tasks/AssignTargetPathTest.cs @@ -115,6 +115,53 @@ namespace MonoTests.Microsoft.Build.Tasks } } + [Test] + public void TestLink () + { + string projectText = @" + + + Cxyz.cs + Test\Link\xyz.cs + + + Crel\bar.resx + Test\Link\bar.resx + + + Crel\qwe.txt + ..\Test\Link\qwe.txt + + + + + + + + "; + Engine engine = new Engine(Consts.BinPath); + Project project = engine.CreateNewProject(); + + project.LoadXml(projectText); + + string id = "A"; + Assert.IsTrue(project.Build("1"), id + "1 : Error in building"); + + string [] files = new string [] { "xyz.cs", "rel/bar.resx", "rel/qwe.txt"}; + string [] assignedFiles = new string [] { "Test/Link/xyz.cs", "Test/Link/bar.resx", "../Test/Link/qwe.txt"}; + + BuildItemGroup include = project.GetEvaluatedItemsByName("FooPath"); + Assert.AreEqual(files.Length, include.Count, id + "2"); + + for (int i = 0; i < files.Length; i++) { + Assert.AreEqual (files [i], include [i].FinalItemSpec, id + "3, file #" + i); + Assert.IsTrue (include[i].HasMetadata ("TargetPath"), id + "4, file #" + i + ", TargetPath metadata missing"); + Assert.AreEqual (assignedFiles [i], include[i].GetMetadata("TargetPath"), id + "5, file #" + i); + Assert.IsTrue (include [i].HasMetadata ("Child"), id + "6, file #" + i + ", Child metadata missing"); + Assert.AreEqual ("C" + files [i], include [i].GetMetadata ("Child"), id + "7, file #" + i + ", Child metadata value incorrect"); + } + } + void CheckTargetPath(string[] files, string[] assignedFiles, string rootFolder, string id) { Engine engine = new Engine(Consts.BinPath); -- 2.25.1