public void ExportBuildLog(long buildId) { switch (exportType) { #region Text case LogExportType.Text: { DB_BuildInfo dbBuild = DB.Table <DB_BuildInfo>().Where(x => x.Id == buildId).First(); if (dbBuild.EndTime == DateTime.MinValue) { dbBuild.EndTime = DateTime.UtcNow; } w.WriteLine($"- PEBakery Build <{dbBuild.Name}> -"); w.WriteLine($"Started at {dbBuild.StartTime.ToLocalTime().ToString("yyyy-MM-dd h:mm:ss tt", CultureInfo.InvariantCulture)}"); w.WriteLine($"Finished at {dbBuild.EndTime.ToLocalTime().ToString("yyyy-MM-dd h:mm:ss tt", CultureInfo.InvariantCulture)}"); TimeSpan t = dbBuild.EndTime - dbBuild.StartTime; w.WriteLine($"Took {t:h\\:mm\\:ss}"); w.WriteLine(); w.WriteLine(); w.WriteLine($"<Log Statistics>"); var states = ((LogState[])Enum.GetValues(typeof(LogState))).Where(x => x != LogState.None && x != LogState.CriticalError); foreach (LogState state in states) { int count = DB.Table <DB_BuildLog>() .Where(x => x.BuildId == buildId) .Where(x => x.State == state) .Count(); w.WriteLine($"{state.ToString().PadRight(9)} : {count}"); } w.WriteLine(); w.WriteLine(); // Show ErrorLogs DB_BuildLog[] errors = DB.Table <DB_BuildLog>().Where(x => x.BuildId == buildId && x.State == LogState.Error).ToArray(); if (0 < errors.Length) { w.WriteLine("<Errors>"); long[] pLogIds = errors.Select(x => x.ScriptId).Distinct().ToArray(); DB_Script[] pLogs = DB.Table <DB_Script>().Where(x => x.BuildId == buildId && pLogIds.Contains(x.Id)).ToArray(); foreach (DB_Script pLog in pLogs) { DB_BuildLog[] eLogs = errors.Where(x => x.ScriptId == pLog.Id).ToArray(); if (eLogs.Length == 1) { w.WriteLine($"- [{eLogs.Length}] Error in Script [{pLog.Name}] ({pLog.Path})"); } else { w.WriteLine($"- [{eLogs.Length}] Errors in Script [{pLog.Name}] ({pLog.Path})"); } foreach (DB_BuildLog eLog in eLogs) { w.WriteLine(eLog.Export(LogExportType.Text, false)); } w.WriteLine(); } w.WriteLine(); } // Show WarnLogs DB_BuildLog[] warns = DB.Table <DB_BuildLog>().Where(x => x.BuildId == buildId && x.State == LogState.Warning).ToArray(); if (0 < errors.Length) { w.WriteLine("<Warnings>"); long[] pLogIds = warns.Select(x => x.ScriptId).Distinct().ToArray(); DB_Script[] pLogs = DB.Table <DB_Script>().Where(x => x.BuildId == buildId && pLogIds.Contains(x.Id)).ToArray(); foreach (DB_Script pLog in pLogs) { DB_BuildLog[] wLogs = warns.Where(x => x.ScriptId == pLog.Id).ToArray(); if (wLogs.Length == 1) { w.WriteLine($"- [{wLogs.Length}] Warning in Script [{pLog.Name}] ({pLog.Path})"); } else { w.WriteLine($"- [{wLogs.Length}] Warnings in Script [{pLog.Name}] ({pLog.Path})"); } foreach (DB_BuildLog eLog in wLogs) { w.WriteLine(eLog.Export(LogExportType.Text, false)); } w.WriteLine(); } w.WriteLine(); } // Script var scripts = DB.Table <DB_Script>() .Where(x => x.BuildId == buildId) .OrderBy(x => x.Order); w.WriteLine("<Scripts>"); { int count = scripts.Count(); int idx = 1; foreach (DB_Script p in scripts) { w.WriteLine($"[{idx}/{count}] {p.Name} v{p.Version} ({p.ElapsedMilliSec / 1000.0:0.000}sec)"); idx++; } w.WriteLine($"Total {count} Scripts"); w.WriteLine(); w.WriteLine(); } w.WriteLine("<Variables>"); VarsType[] typeList = new VarsType[] { VarsType.Fixed, VarsType.Global }; foreach (VarsType varsType in typeList) { w.WriteLine($"- {varsType} Variables"); var vars = DB.Table <DB_Variable>() .Where(x => x.BuildId == buildId && x.Type == varsType) .OrderBy(x => x.Key); foreach (DB_Variable log in vars) { w.WriteLine($"%{log.Key}% = {log.Value}"); } w.WriteLine(); } w.WriteLine(); w.WriteLine("<Code Logs>"); { foreach (DB_Script pLog in scripts) { // Log codes var cLogs = DB.Table <DB_BuildLog>() .Where(x => x.BuildId == buildId && x.ScriptId == pLog.Id) .OrderBy(x => x.Id); foreach (DB_BuildLog log in cLogs) { w.WriteLine(log.Export(LogExportType.Text)); } // Log local variables var vLogs = DB.Table <DB_Variable>() .Where(x => x.BuildId == buildId && x.ScriptId == pLog.Id && x.Type == VarsType.Local) .OrderBy(x => x.Key); if (0 < vLogs.Count()) { w.WriteLine($"- Local Variables of Script [{pLog.Name}]"); foreach (DB_Variable vLog in vLogs) { w.WriteLine($"%{vLog.Key}% = {vLog.Value}"); } w.WriteLine(Logger.LogSeperator); } w.WriteLine(); } } } break; #endregion #region HTML case LogExportType.Html: { DB_BuildInfo dbBuild = DB.Table <DB_BuildInfo>().Where(x => x.Id == buildId).First(); if (dbBuild.EndTime == DateTime.MinValue) { dbBuild.EndTime = DateTime.UtcNow; } ExportBuildLogHtmlModel m = new ExportBuildLogHtmlModel() { PEBakeryVersion = Properties.Resources.StringVersion, BuildName = dbBuild.Name, BuildStartTimeStr = dbBuild.StartTime.ToLocalTime().ToString("yyyy-MM-dd h:mm:ss tt", CultureInfo.InvariantCulture), BuildEndTimeStr = dbBuild.EndTime.ToLocalTime().ToString("yyyy-MM-dd h:mm:ss tt", CultureInfo.InvariantCulture), BuildTookTimeStr = $"{(dbBuild.EndTime - dbBuild.StartTime):h\\:mm\\:ss}", }; // Log Statistics m.LogStats = new List <LogStatHtmlModel>(); var states = ((LogState[])Enum.GetValues(typeof(LogState))).Where(x => x != LogState.None && x != LogState.CriticalError); foreach (LogState state in states) { int count = DB.Table <DB_BuildLog>() .Where(x => x.BuildId == buildId && x.State == state) .Count(); m.LogStats.Add(new LogStatHtmlModel() { State = state, Count = count, }); } // Show ErrorLogs m.ErrorCodeDicts = new Dictionary <ScriptHtmlModel, CodeLogHtmlModel[]>(); { int errIdx = 0; DB_BuildLog[] errors = DB.Table <DB_BuildLog>().Where(x => x.BuildId == buildId && x.State == LogState.Error).ToArray(); if (0 < errors.Length) { long[] pLogIds = errors.Select(x => x.ScriptId).Distinct().ToArray(); DB_Script[] pLogs = DB.Table <DB_Script>().Where(x => x.BuildId == buildId && pLogIds.Contains(x.Id)).ToArray(); foreach (DB_Script pLog in pLogs) { ScriptHtmlModel pModel = new ScriptHtmlModel() { Name = pLog.Name, Path = pLog.Path, }; m.ErrorCodeDicts[pModel] = errors .Where(x => x.ScriptId == pLog.Id) .Select(x => new CodeLogHtmlModel() { State = x.State, Message = x.Export(LogExportType.Html, false), Href = (errIdx++), }).ToArray(); } } } // Show WarnLogs m.WarnCodeDicts = new Dictionary <ScriptHtmlModel, CodeLogHtmlModel[]>(); { int warnIdx = 0; DB_BuildLog[] warns = DB.Table <DB_BuildLog>().Where(x => x.BuildId == buildId && x.State == LogState.Warning).ToArray(); if (0 < warns.Length) { long[] pLogIds = warns.Select(x => x.ScriptId).Distinct().ToArray(); DB_Script[] pLogs = DB.Table <DB_Script>().Where(x => x.BuildId == buildId && pLogIds.Contains(x.Id)).ToArray(); foreach (DB_Script pLog in pLogs) { ScriptHtmlModel pModel = new ScriptHtmlModel() { Name = pLog.Name, Path = pLog.Path, }; m.WarnCodeDicts[pModel] = warns .Where(x => x.ScriptId == pLog.Id) .Select(x => new CodeLogHtmlModel() { State = x.State, Message = x.Export(LogExportType.Html, false), Href = (warnIdx++), }).ToArray(); } } } // Scripts var scripts = DB.Table <DB_Script>() .Where(x => x.BuildId == buildId) .OrderBy(x => x.Order); m.Scripts = new List <ScriptHtmlModel>(); { int idx = 1; foreach (DB_Script pLog in scripts) { m.Scripts.Add(new ScriptHtmlModel() { Index = idx, Name = pLog.Name, Path = pLog.Path, Version = $"v{pLog.Version}", TimeStr = $"{pLog.ElapsedMilliSec / 1000.0:0.000}s", }); idx++; } } // Variables m.Vars = new List <VarHtmlModel>(); { var vars = DB.Table <DB_Variable>() .Where(x => x.BuildId == buildId && (x.Type == VarsType.Fixed || x.Type == VarsType.Global)) .OrderBy(x => x.Type) .ThenBy(x => x.Key); foreach (DB_Variable vLog in vars) { m.Vars.Add(new VarHtmlModel() { Type = vLog.Type, Key = vLog.Key, Value = vLog.Value, }); } } // CodeLogs m.CodeLogs = new List <Tuple <ScriptHtmlModel, CodeLogHtmlModel[], VarHtmlModel[]> >(); { int pIdx = 0; int errIdx = 0; int warnIdx = 0; foreach (DB_Script pLog in scripts) { pIdx += 1; // Log codes DB_BuildLog[] codeLogs = DB.Table <DB_BuildLog>() .Where(x => x.BuildId == buildId && x.ScriptId == pLog.Id) .OrderBy(x => x.Id).ToArray(); ScriptHtmlModel pModel = new ScriptHtmlModel() { Index = pIdx, Name = pLog.Name, Path = pLog.Path, }; List <CodeLogHtmlModel> logModel = new List <CodeLogHtmlModel>(codeLogs.Length); foreach (DB_BuildLog log in codeLogs) { if (log.State == LogState.Error) { logModel.Add(new CodeLogHtmlModel() { State = log.State, Message = log.Export(LogExportType.Html), Href = (errIdx++), }); } else if (log.State == LogState.Warning) { logModel.Add(new CodeLogHtmlModel() { State = log.State, Message = log.Export(LogExportType.Html), Href = (warnIdx++), }); } else { logModel.Add(new CodeLogHtmlModel() { State = log.State, Message = log.Export(LogExportType.Html), }); } } // Log local variables VarHtmlModel[] localVarModel = DB.Table <DB_Variable>() .Where(x => x.BuildId == buildId && x.ScriptId == pLog.Id && x.Type == VarsType.Local) .OrderBy(x => x.Key) .Select(x => new VarHtmlModel() { Type = x.Type, Key = x.Key, Value = x.Value, }).ToArray(); m.CodeLogs.Add(new Tuple <ScriptHtmlModel, CodeLogHtmlModel[], VarHtmlModel[]>(pModel, logModel.ToArray(), localVarModel)); } } string html = RazorEngine.Engine.Razor.RunCompile(Properties.Resources.BuildLogHtmlTemplate, "BuildLogHtmlTemplateKey", null, m); w.WriteLine(html); } break; #endregion } }
public void ExportBuildLog(int buildId, BuildLogOptions opts) { switch (_exportType) { #region Text case LogExportType.Text: { LogModel.BuildInfo dbBuild = _db.Table <LogModel.BuildInfo>().First(x => x.Id == buildId); if (dbBuild.EndTime == DateTime.MinValue) { dbBuild.EndTime = DateTime.UtcNow; } _w.WriteLine($"- PEBakery Build <{dbBuild.Name}> -"); _w.WriteLine($"Started at {dbBuild.StartTime.ToLocalTime().ToString("yyyy-MM-dd hh:mm:ss tt K", CultureInfo.InvariantCulture)}"); _w.WriteLine($"Finished at {dbBuild.EndTime.ToLocalTime().ToString("yyyy-MM-dd hh:mm:ss tt K", CultureInfo.InvariantCulture)}"); TimeSpan t = dbBuild.EndTime - dbBuild.StartTime; _w.WriteLine($"Took {t:h\\:mm\\:ss}"); _w.WriteLine(); _w.WriteLine(); // Log Statistics _w.WriteLine("<Log Statistics>"); var states = ((LogState[])Enum.GetValues(typeof(LogState))).Where(x => x != LogState.None && x != LogState.CriticalError); foreach (LogState state in states) { int count = _db.Table <LogModel.BuildLog>().Count(x => x.BuildId == buildId && x.State == state); _w.WriteLine($"{state.ToString().PadRight(9)}: {count}"); } _w.WriteLine(); _w.WriteLine(); // Show ErrorLogs LogModel.BuildLog[] errors = _db.Table <LogModel.BuildLog>().Where(x => x.BuildId == buildId && x.State == LogState.Error).ToArray(); if (0 < errors.Length) { _w.WriteLine("<Errors>"); int[] scLogIds = errors.Select(x => x.ScriptId).OrderBy(x => x).Distinct().ToArray(); LogModel.Script[] scLogs = _db.Table <LogModel.Script>().Where(x => x.BuildId == buildId && scLogIds.Contains(x.Id)).ToArray(); int[] refScLogIds = errors.Select(x => x.RefScriptId).OrderBy(x => x).Distinct().ToArray(); LogModel.Script[] refScLogs = _db.Table <LogModel.Script>().Where(x => x.BuildId == buildId && refScLogIds.Contains(x.Id)).ToArray(); foreach (LogModel.Script scLog in scLogs) { LogModel.BuildLog[] eLogs = errors.Where(x => x.ScriptId == scLog.Id).ToArray(); if (eLogs.Length == 1) { _w.WriteLine($"- [{eLogs.Length}] Error in script [{scLog.Name}] ({scLog.TreePath})"); } else { _w.WriteLine($"- [{eLogs.Length}] Errors in script [{scLog.Name}] ({scLog.TreePath})"); } foreach (LogModel.BuildLog eLog in eLogs) { _w.WriteLine(eLog.Export(LogExportType.Text, false)); if (eLog.RefScriptId != 0 && eLog.RefScriptId != eLog.ScriptId) { _w.Write(" "); _w.WriteLine(ExportRefScriptText(eLog, refScLogs)); } } _w.WriteLine(); } _w.WriteLine(); } // Show WarnLogs LogModel.BuildLog[] warns = _db.Table <LogModel.BuildLog>().Where(x => x.BuildId == buildId && x.State == LogState.Warning).ToArray(); if (0 < warns.Length) { _w.WriteLine("<Warnings>"); int[] scLogIds = warns.Select(x => x.ScriptId).OrderBy(x => x).Distinct().ToArray(); LogModel.Script[] scLogs = _db.Table <LogModel.Script>().Where(x => x.BuildId == buildId && scLogIds.Contains(x.Id)).ToArray(); int[] refScLogIds = warns.Select(x => x.RefScriptId).OrderBy(x => x).Distinct().ToArray(); LogModel.Script[] refScLogs = _db.Table <LogModel.Script>().Where(x => x.BuildId == buildId && refScLogIds.Contains(x.Id)).ToArray(); foreach (LogModel.Script scLog in scLogs) { LogModel.BuildLog[] wLogs = warns.Where(x => x.ScriptId == scLog.Id).ToArray(); Debug.Assert(0 < wLogs.Length); if (wLogs.Length == 1) { _w.WriteLine($"- [{wLogs.Length}] Warning in script [{scLog.Name}] ({scLog.TreePath})"); } else { _w.WriteLine($"- [{wLogs.Length}] Warnings in script [{scLog.Name}] ({scLog.TreePath})"); } foreach (LogModel.BuildLog wLog in wLogs) { _w.WriteLine(wLog.Export(LogExportType.Text, false)); if (wLog.RefScriptId != 0 && wLog.RefScriptId != wLog.ScriptId) { _w.Write(" "); _w.WriteLine(ExportRefScriptText(wLog, refScLogs)); } } _w.WriteLine(); } _w.WriteLine(); } // Script LogModel.Script[] scripts = _db.Table <LogModel.Script>() .Where(x => x.BuildId == buildId) .ToArray(); LogModel.Script[] processedScripts = scripts .Where(x => 0 < x.Order) .OrderBy(x => x.Order) .ToArray(); _w.WriteLine("<Scripts>"); { int count = processedScripts.Length; int idx = 1; foreach (LogModel.Script sc in processedScripts) { _w.WriteLine($"[{idx}/{count}] {sc.Name} v{sc.Version} ({sc.ElapsedMilliSec / 1000.0:0.000}s)"); idx++; } _w.WriteLine($"Total {count} Scripts"); _w.WriteLine(); _w.WriteLine(); } // Variables _w.WriteLine("<Variables>"); VarsType[] typeList = { VarsType.Fixed, VarsType.Global }; foreach (VarsType varsType in typeList) { _w.WriteLine($"- {varsType} Variables"); var vars = _db.Table <LogModel.Variable>() .Where(x => x.BuildId == buildId && x.Type == varsType) .OrderBy(x => x.Key); foreach (LogModel.Variable log in vars) { _w.WriteLine($"%{log.Key}% = {log.Value}"); } _w.WriteLine(); } _w.WriteLine(); // Code Logs _w.WriteLine("<Code Logs>"); { foreach (LogModel.Script scLog in processedScripts) { // Log codes var cLogs = _db.Table <LogModel.BuildLog>() .Where(x => x.BuildId == buildId && x.ScriptId == scLog.Id); if (!opts.IncludeComments) { cLogs = cLogs.Where(x => (x.Flags & LogModel.BuildLogFlag.Comment) != LogModel.BuildLogFlag.Comment); } if (!opts.IncludeMacros) { cLogs = cLogs.Where(x => (x.Flags & LogModel.BuildLogFlag.Macro) != LogModel.BuildLogFlag.Macro); } cLogs = cLogs.OrderBy(x => x.Id); foreach (LogModel.BuildLog log in cLogs) { _w.WriteLine(log.Export(LogExportType.Text, true)); } // Log local variables var vLogs = _db.Table <LogModel.Variable>() .Where(x => x.BuildId == buildId && x.ScriptId == scLog.Id && x.Type == VarsType.Local) .OrderBy(x => x.Key); if (vLogs.Any()) { _w.WriteLine($"- Local Variables of Script [{scLog.Name}]"); foreach (LogModel.Variable vLog in vLogs) { _w.WriteLine($"%{vLog.Key}% = {vLog.Value}"); } _w.WriteLine(Logger.LogSeparator); } _w.WriteLine(); } } } break; #endregion #region HTML case LogExportType.Html: { LogModel.BuildInfo dbBuild = _db.Table <LogModel.BuildInfo>().First(x => x.Id == buildId); if (dbBuild.EndTime == DateTime.MinValue) { dbBuild.EndTime = DateTime.UtcNow; } ExportBuildLogHtmlModel m = new ExportBuildLogHtmlModel { PEBakeryVersion = Global.Const.StringVersionFull, BuildName = dbBuild.Name, BuildStartTimeStr = dbBuild.StartTime.ToLocalTime().ToString("yyyy-MM-dd h:mm:ss tt K", CultureInfo.InvariantCulture), BuildEndTimeStr = dbBuild.EndTime.ToLocalTime().ToString("yyyy-MM-dd h:mm:ss tt K", CultureInfo.InvariantCulture), BuildTookTimeStr = $"{dbBuild.EndTime - dbBuild.StartTime:h\\:mm\\:ss}", LogStats = new List <LogStatHtmlModel>(), }; // Log Statistics var states = ((LogState[])Enum.GetValues(typeof(LogState))).Where(x => x != LogState.None && x != LogState.CriticalError); foreach (LogState state in states) { int count = _db.Table <LogModel.BuildLog>().Count(x => x.BuildId == buildId && x.State == state); m.LogStats.Add(new LogStatHtmlModel { State = state, Count = count, }); } // Show ErrorLogs m.ErrorCodeDicts = new Dictionary <ScriptHtmlModel, Tuple <CodeLogHtmlModel, string>[]>(); { int errIdx = 0; LogModel.BuildLog[] errors = _db.Table <LogModel.BuildLog>().Where(x => x.BuildId == buildId && x.State == LogState.Error).ToArray(); if (0 < errors.Length) { int[] pLogIds = errors.Select(x => x.ScriptId).Distinct().ToArray(); LogModel.Script[] scLogs = _db.Table <LogModel.Script>().Where(x => x.BuildId == buildId && pLogIds.Contains(x.Id)).ToArray(); int[] refScLogIds = errors.Select(x => x.RefScriptId).OrderBy(x => x).Distinct().ToArray(); LogModel.Script[] refScLogs = _db.Table <LogModel.Script>().Where(x => x.BuildId == buildId && refScLogIds.Contains(x.Id)).ToArray(); foreach (LogModel.Script scLog in scLogs) { ScriptHtmlModel scModel = new ScriptHtmlModel { Name = scLog.Name, Path = scLog.TreePath, }; m.ErrorCodeDicts[scModel] = errors .Where(x => x.ScriptId == scLog.Id) .Select(x => new Tuple <CodeLogHtmlModel, string>( new CodeLogHtmlModel { State = x.State, Message = x.Export(LogExportType.Html, false), Href = errIdx++, }, ExportRefScriptText(x, refScLogs))).ToArray(); } } } // Show WarnLogs m.WarnCodeDicts = new Dictionary <ScriptHtmlModel, Tuple <CodeLogHtmlModel, string>[]>(); { int warnIdx = 0; LogModel.BuildLog[] warns = _db.Table <LogModel.BuildLog>().Where(x => x.BuildId == buildId && x.State == LogState.Warning).ToArray(); if (0 < warns.Length) { int[] pLogIds = warns.Select(x => x.ScriptId).Distinct().ToArray(); LogModel.Script[] scLogs = _db.Table <LogModel.Script>().Where(x => x.BuildId == buildId && pLogIds.Contains(x.Id)).ToArray(); int[] refScLogIds = warns.Select(x => x.RefScriptId).OrderBy(x => x).Distinct().ToArray(); LogModel.Script[] refScLogs = _db.Table <LogModel.Script>().Where(x => x.BuildId == buildId && refScLogIds.Contains(x.Id)).ToArray(); foreach (LogModel.Script scLog in scLogs) { ScriptHtmlModel pModel = new ScriptHtmlModel { Name = scLog.Name, Path = scLog.TreePath, }; m.WarnCodeDicts[pModel] = warns .Where(x => x.ScriptId == scLog.Id) .Select(x => new Tuple <CodeLogHtmlModel, string>( new CodeLogHtmlModel { State = x.State, Message = x.Export(LogExportType.Html, false), Href = warnIdx++, }, ExportRefScriptText(x, refScLogs))).ToArray(); } } } // Scripts var scripts = _db.Table <LogModel.Script>() .Where(x => x.BuildId == buildId && 0 < x.Order) .OrderBy(x => x.Order); m.Scripts = new List <ScriptHtmlModel>(); { int idx = 1; foreach (LogModel.Script scLog in scripts) { m.Scripts.Add(new ScriptHtmlModel { Index = idx, Name = scLog.Name, Path = scLog.TreePath, Version = $"v{scLog.Version}", TimeStr = $"{scLog.ElapsedMilliSec / 1000.0:0.000}s", }); idx++; } } // Variables m.Vars = new List <VarHtmlModel>(); { var vars = _db.Table <LogModel.Variable>() .Where(x => x.BuildId == buildId && (x.Type == VarsType.Fixed || x.Type == VarsType.Global)) .OrderBy(x => x.Type) .ThenBy(x => x.Key); foreach (LogModel.Variable vLog in vars) { m.Vars.Add(new VarHtmlModel { Type = vLog.Type, Key = vLog.Key, Value = vLog.Value, }); } } // CodeLogs m.CodeLogs = new List <Tuple <ScriptHtmlModel, CodeLogHtmlModel[], VarHtmlModel[]> >(); { int pIdx = 0; int errIdx = 0; int warnIdx = 0; foreach (LogModel.Script scLog in scripts) { pIdx += 1; // Log codes var cLogs = _db.Table <LogModel.BuildLog>().Where(x => x.BuildId == buildId && x.ScriptId == scLog.Id); if (!opts.IncludeComments) { cLogs = cLogs.Where(x => (x.Flags & LogModel.BuildLogFlag.Comment) != LogModel.BuildLogFlag.Comment); } if (!opts.IncludeMacros) { cLogs = cLogs.Where(x => (x.Flags & LogModel.BuildLogFlag.Macro) != LogModel.BuildLogFlag.Macro); } LogModel.BuildLog[] codeLogs = cLogs.OrderBy(x => x.Id).OrderBy(x => x.Id).ToArray(); ScriptHtmlModel pModel = new ScriptHtmlModel { Index = pIdx, Name = scLog.Name, Path = scLog.TreePath, }; List <CodeLogHtmlModel> logModel = new List <CodeLogHtmlModel>(codeLogs.Length); foreach (LogModel.BuildLog log in codeLogs) { CodeLogHtmlModel item = new CodeLogHtmlModel { State = log.State, Message = log.Export(LogExportType.Html, true), }; if (log.State == LogState.Error) { item.Href = errIdx++; } else if (log.State == LogState.Warning) { item.Href = warnIdx++; } logModel.Add(item); } // Log local variables VarHtmlModel[] localVarModel = _db.Table <LogModel.Variable>() .Where(x => x.BuildId == buildId && x.ScriptId == scLog.Id && x.Type == VarsType.Local) .OrderBy(x => x.Key) .Select(x => new VarHtmlModel { Type = x.Type, Key = x.Key, Value = x.Value, }).ToArray(); m.CodeLogs.Add(new Tuple <ScriptHtmlModel, CodeLogHtmlModel[], VarHtmlModel[]>(pModel, logModel.ToArray(), localVarModel)); } } string html = RazorEngine.Engine.Razor.RunCompile(Properties.Resources.BuildLogHtmlTemplate, "BuildLogHtmlTemplateKey", null, m); _w.WriteLine(html); } break; #endregion } }