/// <summary> /// Adds a repository and its packages to this package pool. /// </summary> /// <param name="repository">A package repository.</param> /// <param name="rootAliases">An array of the root required aliases.</param> public void AddRepository(IRepository repository, ConfigAlias[] rootAliases = null) { IRepository[] repos; if (repository is RepositoryComposite repositoryComposite) { repos = repositoryComposite.GetRepositories(); } else { repos = new[] { repository }; } rootAliases = rootAliases ?? Array.Empty <ConfigAlias>(); void AddPackageByNameExact(IPackage package) { if (!packageByNameExact.TryGetValue( package.GetName(), out IDictionary <int, IPackage> mapping)) { packageByNameExact[package.GetName()] = mapping = new Dictionary <int, IPackage>(); } mapping[package.Id] = package; } void AddPackageByName(string name, IPackage package) { if (!packageByName.TryGetValue(name, out IList <IPackage> list)) { packageByName[name] = list = new List <IPackage>(); } list.Add(package); } foreach (var repo in repos) { repositories.Add(repo); var exempt = repo is RepositoryPlatform || repo is IRepositoryInstalled; if (repo is ILazyload repositoryLazyload && repositoryLazyload.IsLazyLoad) { lazyloadRepositories.Add(repositoryLazyload); continue; } foreach (var package in repo.GetPackages()) { var names = package.GetNames(); var stability = package.GetStability(); if (!(exempt || IsPackageAcceptable(stability, names))) { continue; } package.Id = id++; packages.Add(package); AddPackageByNameExact(package); foreach (var name in names) { AddPackageByName(name, package); } var packageName = package.GetName(); var alias = ConfigAlias.FindAlias(rootAliases, packageName, package.GetVersion()); if (alias == null) { continue; } var originalPackage = package; if (originalPackage is PackageAlias packageAlias) { originalPackage = packageAlias.GetAliasOf(); } packageAlias = new PackageAlias(originalPackage, alias.AliasNormalized, alias.Alias); packageAlias.SetRootPackageAlias(true); packageAlias.Id = id++; if (originalPackage.GetRepository() is RepositoryArray repositoryArray) { repositoryArray.AddPackage(packageAlias); } else if (originalPackage.GetRepository() is IRepositoryWriteable repositoryWriteable) { repositoryWriteable.AddPackage(packageAlias); } else { throw new RuntimeException($"The repository is must be {nameof(RepositoryArray)} or {nameof(IRepositoryWriteable)} in package {originalPackage}"); } packages.Add(packageAlias); AddPackageByNameExact(packageAlias); foreach (var name in packageAlias.GetNames()) { AddPackageByName(name, packageAlias); } } } }