private async Task AddAssemblyAsync(PackageFile assembly, PackageInput packageInput) { var file = _context.Source.Get(SymbolsIndexUtility.GetAssemblyFilePath(assembly.FileName, assembly.Hash)); if (await file.Exists(_context.Log, _context.Token) == false) { // Write assembly using (var stream = await packageInput.GetEntryStreamWithLockAsync(assembly.ZipEntry)) { await file.Write(stream, _context.Log, _context.Token); } } }
private async Task <List <PackageFile> > GetAssembliesAsync(PackageInput packageInput) { var result = new List <PackageFile>(); var seen = new HashSet <ISleetFile>(); var assemblyFiles = await packageInput.RunWithLockAsync(p => Task.FromResult(p.Zip.Entries .Where(e => e.FullName.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) .ToList())); var pdbFiles = await packageInput.RunWithLockAsync(p => Task.FromResult(p.Zip.Entries .Where(e => e.FullName.EndsWith(".pdb", StringComparison.OrdinalIgnoreCase)) .ToList())); foreach (var assembly in assemblyFiles) { string assemblyHash = null; string pdbHash = null; ZipArchiveEntry pdbEntry = null; var valid = false; try { using (var stream = await packageInput.GetEntryStreamWithLockAsync(assembly)) using (var reader = new PEReader(stream)) { assemblyHash = SymbolsUtility.GetSymbolHashFromAssembly(reader); pdbHash = SymbolsUtility.GetPDBHashFromAssembly(reader); } var assemblyWithoutExt = SleetLib.PathUtility.GetFullPathWithoutExtension(assembly.FullName); pdbEntry = pdbFiles.FirstOrDefault(e => StringComparer.OrdinalIgnoreCase.Equals( SleetLib.PathUtility.GetFullPathWithoutExtension(e.FullName), assemblyWithoutExt)); valid = true; } catch { // Ignore bad assemblies var message = LogMessage.Create(LogLevel.Warning, $"Unable add symbols for {assembly.FullName}, this file will not be present in the symbol server."); await _context.Log.LogAsync(message); } if (valid) { // Add .dll var fileInfo = new FileInfo(assembly.FullName); var dllFile = _context.Source.Get(SymbolsIndexUtility.GetAssemblyFilePath(fileInfo.Name, assemblyHash)); var indexFile = _context.Source.Get(SymbolsIndexUtility.GetAssemblyToPackageIndexPath(fileInfo.Name, assemblyHash)); // Avoid duplicates if (seen.Add(dllFile)) { result.Add(new PackageFile(fileInfo.Name, assemblyHash, assembly, dllFile, indexFile)); } // Add .pdb if (pdbEntry != null) { var pdbFileInfo = new FileInfo(pdbEntry.FullName); var pdbFile = _context.Source.Get(SymbolsIndexUtility.GetAssemblyFilePath(pdbFileInfo.Name, pdbHash)); var pdbIndexFile = _context.Source.Get(SymbolsIndexUtility.GetAssemblyToPackageIndexPath(pdbFileInfo.Name, pdbHash)); // Avoid duplicates if (seen.Add(pdbFile)) { result.Add(new PackageFile(pdbFileInfo.Name, pdbHash, pdbEntry, pdbFile, pdbIndexFile)); } } } } return(result); }