Skip to content

Commit

Permalink
Fix missed errors appearance on restore (#9424)
Browse files Browse the repository at this point in the history
  • Loading branch information
YuliiaKovalova authored Nov 28, 2023
1 parent f7f0b19 commit 5fcddc7
Show file tree
Hide file tree
Showing 8 changed files with 73 additions and 16 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
directory/file(1,2,3,4): error AA0000: Restore Failed

Build failed with errors in 0.0s
]9;4;0;\
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
directory/file(1,2,3,4): error AA0000: Restore Failed

Build failed with errors in 0.0s
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
directory/file(1,2,3,4): error AA0000: Restore Failed

Build failed with errors in 0.0s
]9;4;0;\
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
directory/file(1,2,3,4): warning AA0000: Restore with Warning

Build succeeded with warnings in 0.0s
]9;4;0;\
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
directory/file(1,2,3,4): warning AA0000: Restore with Warning

Build succeeded with warnings in 0.0s
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
directory/file(1,2,3,4): warning AA0000: Restore with Warning

Build succeeded with warnings in 0.0s
]9;4;0;\
24 changes: 24 additions & 0 deletions src/MSBuild.UnitTests/TerminalLogger_Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,30 @@ public Task PrintImmediateMessage_Skipped()
return Verify(_outputWriter.ToString(), _settings).UniqueForOSPlatform();
}

[Fact]
public Task PrintRestore_Failed()
{
bool succeeded = false;
ErrorRaised?.Invoke(_eventSender, MakeErrorEventArgs("Restore Failed"));

ProjectFinished?.Invoke(_eventSender, MakeProjectFinishedEventArgs(_projectFile, succeeded));
BuildFinished?.Invoke(_eventSender, MakeBuildFinishedEventArgs(succeeded));

return Verify(_outputWriter.ToString(), _settings).UniqueForOSPlatform();
}

[Fact]
public Task PrintRestore_SuccessWithWarnings()
{
bool succeeded = true;
WarningRaised?.Invoke(_eventSender, MakeWarningEventArgs("Restore with Warning"));

ProjectFinished?.Invoke(_eventSender, MakeProjectFinishedEventArgs(_projectFile, succeeded));
BuildFinished?.Invoke(_eventSender, MakeBuildFinishedEventArgs(succeeded));

return Verify(_outputWriter.ToString(), _settings).UniqueForOSPlatform();
}

[Fact]
public Task PrintBuildSummary_Failed()
{
Expand Down
43 changes: 27 additions & 16 deletions src/MSBuild/TerminalLogger/TerminalLogger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -602,72 +602,83 @@ private void MessageRaised(object sender, BuildMessageEventArgs e)
/// </summary>
private void WarningRaised(object sender, BuildWarningEventArgs e)
{
var buildEventContext = e.BuildEventContext;
if (buildEventContext is not null && _projects.TryGetValue(new ProjectContext(buildEventContext), out Project? project))
{
string message = EventArgsFormatting.FormatEventMessage(
BuildEventContext? buildEventContext = e.BuildEventContext;
string message = EventArgsFormatting.FormatEventMessage(
category: AnsiCodes.Colorize("warning", TerminalColor.Yellow),
subcategory: e.Subcategory,
message: e.Message,
code: AnsiCodes.Colorize(e.Code, TerminalColor.Yellow),
file: HighlightFileName(e.File),
projectFile: null,
projectFile: e.ProjectFile ?? null,
lineNumber: e.LineNumber,
endLineNumber: e.EndLineNumber,
columnNumber: e.ColumnNumber,
endColumnNumber: e.EndColumnNumber,
threadId: e.ThreadId,
logOutputProperties: null);

if (buildEventContext is not null && _projects.TryGetValue(new ProjectContext(buildEventContext), out Project? project))
{
if (IsImmediateMessage(message))
{
RenderImmediateMessage(message);
}

project.AddBuildMessage(MessageSeverity.Warning, message);
}
else
{
// It is necessary to display warning messages reported by MSBuild, even if it's not tracked in _projects collection.
RenderImmediateMessage(message);
_buildHasWarnings = true;
}
}

/// <summary>
/// Detect markers that require special attention from a customer.
/// </summary>
/// <param name="message">Raised event.</param>
/// <returns>true if marker is detected.</returns>
private bool IsImmediateMessage(string message)
{
private bool IsImmediateMessage(string message) =>
#if NET7_0_OR_GREATER
return ImmediateMessageRegex().IsMatch(message);
ImmediateMessageRegex().IsMatch(message);
#else
return _immediateMessageKeywords.Any(imk => message.IndexOf(imk, StringComparison.OrdinalIgnoreCase) >= 0);
_immediateMessageKeywords.Any(imk => message.IndexOf(imk, StringComparison.OrdinalIgnoreCase) >= 0);
#endif
}

/// <summary>
/// The <see cref="IEventSource.ErrorRaised"/> callback.
/// </summary>
private void ErrorRaised(object sender, BuildErrorEventArgs e)
{
var buildEventContext = e.BuildEventContext;
if (buildEventContext is not null && _projects.TryGetValue(new ProjectContext(buildEventContext), out Project? project))
{
string message = EventArgsFormatting.FormatEventMessage(
BuildEventContext? buildEventContext = e.BuildEventContext;
string message = EventArgsFormatting.FormatEventMessage(
category: AnsiCodes.Colorize("error", TerminalColor.Red),
subcategory: e.Subcategory,
message: e.Message,
code: AnsiCodes.Colorize(e.Code, TerminalColor.Red),
file: HighlightFileName(e.File),
projectFile: null,
projectFile: e.ProjectFile ?? null,
lineNumber: e.LineNumber,
endLineNumber: e.EndLineNumber,
columnNumber: e.ColumnNumber,
endColumnNumber: e.EndColumnNumber,
threadId: e.ThreadId,
logOutputProperties: null);

if (buildEventContext is not null && _projects.TryGetValue(new ProjectContext(buildEventContext), out Project? project))
{
project.AddBuildMessage(MessageSeverity.Error, message);
}
else
{
// It is necessary to display error messages reported by MSBuild, even if it's not tracked in _projects collection.
RenderImmediateMessage(message);
_buildHasErrors = true;
}
}

#endregion
#endregion

#region Refresher thread implementation

Expand Down

0 comments on commit 5fcddc7

Please sign in to comment.