private async Task ResolveDependenciesAsync(IDependencyResolver dependencyResolver,
                                                    CancellationToken cancellation)
        {
            var unresolvedDependencies    = InstalledModules.Unresolved;
            var unresolvedInstallationSet = new UnresolvedInstallationSet(resolved: Enumerable.Empty <ModuleReleaseIdentifier>(),
                                                                          unresolved: unresolvedDependencies);

            var resolvedInstallationSets = (await unresolvedInstallationSet.ResolveAsync(dependencyResolver, cancellation)).ToList();

            if (resolvedInstallationSets.Count() == 0)
            {
                Notify(new InstallationSetConflict());

                // TODO: Replace with logging. We cannot access the logger in the domain currently, as we do not have DI in the domain.
                Console.WriteLine("---> InstallationSetConflict");
            }
            else
            {
                resolvedInstallationSets.Sort();
                ResolvedModules = resolvedInstallationSets.First();
                Notify(new InstallationSetChanged(ResolvedModules));

                // TODO: Replace with logging. We cannot access the logger in the domain currently, as we do not have DI in the domain.
                Console.WriteLine("---> InstallationSetChanged: ");

                foreach (var release in ResolvedModules.Resolved)
                {
                    Console.WriteLine(release.Module + " " + release.Version);
                }
            }
        }
Beispiel #2
0
        private async Task <IEnumerable <ResolvedInstallationSet> > TryResolveSingleDependencyAsync(ModuleDependency dependency,
                                                                                                    IDependencyResolver dependencyResolver,
                                                                                                    CancellationToken cancellation)
        {
            // We have a resolved dependency that does not match our version filter => This is a version conflict
            if (_resolved != null &&
                _resolved.TryGetValue(dependency.Module, out var resolvedDependency) &&
                !dependency.VersionRange.IsMatch(resolvedDependency))
            {
                return(Enumerable.Empty <ResolvedInstallationSet>());
            }

            var matchingReleases = await dependencyResolver.GetMatchingReleasesAsync(dependency, cancellation);

            var resolvedInstallationSets = new List <ResolvedInstallationSet>();
            var resolveTasks             = new List <Task <IEnumerable <ResolvedInstallationSet> > >();

            foreach (var matchingRelease in matchingReleases)
            {
                var dependencies = await dependencyResolver.GetDependenciesAsync(matchingRelease, cancellation);

                if (!TryCombine(matchingRelease, dependencies, out var unresolved))
                {
                    continue;
                }

                var resolved = (_resolved ?? ImmutableDictionary <ModuleIdentifier, ModuleVersion> .Empty).Add(matchingRelease.Module, matchingRelease.Version);

                // If there are no unresolved dependencies for the release, we can short circuit.
                if (unresolved.Count == 0)
                {
                    resolvedInstallationSets.Add(new ResolvedInstallationSet(resolved.Select(p => new ModuleReleaseIdentifier(p.Key, p.Value))));
                }
                else
                {
                    var unresolvedInstallationSet = new UnresolvedInstallationSet(resolved, unresolved);

                    resolveTasks.Add(unresolvedInstallationSet.ResolveAsync(dependencyResolver, cancellation));
                }
            }

            // TODO: Is it possible that there are duplicates?
            return((await Task.WhenAll(resolveTasks)).SelectMany(_ => _).Concat(resolvedInstallationSets));
        }