diff --git a/src/Build/BackEnd/Components/RequestBuilder/IntrinsicTasks/MSBuild.cs b/src/Build/BackEnd/Components/RequestBuilder/IntrinsicTasks/MSBuild.cs index 59193af2a5e..f61dc9a0c76 100644 --- a/src/Build/BackEnd/Components/RequestBuilder/IntrinsicTasks/MSBuild.cs +++ b/src/Build/BackEnd/Components/RequestBuilder/IntrinsicTasks/MSBuild.cs @@ -316,8 +316,9 @@ public async Task ExecuteInternal() { ITaskItem project = Projects[i]; - AbsolutePath projectPath = TaskEnvironment.GetAbsolutePath(FileUtilities.AttemptToShortenPath(project.ItemSpec)); - + AbsolutePath projectPath = FrameworkFileUtilities.FixFilePath( + TaskEnvironment.GetAbsolutePath(project.ItemSpec).GetCanonicalForm()); + if (StopOnFirstFailure && !success) { // Inform the user that we skipped the remaining projects because StopOnFirstFailure=true. diff --git a/src/Tasks.UnitTests/MSBuild_Tests.cs b/src/Tasks.UnitTests/MSBuild_Tests.cs index 9a17e9b848f..e3df4ac95e4 100644 --- a/src/Tasks.UnitTests/MSBuild_Tests.cs +++ b/src/Tasks.UnitTests/MSBuild_Tests.cs @@ -75,6 +75,7 @@ public void ProjectItemSpecTooLong() { MSBuild msbuildTask = new MSBuild { + TaskEnvironment = TaskEnvironmentHelper.CreateForTest(), BuildEngine = new MockEngine(_testOutput), Projects = new ITaskItem[] { new TaskItem(projectFile1) } @@ -123,6 +124,7 @@ public void OutputItemsAreTaggedWithProjectFileAndTargetName() try { MSBuild msbuildTask = new MSBuild(); + msbuildTask.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); msbuildTask.BuildEngine = new MockEngine(); msbuildTask.Projects = new ITaskItem[] { new TaskItem(projectFile1), new TaskItem(projectFile2) }; @@ -519,6 +521,7 @@ public void DifferentGlobalPropertiesWithDefault() projects[3].SetMetadata("Properties", "MyProp=1"); MSBuild msbuildTask = new MSBuild(); + msbuildTask.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); msbuildTask.BuildEngine = new MockEngine(); msbuildTask.Projects = projects; msbuildTask.Properties = new string[] { "MyProp=0" }; @@ -577,6 +580,7 @@ public void DifferentGlobalPropertiesWithoutDefault() projects[3].SetMetadata("Properties", "MyProp=1"); MSBuild msbuildTask = new MSBuild(); + msbuildTask.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); msbuildTask.BuildEngine = new MockEngine(); msbuildTask.Projects = projects; @@ -633,6 +637,7 @@ public void DifferentGlobalPropertiesWithBlanks() projects[3].SetMetadata("Properties", "MyProp=1"); MSBuild msbuildTask = new MSBuild(); + msbuildTask.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); msbuildTask.BuildEngine = new MockEngine(); msbuildTask.Projects = projects; @@ -688,6 +693,7 @@ public void DifferentGlobalPropertiesInvalid() projects[3].SetMetadata("Properties", "=;1"); MSBuild msbuildTask = new MSBuild(); + msbuildTask.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); msbuildTask.BuildEngine = new MockEngine(); msbuildTask.Projects = projects; @@ -735,6 +741,7 @@ public void DifferentAdditionalPropertiesWithDefault() projects[1].SetMetadata("AdditionalProperties", "MyPropA=0"); MSBuild msbuildTask = new MSBuild(); + msbuildTask.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); msbuildTask.BuildEngine = new MockEngine(); msbuildTask.Properties = new string[] { "MyPropG=1" }; msbuildTask.Projects = projects; @@ -794,6 +801,7 @@ public void DifferentAdditionalPropertiesWithGlobalProperties() projects[1].SetMetadata("Properties", "MyPropG=0"); MSBuild msbuildTask = new MSBuild(); + msbuildTask.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); msbuildTask.BuildEngine = new MockEngine(); msbuildTask.Projects = projects; @@ -849,6 +857,7 @@ public void DifferentAdditionalPropertiesWithoutDefault() projects[1].SetMetadata("AdditionalProperties", "MyPropA=1"); MSBuild msbuildTask = new MSBuild(); + msbuildTask.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); msbuildTask.BuildEngine = new MockEngine(); msbuildTask.Projects = projects; @@ -907,6 +916,7 @@ public void TargetsWithSeparationChars() }; MSBuild msbuildTask = new MSBuild(); + msbuildTask.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); msbuildTask.BuildEngine = new MockEngine(); msbuildTask.Projects = projects; @@ -957,6 +967,7 @@ public void StopOnFirstFailureandBuildInParallelSingleNode() for (int i = 0; i < 4; i++) { MSBuild msbuildTask = new MSBuild(); + msbuildTask.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); // By default IsMultipleNodesIs false MockEngine mockEngine = new MockEngine(); mockEngine.IsRunningMultipleNodes = false; @@ -1059,6 +1070,7 @@ public void StopOnFirstFailureandBuildInParallelMultipleNode() for (int i = 0; i < 4; i++) { MSBuild msbuildTask = new MSBuild(); + msbuildTask.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine mockEngine = new MockEngine(); mockEngine.IsRunningMultipleNodes = true; msbuildTask.BuildEngine = mockEngine; @@ -1157,6 +1169,7 @@ public void SkipRemainingProjects() }; MSBuild msbuildTask = new MSBuild(); + msbuildTask.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine mockEngine = new MockEngine(); mockEngine.IsRunningMultipleNodes = true; msbuildTask.BuildEngine = mockEngine; @@ -1174,6 +1187,7 @@ public void SkipRemainingProjects() }; msbuildTask = new MSBuild(); + msbuildTask.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); mockEngine = new MockEngine(); mockEngine.IsRunningMultipleNodes = true; msbuildTask.BuildEngine = mockEngine; @@ -1221,6 +1235,7 @@ public void TargetStopOnFirstFailureBuildInParallel() { // Test the case where the error is in the last target MSBuild msbuildTask = new MSBuild(); + msbuildTask.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine mockEngine = new MockEngine(); msbuildTask.BuildEngine = mockEngine; msbuildTask.Projects = projects; @@ -1338,6 +1353,7 @@ public void PropertiesWithSeparationChars() }; MSBuild msbuildTask = new MSBuild(); + msbuildTask.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); msbuildTask.BuildEngine = new MockEngine(); msbuildTask.Projects = projects; diff --git a/src/Tasks/CallTarget.cs b/src/Tasks/CallTarget.cs index 74acb20e7c3..671e380557e 100644 --- a/src/Tasks/CallTarget.cs +++ b/src/Tasks/CallTarget.cs @@ -15,6 +15,7 @@ namespace Microsoft.Build.Tasks /// id validation checks to fail. /// [RunInMTA] + [MSBuildMultiThreadableTask] public class CallTarget : TaskExtension { #region Properties diff --git a/src/Tasks/MSBuild.cs b/src/Tasks/MSBuild.cs index d3c24bd0f1d..93a55acd5c9 100644 --- a/src/Tasks/MSBuild.cs +++ b/src/Tasks/MSBuild.cs @@ -19,7 +19,8 @@ namespace Microsoft.Build.Tasks /// RequestBuilder which spawned them. /// [RunInMTA] - public class MSBuild : TaskExtension + [MSBuildMultiThreadableTask] + public class MSBuild : TaskExtension, IMultiThreadableTask { /// /// Enum describing the behavior when a project doesn't exist on disk. @@ -187,6 +188,9 @@ public string SkipNonexistentProjects /// public string[] TargetAndPropertyListSeparators { get; set; } + /// + public TaskEnvironment TaskEnvironment { get; set; } + #endregion #region ITask Members @@ -276,7 +280,8 @@ public override bool Execute() { ITaskItem project = Projects[i]; - string projectPath = FileUtilities.AttemptToShortenPath(project.ItemSpec); + AbsolutePath projectPath = FrameworkFileUtilities.FixFilePath( + TaskEnvironment.GetAbsolutePath(project.ItemSpec).GetCanonicalForm()); if (StopOnFirstFailure && !success) {