From 0db67758ebff5728ede0e1b15b7e94691b77fbb1 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 2 Feb 2026 11:42:37 +0000
Subject: [PATCH 1/8] Initial plan
From a68aff3d26ecdca52cdc9ace75cf1b14ac6f6f54 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 2 Feb 2026 11:51:21 +0000
Subject: [PATCH 2/8] Migrate WriteCodeFragment task to use TaskEnvironment API
Co-authored-by: JanProvaznik <25267098+JanProvaznik@users.noreply.github.com>
---
.../WriteCodeFragment_Tests.cs | 29 +++++++++++++++++++
src/Tasks/WriteCodeFragment.cs | 25 ++++++++++++----
2 files changed, 49 insertions(+), 5 deletions(-)
diff --git a/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs b/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs
index 374df4ef58c..476918b0acb 100644
--- a/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs
+++ b/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs
@@ -5,6 +5,7 @@
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
+using Microsoft.Build.Framework;
using Microsoft.Build.Shared;
using Microsoft.Build.Tasks;
using Microsoft.Build.Utilities;
@@ -27,6 +28,7 @@ public class WriteCodeFragment_Tests
public void InvalidLanguage()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
task.Language = "xx";
@@ -44,6 +46,7 @@ public void InvalidLanguage()
public void NoLanguage()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
task.OutputFile = new TaskItem("foo");
@@ -60,6 +63,7 @@ public void NoLanguage()
public void NoFileOrDirectory()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
task.Language = "c#";
@@ -76,6 +80,7 @@ public void NoFileOrDirectory()
public void CombineFileDirectory()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
task.Language = "c#";
@@ -145,6 +150,7 @@ public void FileNameNoDirectory()
using TestEnvironment env = TestEnvironment.Create();
var file = env.ExpectFile(Directory.GetCurrentDirectory(), ".tmp");
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
task.Language = "c#";
@@ -167,6 +173,7 @@ public void FileNameNoDirectory()
public void DirectoryAndRootedFile()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
task.Language = "c#";
@@ -202,6 +209,7 @@ public void NoAttributesShouldEmitNoFile()
}
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
task.Language = "c#";
@@ -229,6 +237,7 @@ public void NoAttributesShouldEmitNoFile2()
}
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
task.Language = "c#";
@@ -248,6 +257,7 @@ public void NoAttributesShouldEmitNoFile2()
public void InvalidFilePath()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
task.Language = "c#";
@@ -266,6 +276,7 @@ public void InvalidFilePath()
public void InvalidDirectoryPath()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
task.Language = "c#";
@@ -288,6 +299,7 @@ public void OneAttributeNoParams()
try
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute = new TaskItem("System.AssemblyTrademarkAttribute");
@@ -317,6 +329,7 @@ public void OneAttributeNoParams()
public void OneAttributeNoParamsVb()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute = new TaskItem("System.AssemblyTrademarkAttribute");
@@ -340,6 +353,7 @@ public void OneAttributeNoParamsVb()
public void TwoAttributes()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute1 = new TaskItem("AssemblyTrademarkAttribute");
@@ -369,6 +383,7 @@ public void TwoAttributes()
public void ToDirectory()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute = new TaskItem("System.AssemblyTrademarkAttribute");
@@ -417,6 +432,7 @@ public void OneAttributeTwoParams()
try
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute");
@@ -448,6 +464,7 @@ public void OneAttributeTwoParams()
public void OneAttributeTwoParamsSameName()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute");
@@ -471,6 +488,7 @@ public void OneAttributeTwoParamsSameName()
public void OneAttributePositionalParamInvalidSuffix()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute");
@@ -494,6 +512,7 @@ public void OneAttributePositionalParamInvalidSuffix()
public void OneAttributeTwoPositionalParams()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute");
@@ -518,6 +537,7 @@ public void OneAttributeTwoPositionalParams()
public void OneAttributeTwoPositionalParamsWithSameValue()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute = new TaskItem("AssemblyMetadataAttribute");
@@ -550,6 +570,7 @@ public void MultilineAttributeCSharp()
var multilineString = String.Join(Environment.NewLine, lines);
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute = new TaskItem("System.Reflection.AssemblyDescriptionAttribute");
@@ -586,6 +607,7 @@ public void MultilineAttributeVB()
var multilineString = String.Join(Environment.NewLine, lines);
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute = new TaskItem("System.Reflection.AssemblyDescriptionAttribute");
@@ -619,6 +641,7 @@ public void MultilineAttributeVB()
public void OneAttributeSkippedPositionalParams()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute");
@@ -642,6 +665,7 @@ public void OneAttributeSkippedPositionalParams()
public void InvalidNumber()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute");
@@ -665,6 +689,7 @@ public void InvalidNumber()
public void NoNumber()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute");
@@ -688,6 +713,7 @@ public void NoNumber()
public void OneAttributePositionalAndNamedParams()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute");
@@ -721,6 +747,7 @@ public void OneAttributePositionalAndNamedParams()
public void OneAttributePositionalAndNamedParamsVisualBasic()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute");
@@ -1062,6 +1089,7 @@ public void InferredTypeFallsBackToStringWhenTypeConversionFails()
public void MessageDisplayPositionalParameterNameWhenAttributeNotFound()
{
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute = new TaskItem("System.TheAttributeCannotFound");
@@ -1101,6 +1129,7 @@ private WriteCodeFragment CreateTask(string language, TaskItem outputDirectory,
{
return new WriteCodeFragment()
{
+ TaskEnvironment = TaskEnvironmentHelper.CreateForTest(),
Language = language,
OutputDirectory = outputDirectory,
OutputFile = outputFile,
diff --git a/src/Tasks/WriteCodeFragment.cs b/src/Tasks/WriteCodeFragment.cs
index e45988febff..b83e7afdb99 100644
--- a/src/Tasks/WriteCodeFragment.cs
+++ b/src/Tasks/WriteCodeFragment.cs
@@ -30,8 +30,11 @@ namespace Microsoft.Build.Tasks
///
/// Currently only supports writing .NET attributes.
///
- public class WriteCodeFragment : TaskExtension
+ [MSBuildMultiThreadableTask]
+ public class WriteCodeFragment : TaskExtension, IMultiThreadableTask
{
+ ///
+ public TaskEnvironment TaskEnvironment { get; set; }
private const string TypeNameSuffix = "_TypeName";
private const string IsLiteralSuffix = "_IsLiteral";
private static readonly string[] NamespaceImports = ["System", "System.Reflection"];
@@ -104,6 +107,7 @@ public override bool Execute()
return true;
}
+ AbsolutePath outputFilePath = default;
try
{
if (OutputFile != null && OutputDirectory != null && !Path.IsPathRooted(OutputFile.ItemSpec))
@@ -111,16 +115,27 @@ public override bool Execute()
OutputFile = new TaskItem(Path.Combine(OutputDirectory.ItemSpec, OutputFile.ItemSpec));
}
- OutputFile ??= new TaskItem(FileUtilities.GetTemporaryFile(OutputDirectory.ItemSpec, null, extension));
+ if (OutputFile != null)
+ {
+ outputFilePath = FrameworkFileUtilities.NormalizePath(TaskEnvironment.GetAbsolutePath(OutputFile.ItemSpec));
+ }
+ else
+ {
+ AbsolutePath outputDirectoryPath = FrameworkFileUtilities.NormalizePath(TaskEnvironment.GetAbsolutePath(OutputDirectory.ItemSpec));
+ outputFilePath = new AbsolutePath(FileUtilities.GetTemporaryFile(outputDirectoryPath, null, extension), ignoreRootedCheck: true);
+ OutputFile = new TaskItem(outputFilePath.Value);
+ }
- FileUtilities.EnsureDirectoryExists(Path.GetDirectoryName(OutputFile.ItemSpec));
+ FileUtilities.EnsureDirectoryExists(Path.GetDirectoryName(outputFilePath.Value));
- File.WriteAllText(OutputFile.ItemSpec, code); // Overwrites file if it already exists (and can be overwritten)
+ File.WriteAllText(outputFilePath, code); // Overwrites file if it already exists (and can be overwritten)
}
catch (Exception ex) when (ExceptionHandling.IsIoRelatedException(ex))
{
string itemSpec = OutputFile?.ItemSpec ?? String.Empty;
- string lockedFileMessage = LockCheck.GetLockedFileMessage(itemSpec);
+ string lockedFileMessage = outputFilePath.Value != null
+ ? LockCheck.GetLockedFileMessage(outputFilePath)
+ : LockCheck.GetLockedFileMessage(itemSpec);
Log.LogErrorWithCodeFromResources("WriteCodeFragment.CouldNotWriteOutput", itemSpec, ex.Message, lockedFileMessage);
return false;
}
From 016d864bda168368ee77a786d42da1ef00c38ac9 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 4 Feb 2026 14:12:55 +0000
Subject: [PATCH 3/8] Address review feedback: remove NormalizePath and .Value
accesses
Co-authored-by: JanProvaznik <25267098+JanProvaznik@users.noreply.github.com>
---
src/Tasks/WriteCodeFragment.cs | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/Tasks/WriteCodeFragment.cs b/src/Tasks/WriteCodeFragment.cs
index b83e7afdb99..032a2a5b5d9 100644
--- a/src/Tasks/WriteCodeFragment.cs
+++ b/src/Tasks/WriteCodeFragment.cs
@@ -117,16 +117,16 @@ public override bool Execute()
if (OutputFile != null)
{
- outputFilePath = FrameworkFileUtilities.NormalizePath(TaskEnvironment.GetAbsolutePath(OutputFile.ItemSpec));
+ outputFilePath = TaskEnvironment.GetAbsolutePath(OutputFile.ItemSpec);
}
else
{
- AbsolutePath outputDirectoryPath = FrameworkFileUtilities.NormalizePath(TaskEnvironment.GetAbsolutePath(OutputDirectory.ItemSpec));
+ AbsolutePath outputDirectoryPath = TaskEnvironment.GetAbsolutePath(OutputDirectory.ItemSpec);
outputFilePath = new AbsolutePath(FileUtilities.GetTemporaryFile(outputDirectoryPath, null, extension), ignoreRootedCheck: true);
- OutputFile = new TaskItem(outputFilePath.Value);
+ OutputFile = new TaskItem(outputFilePath);
}
- FileUtilities.EnsureDirectoryExists(Path.GetDirectoryName(outputFilePath.Value));
+ FileUtilities.EnsureDirectoryExists(Path.GetDirectoryName(outputFilePath));
File.WriteAllText(outputFilePath, code); // Overwrites file if it already exists (and can be overwritten)
}
From 2f2bcf3cbdb86dc2e38440a0203e9a5755f08ad2 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 5 Feb 2026 11:19:57 +0000
Subject: [PATCH 4/8] Remove ignoreRootedCheck from AbsolutePath constructor
Co-authored-by: JanProvaznik <25267098+JanProvaznik@users.noreply.github.com>
---
src/Tasks/WriteCodeFragment.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Tasks/WriteCodeFragment.cs b/src/Tasks/WriteCodeFragment.cs
index 032a2a5b5d9..1752ff1286b 100644
--- a/src/Tasks/WriteCodeFragment.cs
+++ b/src/Tasks/WriteCodeFragment.cs
@@ -122,7 +122,7 @@ public override bool Execute()
else
{
AbsolutePath outputDirectoryPath = TaskEnvironment.GetAbsolutePath(OutputDirectory.ItemSpec);
- outputFilePath = new AbsolutePath(FileUtilities.GetTemporaryFile(outputDirectoryPath, null, extension), ignoreRootedCheck: true);
+ outputFilePath = new AbsolutePath(FileUtilities.GetTemporaryFile(outputDirectoryPath, null, extension));
OutputFile = new TaskItem(outputFilePath);
}
From a4329865082389bcce41abb449ccb3384051d8d0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Provazn=C3=ADk?=
Date: Fri, 6 Feb 2026 16:56:22 +0100
Subject: [PATCH 5/8] fix relative path directory edge case
---
src/Tasks/WriteCodeFragment.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Tasks/WriteCodeFragment.cs b/src/Tasks/WriteCodeFragment.cs
index 1752ff1286b..3ef980321f4 100644
--- a/src/Tasks/WriteCodeFragment.cs
+++ b/src/Tasks/WriteCodeFragment.cs
@@ -123,7 +123,7 @@ public override bool Execute()
{
AbsolutePath outputDirectoryPath = TaskEnvironment.GetAbsolutePath(OutputDirectory.ItemSpec);
outputFilePath = new AbsolutePath(FileUtilities.GetTemporaryFile(outputDirectoryPath, null, extension));
- OutputFile = new TaskItem(outputFilePath);
+ OutputFile = new TaskItem(Path.Combine(OutputDirectory.ItemSpec, Path.GetFileName(outputFilePath.Value)));
}
FileUtilities.EnsureDirectoryExists(Path.GetDirectoryName(outputFilePath));
From af34a815db3d9b16a692508b53cad6036a9fe3bc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Provazn=C3=ADk?=
Date: Fri, 6 Feb 2026 16:58:19 +0100
Subject: [PATCH 6/8] Update src/Tasks/WriteCodeFragment.cs
Co-authored-by: Rainer Sigwald
---
src/Tasks/WriteCodeFragment.cs | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/src/Tasks/WriteCodeFragment.cs b/src/Tasks/WriteCodeFragment.cs
index 3ef980321f4..d90f1c9c106 100644
--- a/src/Tasks/WriteCodeFragment.cs
+++ b/src/Tasks/WriteCodeFragment.cs
@@ -133,9 +133,7 @@ public override bool Execute()
catch (Exception ex) when (ExceptionHandling.IsIoRelatedException(ex))
{
string itemSpec = OutputFile?.ItemSpec ?? String.Empty;
- string lockedFileMessage = outputFilePath.Value != null
- ? LockCheck.GetLockedFileMessage(outputFilePath)
- : LockCheck.GetLockedFileMessage(itemSpec);
+ string lockedFileMessage = LockCheck.GetLockedFileMessage(outputFilePath.Value ?? itemSpec);
Log.LogErrorWithCodeFromResources("WriteCodeFragment.CouldNotWriteOutput", itemSpec, ex.Message, lockedFileMessage);
return false;
}
From fba0cca37deabbb937412894ce31428d84934fba Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 6 Feb 2026 16:05:28 +0000
Subject: [PATCH 7/8] Add test for relative OutputDirectory producing relative
OutputFile
Co-authored-by: JanProvaznik <25267098+JanProvaznik@users.noreply.github.com>
---
.../WriteCodeFragment_Tests.cs | 49 +++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs b/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs
index 476918b0acb..681d6c29f07 100644
--- a/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs
+++ b/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs
@@ -421,6 +421,55 @@ public void ToDirectoryAndDirectoryDoesNotExist()
Assert.Equal(".cs", task.OutputFile.ItemSpec.Substring(task.OutputFile.ItemSpec.Length - 3));
}
+ ///
+ /// When OutputDirectory is relative and OutputFile is not specified, the resulting OutputFile should be relative.
+ ///
+ [Fact]
+ public void RelativeOutputDirectoryProducesRelativeOutputFile()
+ {
+ using TestEnvironment env = TestEnvironment.Create();
+
+ // Create an actual folder and get a relative path to it
+ string absoluteFolder = env.CreateFolder().Path;
+ string relativeFolder = Path.GetFileName(absoluteFolder);
+
+ // Change current directory to the parent so the relative path works
+ string originalDir = Directory.GetCurrentDirectory();
+ try
+ {
+ Directory.SetCurrentDirectory(Path.GetDirectoryName(absoluteFolder));
+
+ WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
+ MockEngine engine = new MockEngine(true);
+ task.BuildEngine = engine;
+ TaskItem attribute = new TaskItem("System.AssemblyTrademarkAttribute");
+ task.AssemblyAttributes = new TaskItem[] { attribute };
+ task.Language = "c#";
+ task.OutputDirectory = new TaskItem(relativeFolder);
+ bool result = task.Execute();
+
+ result.ShouldBeTrue(engine.Log);
+
+ // The output file should be relative (not rooted) since OutputDirectory was relative
+ Path.IsPathRooted(task.OutputFile.ItemSpec).ShouldBeFalse("OutputFile should be relative when OutputDirectory is relative");
+
+ // The output file should start with the relative folder name
+ task.OutputFile.ItemSpec.ShouldStartWith(relativeFolder);
+
+ // Cleanup the generated file
+ string absoluteOutputFile = Path.Combine(Path.GetDirectoryName(absoluteFolder), task.OutputFile.ItemSpec);
+ if (File.Exists(absoluteOutputFile))
+ {
+ File.Delete(absoluteOutputFile);
+ }
+ }
+ finally
+ {
+ Directory.SetCurrentDirectory(originalDir);
+ }
+ }
+
///
/// Regular case
///
From 5e4d0d480a0915ca2546c0f12bf13cb345ed82e0 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 9 Feb 2026 09:29:16 +0000
Subject: [PATCH 8/8] Merge main and add TaskEnvironment to
CommentIsInvariantCulture test
Co-authored-by: JanProvaznik <25267098+JanProvaznik@users.noreply.github.com>
---
src/Tasks.UnitTests/WriteCodeFragment_Tests.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs b/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs
index 75bf3750556..e72f97b3fbd 100644
--- a/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs
+++ b/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs
@@ -1296,6 +1296,7 @@ public void CommentIsInvariantCulture(string cultureName)
System.Globalization.CultureInfo.CurrentUICulture = new System.Globalization.CultureInfo(cultureName);
WriteCodeFragment task = new WriteCodeFragment();
+ task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest();
MockEngine engine = new MockEngine(true);
task.BuildEngine = engine;
TaskItem attribute = new TaskItem("System.AssemblyVersionAttribute");