private static void CheckIfPackageCanBeUninstalled(PackageIdentity packageIdentity, IDictionary <PackageIdentity, HashSet <PackageIdentity> > dependenciesDict, IDictionary <PackageIdentity, HashSet <PackageIdentity> > dependentsDict, UninstallationContext uninstallationContext, HashSet <PackageIdentity> packagesMarkedForUninstall) { HashSet <PackageIdentity> dependents; if (dependentsDict.TryGetValue(packageIdentity, out dependents) && dependents != null) { if (!uninstallationContext.ForceRemove) { var unMarkedDependents = dependents.Where(d => !packagesMarkedForUninstall.Contains(d)).ToList(); if (unMarkedDependents.Count > 0) { throw CreatePackageHasDependentsException(packageIdentity, unMarkedDependents); } } } HashSet <PackageIdentity> dependencies; if (uninstallationContext.RemoveDependencies && dependenciesDict.TryGetValue(packageIdentity, out dependencies) && dependencies != null) { foreach (var dependency in dependencies) { CheckIfPackageCanBeUninstalled(dependency, dependenciesDict, dependentsDict, uninstallationContext, packagesMarkedForUninstall); } } }
private static HashSet <PackageIdentity> MarkPackagesToBeUninstalled(PackageIdentity packageIdentity, IDictionary <PackageIdentity, HashSet <PackageIdentity> > dependenciesDict, UninstallationContext uninstallationContext) { var breathFirstSearchQueue = new Queue <PackageIdentity>(); var markedPackages = new List <PackageIdentity>(); breathFirstSearchQueue.Enqueue(packageIdentity); while (breathFirstSearchQueue.Count > 0) { var headPackage = breathFirstSearchQueue.Dequeue(); markedPackages.Add(headPackage); HashSet <PackageIdentity> dependencies; if (uninstallationContext.RemoveDependencies && dependenciesDict.TryGetValue(headPackage, out dependencies) && dependencies != null) { foreach (var dependency in dependencies) { if (markedPackages.Contains(dependency)) { // Put it back at the end markedPackages.Remove(dependency); markedPackages.Add(dependency); } else { breathFirstSearchQueue.Enqueue(dependency); } } } } return(new HashSet <PackageIdentity>(markedPackages, PackageIdentity.Comparer)); }
public static ICollection <PackageIdentity> GetPackagesToBeUninstalled(PackageIdentity packageIdentity, IEnumerable <PackageDependencyInfo> dependencyInfoEnumerable, IEnumerable <PackageIdentity> installedPackages, UninstallationContext uninstallationContext) { IDictionary <PackageIdentity, HashSet <PackageIdentity> > dependenciesDictionary; var dependentsDictionary = GetPackageDependents(dependencyInfoEnumerable, installedPackages, out dependenciesDictionary); var packagesMarkedForUninstall = MarkPackagesToBeUninstalled(packageIdentity, dependenciesDictionary, uninstallationContext); CheckIfPackageCanBeUninstalled(packageIdentity, dependenciesDictionary, dependentsDictionary, uninstallationContext, packagesMarkedForUninstall); return(packagesMarkedForUninstall); }