DependencyResolutionResult BuildResult(IPackageDescriptor packageDescriptor, LoggingPackageVisitor visitor, List<IPackageInfo> allPackages)
 {
     return new DependencyResolutionResult(packageDescriptor,
                                           FromPacks(allPackages, visitor.Success).ToList(),
                                           FromPacks(allPackages, visitor.Fail).ToList(),
                                           FromNotFound(visitor.NotFound).ToList());
 }
        public DependencyResolutionResult TryResolveDependencies(IPackageDescriptor packageDescriptor, IEnumerable<IPackageRepository> repositoriesToQuery)
        {
            Debug.WriteLine("Resolving descriptor " + packageDescriptor.Dependencies.Select(x => x.ToString()).JoinString(", "));

            var excluded = new List<IPackageInfo>();

            var allPackages = repositoriesToQuery.Packages().SelectMany(_ => _).ToList();
            var notFound = new List<PackageDependency>();

            for (int i = 0; i < MAX_RETRIES; i++)
            {
                var visitor = new LoggingPackageVisitor(
                    allPackages,
                    packages => Nuke(PackageStrategy.Latest(packages)),
                    fail: excluded);

                visitor.ReadDependency = LocalHints(packageDescriptor.Dependencies, Override(packageDescriptor.Overrides, visitor.ReadDependency));

                if (visitor.Visit(packageDescriptor.Dependencies))
                {
                    return BuildResult(packageDescriptor, visitor, allPackages);
                }

                var hasNewIncompatibles = visitor.IncompatiblePackages.Except(excluded).Any();

                var currentNotFound = ReadNotFoundDependencies(visitor);
                var hasNewNotFound = currentNotFound.Except(notFound).Any();
                if (!hasNewNotFound && !hasNewIncompatibles)
                    return BuildResult(packageDescriptor, visitor, allPackages);
                excluded.AddRange(visitor.IncompatiblePackages);
                notFound = currentNotFound.ToList();
            }

            throw new InvalidOperationException(string.Format("OpenWrap tried {0} times to resolve the tree of dependencies and gave up.", MAX_RETRIES));
        }
 static IEnumerable<PackageDependency> ReadNotFoundDependencies(LoggingPackageVisitor visitor)
 {
     return visitor.NotFound.Select(_ => ((DependencyNode)_.Last()).Dependency);
 }