예제 #1
0
        /// <nodoc />
        internal void RenderMarkdown(MarkDownWriter writer)
        {
            int cacheHitRate = 0;

            if (TotalProcessPips > 0)
            {
                cacheHitRate = (int)(100.0 * ProcessPipCacheHit / TotalProcessPips);
            }

            var caseRateMessage = $"Process pip cache hits: {cacheHitRate}% ({ProcessPipCacheHit}/{TotalProcessPips})";

            if (Entries.Count == 0)
            {
                writer.WriteDetailedTableEntry("Cache rates", caseRateMessage);
            }
            else
            {
                writer.StartDetailedTableSummary(
                    "Cache rates & Misses",
                    caseRateMessage
                    );

                foreach (var entry in Entries)
                {
                    writer.WritePreSection(
                        entry.PipDescription + (entry.FromCacheLookup ? " (From Cachelookup)" : null),
                        entry.Reason,
                        25);
                }

                writer.EndDetailedTableSummary();
            }
        }
예제 #2
0
        /// <nodoc />
        internal void RenderMarkdown(MarkDownWriter writer)
        {
            writer.StartDetailedTableSummary(
                "Critical path",
                $"Pip Duration: {TotalCriticalPathRuntime.MakeFriendly()}, Exe Duration: {ExeDurationCriticalPath.MakeFriendly()}");
            writer.StartTable(
                "Pip Duration",
                "Exe Duration",
                "Queue Duration",
                "Pip Result",
                "Scheduled Time",
                "Completed Time",
                "Pip");
            writer.WriteTableRow(
                TotalCriticalPathRuntime.MakeFriendly(),
                ExeDurationCriticalPath.MakeFriendly(),
                TotalMasterQueueTime.MakeFriendly(),
                string.Empty,
                string.Empty,
                string.Empty,
                "*Total");
            writer.WriteTableRow(
                "-",
                "-",
                "-",
                "-",
                "-",
                "-",
                "-");
            foreach (var line in Lines)
            {
                writer.WriteTableRow(
                    line.PipDuration.MakeFriendly(),
                    line.ProcessExecuteTime.MakeFriendly(),
                    line.PipQueueDuration.MakeFriendly(),
                    line.Result,
                    line.ScheduleTime.MakeFriendly(),
                    line.Completed.MakeFriendly(),
                    line.PipDescription
                    );
            }

            writer.EndTable();
            writer.EndDetailedTableSummary();
        }
예제 #3
0
        /// <nodoc />
        internal void RenderMarkdown(MarkDownWriter writer)
        {
            int cacheHitRate = 0;
            if (TotalProcessPips > 0)
            {
                cacheHitRate = (int)(100.0 * ProcessPipCacheHit / TotalProcessPips);
            }

            var caseRateMessage = $"Process pip cache hits: {cacheHitRate}% ({ProcessPipCacheHit}/{TotalProcessPips})";

            if (Entries.Count == 0 && BatchEntries == null) 
            {
                writer.WriteDetailedTableEntry("Cache rates", caseRateMessage);
            }
            else
            {
                writer.StartDetailedTableSummary(
                    "Cache rates & Misses",
                    caseRateMessage
                    );

                foreach (var entry in Entries)
                {
                    writer.WritePreSection(
                        entry.PipDescription + (entry.FromCacheLookup ? " (From Cachelookup)" : null), 
                        entry.Reason,
                        25);
                }

                for (var i = 0; i < BatchEntries.Count; i++)
                {
                    if (writer.ExceedsTargetBytes)
                    {
                        writer.WritePreSection("Analysis Results Truncated", "Additional analysis results have been truncated to ensure browser responsiveness", 25);
                        break;
                    }

                    writer.WritePreSection($"Batch #{i}", BatchEntries[i], 25);
                }
                writer.EndDetailedTableSummary();
            }
            
        }
예제 #4
0
        private void WriteKeyValuePair(MarkDownWriter writer, string key, string value, bool fixedFont)
        {
            writer.StartElement("tr");

            writer.StartElement("td", "text-align:left;vertical-align: text-top;min-width:5em");
            writer.WriteText(key);
            writer.EndElement("td");

            writer.StartElement("td");
            if (fixedFont)
            {
                writer.StartElement("span", "font-family:consolas;monospace");
            }

            writer.WriteText(value);
            if (fixedFont)
            {
                writer.EndElement("span");
            }
            writer.EndElement("td");
            writer.EndElement("tr");
        }
예제 #5
0
        /// <nodoc />
        internal void RenderMarkDown(MarkDownWriter writer)
        {
            writer.WriteRaw("### <span style=\"font - family:consolas; monospace\">");
            writer.WriteText(PipDescription);
            writer.WriteRaw("</span> failed with exit code ");
            writer.WriteLineRaw(ExitCode.ToString(CultureInfo.InvariantCulture));

            writer.StartDetails("Pip Details");
            writer.StartTable();
            WriteKeyValuePair(writer, "PipHash:", SemiStablePipId, true);
            WriteKeyValuePair(writer, "Pip:", PipDescription, true);
            WriteKeyValuePair(writer, "Spec:", SpecPath, true);
            WriteKeyValuePair(writer, "Tool:", ToolName, true);
            WriteKeyValuePair(writer, "Exit Code:", ExitCode.ToString(CultureInfo.InvariantCulture), true);
            writer.EndTable();
            writer.EndDetails();

            if (!string.IsNullOrEmpty(Output))
            {
                writer.WritePre(Output);
            }
        }
예제 #6
0
        /// <summary>
        /// This will render the markdown to the predetermined file.
        /// </summary>
        /// <remarks>
        /// Caller is responsible for exception handling
        /// </remarks>
        public string RenderMarkdown()
        {
            Directory.CreateDirectory(Path.GetDirectoryName(m_filePath));
            using (var writer = new MarkDownWriter(m_filePath))
            {
                writer.WriteHeader("Stats");

                writer.StartTable();

                if (DurationTree != null)
                {
                    writer.StartDetailedTableSummary("Build Duration", DurationTree.Duration.MakeFriendly());
                    var builder = new StringBuilder();
                    DurationTree.Write(builder, 0, DurationTree.Duration);
                    writer.WritePre(builder.ToString());
                    writer.EndDetailedTableSummary();
                }

                CacheSummary.RenderMarkdown(writer);

                CriticalPathSummary.RenderMarkdown(writer);

                writer.EndTable();

                if (PipErrors.Count > 0)
                {
                    writer.WriteHeader("Pip Errors");
                    foreach (var error in PipErrors)
                    {
                        writer.WriteLineRaw("");
                        error.RenderMarkDown(writer);
                    }
                }
            }

            return(m_filePath);
        }