diff options
author | Christopher Baines <cbaines8@gmail.com> | 2011-08-11 15:35:54 +0100 |
---|---|---|
committer | Christopher Baines <cbaines8@gmail.com> | 2011-08-11 15:35:54 +0100 |
commit | cbea0578989754f70874bf49946b84bf4f7a567e (patch) | |
tree | 2c0327d42ee6051a3e5357a4395079bc22bc817e /apt-pkg/packagemanager.cc | |
parent | e7ecc2183ced0503c4f9662339f5ab98dc1606ee (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/packagemanager.cc')
-rw-r--r-- | apt-pkg/packagemanager.cc | 15 |
1 files changed, 11 insertions, 4 deletions
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)) { |