public void StatusEventRaised(object sender, BuildStatusEventArgs e)
 {
     try
     {
         lock (syncLock)
         {
             // This happens when we consume args created by us (deserialized)
             if (e is ProjectEvaluationStartedEventArgs projectEvaluationStarted)
             {
                 var projectName = projectEvaluationStarted.ProjectFile;
                 var project     = EvaluationFolder.GetOrCreateNodeWithName <Project>(projectName);
                 project.Id = e.BuildEventContext.ProjectContextId;
             }
             else if (e is ProjectEvaluationFinishedEventArgs projectEvaluationFinished)
             {
             }
             // this happens during live build using MSBuild 15.3 or newer
             else if (e.GetType().Name == "ProjectEvaluationStartedEventArgs")
             {
                 var projectName = Utilities.ParseQuotedSubstring(e.Message);
                 var project     = EvaluationFolder.GetOrCreateNodeWithName <Project>(projectName);
                 project.Id = Reflector.GetEvaluationId(e.BuildEventContext);
             }
         }
     }
     catch (Exception ex)
     {
         HandleException(ex);
     }
 }
 private void Write(BuildEventContext buildEventContext)
 {
     Write(buildEventContext.NodeId);
     Write(buildEventContext.ProjectContextId);
     Write(buildEventContext.TargetId);
     Write(buildEventContext.TaskId);
     Write(buildEventContext.SubmissionId);
     Write(buildEventContext.ProjectInstanceId);
     Write(Reflector.GetEvaluationId(buildEventContext));
 }
Exemple #3
0
        public void StatusEventRaised(object sender, BuildStatusEventArgs e)
        {
            try
            {
                lock (syncLock)
                {
                    // This happens when we consume args created by us (deserialized)
                    if (e is ProjectEvaluationStartedEventArgs projectEvaluationStarted)
                    {
                        EvaluationFolder = Build.GetOrCreateNodeWithName <Folder>(Intern("Evaluation"));

                        var evaluationId = -e.BuildEventContext.ProjectContextId;
                        var projectName  = Intern(projectEvaluationStarted.ProjectFile);
                        var nodeName     = Intern(GetEvaluationProjectName(evaluationId, projectName));
                        var project      = EvaluationFolder.GetOrCreateNodeWithName <Project>(nodeName);
                        if (project.ProjectFile == null)
                        {
                            project.ProjectFile = projectName;
                        }

                        // we stash the evaluation Id as a negative ProjectContextId
                        project.Id = evaluationId;
                    }
                    else if (e is ProjectEvaluationFinishedEventArgs projectEvaluationFinished)
                    {
                        EvaluationFolder = Build.GetOrCreateNodeWithName <Folder>("Evaluation");

                        var projectName    = Intern(projectEvaluationFinished.ProjectFile);
                        var profilerResult = projectEvaluationFinished.ProfilerResult;
                        if (profilerResult != null && projectName != null)
                        {
                            var nodeName = Intern(GetEvaluationProjectName(-projectEvaluationFinished.BuildEventContext.ProjectContextId, projectName));
                            var project  = EvaluationFolder.GetOrCreateNodeWithName <Project>(nodeName);
                            ConstructProfilerResult(project, profilerResult.Value);
                        }
                    }
                    // this happens during live build using MSBuild 15.3 or newer
                    else if (e.GetType().Name == "ProjectEvaluationStartedEventArgs")
                    {
                        var projectName = Intern(TextUtilities.ParseQuotedSubstring(e.Message));
                        var nodeName    = Intern(GetEvaluationProjectName(-e.BuildEventContext.ProjectContextId, projectName));
                        var project     = EvaluationFolder.GetOrCreateNodeWithName <Project>(nodeName);
                        project.Id = Reflector.GetEvaluationId(e.BuildEventContext);
                        if (project.ProjectFile == null)
                        {
                            project.ProjectFile = projectName;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }
Exemple #4
0
        /// <summary>
        /// Handles a generic BuildMessage event and assigns it to the appropriate logging node.
        /// </summary>
        /// <param name="args">The <see cref="BuildMessageEventArgs"/> instance containing the event data.</param>
        public void AddMessage(LazyFormattedBuildEventArgs args, string message)
        {
            message = stringTable.Intern(message);

            TreeNode node        = null;
            var      messageNode = new Message
            {
                Text      = message,
                Timestamp = args.Timestamp
            };
            object nodeToAdd = messageNode;

            if (args.BuildEventContext?.TaskId > 0)
            {
                node = construction
                       .GetOrAddProject(args.BuildEventContext.ProjectContextId)
                       .GetTargetById(args.BuildEventContext.TargetId)
                       .GetTaskById(args.BuildEventContext.TaskId);
                var task = node as Task;
                if (task != null)
                {
                    if (task.Name == "ResolveAssemblyReference")
                    {
                        Folder inputs  = task.GetOrCreateNodeWithName <Folder>("Inputs");
                        Folder results = task.FindChild <Folder>("Results");
                        node = results ?? inputs;

                        if (message.StartsWith("    "))
                        {
                            message = message.Substring(4);

                            var parameter = node.FindLastChild <Parameter>();
                            if (parameter != null)
                            {
                                if (!string.IsNullOrWhiteSpace(message))
                                {
                                    node = parameter;

                                    if (message.StartsWith("    "))
                                    {
                                        message = message.Substring(4);

                                        var lastItem = parameter.FindLastChild <Item>();

                                        // only indent if it's not a "For SearchPath..." message - that one needs to be directly under parameter
                                        if (lastItem != null && !message.StartsWith("For SearchPath"))
                                        {
                                            node = lastItem;
                                        }
                                    }

                                    if (!string.IsNullOrEmpty(message))
                                    {
                                        if (message.IndexOf('=') != -1)
                                        {
                                            var kvp = Utilities.ParseNameValue(message);
                                            node.AddChild(new Metadata
                                            {
                                                Name  = stringTable.Intern(kvp.Key.TrimEnd(space)),
                                                Value = stringTable.Intern(kvp.Value.TrimStart(space))
                                            });
                                        }
                                        else
                                        {
                                            node.AddChild(new Item()
                                            {
                                                Text = stringTable.Intern(message)
                                            });
                                        }
                                    }
                                }

                                return;
                            }
                        }
                        else
                        {
                            if (results == null)
                            {
                                bool isResult = message.StartsWith("Unified primary reference ") ||
                                                message.StartsWith("Primary reference ") ||
                                                message.StartsWith("Dependency ") ||
                                                message.StartsWith("Unified Dependency ");

                                if (isResult)
                                {
                                    results = task.GetOrCreateNodeWithName <Folder>("Results");
                                    node    = results;
                                }
                                else
                                {
                                    node = inputs;
                                }
                            }
                            else
                            {
                                node = results;
                            }

                            node.GetOrCreateNodeWithName <Parameter>(stringTable.Intern(message.TrimEnd(':')));
                            return;
                        }
                    }
                    else if (task.Name == "MSBuild")
                    {
                        if (message.StartsWith("Global Properties") ||
                            message.StartsWith("Additional Properties") ||
                            message.StartsWith("Overriding Global Properties") ||
                            message.StartsWith("Removing Properties"))
                        {
                            node.GetOrCreateNodeWithName <Folder>(message);
                            return;
                        }

                        node = node.FindLastChild <Folder>();
                        if (message[0] == ' ' && message[1] == ' ')
                        {
                            message = message.Substring(2);
                        }

                        var kvp = Utilities.ParseNameValue(message);
                        if (kvp.Value == "")
                        {
                            nodeToAdd = new Item
                            {
                                Text = stringTable.Intern(kvp.Key)
                            };
                        }
                        else
                        {
                            nodeToAdd = new Property
                            {
                                Name  = stringTable.Intern(kvp.Key),
                                Value = stringTable.Intern(kvp.Value)
                            };
                        }
                    }
                }
            }
            else if (args.BuildEventContext?.TargetId > 0)
            {
                node = construction
                       .GetOrAddProject(args.BuildEventContext.ProjectContextId)
                       .GetTargetById(args.BuildEventContext.TargetId);

                if (message.StartsWith("Task") && message.Contains("skipped"))
                {
                    messageNode.IsLowRelevance = true;
                }
            }
            else if (args.BuildEventContext?.ProjectContextId > 0)
            {
                var project = construction.GetOrAddProject(args.BuildEventContext.ProjectContextId);
                node = project;

                if (message.StartsWith("Target") && message.Contains("skipped"))
                {
                    var targetName = stringTable.Intern(Utilities.ParseQuotedSubstring(message));
                    if (targetName != null)
                    {
                        node = project.GetOrAddTargetByName(targetName);
                        messageNode.IsLowRelevance = true;
                    }
                }
            }
            else if (Reflector.GetEvaluationId(args.BuildEventContext) is int evaluationId && evaluationId != -1)
            {
                var evaluation = construction.EvaluationFolder;
                var project    = evaluation.FindChild <Project>(p => p.Id == evaluationId);
                node = project;

                if (node != null && node.FindChild <Message>(message) != null)
                {
                    // avoid duplicate messages
                    return;
                }
            }

            if (node == null)
            {
                node = construction.Build;

                if (IsEvaluationMessage(message))
                {
                    if (!evaluationMessagesAlreadySeen.Add(message))
                    {
                        return;
                    }

                    node = construction.EvaluationFolder;
                }
                else if (message.StartsWith("The target") && message.Contains("does not exist in the project, and will be ignored"))
                {
                    var folder = construction.EvaluationFolder;
                    node = folder;
                    messageNode.IsLowRelevance = true;
                }
                else if (args.BuildEventContext != null && (args.BuildEventContext.NodeId == 0 &&
                                                            args.BuildEventContext.ProjectContextId == 0 &&
                                                            args.BuildEventContext.ProjectInstanceId == 0 &&
                                                            args.BuildEventContext.TargetId == 0 &&
                                                            args.BuildEventContext.TaskId == 0))
                {
                    // must be Detailed Build Summary
                    // https://github.com/Microsoft/msbuild/blob/master/src/XMakeBuildEngine/BackEnd/Components/Scheduler/Scheduler.cs#L509
                    node = construction.Build.GetOrCreateNodeWithName <Folder>("DetailedSummary");
                }
            }

            node.AddChild(nodeToAdd);
        }