From 0ae82589f60cea5bcf493f6c88e904bfe6790a64 Mon Sep 17 00:00:00 2001 From: "Yue (Felix) Huang" Date: Tue, 13 Jun 2023 17:31:28 -0700 Subject: [PATCH 1/4] Dev/yuehuang/main rar (#1) * Add Question switch to stop the build when targets are not incremental. * Add question property to tasks. * Add tests * Clean up IIncrementalTask interface. * Add additional tasks. * Test and Question on this repro. * fix build * Fix question in -m. Fix BindingRedirect to target incremental. * Fix tests for Linux. * WIP * Fix feedbacks * . * Revert condition. * fix feedback. * touch to rerun. * Fix merge. * Fix merge pt2 * Fix merge p3 * Fix fileState when it couldn't resolve some files. * Fix merge * Address feedbacks * Fix test. * Clean up. * WIP * Fix Feedback * Fix Feedback. * Update tests * Address some feedbacks. * Fix merge conflict * . --- eng/BootStrapMSBuild.targets | 3 ++ src/MSBuild/MSBuild.csproj | 2 +- src/Samples/PortableTask/PortableTask.csproj | 2 +- src/Tasks.UnitTests/WriteLinesToFile_Tests.cs | 51 +++++++++++++++++++ src/Tasks/FileIO/WriteLinesToFile.cs | 9 ++-- src/Tasks/GenerateResource.cs | 2 +- 6 files changed, 63 insertions(+), 6 deletions(-) diff --git a/eng/BootStrapMSBuild.targets b/eng/BootStrapMSBuild.targets index e625498d4a9..a4c8fbee037 100644 --- a/eng/BootStrapMSBuild.targets +++ b/eng/BootStrapMSBuild.targets @@ -68,6 +68,9 @@ + + + diff --git a/src/MSBuild/MSBuild.csproj b/src/MSBuild/MSBuild.csproj index dfff888c132..dd1c309f66d 100644 --- a/src/MSBuild/MSBuild.csproj +++ b/src/MSBuild/MSBuild.csproj @@ -247,7 +247,7 @@ - + - + diff --git a/src/Tasks.UnitTests/WriteLinesToFile_Tests.cs b/src/Tasks.UnitTests/WriteLinesToFile_Tests.cs index 0b3d12f099e..d5495b9dfab 100644 --- a/src/Tasks.UnitTests/WriteLinesToFile_Tests.cs +++ b/src/Tasks.UnitTests/WriteLinesToFile_Tests.cs @@ -238,6 +238,57 @@ public void QuestionWriteLinesWriteOnlyWhenDifferentTest() } } + /// + /// Question WriteLines to return true when Lines are empty. + /// + [Fact] + public void QuestionWriteLinesWhenLinesAreEmpty() + { + // Test the combination of: + // 1) File exists + // 2) Overwrite + // 3) WriteOnlyWhenDifferent + + var fileExists = FileUtilities.GetTemporaryFile(); + var fileNotExists = FileUtilities.GetTemporaryFileName(); + try + { + TestWriteLines(fileExists, fileNotExists, Overwrite: true, WriteOnlyWhenDifferent: true); + TestWriteLines(fileExists, fileNotExists, Overwrite: false, WriteOnlyWhenDifferent: true); + TestWriteLines(fileExists, fileNotExists, Overwrite: true, WriteOnlyWhenDifferent: false); + TestWriteLines(fileExists, fileNotExists, Overwrite: false, WriteOnlyWhenDifferent: false); + } + finally + { + File.Delete(fileExists); + } + + void TestWriteLines(string fileExists, string fileNotExists, bool Overwrite, bool WriteOnlyWhenDifferent) + { + var test1 = new WriteLinesToFile + { + Overwrite = Overwrite, + BuildEngine = new MockEngine(_output), + File = new TaskItem(fileExists), + WriteOnlyWhenDifferent = WriteOnlyWhenDifferent, + FailIfNotIncremental = true, + // Tests Lines = null. + }; + test1.Execute().ShouldBeTrue(); + + var test2 = new WriteLinesToFile + { + Overwrite = Overwrite, + BuildEngine = new MockEngine(_output), + File = new TaskItem(fileNotExists), + WriteOnlyWhenDifferent = WriteOnlyWhenDifferent, + FailIfNotIncremental = true, + Lines = Array.Empty(), // Test empty. + }; + test2.Execute().ShouldBeTrue(); + } + } + /// /// Should create directory structure when target does not exist. /// diff --git a/src/Tasks/FileIO/WriteLinesToFile.cs b/src/Tasks/FileIO/WriteLinesToFile.cs index 7ae0228c8e5..9b94858fc12 100644 --- a/src/Tasks/FileIO/WriteLinesToFile.cs +++ b/src/Tasks/FileIO/WriteLinesToFile.cs @@ -133,8 +133,11 @@ public override bool Execute() if (FailIfNotIncremental) { - Log.LogErrorWithCodeFromResources("WriteLinesToFile.ErrorReadingFile", File.ItemSpec); - return false; + if (Lines?.Length > 0) + { + Log.LogErrorWithCodeFromResources("WriteLinesToFile.ErrorReadingFile", File.ItemSpec); + return false; + } } else { @@ -143,7 +146,7 @@ public override bool Execute() } else { - if (FailIfNotIncremental) + if (FailIfNotIncremental && Lines?.Length > 0) { Log.LogErrorWithCodeFromResources("WriteLinesToFile.ErrorOrWarning", File.ItemSpec, string.Empty); return false; diff --git a/src/Tasks/GenerateResource.cs b/src/Tasks/GenerateResource.cs index 6ff6c0a5dff..3d87b7de11d 100644 --- a/src/Tasks/GenerateResource.cs +++ b/src/Tasks/GenerateResource.cs @@ -725,7 +725,7 @@ public override bool Execute() } else if (FailIfNotIncremental) { - Log.LogErrorFromResources("GenerateResource.OutOfDate"); + Log.LogErrorFromResources("GenerateResource.NothingOutOfDate"); } else { From dbdd2e06961e783254a66f7f3729532e49b3a510 Mon Sep 17 00:00:00 2001 From: Felix Huang Date: Thu, 15 Jun 2023 16:38:13 -0700 Subject: [PATCH 2/4] Improve the messaging for ResGen in question mode. --- .../GenerateResource_Tests.cs | 64 +++++++++++++++++++ src/Tasks/GenerateResource.cs | 11 +++- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/src/Tasks.UnitTests/ResourceHandling/GenerateResource_Tests.cs b/src/Tasks.UnitTests/ResourceHandling/GenerateResource_Tests.cs index f704ef169a1..f5c2d20a568 100644 --- a/src/Tasks.UnitTests/ResourceHandling/GenerateResource_Tests.cs +++ b/src/Tasks.UnitTests/ResourceHandling/GenerateResource_Tests.cs @@ -389,6 +389,70 @@ public void ForceOutOfDateByDeletion() Utilities.AssertLogContainsResource(t2, "GenerateResource.ResourceNotFound", t2.Sources[0].ItemSpec); } + [Fact] + public void QuestionOutOfDateByDeletion() + { + var folder = _env.CreateFolder(); + string resxFileInput = Utilities.WriteTestResX(false, null, null, _env.CreateFile(folder, ".resx").Path); + TaskItem stateFile = new TaskItem(_env.GetTempFile(".cache").Path); + ITaskItem[] sources = new ITaskItem[] { new TaskItem(resxFileInput) }; + ITaskItem[] output; + + { + GenerateResource t = Utilities.CreateTask(_output); + t.Sources = sources; + t.StateFile = stateFile; + Utilities.ExecuteTask(t); + + Utilities.AssertLogContainsResource(t, "GenerateResource.OutputDoesntExist", t.OutputResources[0].ItemSpec); + + output = t.OutputResources; + } + + { + // Run again to ensure all files are up to date. + GenerateResource t = Utilities.CreateTask(_output); + t.Sources = sources; + t.StateFile = stateFile; + t.FailIfNotIncremental = true; + Utilities.ExecuteTask(t); + } + + { + // Delete the file and verify that FailIfNotIncremental will print the missing file + GenerateResource t = Utilities.CreateTask(_output); + t.StateFile = stateFile; + t.Sources = sources; + t.FailIfNotIncremental = true; + + // Delete the output + File.Delete(output[0].ItemSpec); + + t.Execute().ShouldBeFalse(); + + Utilities.AssertLogContainsResource(t, "GenerateResource.ProcessingFile", sources[0].ItemSpec, output[0].ItemSpec); + } + + { + GenerateResource t = Utilities.CreateTask(_output); + t.Sources = sources; + t.StateFile = stateFile; + Utilities.ExecuteTask(t); + + Utilities.AssertLogContainsResource(t, "GenerateResource.OutputDoesntExist", t.OutputResources[0].ItemSpec); + } + + { + // Run again to ensure all files are up to date. + GenerateResource t = Utilities.CreateTask(_output); + t.Sources = sources; + t.StateFile = stateFile; + t.FailIfNotIncremental = true; + Utilities.ExecuteTask(t); + } + + } + /// /// Force out-of-date with ShouldRebuildResgenOutputFile on the linked file /// diff --git a/src/Tasks/GenerateResource.cs b/src/Tasks/GenerateResource.cs index 3d87b7de11d..76bcb3d9057 100644 --- a/src/Tasks/GenerateResource.cs +++ b/src/Tasks/GenerateResource.cs @@ -725,7 +725,16 @@ public override bool Execute() } else if (FailIfNotIncremental) { - Log.LogErrorFromResources("GenerateResource.NothingOutOfDate"); + int maxCount = Math.Min(inputsToProcess.Count, outputsToProcess.Count); + maxCount = Math.Min(maxCount, 5); // Limit to just 5 + + for (int index = 0; index < maxCount; index++) + { + // Log the file that would be process as an error. + Log.LogErrorFromResources("GenerateResource.ProcessingFile", inputsToProcess[index], outputsToProcess[index]); + } + + return false; } else { From 058d5fc24191a713f099293e820e32610cdbd96e Mon Sep 17 00:00:00 2001 From: Felix Huang Date: Tue, 20 Jun 2023 15:16:41 -0700 Subject: [PATCH 3/4] Fix Style --- .../GenerateResource_Tests.cs | 88 ++++++++----------- 1 file changed, 36 insertions(+), 52 deletions(-) diff --git a/src/Tasks.UnitTests/ResourceHandling/GenerateResource_Tests.cs b/src/Tasks.UnitTests/ResourceHandling/GenerateResource_Tests.cs index f5c2d20a568..91986ca83f6 100644 --- a/src/Tasks.UnitTests/ResourceHandling/GenerateResource_Tests.cs +++ b/src/Tasks.UnitTests/ResourceHandling/GenerateResource_Tests.cs @@ -398,59 +398,43 @@ public void QuestionOutOfDateByDeletion() ITaskItem[] sources = new ITaskItem[] { new TaskItem(resxFileInput) }; ITaskItem[] output; - { - GenerateResource t = Utilities.CreateTask(_output); - t.Sources = sources; - t.StateFile = stateFile; - Utilities.ExecuteTask(t); - - Utilities.AssertLogContainsResource(t, "GenerateResource.OutputDoesntExist", t.OutputResources[0].ItemSpec); - - output = t.OutputResources; - } - - { - // Run again to ensure all files are up to date. - GenerateResource t = Utilities.CreateTask(_output); - t.Sources = sources; - t.StateFile = stateFile; - t.FailIfNotIncremental = true; - Utilities.ExecuteTask(t); - } - - { - // Delete the file and verify that FailIfNotIncremental will print the missing file - GenerateResource t = Utilities.CreateTask(_output); - t.StateFile = stateFile; - t.Sources = sources; - t.FailIfNotIncremental = true; - - // Delete the output - File.Delete(output[0].ItemSpec); - - t.Execute().ShouldBeFalse(); - - Utilities.AssertLogContainsResource(t, "GenerateResource.ProcessingFile", sources[0].ItemSpec, output[0].ItemSpec); - } - - { - GenerateResource t = Utilities.CreateTask(_output); - t.Sources = sources; - t.StateFile = stateFile; - Utilities.ExecuteTask(t); - - Utilities.AssertLogContainsResource(t, "GenerateResource.OutputDoesntExist", t.OutputResources[0].ItemSpec); - } - - { - // Run again to ensure all files are up to date. - GenerateResource t = Utilities.CreateTask(_output); - t.Sources = sources; - t.StateFile = stateFile; - t.FailIfNotIncremental = true; - Utilities.ExecuteTask(t); - } + GenerateResource t1 = Utilities.CreateTask(_output); + t1.Sources = sources; + t1.StateFile = stateFile; + Utilities.ExecuteTask(t1); + Utilities.AssertLogContainsResource(t1, "GenerateResource.OutputDoesntExist", t1.OutputResources[0].ItemSpec); + output = t1.OutputResources; + + // Run again to ensure all files are up to date. + GenerateResource t2 = Utilities.CreateTask(_output); + t2.Sources = sources; + t2.StateFile = stateFile; + t2.FailIfNotIncremental = true; + Utilities.ExecuteTask(t2); + // Delete the file and verify that FailIfNotIncremental will print the missing file + GenerateResource t3 = Utilities.CreateTask(_output); + t3.StateFile = stateFile; + t3.Sources = sources; + t3.FailIfNotIncremental = true; + + // Delete the output + File.Delete(output[0].ItemSpec); + t3.Execute().ShouldBeFalse(); + Utilities.AssertLogContainsResource(t3, "GenerateResource.ProcessingFile", sources[0].ItemSpec, output[0].ItemSpec); + + GenerateResource t4 = Utilities.CreateTask(_output); + t4.Sources = sources; + t4.StateFile = stateFile; + Utilities.ExecuteTask(t4); + Utilities.AssertLogContainsResource(t4, "GenerateResource.OutputDoesntExist", t4.OutputResources[0].ItemSpec); + + // Run again to ensure all files are up to date. + GenerateResource t5 = Utilities.CreateTask(_output); + t5.Sources = sources; + t5.StateFile = stateFile; + t5.FailIfNotIncremental = true; + Utilities.ExecuteTask(t5); } /// From d955f2ef66e54542328cd11dfe5e90cbebc25ecf Mon Sep 17 00:00:00 2001 From: Felix Huang Date: Tue, 25 Jul 2023 12:33:47 -0700 Subject: [PATCH 4/4] Revert GenerateResource into separate PR. --- .../GenerateResource_Tests.cs | 48 ------------------- src/Tasks/GenerateResource.cs | 11 +---- 2 files changed, 1 insertion(+), 58 deletions(-) diff --git a/src/Tasks.UnitTests/ResourceHandling/GenerateResource_Tests.cs b/src/Tasks.UnitTests/ResourceHandling/GenerateResource_Tests.cs index 91986ca83f6..f704ef169a1 100644 --- a/src/Tasks.UnitTests/ResourceHandling/GenerateResource_Tests.cs +++ b/src/Tasks.UnitTests/ResourceHandling/GenerateResource_Tests.cs @@ -389,54 +389,6 @@ public void ForceOutOfDateByDeletion() Utilities.AssertLogContainsResource(t2, "GenerateResource.ResourceNotFound", t2.Sources[0].ItemSpec); } - [Fact] - public void QuestionOutOfDateByDeletion() - { - var folder = _env.CreateFolder(); - string resxFileInput = Utilities.WriteTestResX(false, null, null, _env.CreateFile(folder, ".resx").Path); - TaskItem stateFile = new TaskItem(_env.GetTempFile(".cache").Path); - ITaskItem[] sources = new ITaskItem[] { new TaskItem(resxFileInput) }; - ITaskItem[] output; - - GenerateResource t1 = Utilities.CreateTask(_output); - t1.Sources = sources; - t1.StateFile = stateFile; - Utilities.ExecuteTask(t1); - Utilities.AssertLogContainsResource(t1, "GenerateResource.OutputDoesntExist", t1.OutputResources[0].ItemSpec); - output = t1.OutputResources; - - // Run again to ensure all files are up to date. - GenerateResource t2 = Utilities.CreateTask(_output); - t2.Sources = sources; - t2.StateFile = stateFile; - t2.FailIfNotIncremental = true; - Utilities.ExecuteTask(t2); - - // Delete the file and verify that FailIfNotIncremental will print the missing file - GenerateResource t3 = Utilities.CreateTask(_output); - t3.StateFile = stateFile; - t3.Sources = sources; - t3.FailIfNotIncremental = true; - - // Delete the output - File.Delete(output[0].ItemSpec); - t3.Execute().ShouldBeFalse(); - Utilities.AssertLogContainsResource(t3, "GenerateResource.ProcessingFile", sources[0].ItemSpec, output[0].ItemSpec); - - GenerateResource t4 = Utilities.CreateTask(_output); - t4.Sources = sources; - t4.StateFile = stateFile; - Utilities.ExecuteTask(t4); - Utilities.AssertLogContainsResource(t4, "GenerateResource.OutputDoesntExist", t4.OutputResources[0].ItemSpec); - - // Run again to ensure all files are up to date. - GenerateResource t5 = Utilities.CreateTask(_output); - t5.Sources = sources; - t5.StateFile = stateFile; - t5.FailIfNotIncremental = true; - Utilities.ExecuteTask(t5); - } - /// /// Force out-of-date with ShouldRebuildResgenOutputFile on the linked file /// diff --git a/src/Tasks/GenerateResource.cs b/src/Tasks/GenerateResource.cs index 3f69cf4ef6c..535e0a3dd2d 100644 --- a/src/Tasks/GenerateResource.cs +++ b/src/Tasks/GenerateResource.cs @@ -725,16 +725,7 @@ public override bool Execute() } else if (FailIfNotIncremental) { - int maxCount = Math.Min(inputsToProcess.Count, outputsToProcess.Count); - maxCount = Math.Min(maxCount, 5); // Limit to just 5 - - for (int index = 0; index < maxCount; index++) - { - // Log the file that would be process as an error. - Log.LogErrorFromResources("GenerateResource.ProcessingFile", inputsToProcess[index], outputsToProcess[index]); - } - - return false; + Log.LogErrorFromResources("GenerateResource.OutOfDate"); } else {