+ if (ConflictPkg.CurrentVer() == Ver && List->IsNow(ConflictPkg))
+ {
+ cout << OutputInDepth(Depth) << Pkg.Name() << " conflicts with " << ConflictPkg.Name() << endl;
+ /* If a loop is not present or has not yet been detected, attempt to unpack packages
+ to resolve this conflict. If there is a loop present, remove packages to resolve this conflict */
+ if (!List->IsFlag(ConflictPkg,pkgOrderList::Loop)) {
+ if (Cache[ConflictPkg].Keep() == 0 && Cache[ConflictPkg].InstallVer != 0) {
+ if (Debug)
+ cout << OutputInDepth(Depth) << OutputInDepth(Depth) << "Unpacking " << ConflictPkg.Name() << " to prevent conflict" << endl;
+ List->Flag(Pkg,pkgOrderList::Loop);
+ SmartUnPack(ConflictPkg,false, Depth + 1);
+ // Remove loop to allow it to be used later if needed
+ List->RmFlag(Pkg,pkgOrderList::Loop);
+ } else {
+ if (EarlyRemove(ConflictPkg) == false)
+ return _error->Error("Internal Error, Could not early remove %s",ConflictPkg.Name());
+ }
+ } else {
+ if (!List->IsFlag(ConflictPkg,pkgOrderList::Removed)) {
+ if (Debug)
+ cout << OutputInDepth(Depth) << "Because of conficts knot, removing " << ConflictPkg.Name() << " to conflict violation" << endl;
+ if (EarlyRemove(ConflictPkg) == false)
+ return _error->Error("Internal Error, Could not early remove %s",ConflictPkg.Name());
+ }
+ }
+ }
+ }
+ }
+
+ // Check for breaks
+ if (End->Type == pkgCache::Dep::DpkgBreaks) {
+ SPtrArray<Version *> VList = End.AllTargets();
+ for (Version **I = VList; *I != 0; I++)
+ {
+ VerIterator Ver(Cache,*I);
+ PkgIterator BrokenPkg = Ver.ParentPkg();
+ VerIterator InstallVer(Cache,Cache[BrokenPkg].InstallVer);
+
+ // Check if it needs to be unpacked
+ if (List->IsFlag(BrokenPkg,pkgOrderList::InList) && Cache[BrokenPkg].Delete() == false &&
+ List->IsNow(BrokenPkg)) {
+ if (List->IsFlag(BrokenPkg,pkgOrderList::Loop) && PkgLoop) {
+ // This dependancy has already been dealt with by another SmartUnPack on Pkg
+ break;
+ } else if (List->IsFlag(Pkg,pkgOrderList::Loop)) {
+ /* Found a break, so unpack the package, but dont remove loop as already set.
+ This means that there is another SmartUnPack call for this
+ package and it will remove the loop flag. */
+ if (Debug)
+ cout << OutputInDepth(Depth) << " Unpacking " << BrokenPkg.Name() << " to avoid break" << endl;
+
+ SmartUnPack(BrokenPkg, false, Depth + 1);
+ } else {
+ List->Flag(Pkg,pkgOrderList::Loop);
+ // Found a break, so unpack the package
+ if (Debug)
+ cout << OutputInDepth(Depth) << " Unpacking " << BrokenPkg.Name() << " to avoid break" << endl;
+
+ SmartUnPack(BrokenPkg, false, Depth + 1);
+ List->RmFlag(Pkg,pkgOrderList::Loop);
+ }
+ }
+
+ // Check if a package needs to be removed
+ if (Cache[BrokenPkg].Delete() == true && !List->IsFlag(BrokenPkg,pkgOrderList::Configured)) {
+ if (Debug)
+ cout << OutputInDepth(Depth) << " Removing " << BrokenPkg.Name() << " to avoid break" << endl;
+ SmartRemove(BrokenPkg);