Exemplo n.º 1
0
        public PackageInstaller(PackageReaderFactory packageReaderFactory, string rootDirectory, VersionResolutionTable versionTable,
                                PackageManifest manifest, ICollection <IRepository> cacheRepositories, InstalledPackagesManager installedPackagesManager)
        {
            Guard.NotNull(packageReaderFactory, nameof(packageReaderFactory));
            Guard.NotNull(rootDirectory, nameof(rootDirectory));
            Guard.NotNull(versionTable, nameof(rootDirectory));
            Guard.NotNull(manifest, nameof(rootDirectory));
            Guard.NotNull(cacheRepositories, nameof(rootDirectory));

            _packageReaderFactory     = packageReaderFactory;
            _rootDirectory            = rootDirectory;
            _versionTable             = versionTable;
            _manifest                 = manifest;
            _cacheRepositories        = cacheRepositories;
            _installedPackagesManager = installedPackagesManager;

            _libFolderPath     = Path.Combine(rootDirectory, "lib");
            _includeFolderPath = Path.Combine(rootDirectory, "include");
            _toolsFolderPath   = Path.Combine(rootDirectory, "tools");
            _otherFolderPath   = Path.Combine(rootDirectory, "other");

            _index = _installedPackagesManager.ReadFromFolder(_rootDirectory);

            foreach (var package in versionTable.GetPackages())
            {
                _manifest.Dependencies.Add(new PackageDependency(package.PackageId, new NuGet.Versioning.VersionRange(package.Version)));
            }
        }
Exemplo n.º 2
0
        private VersionResolutionTable Flatten()
        {
            var table = new VersionResolutionTable();

            foreach (var node in _rootDependencyNode.Children)
            {
                FlattenNode(node, table);
            }

            return(table);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Resolution algorithm in V1 is fairly simple. Every dependency has a
        /// version pattern and platform name. Steps:
        ///
        /// 1) Starting from root, resolve version patterns to version array for every node
        /// in the tree recursively (the whole structure is not known yet)
        ///
        /// 2) Starting from root, resolve latest version's manifest to get dependencies of
        /// dependencies.
        ///
        /// 3) Repeat steps 1-2 until all the version patterns and manifests are resolved.
        ///
        /// 4) Flatten the tree to array of (PackageId, Platform, Version[])
        ///
        /// 5) Using (PackageId, Platform) as a key, merge array to a dictionary where
        /// value is Version[] and is an intersection of all Version[] for the key from
        /// array created in step 4.
        ///
        /// Data structure received in step 5 is the result of dependency resolution.
        /// Empty Version[] indicates a conflict for that package which can be displayed
        /// to a user using information from DependencyNode tree.
        ///
        /// </summary>
        /// <returns></returns>
        public void Resolve()
        {
            using (new TimeMeasurer(_writer.Text))
            {
                //steps 1-2-3
                ResolveAll();
            }

            //steps 4-5
            _table = Flatten();

            _resolved = true;
        }
Exemplo n.º 4
0
        public void SimpleVersionIntersectionTest()
        {
            var pkg = new Package("Self.Library", new Version(2, 0, 0, 501));

            pkg.Dependencies.Add(new PackageDependency("Company.Logging", "3.0"));
            pkg.Dependencies.Add(new PackageDependency("log4net", "1.2.8"));

            var dr     = new DependencyResolution(pkg, new[] { _repo });
            var result = dr.Resolve();
            VersionResolutionTable   table    = result.Item1;
            IEnumerable <PackageKey> packages = table.GetPackages();

            Assert.IsFalse(table.HasConflicts);
            Assert.AreEqual(2, packages.Count());
            Assert.AreEqual(new Version(3, 0, 0, 4863), packages.ElementAt(0).Version);
            //Assert.AreEqual(new Version(2, 0, 0, 501), packages.ElementAt(0).Version);
            Assert.AreEqual(new Version(1, 2, 8, 0), packages.ElementAt(1).Version);
        }
Exemplo n.º 5
0
        private void FlattenNode(DependencyNode node, VersionResolutionTable collector)
        {
            if (node == null)
            {
                return;
            }

            if (!node.IsFull)
            {
                throw new InvalidOperationException("Cannot flatten unresolved node");
            }

            collector.Intersect(node.UnresolvedPackage, node.ActiveSatisfayingData);

            foreach (var child in node.Children)
            {
                FlattenNode(child, collector);
            }
        }
Exemplo n.º 6
0
        public void SimpleConflictTest()
        {
            var pkg = new Package("Self.Library", new Version(2, 0, 0, 501));

            pkg.Dependencies.Add(new PackageDependency("Company.Logging", "3.0"));
            pkg.Dependencies.Add(new PackageDependency("log4net", "1.1"));

            var dr     = new DependencyResolution(pkg, new[] { _repo });
            var result = dr.Resolve();
            VersionResolutionTable table = result.Item1;

            Assert.IsTrue(table.HasConflicts);
            Assert.AreEqual(1, table.ConflictCount);

            var resolved   = table.GetPackages();
            var unresolved = table.GetConflictedPackages();

            Assert.AreEqual(1, resolved.Count());
            Assert.AreEqual(1, unresolved.Count());

            string cd = dr.DescribeConflict(result.Item2, unresolved.First());
        }
Exemplo n.º 7
0
 public IPackageInstaller GetInstaller(string rootDirectory, VersionResolutionTable versionTable, PackageManifest manifest)
 {
     return(new PackageInstaller(_packageReaderFactory, rootDirectory, versionTable, manifest,
                                 _repositoryFactory.TryGetEnabledRepos(RepositoryScope.Cache), _installedPackagesManager));
 }