From dcaa0bb4ad0d12c1e1bdc061cd722b5010c37433 Mon Sep 17 00:00:00 2001 From: AR-May <67507805+AR-May@users.noreply.github.com> Date: Thu, 18 Apr 2024 14:58:31 +0200 Subject: [PATCH] Fix indentation of multiline messages in Terminal Logger. (#9997) Fixes #9996 Context The multiline messages indentation processing implies that the message will appear in the structured view under the related project. That is not correct for the Quiet verbosity and for couple of other places, such as rendering the immediate message and cases when the project is not determined. Changes Made Make the indentation dependent on where the message would be shown. Testing Unit tests --- ...bosity_FailedWithErrors.Linux.verified.txt | 9 ++- ...erbosity_FailedWithErrors.OSX.verified.txt | 9 ++- ...sity_FailedWithErrors.Windows.verified.txt | 9 ++- ...bosity_FailedWithErrors.Linux.verified.txt | 9 ++- ...erbosity_FailedWithErrors.OSX.verified.txt | 9 ++- ...sity_FailedWithErrors.Windows.verified.txt | 9 ++- ...bosity_FailedWithErrors.Linux.verified.txt | 9 ++- ...erbosity_FailedWithErrors.OSX.verified.txt | 9 ++- ...sity_FailedWithErrors.Windows.verified.txt | 9 ++- ...bosity_FailedWithErrors.Linux.verified.txt | 9 ++- ...erbosity_FailedWithErrors.OSX.verified.txt | 9 ++- ...sity_FailedWithErrors.Windows.verified.txt | 9 ++- ...bosity_FailedWithErrors.Linux.verified.txt | 5 ++ ...erbosity_FailedWithErrors.OSX.verified.txt | 5 ++ ...sity_FailedWithErrors.Windows.verified.txt | 5 ++ ...bosity_FailedWithErrors.Linux.verified.txt | 9 ++- ...erbosity_FailedWithErrors.OSX.verified.txt | 9 ++- ...sity_FailedWithErrors.Windows.verified.txt | 9 ++- src/MSBuild.UnitTests/TerminalLogger_Tests.cs | 1 + src/MSBuild/TerminalLogger/TerminalLogger.cs | 75 +++++++++++-------- 20 files changed, 166 insertions(+), 60 deletions(-) diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDetailedVerbosity_FailedWithErrors.Linux.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDetailedVerbosity_FailedWithErrors.Linux.verified.txt index 2a011fd87a4..94ea05fb0d6 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDetailedVerbosity_FailedWithErrors.Linux.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDetailedVerbosity_FailedWithErrors.Linux.verified.txt @@ -1,9 +1,14 @@ ]9;4;3;\The plugin credential provider could not acquire credentials.Authentication may require manual action. Consider re-running the command with --interactive for `dotnet`, /p:NuGetInteractive="true" for MSBuild or removing the -NonInteractive switch for `NuGet` - project failed with 1 error(s) and 1 warning(s) (0.2s) + project failed with 1 error(s) and 2 warning(s) (0.2s) High importance message! directory/file(1,2,3,4): warning AA0000: Warning! + directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! [?25l [?25h -Build failed with 1 error(s) and 1 warning(s) in 5.0s +Build failed with 1 error(s) and 2 warning(s) in 5.0s ]9;4;0;\ \ No newline at end of file diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDetailedVerbosity_FailedWithErrors.OSX.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDetailedVerbosity_FailedWithErrors.OSX.verified.txt index 94c8f8666eb..56e94ae3408 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDetailedVerbosity_FailedWithErrors.OSX.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDetailedVerbosity_FailedWithErrors.OSX.verified.txt @@ -1,8 +1,13 @@ The plugin credential provider could not acquire credentials.Authentication may require manual action. Consider re-running the command with --interactive for `dotnet`, /p:NuGetInteractive="true" for MSBuild or removing the -NonInteractive switch for `NuGet` - project failed with 1 error(s) and 1 warning(s) (0.2s) + project failed with 1 error(s) and 2 warning(s) (0.2s) High importance message! directory/file(1,2,3,4): warning AA0000: Warning! + directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! [?25l [?25h -Build failed with 1 error(s) and 1 warning(s) in 5.0s +Build failed with 1 error(s) and 2 warning(s) in 5.0s diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDetailedVerbosity_FailedWithErrors.Windows.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDetailedVerbosity_FailedWithErrors.Windows.verified.txt index 2a011fd87a4..94ea05fb0d6 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDetailedVerbosity_FailedWithErrors.Windows.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDetailedVerbosity_FailedWithErrors.Windows.verified.txt @@ -1,9 +1,14 @@ ]9;4;3;\The plugin credential provider could not acquire credentials.Authentication may require manual action. Consider re-running the command with --interactive for `dotnet`, /p:NuGetInteractive="true" for MSBuild or removing the -NonInteractive switch for `NuGet` - project failed with 1 error(s) and 1 warning(s) (0.2s) + project failed with 1 error(s) and 2 warning(s) (0.2s) High importance message! directory/file(1,2,3,4): warning AA0000: Warning! + directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! [?25l [?25h -Build failed with 1 error(s) and 1 warning(s) in 5.0s +Build failed with 1 error(s) and 2 warning(s) in 5.0s ]9;4;0;\ \ No newline at end of file diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDiagnosticVerbosity_FailedWithErrors.Linux.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDiagnosticVerbosity_FailedWithErrors.Linux.verified.txt index 2a011fd87a4..94ea05fb0d6 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDiagnosticVerbosity_FailedWithErrors.Linux.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDiagnosticVerbosity_FailedWithErrors.Linux.verified.txt @@ -1,9 +1,14 @@ ]9;4;3;\The plugin credential provider could not acquire credentials.Authentication may require manual action. Consider re-running the command with --interactive for `dotnet`, /p:NuGetInteractive="true" for MSBuild or removing the -NonInteractive switch for `NuGet` - project failed with 1 error(s) and 1 warning(s) (0.2s) + project failed with 1 error(s) and 2 warning(s) (0.2s) High importance message! directory/file(1,2,3,4): warning AA0000: Warning! + directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! [?25l [?25h -Build failed with 1 error(s) and 1 warning(s) in 5.0s +Build failed with 1 error(s) and 2 warning(s) in 5.0s ]9;4;0;\ \ No newline at end of file diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDiagnosticVerbosity_FailedWithErrors.OSX.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDiagnosticVerbosity_FailedWithErrors.OSX.verified.txt index 94c8f8666eb..56e94ae3408 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDiagnosticVerbosity_FailedWithErrors.OSX.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDiagnosticVerbosity_FailedWithErrors.OSX.verified.txt @@ -1,8 +1,13 @@ The plugin credential provider could not acquire credentials.Authentication may require manual action. Consider re-running the command with --interactive for `dotnet`, /p:NuGetInteractive="true" for MSBuild or removing the -NonInteractive switch for `NuGet` - project failed with 1 error(s) and 1 warning(s) (0.2s) + project failed with 1 error(s) and 2 warning(s) (0.2s) High importance message! directory/file(1,2,3,4): warning AA0000: Warning! + directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! [?25l [?25h -Build failed with 1 error(s) and 1 warning(s) in 5.0s +Build failed with 1 error(s) and 2 warning(s) in 5.0s diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDiagnosticVerbosity_FailedWithErrors.Windows.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDiagnosticVerbosity_FailedWithErrors.Windows.verified.txt index 2a011fd87a4..94ea05fb0d6 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDiagnosticVerbosity_FailedWithErrors.Windows.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryDiagnosticVerbosity_FailedWithErrors.Windows.verified.txt @@ -1,9 +1,14 @@ ]9;4;3;\The plugin credential provider could not acquire credentials.Authentication may require manual action. Consider re-running the command with --interactive for `dotnet`, /p:NuGetInteractive="true" for MSBuild or removing the -NonInteractive switch for `NuGet` - project failed with 1 error(s) and 1 warning(s) (0.2s) + project failed with 1 error(s) and 2 warning(s) (0.2s) High importance message! directory/file(1,2,3,4): warning AA0000: Warning! + directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! [?25l [?25h -Build failed with 1 error(s) and 1 warning(s) in 5.0s +Build failed with 1 error(s) and 2 warning(s) in 5.0s ]9;4;0;\ \ No newline at end of file diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryMinimalVerbosity_FailedWithErrors.Linux.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryMinimalVerbosity_FailedWithErrors.Linux.verified.txt index c0b5f816a67..0b4eb677187 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryMinimalVerbosity_FailedWithErrors.Linux.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryMinimalVerbosity_FailedWithErrors.Linux.verified.txt @@ -1,8 +1,13 @@ ]9;4;3;\The plugin credential provider could not acquire credentials.Authentication may require manual action. Consider re-running the command with --interactive for `dotnet`, /p:NuGetInteractive="true" for MSBuild or removing the -NonInteractive switch for `NuGet` - project failed with 1 error(s) and 1 warning(s) (0.2s) + project failed with 1 error(s) and 2 warning(s) (0.2s) directory/file(1,2,3,4): warning AA0000: Warning! + directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! [?25l [?25h -Build failed with 1 error(s) and 1 warning(s) in 5.0s +Build failed with 1 error(s) and 2 warning(s) in 5.0s ]9;4;0;\ \ No newline at end of file diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryMinimalVerbosity_FailedWithErrors.OSX.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryMinimalVerbosity_FailedWithErrors.OSX.verified.txt index f2c3daca5c7..0ac0ba155c8 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryMinimalVerbosity_FailedWithErrors.OSX.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryMinimalVerbosity_FailedWithErrors.OSX.verified.txt @@ -1,7 +1,12 @@ The plugin credential provider could not acquire credentials.Authentication may require manual action. Consider re-running the command with --interactive for `dotnet`, /p:NuGetInteractive="true" for MSBuild or removing the -NonInteractive switch for `NuGet` - project failed with 1 error(s) and 1 warning(s) (0.2s) + project failed with 1 error(s) and 2 warning(s) (0.2s) directory/file(1,2,3,4): warning AA0000: Warning! + directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! [?25l [?25h -Build failed with 1 error(s) and 1 warning(s) in 5.0s +Build failed with 1 error(s) and 2 warning(s) in 5.0s diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryMinimalVerbosity_FailedWithErrors.Windows.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryMinimalVerbosity_FailedWithErrors.Windows.verified.txt index c0b5f816a67..0b4eb677187 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryMinimalVerbosity_FailedWithErrors.Windows.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryMinimalVerbosity_FailedWithErrors.Windows.verified.txt @@ -1,8 +1,13 @@ ]9;4;3;\The plugin credential provider could not acquire credentials.Authentication may require manual action. Consider re-running the command with --interactive for `dotnet`, /p:NuGetInteractive="true" for MSBuild or removing the -NonInteractive switch for `NuGet` - project failed with 1 error(s) and 1 warning(s) (0.2s) + project failed with 1 error(s) and 2 warning(s) (0.2s) directory/file(1,2,3,4): warning AA0000: Warning! + directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! [?25l [?25h -Build failed with 1 error(s) and 1 warning(s) in 5.0s +Build failed with 1 error(s) and 2 warning(s) in 5.0s ]9;4;0;\ \ No newline at end of file diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryNormalVerbosity_FailedWithErrors.Linux.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryNormalVerbosity_FailedWithErrors.Linux.verified.txt index c0b5f816a67..0b4eb677187 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryNormalVerbosity_FailedWithErrors.Linux.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryNormalVerbosity_FailedWithErrors.Linux.verified.txt @@ -1,8 +1,13 @@ ]9;4;3;\The plugin credential provider could not acquire credentials.Authentication may require manual action. Consider re-running the command with --interactive for `dotnet`, /p:NuGetInteractive="true" for MSBuild or removing the -NonInteractive switch for `NuGet` - project failed with 1 error(s) and 1 warning(s) (0.2s) + project failed with 1 error(s) and 2 warning(s) (0.2s) directory/file(1,2,3,4): warning AA0000: Warning! + directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! [?25l [?25h -Build failed with 1 error(s) and 1 warning(s) in 5.0s +Build failed with 1 error(s) and 2 warning(s) in 5.0s ]9;4;0;\ \ No newline at end of file diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryNormalVerbosity_FailedWithErrors.OSX.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryNormalVerbosity_FailedWithErrors.OSX.verified.txt index f2c3daca5c7..0ac0ba155c8 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryNormalVerbosity_FailedWithErrors.OSX.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryNormalVerbosity_FailedWithErrors.OSX.verified.txt @@ -1,7 +1,12 @@ The plugin credential provider could not acquire credentials.Authentication may require manual action. Consider re-running the command with --interactive for `dotnet`, /p:NuGetInteractive="true" for MSBuild or removing the -NonInteractive switch for `NuGet` - project failed with 1 error(s) and 1 warning(s) (0.2s) + project failed with 1 error(s) and 2 warning(s) (0.2s) directory/file(1,2,3,4): warning AA0000: Warning! + directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! [?25l [?25h -Build failed with 1 error(s) and 1 warning(s) in 5.0s +Build failed with 1 error(s) and 2 warning(s) in 5.0s diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryNormalVerbosity_FailedWithErrors.Windows.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryNormalVerbosity_FailedWithErrors.Windows.verified.txt index c0b5f816a67..0b4eb677187 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryNormalVerbosity_FailedWithErrors.Windows.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryNormalVerbosity_FailedWithErrors.Windows.verified.txt @@ -1,8 +1,13 @@ ]9;4;3;\The plugin credential provider could not acquire credentials.Authentication may require manual action. Consider re-running the command with --interactive for `dotnet`, /p:NuGetInteractive="true" for MSBuild or removing the -NonInteractive switch for `NuGet` - project failed with 1 error(s) and 1 warning(s) (0.2s) + project failed with 1 error(s) and 2 warning(s) (0.2s) directory/file(1,2,3,4): warning AA0000: Warning! + directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! [?25l [?25h -Build failed with 1 error(s) and 1 warning(s) in 5.0s +Build failed with 1 error(s) and 2 warning(s) in 5.0s ]9;4;0;\ \ No newline at end of file diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryQuietVerbosity_FailedWithErrors.Linux.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryQuietVerbosity_FailedWithErrors.Linux.verified.txt index ed7d3ade9de..6e417bd1a11 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryQuietVerbosity_FailedWithErrors.Linux.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryQuietVerbosity_FailedWithErrors.Linux.verified.txt @@ -1,3 +1,8 @@ ]9;4;3;\directory/file(1,2,3,4): warning AA0000: Warning! +directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! ]9;4;0;\ \ No newline at end of file diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryQuietVerbosity_FailedWithErrors.OSX.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryQuietVerbosity_FailedWithErrors.OSX.verified.txt index b52d4bf957f..63b3c74b0c3 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryQuietVerbosity_FailedWithErrors.OSX.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryQuietVerbosity_FailedWithErrors.OSX.verified.txt @@ -1,2 +1,7 @@ directory/file(1,2,3,4): warning AA0000: Warning! +directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryQuietVerbosity_FailedWithErrors.Windows.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryQuietVerbosity_FailedWithErrors.Windows.verified.txt index ed7d3ade9de..6e417bd1a11 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryQuietVerbosity_FailedWithErrors.Windows.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintBuildSummaryQuietVerbosity_FailedWithErrors.Windows.verified.txt @@ -1,3 +1,8 @@ ]9;4;3;\directory/file(1,2,3,4): warning AA0000: Warning! +directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! ]9;4;0;\ \ No newline at end of file diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintSummaryWithOverwrittenVerbosity_FailedWithErrors.Linux.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintSummaryWithOverwrittenVerbosity_FailedWithErrors.Linux.verified.txt index 2a011fd87a4..94ea05fb0d6 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintSummaryWithOverwrittenVerbosity_FailedWithErrors.Linux.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintSummaryWithOverwrittenVerbosity_FailedWithErrors.Linux.verified.txt @@ -1,9 +1,14 @@ ]9;4;3;\The plugin credential provider could not acquire credentials.Authentication may require manual action. Consider re-running the command with --interactive for `dotnet`, /p:NuGetInteractive="true" for MSBuild or removing the -NonInteractive switch for `NuGet` - project failed with 1 error(s) and 1 warning(s) (0.2s) + project failed with 1 error(s) and 2 warning(s) (0.2s) High importance message! directory/file(1,2,3,4): warning AA0000: Warning! + directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! [?25l [?25h -Build failed with 1 error(s) and 1 warning(s) in 5.0s +Build failed with 1 error(s) and 2 warning(s) in 5.0s ]9;4;0;\ \ No newline at end of file diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintSummaryWithOverwrittenVerbosity_FailedWithErrors.OSX.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintSummaryWithOverwrittenVerbosity_FailedWithErrors.OSX.verified.txt index 94c8f8666eb..56e94ae3408 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintSummaryWithOverwrittenVerbosity_FailedWithErrors.OSX.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintSummaryWithOverwrittenVerbosity_FailedWithErrors.OSX.verified.txt @@ -1,8 +1,13 @@ The plugin credential provider could not acquire credentials.Authentication may require manual action. Consider re-running the command with --interactive for `dotnet`, /p:NuGetInteractive="true" for MSBuild or removing the -NonInteractive switch for `NuGet` - project failed with 1 error(s) and 1 warning(s) (0.2s) + project failed with 1 error(s) and 2 warning(s) (0.2s) High importance message! directory/file(1,2,3,4): warning AA0000: Warning! + directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! [?25l [?25h -Build failed with 1 error(s) and 1 warning(s) in 5.0s +Build failed with 1 error(s) and 2 warning(s) in 5.0s diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintSummaryWithOverwrittenVerbosity_FailedWithErrors.Windows.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintSummaryWithOverwrittenVerbosity_FailedWithErrors.Windows.verified.txt index 2a011fd87a4..94ea05fb0d6 100644 --- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintSummaryWithOverwrittenVerbosity_FailedWithErrors.Windows.verified.txt +++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.PrintSummaryWithOverwrittenVerbosity_FailedWithErrors.Windows.verified.txt @@ -1,9 +1,14 @@ ]9;4;3;\The plugin credential provider could not acquire credentials.Authentication may require manual action. Consider re-running the command with --interactive for `dotnet`, /p:NuGetInteractive="true" for MSBuild or removing the -NonInteractive switch for `NuGet` - project failed with 1 error(s) and 1 warning(s) (0.2s) + project failed with 1 error(s) and 2 warning(s) (0.2s) High importance message! directory/file(1,2,3,4): warning AA0000: Warning! + directory/file(1,2,3,4): warning AA0000: + A + Multi + Line + Warning! directory/file(1,2,3,4): error AA0000: Error! [?25l [?25h -Build failed with 1 error(s) and 1 warning(s) in 5.0s +Build failed with 1 error(s) and 2 warning(s) in 5.0s ]9;4;0;\ \ No newline at end of file diff --git a/src/MSBuild.UnitTests/TerminalLogger_Tests.cs b/src/MSBuild.UnitTests/TerminalLogger_Tests.cs index 955610abad2..7f89f347c25 100644 --- a/src/MSBuild.UnitTests/TerminalLogger_Tests.cs +++ b/src/MSBuild.UnitTests/TerminalLogger_Tests.cs @@ -436,6 +436,7 @@ private void CallAllTypesOfMessagesWarningAndError() MessageRaised?.Invoke(_eventSender, MakeMessageEventArgs("Normal importance message!", MessageImportance.Normal)); MessageRaised?.Invoke(_eventSender, MakeMessageEventArgs("Low importance message!", MessageImportance.Low)); WarningRaised?.Invoke(_eventSender, MakeWarningEventArgs("Warning!")); + WarningRaised?.Invoke(_eventSender, MakeWarningEventArgs("A\nMulti\r\nLine\nWarning!")); ErrorRaised?.Invoke(_eventSender, MakeErrorEventArgs("Error!")); } diff --git a/src/MSBuild/TerminalLogger/TerminalLogger.cs b/src/MSBuild/TerminalLogger/TerminalLogger.cs index 9dfb90a1750..71749e72717 100644 --- a/src/MSBuild/TerminalLogger/TerminalLogger.cs +++ b/src/MSBuild/TerminalLogger/TerminalLogger.cs @@ -62,6 +62,10 @@ public ProjectContext(BuildEventContext context) /// internal const string Indentation = " "; + internal const string DoubleIndentation = $"{Indentation}{Indentation}"; + + internal const string TripleIndentation = $"{Indentation}{Indentation}{Indentation}"; + internal const TerminalColor TargetFrameworkColor = TerminalColor.Cyan; internal Func? CreateStopwatch = null; @@ -646,7 +650,7 @@ private void ProjectFinished(object sender, ProjectFinishedEventArgs e) { foreach (BuildMessage buildMessage in project.BuildMessages) { - Terminal.WriteLine($"{Indentation}{Indentation}{buildMessage.Message}"); + Terminal.WriteLine($"{DoubleIndentation}{buildMessage.Message}"); } } @@ -860,32 +864,22 @@ private void MessageRaised(object sender, BuildMessageEventArgs e) private void WarningRaised(object sender, BuildWarningEventArgs e) { BuildEventContext? buildEventContext = e.BuildEventContext; - string message = FormatEventMessage( - category: AnsiCodes.Colorize("warning", TerminalColor.Yellow), - subcategory: e.Subcategory, - message: e.Message, - code: AnsiCodes.Colorize(e.Code, TerminalColor.Yellow), - file: HighlightFileName(e.File), - lineNumber: e.LineNumber, - endLineNumber: e.EndLineNumber, - columnNumber: e.ColumnNumber, - endColumnNumber: e.EndColumnNumber); if (buildEventContext is not null && _projects.TryGetValue(new ProjectContext(buildEventContext), out Project? project) && Verbosity > LoggerVerbosity.Quiet) { - if (IsImmediateMessage(message)) + if (!String.IsNullOrEmpty(e.Message) && IsImmediateMessage(e.Message!)) { - RenderImmediateMessage(message); + RenderImmediateMessage(FormatWarningMessage(e, Indentation)); } - project.AddBuildMessage(MessageSeverity.Warning, message); + project.AddBuildMessage(MessageSeverity.Warning, FormatWarningMessage(e, TripleIndentation)); } else { // It is necessary to display warning messages reported by MSBuild, even if it's not tracked in _projects collection or the verbosity is Quiet. - RenderImmediateMessage(message); + RenderImmediateMessage(FormatWarningMessage(e, Indentation)); _buildWarningsCount++; } } @@ -908,27 +902,17 @@ private bool IsImmediateMessage(string message) => private void ErrorRaised(object sender, BuildErrorEventArgs e) { BuildEventContext? buildEventContext = e.BuildEventContext; - string message = FormatEventMessage( - category: AnsiCodes.Colorize("error", TerminalColor.Red), - subcategory: e.Subcategory, - message: e.Message, - code: AnsiCodes.Colorize(e.Code, TerminalColor.Red), - file: HighlightFileName(e.File), - lineNumber: e.LineNumber, - endLineNumber: e.EndLineNumber, - columnNumber: e.ColumnNumber, - endColumnNumber: e.EndColumnNumber); - + if (buildEventContext is not null && _projects.TryGetValue(new ProjectContext(buildEventContext), out Project? project) && Verbosity > LoggerVerbosity.Quiet) { - project.AddBuildMessage(MessageSeverity.Error, message); + project.AddBuildMessage(MessageSeverity.Error, FormatErrorMessage(e, TripleIndentation)); } else { // It is necessary to display error messages reported by MSBuild, even if it's not tracked in _projects collection or the verbosity is Quiet. - RenderImmediateMessage(message); + RenderImmediateMessage(FormatErrorMessage(e, Indentation)); _buildErrorsCount++; } } @@ -1072,6 +1056,36 @@ private int NodeIndexForContext(BuildEventContext context) : path; } + private string FormatWarningMessage(BuildWarningEventArgs e, string indent) + { + return FormatEventMessage( + category: AnsiCodes.Colorize("warning", TerminalColor.Yellow), + subcategory: e.Subcategory, + message: e.Message, + code: AnsiCodes.Colorize(e.Code, TerminalColor.Yellow), + file: HighlightFileName(e.File), + lineNumber: e.LineNumber, + endLineNumber: e.EndLineNumber, + columnNumber: e.ColumnNumber, + endColumnNumber: e.EndColumnNumber, + indent); + } + + private string FormatErrorMessage(BuildErrorEventArgs e, string indent) + { + return FormatEventMessage( + category: AnsiCodes.Colorize("error", TerminalColor.Red), + subcategory: e.Subcategory, + message: e.Message, + code: AnsiCodes.Colorize(e.Code, TerminalColor.Red), + file: HighlightFileName(e.File), + lineNumber: e.LineNumber, + endLineNumber: e.EndLineNumber, + columnNumber: e.ColumnNumber, + endColumnNumber: e.EndColumnNumber, + indent); + } + private string FormatEventMessage( string category, string subcategory, @@ -1081,7 +1095,8 @@ private string FormatEventMessage( int lineNumber, int endLineNumber, int columnNumber, - int endColumnNumber) + int endColumnNumber, + string indent) { message ??= string.Empty; StringBuilder builder = new(128); @@ -1135,7 +1150,7 @@ private string FormatEventMessage( // render multi-line message in a special way if (message.IndexOf('\n') >= 0) { - const string indent = $"{Indentation}{Indentation}{Indentation}"; + // Place the multiline message under the project in case of minimal and higher verbosity. string[] lines = message.Split(newLineStrings, StringSplitOptions.None); foreach (string line in lines)