From af1c1010f1dc6780d8cea7ecab7cd48cc210eff5 Mon Sep 17 00:00:00 2001 From: NikolayPianikov Date: Mon, 31 Jan 2022 23:59:54 +0300 Subject: [PATCH] Add extended event info --- .../BuildErrorMessageUpdater.cs | 55 ++++++++++++++++++ .../BuildMessageMessageUpdater.cs | 57 +++++++++++++++++++ .../BuildWarningMessageUpdater.cs | 55 ++++++++++++++++++ TeamCity.MSBuild.Logger/Composer.cs | 5 +- TeamCity.MSBuild.Logger/IoCConfiguration.cs | 0 .../PatchedServiceMessage.cs | 18 ++++++ .../TeamCity.MSBuild.Logger.csproj | 2 +- 7 files changed, 190 insertions(+), 2 deletions(-) create mode 100644 TeamCity.MSBuild.Logger/BuildErrorMessageUpdater.cs create mode 100644 TeamCity.MSBuild.Logger/BuildMessageMessageUpdater.cs create mode 100644 TeamCity.MSBuild.Logger/BuildWarningMessageUpdater.cs delete mode 100644 TeamCity.MSBuild.Logger/IoCConfiguration.cs create mode 100644 TeamCity.MSBuild.Logger/PatchedServiceMessage.cs diff --git a/TeamCity.MSBuild.Logger/BuildErrorMessageUpdater.cs b/TeamCity.MSBuild.Logger/BuildErrorMessageUpdater.cs new file mode 100644 index 0000000..bb3c39a --- /dev/null +++ b/TeamCity.MSBuild.Logger/BuildErrorMessageUpdater.cs @@ -0,0 +1,55 @@ +namespace TeamCity.MSBuild.Logger +{ + using JetBrains.TeamCity.ServiceMessages; + using JetBrains.TeamCity.ServiceMessages.Write.Special; + using Microsoft.Build.Framework; + + internal class BuildErrorMessageUpdater: IServiceMessageUpdater + { + private readonly IEventContext _eventContext; + + public BuildErrorMessageUpdater(IEventContext eventContext) => + _eventContext = eventContext; + + public IServiceMessage UpdateServiceMessage(IServiceMessage message) + { + if (_eventContext.TryGetEvent(out var buildEventManager) + && buildEventManager is BuildErrorEventArgs error) + { + var newMessage = new PatchedServiceMessage(message); + if (!string.IsNullOrWhiteSpace(error.Code)) + { + newMessage.Add("code", error.Code); + } + + if (!string.IsNullOrWhiteSpace(error.File)) + { + newMessage.Add("file", error.File); + } + + if (!string.IsNullOrWhiteSpace(error.Subcategory)) + { + newMessage.Add("subcategory", error.Subcategory); + } + + if (!string.IsNullOrWhiteSpace(error.ProjectFile)) + { + newMessage.Add("projectFile", error.ProjectFile); + } + + if (!string.IsNullOrWhiteSpace(error.SenderName)) + { + newMessage.Add("senderName", error.SenderName); + } + + newMessage.Add("columnNumber", error.ColumnNumber.ToString()); + newMessage.Add("endColumnNumber", error.EndColumnNumber.ToString()); + newMessage.Add("lineNumber", error.LineNumber.ToString()); + newMessage.Add("endLineNumber", error.EndLineNumber.ToString()); + return newMessage; + } + + return message; + } + } +} \ No newline at end of file diff --git a/TeamCity.MSBuild.Logger/BuildMessageMessageUpdater.cs b/TeamCity.MSBuild.Logger/BuildMessageMessageUpdater.cs new file mode 100644 index 0000000..adc4c09 --- /dev/null +++ b/TeamCity.MSBuild.Logger/BuildMessageMessageUpdater.cs @@ -0,0 +1,57 @@ +namespace TeamCity.MSBuild.Logger +{ + using JetBrains.TeamCity.ServiceMessages; + using JetBrains.TeamCity.ServiceMessages.Write.Special; + using Microsoft.Build.Framework; + + internal class BuildMessageMessageUpdater: IServiceMessageUpdater + { + private readonly IEventContext _eventContext; + + public BuildMessageMessageUpdater(IEventContext eventContext) => + _eventContext = eventContext; + + public IServiceMessage UpdateServiceMessage(IServiceMessage message) + { + if (_eventContext.TryGetEvent(out var buildEventManager) + && buildEventManager is BuildMessageEventArgs msg) + { + var newMessage = new PatchedServiceMessage(message); + if (!string.IsNullOrWhiteSpace(msg.Code)) + { + newMessage.Add("code", msg.Code); + } + + if (!string.IsNullOrWhiteSpace(msg.File)) + { + newMessage.Add("file", msg.File); + } + + if (!string.IsNullOrWhiteSpace(msg.Subcategory)) + { + newMessage.Add("subcategory", msg.Subcategory); + } + + if (!string.IsNullOrWhiteSpace(msg.ProjectFile)) + { + newMessage.Add("projectFile", msg.ProjectFile); + } + + if (!string.IsNullOrWhiteSpace(msg.SenderName)) + { + newMessage.Add("senderName", msg.SenderName); + } + + newMessage.Add("columnNumber", msg.ColumnNumber.ToString()); + newMessage.Add("endColumnNumber", msg.EndColumnNumber.ToString()); + newMessage.Add("lineNumber", msg.LineNumber.ToString()); + newMessage.Add("endLineNumber", msg.EndLineNumber.ToString()); + newMessage.Add("importance", msg.Importance.ToString()); + + return newMessage; + } + + return message; + } + } +} \ No newline at end of file diff --git a/TeamCity.MSBuild.Logger/BuildWarningMessageUpdater.cs b/TeamCity.MSBuild.Logger/BuildWarningMessageUpdater.cs new file mode 100644 index 0000000..26f9f58 --- /dev/null +++ b/TeamCity.MSBuild.Logger/BuildWarningMessageUpdater.cs @@ -0,0 +1,55 @@ +namespace TeamCity.MSBuild.Logger +{ + using JetBrains.TeamCity.ServiceMessages; + using JetBrains.TeamCity.ServiceMessages.Write.Special; + using Microsoft.Build.Framework; + + internal class BuildWarningMessageUpdater: IServiceMessageUpdater + { + private readonly IEventContext _eventContext; + + public BuildWarningMessageUpdater(IEventContext eventContext) => + _eventContext = eventContext; + + public IServiceMessage UpdateServiceMessage(IServiceMessage message) + { + if (_eventContext.TryGetEvent(out var buildEventManager) + && buildEventManager is BuildWarningEventArgs warning) + { + var newMessage = new PatchedServiceMessage(message); + if (!string.IsNullOrWhiteSpace(warning.Code)) + { + newMessage.Add("code", warning.Code); + } + + if (!string.IsNullOrWhiteSpace(warning.File)) + { + newMessage.Add("file", warning.File); + } + + if (!string.IsNullOrWhiteSpace(warning.Subcategory)) + { + newMessage.Add("subcategory", warning.Subcategory); + } + + if (!string.IsNullOrWhiteSpace(warning.ProjectFile)) + { + newMessage.Add("projectFile", warning.ProjectFile); + } + + if (!string.IsNullOrWhiteSpace(warning.SenderName)) + { + newMessage.Add("senderName", warning.SenderName); + } + + newMessage.Add("columnNumber", warning.ColumnNumber.ToString()); + newMessage.Add("endColumnNumber", warning.EndColumnNumber.ToString()); + newMessage.Add("lineNumber", warning.LineNumber.ToString()); + newMessage.Add("endLineNumber", warning.EndLineNumber.ToString()); + return newMessage; + } + + return message; + } + } +} \ No newline at end of file diff --git a/TeamCity.MSBuild.Logger/Composer.cs b/TeamCity.MSBuild.Logger/Composer.cs index 26e22ad..92a912a 100644 --- a/TeamCity.MSBuild.Logger/Composer.cs +++ b/TeamCity.MSBuild.Logger/Composer.cs @@ -75,7 +75,10 @@ private static void Setup() => .Bind().To() .Bind().To() .Bind().As(Transient).To(_ => DateTime.Now) - .Bind().To() + .Bind(typeof(TimestampUpdater)).To() + .Bind(typeof(BuildErrorMessageUpdater)).To() + .Bind(typeof(BuildWarningMessageUpdater)).To() + .Bind(typeof(BuildMessageMessageUpdater)).To() .Bind().To( ctx => ctx.Resolve().CreateWriter( str => ctx.Resolve(ColorMode.NoColor).Write(str + "\n"))) diff --git a/TeamCity.MSBuild.Logger/IoCConfiguration.cs b/TeamCity.MSBuild.Logger/IoCConfiguration.cs deleted file mode 100644 index e69de29..0000000 diff --git a/TeamCity.MSBuild.Logger/PatchedServiceMessage.cs b/TeamCity.MSBuild.Logger/PatchedServiceMessage.cs new file mode 100644 index 0000000..6420f8b --- /dev/null +++ b/TeamCity.MSBuild.Logger/PatchedServiceMessage.cs @@ -0,0 +1,18 @@ +namespace TeamCity.MSBuild.Logger +{ + using System; + using System.Linq; + using JetBrains.Annotations; + using JetBrains.TeamCity.ServiceMessages; + using JetBrains.TeamCity.ServiceMessages.Write; + + internal class PatchedServiceMessage : ServiceMessage + { + public PatchedServiceMessage([NotNull] IServiceMessage message) + : base(message.Name) + { + if (message == null) throw new ArgumentNullException(nameof(message)); + AddRange(message.Keys.ToDictionary(x => x, message.GetValue)); + } + } +} \ No newline at end of file diff --git a/TeamCity.MSBuild.Logger/TeamCity.MSBuild.Logger.csproj b/TeamCity.MSBuild.Logger/TeamCity.MSBuild.Logger.csproj index 6d7bc2a..2faedf2 100644 --- a/TeamCity.MSBuild.Logger/TeamCity.MSBuild.Logger.csproj +++ b/TeamCity.MSBuild.Logger/TeamCity.MSBuild.Logger.csproj @@ -20,7 +20,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive