Пример #1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="TaskParameter"/> class.
        /// </summary>
        /// <param name="message">The message from the logging system.</param>
        /// <param name="prefix">The prefix parsed out (e.g. 'Output Item(s): ').</param>
        /// <param name="collapseSingleItem">If set to <c>true</c>, will collapse the node to a single item when possible.</param>
        /// <param name="itemAttributeName">Name of the item 'Include' attribute.</param>
        protected TaskParameter(string message, string prefix, bool collapseSingleItem = true, string itemAttributeName = "Include")
        {
            this.collapseSingleItem = collapseSingleItem;
            this.itemAttributeName  = itemAttributeName;

            foreach (var item in ItemGroupParser.ParseItemList(message, prefix, out name))
            {
                items.Add(item);
            }
        }
Пример #2
0
        /// <summary>
        /// Handles BuildMessage event when an ItemGroup discovery/evaluation is logged.
        /// </summary>
        /// <param name="args">The <see cref="BuildMessageEventArgs"/> instance containing the event data.</param>
        /// <param name="prefix">The prefix string.</param>
        public void AddItemGroup(BuildMessageEventArgs args, string prefix, NamedNode containerNode)
        {
            var project   = construction.GetOrAddProject(args.BuildEventContext.ProjectContextId);
            var target    = project.GetTargetById(args.BuildEventContext.TargetId);
            var itemGroup = ItemGroupParser.ParsePropertyOrItemList(args.Message, prefix, stringTable);
            var property  = itemGroup as Property;

            if (property != null)
            {
                itemGroup = new Item
                {
                    Name = property.Name,
                    Text = property.Value
                };
                containerNode.Name = stringTable.Intern(property.Name);
            }

            containerNode.AddChild(itemGroup);
            target.AddChild(containerNode);
        }
        /// <summary>
        /// Handles BuildMessage event when an ItemGroup discovery/evaluation is logged.
        /// </summary>
        /// <param name="args">The <see cref="BuildMessageEventArgs"/> instance containing the event data.</param>
        /// <param name="prefix">The prefix string.</param>
        public void AddItemGroup(BuildMessageEventArgs args, string prefix, NamedNode containerNode)
        {
            var project = construction.GetOrAddProject(args.BuildEventContext.ProjectContextId);
            var target  = project.GetTargetById(args.BuildEventContext.TargetId);

            var itemGroup = ItemGroupParser.ParsePropertyOrItemList(args.Message, prefix, stringTable);

            if (itemGroup is Property property)
            {
                itemGroup = new Item
                {
                    Text = property.Value
                };
                containerNode.Name = property.Name;
                containerNode.AddChild(itemGroup);
            }
            else if (itemGroup is Parameter parameter)
            {
                containerNode.Name = parameter.Name;
                foreach (ParentedNode child in parameter.Children)
                {
                    child.Parent = null;
                    containerNode.AddChild(child);
                }
            }

            if (target.LastChild is NamedNode last &&
                last.GetType() == containerNode.GetType() &&
                last.Name == containerNode.Name)
            {
                foreach (ParentedNode child in containerNode.Children)
                {
                    child.Parent = null;
                    last.AddChild(child);
                }

                return;
            }

            target.AddChild(containerNode);
        }
Пример #4
0
        public void WarningRaised(object sender, BuildWarningEventArgs args)
        {
            try
            {
                lock (syncLock)
                {
                    TreeNode parent = FindParent(args.BuildEventContext);
                    if (parent == null)
                    {
                        parent = Build;
                    }

                    var warning = new Warning();

                    string text = args.Message;

                    if (parent is ResolveAssemblyReferenceTask rar)
                    {
                        var match = Strings.IsFoundConflicts(text);
                        if (match.Success)
                        {
                            string details = match.Groups[2].Value;
                            // https://github.com/KirillOsenkov/MSBuildStructuredLog/issues/443
                            ItemGroupParser.ParseThereWasAConflict(warning, details, stringTable);
                            text = text.GetFirstLine();
                        }
                    }

                    parent = parent.GetOrCreateNodeWithName <Folder>(Strings.Warnings);

                    Populate(warning, args, text);

                    parent.AddChild(warning);
                }
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }
Пример #5
0
        public void Process(BuildMessageEventArgs args)
        {
            if (args == null)
            {
                return;
            }

            var message = args.Message;

            if (string.IsNullOrEmpty(message))
            {
                return;
            }

            switch (message[0])
            {
            case 'A':
                if (message.StartsWith(ItemGroupIncludeMessagePrefix))
                {
                    AddItemGroup(args, ItemGroupIncludeMessagePrefix, new AddItem());
                    return;
                }
                break;

            case 'O':
                if (message.StartsWith(OutputItemsMessagePrefix))
                {
                    var task      = GetTask(args);
                    var folder    = task.GetOrCreateNodeWithName <Folder>("OutputItems");
                    var parameter = ItemGroupParser.ParsePropertyOrItemList(message, OutputItemsMessagePrefix, stringTable);
                    folder.AddChild(parameter);
                    return;
                }

                if (message.StartsWith(OutputPropertyMessagePrefix))
                {
                    var task      = GetTask(args);
                    var folder    = task.GetOrCreateNodeWithName <Folder>("OutputProperties");
                    var parameter = ItemGroupParser.ParsePropertyOrItemList(message, OutputPropertyMessagePrefix, stringTable);
                    folder.AddChild(parameter);
                    return;
                }
                break;

            case 'R':
                if (message.StartsWith(ItemGroupRemoveMessagePrefix))
                {
                    AddItemGroup(args, ItemGroupRemoveMessagePrefix, new RemoveItem());
                    return;
                }
                break;

            case 'S':
                if (message.StartsWith(PropertyGroupMessagePrefix))
                {
                    AddPropertyGroup(args, PropertyGroupMessagePrefix);
                    return;
                }
                break;

            case 'T':
                if (message.StartsWith(TaskParameterMessagePrefix))
                {
                    var task      = GetTask(args);
                    var folder    = task.GetOrCreateNodeWithName <Folder>("Parameters");
                    var parameter = ItemGroupParser.ParsePropertyOrItemList(message, TaskParameterMessagePrefix, stringTable);
                    folder.AddChild(parameter);
                    return;
                }
                break;

            case 'U':
                // A task from assembly message (parses out the task name and assembly path).
                var match = usingTaskRegex.Match(message);
                if (match.Success)
                {
                    construction.SetTaskAssembly(
                        stringTable.Intern(match.Groups["task"].Value),
                        stringTable.Intern(match.Groups["assembly"].Value));
                    return;
                }

                break;

            default:
                break;
            }

            if (args is TaskCommandLineEventArgs taskArgs)
            {
                AddCommandLine(taskArgs);
                return;
            }

            // Just the generic log message or something we currently don't handle in the object model.
            AddMessage(args, message);
        }
Пример #6
0
        public void Process(BuildMessageEventArgs args)
        {
            if (args == null)
            {
                return;
            }

            var message = args.Message;

            if (string.IsNullOrEmpty(message))
            {
                return;
            }

            if (args.SenderName == "BinaryLogger")
            {
                var parameter = ItemGroupParser.ParsePropertyOrItemList(message, string.Empty, stringTable);
                construction.Build.AddChild(parameter);
                return;
            }

            if (message.StartsWith(Strings.ItemGroupIncludeMessagePrefix))
            {
                AddItemGroup(args, Strings.ItemGroupIncludeMessagePrefix, new AddItem());
                return;
            }

            if (message.StartsWith(Strings.OutputItemsMessagePrefix))
            {
                var task = GetTask(args);

                //this.construction.Build.Statistics.ReportOutputItemMessage(task, message);

                var folder    = task.GetOrCreateNodeWithName <Folder>("OutputItems");
                var parameter = ItemGroupParser.ParsePropertyOrItemList(message, Strings.OutputItemsMessagePrefix, stringTable);
                folder.AddChild(parameter);
                return;
            }

            if (message.StartsWith(Strings.OutputPropertyMessagePrefix))
            {
                var task      = GetTask(args);
                var folder    = task.GetOrCreateNodeWithName <Folder>("OutputProperties");
                var parameter = ItemGroupParser.ParsePropertyOrItemList(message, Strings.OutputPropertyMessagePrefix, stringTable);
                folder.AddChild(parameter);
                return;
            }

            if (message.StartsWith(Strings.ItemGroupRemoveMessagePrefix))
            {
                AddItemGroup(args, Strings.ItemGroupRemoveMessagePrefix, new RemoveItem());
                return;
            }

            if (message.StartsWith(Strings.PropertyGroupMessagePrefix))
            {
                AddPropertyGroup(args, Strings.PropertyGroupMessagePrefix);
                return;
            }

            if (message.StartsWith(Strings.TaskParameterMessagePrefix))
            {
                var task = GetTask(args);
                if (IgnoreParameters(task))
                {
                    return;
                }

                //this.construction.Build.Statistics.ReportTaskParameterMessage(task, message);

                var folder    = task.GetOrCreateNodeWithName <Folder>(Strings.Parameters);
                var parameter = ItemGroupParser.ParsePropertyOrItemList(message, Strings.TaskParameterMessagePrefix, stringTable);
                folder.AddChild(parameter);
                return;
            }

            // A task from assembly message (parses out the task name and assembly path).
            var match = Strings.UsingTask(message);

            if (match.Success)
            {
                construction.SetTaskAssembly(
                    stringTable.Intern(match.Groups["task"].Value),
                    stringTable.Intern(match.Groups["assembly"].Value));
                return;
            }

            if (args is TaskCommandLineEventArgs taskArgs)
            {
                if (AddCommandLine(taskArgs))
                {
                    return;
                }
            }

            // Just the generic log message or something we currently don't handle in the object model.
            AddMessage(args, message);
        }
Пример #7
0
        private bool ProcessRAR(ResolveAssemblyReferenceTask task, ref TreeNode node, string message)
        {
            Folder inputs  = task.Inputs;
            Folder results = task.Results;

            node = results ?? inputs;

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

                var parameter = node?.FindLastChild <Parameter>();
                if (parameter != null)
                {
                    bool thereWasAConflict = Strings.IsThereWasAConflictPrefix(parameter.Name);
                    if (thereWasAConflict)
                    {
                        if (construction.Build.IsMSBuildVersionAtLeast(16, 9))
                        {
                            // https://github.com/KirillOsenkov/MSBuildStructuredLog/issues/443
                            ItemGroupParser.ParseThereWasAConflict(parameter, message, stringTable);
                        }
                        else
                        {
                            HandleThereWasAConflict(parameter, message, stringTable);
                        }

                        return(true);
                    }

                    if (!string.IsNullOrWhiteSpace(message))
                    {
                        node = parameter;

                        if (message.StartsWith("    ", StringComparison.Ordinal))
                        {
                            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
                            // also don't indent if it's under AssemblyFoldersEx in Results
                            if (lastItem != null &&
                                !Strings.ForSearchPathPrefix.IsMatch(message) &&
                                !parameter.Name.StartsWith("AssemblyFoldersEx", StringComparison.Ordinal))
                            {
                                node = lastItem;
                            }
                        }

                        if (!string.IsNullOrEmpty(message))
                        {
                            var equals = message.IndexOf('=');
                            if (equals != -1 && message.IndexOfFirstLineBreak() == -1)
                            {
                                var kvp      = TextUtilities.ParseNameValue(message);
                                var metadata = new Metadata
                                {
                                    Name  = Intern(kvp.Key.TrimEnd(space)),
                                    Value = Intern(kvp.Value.TrimStart(space))
                                };
                                node.Children.Add(metadata);
                                metadata.Parent = node;
                            }
                            else
                            {
                                node.AddChild(new Item
                                {
                                    Text = Intern(message)
                                });
                            }
                        }
                    }

                    return(true);
                }
            }
            else
            {
                if (results == null)
                {
                    bool isResult = Strings.UnifiedPrimaryReferencePrefix.IsMatch(message) ||
                                    Strings.PrimaryReferencePrefix.IsMatch(message) ||
                                    Strings.DependencyPrefix.IsMatch(message) ||
                                    Strings.UnifiedDependencyPrefix.IsMatch(message) ||
                                    Strings.AssemblyFoldersExLocation.IsMatch(message) ||
                                    Strings.IsThereWasAConflictPrefix(message);

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

                        node = inputs;
                    }
                }
                else
                {
                    node = results;
                }

                var    parameter = new Parameter();
                string parameterName;

                if (Strings.IsThereWasAConflictPrefix(message))
                {
                    ItemGroupParser.ParseThereWasAConflict(parameter, message, stringTable);
                    parameterName = message.GetFirstLine();
                }
                else
                {
                    parameterName = message.TrimEnd(':');
                }

                parameter.Name = Intern(parameterName);

                node.AddChild(parameter);
                return(true);
            }

            return(false);
        }
