private Disposable <ExecutionLogFileReader> LoadExecutionLog(IExecutionLogTarget analyzer) { Contract.Requires(CachedGraph != null); if (ExecutionLogPath != null) { var analysisInput = this; var readerWrapper = StreamProvider.OpenReadStream(ExecutionLogPath) .ChainSelect(executionLogStream => new ExecutionLogFileReader(executionLogStream, analysisInput.CachedGraph.Context, analyzer, closeStreamOnDispose: true)); var reader = readerWrapper.Value; if (!reader.LogId.HasValue) { throw CommandLineUtilities.Error("Could not load execution log. Execution log does not have header containing pip graph id."); } if (reader.LogId.Value != CachedGraph.PipGraph.GraphId) { throw CommandLineUtilities.Error("Could not load execution log. Execution log header contains pip graph id that does not match id from loaded pip graph."); } return(readerWrapper); } return(null); }
public DumpPipAnalyzer(AnalysisInput input, string outputFilePath, long semiStableHash, DirectoryArtifact directory, bool useOriginalPaths, bool logProgress = false) : base(input) { if (string.IsNullOrEmpty(outputFilePath)) { outputFilePath = Path.Combine(Path.GetDirectoryName(input.ExecutionLogPath), $"Pip{semiStableHash:X16}.html"); Console.WriteLine($"Missing option /outputFilePath using: {outputFilePath}"); } m_outputFilePath = outputFilePath; m_useOriginalPaths = useOriginalPaths; if (logProgress) { Console.WriteLine("Finding matching pip"); } var pipTable = input.CachedGraph.PipTable; foreach (var pipId in pipTable.StableKeys) { if (pipTable.GetPipType(pipId) == PipType.Module) { var modulePip = (ModulePip)pipTable.HydratePip(pipId, PipQueryContext.ViewerAnalyzer); m_moduleIdToFriendlyName.Add(modulePip.Module, modulePip.Identity.ToString(StringTable)); } var possibleMatch = pipTable.GetPipSemiStableHash(pipId); if (possibleMatch == semiStableHash) { m_pip = pipTable.HydratePip(pipId, PipQueryContext.ViewerAnalyzer); } } if (directory.IsValid) { Console.WriteLine("Looking for a pip that produced the specified DirectoryArtifact."); var directoryProducers = input.CachedGraph.PipGraph.AllOutputDirectoriesAndProducers.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); if (directoryProducers.TryGetValue(directory, out var pipId)) { m_pip = pipTable.HydratePip(pipId, PipQueryContext.ViewerAnalyzer); } // This directory artifact does not have a registered producer. This might happen if it represents a composite SOD. else if (directory.IsSharedOpaque) { directoryProducers = input.CachedGraph.PipGraph.AllCompositeSharedOpaqueDirectoriesAndProducers.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); if (directoryProducers.TryGetValue(directory, out pipId)) { m_pip = pipTable.HydratePip(pipId, PipQueryContext.ViewerAnalyzer); } } } if (m_pip == null) { throw CommandLineUtilities.Error("Did not find a matching pip."); } m_html = new HtmlHelper(PathTable, StringTable, SymbolTable, CachedGraph.PipTable); }