コード例 #1
0
        /// <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);
                    }
                }
            }
        }