Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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);
        }