+// PM::NonLoopingSmart - helper to avoid loops while calling Smart methods /*{{{*/
+// -----------------------------------------------------------------------
+/* ensures that a loop of the form A depends B, B depends A (and similar)
+ is not leading us down into infinite recursion segfault land */
+bool pkgPackageManager::NonLoopingSmart(SmartAction const action, pkgCache::PkgIterator &Pkg,
+ pkgCache::PkgIterator DepPkg, int const Depth, bool const PkgLoop,
+ bool * const Bad, bool * const Changed)
+{
+ if (PkgLoop == false)
+ List->Flag(Pkg,pkgOrderList::Loop);
+ bool success = false;
+ switch(action)
+ {
+ case UNPACK_IMMEDIATE: success = SmartUnPack(DepPkg, true, Depth + 1); break;
+ case UNPACK: success = SmartUnPack(DepPkg, false, Depth + 1); break;
+ case CONFIGURE: success = SmartConfigure(DepPkg, Depth + 1); break;
+ }
+ if (PkgLoop == false)
+ List->RmFlag(Pkg,pkgOrderList::Loop);
+
+ if (success == false)
+ return false;
+
+ if (Bad != NULL)
+ *Bad = false;
+ if (Changed != NULL && List->IsFlag(DepPkg,pkgOrderList::Loop) == false)
+ *Changed = true;
+ return true;
+}
+ /*}}}*/