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); } } }
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)); }