+ // Check if the current version of the package is avalible and will satisfy this dependancy
+ if (DepPkg.CurrentVer() == Ver && List->IsNow(DepPkg) == true &&
+ !List->IsFlag(DepPkg,pkgOrderList::Removed) && DepPkg.State() == PkgIterator::NeedsNothing)
+ {
+ Bad = false;
+ break;
+ }
+
+ // Check if the version that is going to be installed will satisfy the dependancy
+ if (Cache[DepPkg].InstallVer == *I) {
+ if (List->IsFlag(DepPkg,pkgOrderList::UnPacked)) {
+ if (List->IsFlag(DepPkg,pkgOrderList::Loop) && PkgLoop) {
+ // This dependancy has already been dealt with by another SmartConfigure on Pkg
+ Bad = false;
+ break;
+ } else if (List->IsFlag(Pkg,pkgOrderList::Loop)) {
+ /* Check for a loop to prevent one forming
+ If A depends on B and B depends on A, SmartConfigure will
+ just hop between them if this is not checked. Dont remove the
+ loop flag after finishing however as loop is already set.
+ This means that there is another SmartConfigure call for this
+ package and it will remove the loop flag */
+ Bad = !SmartConfigure(DepPkg, Depth + 1);
+ } else {
+ /* Check for a loop to prevent one forming
+ If A depends on B and B depends on A, SmartConfigure will
+ just hop between them if this is not checked */
+ List->Flag(Pkg,pkgOrderList::Loop);
+ Bad = !SmartConfigure(DepPkg, Depth + 1);
+ List->RmFlag(Pkg,pkgOrderList::Loop);
+ }
+ // If SmartConfigure was succesfull, Bad is false, so break
+ if (!Bad) break;
+ } else if (List->IsFlag(DepPkg,pkgOrderList::Configured)) {
+ Bad = false;
+ break;
+ }
+ }
+ }
+
+ /* If the dependany is still not satisfied, try, if possible, unpacking a package to satisfy it */
+ if (InstallVer != 0 && Bad) {
+ if (List->IsNow(DepPkg)) {
+ Bad = false;
+ if (List->IsFlag(Pkg,pkgOrderList::Loop))
+ {
+ if (Debug)
+ std::clog << OutputInDepth(Depth) << "Package " << Pkg << " loops in SmartConfigure" << std::endl;
+ }
+ else
+ {
+ List->Flag(Pkg,pkgOrderList::Loop);
+ if (Debug)
+ cout << OutputInDepth(Depth) << "Unpacking " << DepPkg.Name() << " to avoid loop" << endl;
+ SmartUnPack(DepPkg, true, Depth + 1);
+ List->RmFlag(Pkg,pkgOrderList::Loop);
+ }
+ }
+ }
+
+ if (Start==End) {
+ if (Bad && Debug && List->IsFlag(DepPkg,pkgOrderList::Loop) == false)
+ std::clog << OutputInDepth(Depth) << "Could not satisfy dependencies for " << Pkg.Name() << std::endl;
+ break;
+ } else {
+ Start++;
+ }
+ }
+ }
+
+ if (Bad) {
+ if (Debug)
+ _error->Warning(_("Could not configure '%s'. "),Pkg.Name());