示例#1
0
        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;
            }
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
            }
        }
示例#5
0
 private static PackageVersion GetPackageVersionEntity(Package package, Entity.Package packageEntity)
 {
     return(packageEntity.PackageVersions.FirstOrDefault(s => s.PackageId == packageEntity.PackageId && s.Version == package.Version));
 }
示例#6
0
        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);
        }