Пример #8
0
        public void Process(BuildMessageEventArgs args)
        {
            // Task Input / Outputs
            if (args.Message.StartsWith(TaskParameterMessagePrefix))
            {
                var task      = GetTask(args);
                var folder    = task.GetOrCreateNodeWithName <Folder>("Parameters");
                var parameter = ItemGroupParser.ParsePropertyOrItemList(args.Message, TaskParameterMessagePrefix, stringTable);
                folder.AddChild(parameter);
            }
            else if (args.Message.StartsWith(OutputItemsMessagePrefix))
            {
                var task      = GetTask(args);
                var folder    = task.GetOrCreateNodeWithName <Folder>("OutputItems");
                var parameter = ItemGroupParser.ParsePropertyOrItemList(args.Message, OutputItemsMessagePrefix, stringTable);
                folder.AddChild(parameter);
            }
            else if (args.Message.StartsWith(OutputPropertyMessagePrefix))
            {
                var task      = GetTask(args);
                var folder    = task.GetOrCreateNodeWithName <Folder>("OutputProperties");
                var parameter = ItemGroupParser.ParsePropertyOrItemList(args.Message, OutputPropertyMessagePrefix, stringTable);
                folder.AddChild(parameter);
            }

            // Item / Property groups
            else if (args.Message.StartsWith(PropertyGroupMessagePrefix))
            {
                AddPropertyGroup(args, PropertyGroupMessagePrefix);
            }
            else if (args.Message.StartsWith(ItemGroupIncludeMessagePrefix))
            {
                AddItemGroup(args, ItemGroupIncludeMessagePrefix, new AddItem());
            }
            else if (args.Message.StartsWith(ItemGroupRemoveMessagePrefix))
            {
                AddItemGroup(args, ItemGroupRemoveMessagePrefix, new RemoveItem());
            }
            else
            {
                // This was command line arguments for task
                var taskArgs = args as TaskCommandLineEventArgs;
                if (taskArgs != null)
                {
                    AddCommandLine(taskArgs);
                    return;
                }

                // A task from assembly message (parses out the task name and assembly path).
                const string taskAssemblyPattern = "Using \"(?<task>.+)\" task from (assembly|the task factory) \"(?<assembly>.+)\"\\.";
                var          match = Regex.Match(args.Message, taskAssemblyPattern);
                if (match.Success)
                {
                    construction.SetTaskAssembly(
                        stringTable.Intern(match.Groups["task"].Value),
                        stringTable.Intern(match.Groups["assembly"].Value));
                }
                else
                {
                    // Just the generic log message or something we currently don't handle in the object model.
                    AddMessage(args, args.Message);
                }
            }
        }