private PackageVersion GetorAddPackageVersionEntity(Package package, Entity.Package packageEntity) { var packageVersionEntity = GetPackageVersionEntity(package, packageEntity); // This version of the package was already processed, don't process again if (packageVersionEntity != null) { Logger.LogDebug($"{package.Id}.{package.Version} package version already exists. Ignoring."); return(packageVersionEntity); } DbContextTransaction transaction = null; try { transaction = dbContext.Database.BeginTransaction(); // Get package contents from repository var tempVersion = new Version(package.Version); packageVersionEntity = new PackageVersion { Version = package.Version, MajorVersion = Math.Max(0, tempVersion.Major), MinorVersion = Math.Max(0, tempVersion.Minor), BuildVersion = Math.Max(0, tempVersion.Build), RevisionVersion = Math.Max(0, tempVersion.Revision) }; packageEntity.PackageVersions.Add(packageVersionEntity); dbContext.SaveChanges(); Logger.LogInformation($"{package.Id}.{package.Version} package version added to database."); PopulatePackageAssembliesFromPackageContent(package, packageEntity, packageVersionEntity); transaction.Commit(); return(packageVersionEntity); } catch { Logger.LogError("Exception thrown. Rolling back changes."); transaction?.Rollback(); throw; } }
private Entity.Package GetorAddPackageEntity(Package package) { // Get package from database or add it if not found var packageEntity = GetPackageEntity(package); if (packageEntity == null) { // Package not found in database. Add it. packageEntity = new Entity.Package { Name = package.Id, Title = string.IsNullOrEmpty(package.Title) ? package.Id : package.Title }; dbContext.Packages.Add(packageEntity); dbContext.SaveChanges(); Logger.LogInformation($"Package {packageEntity.Name} added to database"); } return(packageEntity); }
private PackageVersionAssembly GetOrAddPackageAssemblyVersionEntity(Entity.Package packageEntity, PackageVersion packageVersionEntity, Assembly assemblyEntity, AssemblyVersion assemblyVersionEntity) { var packageVersionAssemblyEntity = packageVersionEntity.PackageVersionAssemblies.FirstOrDefault(pva => (pva.AssemblyVersion.AssemblyId == assemblyEntity.AssemblyId) && (pva.AssemblyVersion.Version == assemblyVersionEntity.Version)); if (packageVersionAssemblyEntity == null) { packageVersionAssemblyEntity = new PackageVersionAssembly() { AssemblyVersion = assemblyVersionEntity, PackageVersion = packageVersionEntity, }; packageVersionEntity.PackageVersionAssemblies.Add(packageVersionAssemblyEntity); Logger.LogInformation($"{assemblyEntity.Name}.{assemblyVersionEntity.Version} assembly for package {packageEntity.Name}.{packageVersionEntity.Version} added to PackageVersionAssembly."); } else { Logger.LogDebug($"{assemblyEntity.Name}.{assemblyVersionEntity.Version} assembly found for package {packageEntity.Name}.{packageVersionEntity.Version}. Ignoring."); } return(packageVersionAssemblyEntity); }
private void PopulatePackageAssembliesFromPackageContent(Package package, Entity.Package packageEntity, PackageVersion packageVersionEntity) { var uniqueAssemblies = new Dictionary <string, AssemblyName>(); var coreAssembly = typeof(object).Assembly; using var byteStream = new MemoryStream(package.Content); using var archive = ArchiveFactory.Open(byteStream); using var lc = new MetadataLoadContext(new ZipAssemblyResolver(archive, coreAssembly), coreAssembly.FullName); foreach (var archiveEntry in archive.Entries) { if (archiveEntry.IsDirectory || (!archiveEntry.Key.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase) && !archiveEntry.Key.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase))) { continue; } System.Reflection.Assembly assembly; using var entryStream = archiveEntry.ExtractToStream(); try { assembly = lc.LoadFromStream(entryStream); } catch (FileLoadException) { Logger.LogError($"{packageEntity.Name} (v{packageVersionEntity.Version}) - {archiveEntry.Key} - could not be loaded."); continue; } catch (Exception e) { Logger.LogError(e, $"{packageEntity.Name} (v{packageVersionEntity.Version}) - {archiveEntry.Key} - threw an exception."); continue; } foreach (var referencedAssembly in assembly.GetReferencedAssemblies()) { if (!uniqueAssemblies.ContainsKey(referencedAssembly.FullName)) { uniqueAssemblies.Add(referencedAssembly.FullName, referencedAssembly); } } var assemblyName = assembly.GetName(); Logger.LogDebug($"Processing assembly {assemblyName.Name}, version={assemblyName.Version}"); var assemblyEntity = GetOrAddAssemblyEntity(assemblyName); var assemblyVersionEntity = GetOrAddAssemblyVersionEntity(assemblyEntity, assemblyName); var packageAssemblyVersionEntity = GetOrAddPackageAssemblyVersionEntity(packageEntity, packageVersionEntity, assemblyEntity, assemblyVersionEntity); packageAssemblyVersionEntity.ReferenceIncluded = true; } foreach (var uniqueAssembly in uniqueAssemblies.Values) { Logger.LogDebug($"Processing referenced assembly {uniqueAssembly.Name}, version={uniqueAssembly.Version}"); var assemblyEntity = GetOrAddAssemblyEntity(uniqueAssembly); var assemblyVersionEntity = GetOrAddAssemblyVersionEntity(assemblyEntity, uniqueAssembly); GetOrAddPackageAssemblyVersionEntity(packageEntity, packageVersionEntity, assemblyEntity, assemblyVersionEntity); } }
private static PackageVersion GetPackageVersionEntity(Package package, Entity.Package packageEntity) { return(packageEntity.PackageVersions.FirstOrDefault(s => s.PackageId == packageEntity.PackageId && s.Version == package.Version)); }
private PackageVersionEnvironment GetOrAddPackageEnvironmentEntity(IRepository <Package> repository, Entity.Package packageEntity, PackageVersion packageVersionEntity) { var packageEnvironment = GetPackageEnvironmentEntity(repository, packageVersionEntity); if (packageEnvironment == null) { packageEnvironment = new PackageVersionEnvironment { PackageVersionId = packageVersionEntity.PackageVersionId, Name = repository.Name }; packageVersionEntity.PackageEnvironments.Add(packageEnvironment); dbContext.SaveChanges(); Logger.LogInformation($"Environment {packageEnvironment.Name} for Package {packageEntity.Name} added to database"); } return(packageEnvironment); }