Merge pull request #3979 from radical/fix-xbuild-tgt
authorAnkit Jain <radical@gmail.com>
Thu, 17 Nov 2016 18:22:49 +0000 (13:22 -0500)
committerGitHub <noreply@github.com>
Thu, 17 Nov 2016 18:22:49 +0000 (13:22 -0500)
[xbuild] Handle a repeat build of a target, when building through ..

mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs
mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/TargetTest.cs

index 33aad3dea63adebda939e6604a84411ba36560dc..b4ed8562382595c92f99c2b474a5c9ecc4043757 100644 (file)
@@ -374,10 +374,8 @@ namespace Microsoft.Build.BuildEngine {
                                return false;
 
                        ITaskItem[] outputs;
-                       if (ParentEngine.BuiltTargetsOutputByName.TryGetValue (key, out outputs)) {
-                               if (targetOutputs != null)
-                                       targetOutputs.Add (target_name, outputs);
-                       }
+                       if (targetOutputs != null && ParentEngine.BuiltTargetsOutputByName.TryGetValue (key, out outputs))
+                               targetOutputs [target_name] = outputs;
                        return true;
                }
 
index 8f2aa2e7b28daf2b2f4f41ae052bae1b3097e233..d36ae158701c0db1fa8a9243e154b77e399d63bd 100644 (file)
@@ -285,6 +285,51 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                        t [0].RemoveTask (null);
                }
 
+               [Test]
+               public void TestRunTargetTwice ()
+               {
+                       string documentString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                       <Target Name=""Foo"">
+                               <Message Text=""Foo ran""/>
+                       </Target>
+                       <Target Name=""Main"">
+                               <MSBuild Projects=""$(MSBuildProjectFile)"" Targets=""Foo;Foo"" />
+                       </Target>
+
+               </Project>";
+
+                       var filepath = Path.GetTempFileName ();
+                       try {
+                               File.WriteAllText (filepath, documentString);
+
+                               var engine = new Engine (Consts.BinPath);
+                               var project = engine.CreateNewProject ();
+                               project.Load (filepath);
+
+                               var logger = new TestMessageLogger ();
+                               engine.RegisterLogger (logger);
+
+                               var result = project.Build ("Main");
+                               if (!result) {
+                                       logger.DumpMessages ();
+                                       Assert.Fail ("Build failed, see the logs");
+                               }
+
+                               Assert.AreEqual(1, logger.NormalMessageCount, "Expected number of messages");
+                               logger.CheckLoggedMessageHead ("Foo ran", "A1");
+
+                               Assert.AreEqual(0, logger.NormalMessageCount, "Extra messages found");
+                               Assert.AreEqual(0, logger.WarningMessageCount, "Extra warning messages found");
+
+                               Assert.AreEqual(2, logger.TargetStarted, "TargetStarted count");
+                               Assert.AreEqual(2, logger.TargetFinished, "TargetFinished count");
+
+                               Assert.IsTrue (result);
+                       } finally {
+                               File.Delete (filepath);
+                       }
+               }
+
                [Test]
                public void TestTargetOutputs1 ()
                {