summaryrefslogtreecommitdiff
path: root/apt-pkg
diff options
context:
space:
mode:
authorChristopher Baines <cbaines8@gmail.com>2011-08-11 15:35:54 +0100
committerChristopher Baines <cbaines8@gmail.com>2011-08-11 15:35:54 +0100
commitcbea0578989754f70874bf49946b84bf4f7a567e (patch)
tree2c0327d42ee6051a3e5357a4395079bc22bc817e /apt-pkg
parente7ecc2183ced0503c4f9662339f5ab98dc1606ee (diff)
Added a RmFlag function to remvoe the loop flag, this should prevent any errors or wierd behaviour because of the loop flag being used
at mutiple stages in both SmartUnpack and SmartConfigure.
Diffstat (limited to 'apt-pkg')
-rw-r--r--apt-pkg/orderlist.h2
-rw-r--r--apt-pkg/packagemanager.cc15
2 files changed, 13 insertions, 4 deletions
diff --git a/apt-pkg/orderlist.h b/apt-pkg/orderlist.h
index 2f5c6d0d1..4e5ea1654 100644
--- a/apt-pkg/orderlist.h
+++ b/apt-pkg/orderlist.h
@@ -94,6 +94,8 @@ class pkgOrderList : protected pkgCache::Namespace
void Flag(PkgIterator Pkg,unsigned long State, unsigned long F) {Flags[Pkg->ID] = (Flags[Pkg->ID] & (~F)) | State;};
inline void Flag(PkgIterator Pkg,unsigned long F) {Flags[Pkg->ID] |= F;};
inline void Flag(Package *Pkg,unsigned long F) {Flags[Pkg->ID] |= F;};
+ // RmFlag removes a flag from a package
+ inline void RmFlag(Package *Pkg,unsigned long F) {Flags[Pkg->ID] &= ~F;};
// IsNow will return true if the Pkg has been not been either configured or unpacked
inline bool IsNow(PkgIterator Pkg) {return (Flags[Pkg->ID] & (States & (~Removed))) == 0;};
bool IsMissing(PkgIterator Pkg);
diff --git a/apt-pkg/packagemanager.cc b/apt-pkg/packagemanager.cc
index d956c001e..722cbfa86 100644
--- a/apt-pkg/packagemanager.cc
+++ b/apt-pkg/packagemanager.cc
@@ -369,7 +369,9 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg)
if (!List->IsFlag(DepPkg,pkgOrderList::Loop)) {
List->Flag(Pkg,pkgOrderList::Loop);
// If SmartConfigure was succesfull, Bad is false, so break
- if (!(Bad = !SmartConfigure(DepPkg))) break;
+ Bad = !SmartConfigure(DepPkg);
+ List->RmFlag(Pkg,pkgOrderList::Loop);
+ if (!Bad) break;
}
} else if (List->IsFlag(DepPkg,pkgOrderList::Configured)) {
Bad = false;
@@ -381,11 +383,12 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg)
/* If the dependany is still not satisfied, try, if possible, unpacking a package to satisfy it */
if (InstallVer != 0 && Bad) {
Bad = false;
- List->Flag(Pkg,pkgOrderList::Loop);
if (!List->IsFlag(DepPkg,pkgOrderList::Loop)) {
+ List->Flag(Pkg,pkgOrderList::Loop);
if (Debug)
cout << " Unpacking " << DepPkg.Name() << " to avoid loop" << endl;
SmartUnPack(DepPkg, true);
+ //List->Flag(Pkg,~pkgOrderList::Loop);
}
}
@@ -616,15 +619,18 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate)
// See if the current version is conflicting
if (ConflictPkg.CurrentVer() == Ver && List->IsNow(ConflictPkg))
- {
+ {
+ cout << 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 << "Unpacking " << ConflictPkg.Name() << " to prevent conflict" << endl;
- List->Flag(Pkg,pkgOrderList::Loop);
+ List->Flag(Pkg,pkgOrderList::Loop);
SmartUnPack(ConflictPkg,false);
+ // 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());
@@ -659,6 +665,7 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate)
cout << " Unpacking " << BrokenPkg.Name() << " to avoid break" << endl;
SmartUnPack(BrokenPkg, false);
+ List->RmFlag(Pkg,pkgOrderList::Loop);
}
// Check if a package needs to be removed
if (Cache[BrokenPkg].Delete() == true && !List->IsFlag(BrokenPkg,pkgOrderList::Configured)) {