X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/590f1923121815b36ef889033c1c416a23cbe9a2..b57257d2993aaf8c0cf9d6f0ea8ebd0208112bc5:/apt-pkg/packagemanager.cc?ds=inline diff --git a/apt-pkg/packagemanager.cc b/apt-pkg/packagemanager.cc index 8bcf3d884..b5d353602 100644 --- a/apt-pkg/packagemanager.cc +++ b/apt-pkg/packagemanager.cc @@ -286,9 +286,17 @@ bool pkgPackageManager::ConfigureAll() for (pkgOrderList::iterator I = OList.begin(); I != OList.end(); I++) { PkgIterator Pkg(Cache,*I); + + /* Check if the package has been configured, this can happen if SmartConfigure + calls its self */ + if (List->IsFlag(Pkg,pkgOrderList::Configured)) continue; - if (ConfigurePkgs == true && SmartConfigure(Pkg) == false) { - _error->Error("Internal error, packages left unconfigured. %s",Pkg.Name()); + if (ConfigurePkgs == true && SmartConfigure(Pkg, 0) == false) { + if (ImmConfigureAll) + _error->Error(_("Could not perform immediate configuration on '%s'. " + "Please see man 5 apt.conf under APT::Immediate-Configure for details. (%d)"),Pkg.Name(),1); + else + _error->Error("Internal error, packages left unconfigured. %s",Pkg.Name()); return false; } @@ -300,19 +308,34 @@ bool pkgPackageManager::ConfigureAll() /*}}}*/ // PM::SmartConfigure - Perform immediate configuration of the pkg /*{{{*/ // --------------------------------------------------------------------- -/* This routine trys to put the system in a state where Pkg can be configured, - this involves checking each of Pkg's dependanies and unpacking and - configuring packages where needed. */ -bool pkgPackageManager::SmartConfigure(PkgIterator Pkg) +/* This function tries to put the system in a state where Pkg can be configured. + This involves checking each of Pkg's dependanies and unpacking and + configuring packages where needed. + + Note on failure: This method can fail, without causing any problems. + This can happen when using Immediate-Configure-All, SmartUnPack may call + SmartConfigure, it may fail because of a complex dependancy situation, but + a error will only be reported if ConfigureAll fails. This is why some of the + messages this function reports on failure (return false;) as just warnings + only shown when debuging*/ +bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth) { - if (Debug == true) - clog << "SmartConfigure " << Pkg.Name() << endl; - + // If this is true, only check and correct and dependancies without the Loop flag + bool PkgLoop = List->IsFlag(Pkg,pkgOrderList::Loop); + + if (Debug) { + VerIterator InstallVer = VerIterator(Cache,Cache[Pkg].InstallVer); + clog << OutputInDepth(Depth) << "SmartConfigure " << Pkg.Name() << " (" << InstallVer.VerStr() << ")"; + if (PkgLoop) + clog << " (Only Correct Dependancies)"; + clog << endl; + } + VerIterator const instVer = Cache[Pkg].InstVerIter(Cache); /* Because of the ordered list, most dependancies should be unpacked, - however if there is a loop this is not the case, so check for dependancies before configuring. - This is done after the package installation as it makes it easier to deal with conflicts problems */ + however if there is a loop (A depends on B, B depends on A) this will not + be the case, so check for dependancies before configuring. */ bool Bad = false; for (DepIterator D = instVer.DependsList(); D.end() == false; ) @@ -331,70 +354,61 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg) VerIterator InstallVer; SPtrArray VList = Start.AllTargets(); + // Check through each version of each package that could satisfy this dependancy for (Version **I = VList; *I != 0; I++) { VerIterator Ver(Cache,*I); DepPkg = Ver.ParentPkg(); - - if (!Bad) continue; - InstallVer = VerIterator(Cache,Cache[DepPkg].InstallVer); - //VerIterator CandVer(Cache,Cache[DepPkg].CandidateVer); - - if (Debug && false) { - if (Ver==0) { - cout << " Checking if " << Ver << " of " << DepPkg.Name() << " satisfies this dependancy" << endl; - } else { - cout << " Checking if " << Ver.VerStr() << " of " << DepPkg.Name() << " satisfies this dependancy" << endl; - } - - if (DepPkg.CurrentVer()==0) { - cout << " CurrentVer " << DepPkg.CurrentVer() << " IsNow " << List->IsNow(DepPkg) << " NeedsNothing " << (DepPkg.State() == PkgIterator::NeedsNothing) << endl; - } else { - cout << " CurrentVer " << DepPkg.CurrentVer().VerStr() << " IsNow " << List->IsNow(DepPkg) << " NeedsNothing " << (DepPkg.State() == PkgIterator::NeedsNothing) << endl; - } - - if (InstallVer==0) { - cout << " InstallVer " << InstallVer << endl; - } else { - cout << " InstallVer " << InstallVer.VerStr() << endl; - } - //if (CandVer != 0) - // cout << " CandVer " << CandVer.VerStr() << endl; - - cout << " Keep " << Cache[DepPkg].Keep() << " Unpacked " << List->IsFlag(DepPkg,pkgOrderList::UnPacked) << " Configured " << List->IsFlag(DepPkg,pkgOrderList::Configured) << endl; - - } - - // Check if it satisfies this dependancy + + // Check if the current version of the package is avalible and will satisfy this dependancy if (DepPkg.CurrentVer() == Ver && List->IsNow(DepPkg) == true && - DepPkg.State() == PkgIterator::NeedsNothing) + !List->IsFlag(DepPkg,pkgOrderList::Removed) && DepPkg.State() == PkgIterator::NeedsNothing) { Bad = false; - continue; + 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)) { - List->Flag(Pkg,pkgOrderList::Loop); - Bad = !SmartConfigure(DepPkg); + 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 { - Bad = false; + /* 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; } - continue; } } + /* 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)) { + if (List->IsNow(DepPkg) && !List->IsFlag(DepPkg,pkgOrderList::Loop)) { + List->Flag(Pkg,pkgOrderList::Loop); if (Debug) - cout << " Unpacking " << DepPkg.Name() << " to avoid loop" << endl; - SmartUnPack(DepPkg, true); + cout << OutputInDepth(Depth) << "Unpacking " << DepPkg.Name() << " to avoid loop" << endl; + SmartUnPack(DepPkg, true, Depth + 1); + List->RmFlag(Pkg,pkgOrderList::Loop); } } @@ -405,16 +419,26 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg) } } break; - } else { Start++; } } } + + if (Bad) { + if (Debug) + _error->Warning(_("Could not configure '%s'. "),Pkg.Name()); + return false; + } + + if (PkgLoop) return true; static std::string const conf = _config->Find("PackageManager::Configure","all"); static bool const ConfigurePkgs = (conf == "all" || conf == "smart"); + if (List->IsFlag(Pkg,pkgOrderList::Configured)) + return _error->Error("Internal configure error on '%s'. ",Pkg.Name(),1); + if (ConfigurePkgs == true && Configure(Pkg) == false) return false; @@ -428,13 +452,12 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg) Cache[P].InstallVer == 0 || (P.CurrentVer() == Cache[P].InstallVer && (Cache[Pkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall)) continue; - SmartConfigure(P); + SmartConfigure(P, (Depth +1)); } // Sanity Check - if (List->IsFlag(Pkg,pkgOrderList::Configured) == false && Debug) - _error->Warning(_("Could not perform immediate configuration on '%s'. " - "Please see man 5 apt.conf under APT::Immediate-Configure for details. (%d)"),Pkg.Name(),1); + if (List->IsFlag(Pkg,pkgOrderList::Configured) == false) + return _error->Error(_("Could not configure '%s'. "),Pkg.Name()); return true; } @@ -508,33 +531,40 @@ bool pkgPackageManager::SmartRemove(PkgIterator Pkg) unpacked, or when it has been unpacked, if Immediate==true it configures it. */ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg) { - return SmartUnPack(Pkg, true); + return SmartUnPack(Pkg, true, 0); } -bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate) +bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate, int const Depth) { - if (Debug == true) - clog << "SmartUnPack " << Pkg.Name() << endl; + bool PkgLoop = List->IsFlag(Pkg,pkgOrderList::Loop); + + if (Debug) { + clog << OutputInDepth(Depth) << "SmartUnPack " << Pkg.Name(); + VerIterator InstallVer = VerIterator(Cache,Cache[Pkg].InstallVer); + if (Pkg.CurrentVer() == 0) + cout << " (install version " << InstallVer.VerStr() << ")"; + else + cout << " (replace version " << Pkg.CurrentVer().VerStr() << " with " << InstallVer.VerStr() << ")"; + if (PkgLoop) + cout << " (Only Perform PreUnpack Checks)"; + cout << endl; + } // Check if it is already unpacked if (Pkg.State() == pkgCache::PkgIterator::NeedsConfigure && Cache[Pkg].Keep() == true) { - List->Flag(Pkg,pkgOrderList::UnPacked,pkgOrderList::States); - if (Immediate == true && - List->IsFlag(Pkg,pkgOrderList::Immediate) == true) - if (SmartConfigure(Pkg) == false) - _error->Warning(_("Could not perform immediate configuration on already unpacked '%s'. " - "Please see man 5 apt.conf under APT::Immediate-Configure for details."),Pkg.Name()); - return true; + cout << OutputInDepth(Depth) << "SmartUnPack called on Package " << Pkg.Name() << " but its unpacked" << endl; + return false; } - + VerIterator const instVer = Cache[Pkg].InstVerIter(Cache); - /* PreUnpack Checks: This loop checks and attemps to rectify and problems that would prevent the package being unpacked. - It addresses: PreDepends, Conflicts, Obsoletes and DpkgBreaks. Any resolutions that do not require it should - avoid configuration (calling SmartUnpack with Immediate=true), this is because any loops before Pkg is unpacked - can cause problems. This will be either dealt with if the package is configured as a dependancy of - Pkg (if and when Pkg is configured), or by the ConfigureAll call at the end of the for loop in OrderInstall. */ + /* PreUnpack Checks: This loop checks and attempts to rectify and problems that would prevent the package being unpacked. + It addresses: PreDepends, Conflicts, Obsoletes and Breaks (DpkgBreaks). Any resolutions that do not require it should + avoid configuration (calling SmartUnpack with Immediate=true), this is because when unpacking some packages with + complex dependancy structures, trying to configure some packages while breaking the loops can complicate things . + This will be either dealt with if the package is configured as a dependency of Pkg (if and when Pkg is configured), + or by the ConfigureAll call at the end of the for loop in OrderInstall. */ for (DepIterator D = instVer.DependsList(); D.end() == false; ) { @@ -546,7 +576,7 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate) while (End->Type == pkgCache::Dep::PreDepends) { if (Debug) - clog << "PreDepends order for " << Pkg.Name() << std::endl; + clog << OutputInDepth(Depth) << "PreDepends order for " << Pkg.Name() << std::endl; // Look for possible ok targets. SPtrArray VList = Start.AllTargets(); @@ -562,7 +592,7 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate) { Bad = false; if (Debug) - clog << "Found ok package " << Pkg.Name() << endl; + clog << OutputInDepth(Depth) << "Found ok package " << Pkg.Name() << endl; continue; } } @@ -577,10 +607,15 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate) if (Cache[Pkg].InstallVer != *I || (Cache[Pkg].Keep() == true && Pkg.State() == PkgIterator::NeedsNothing)) continue; + + if (List->IsFlag(Pkg,pkgOrderList::Configured)) { + Bad = false; + continue; + } if (Debug) - clog << "Trying to SmartConfigure " << Pkg.Name() << endl; - Bad = !SmartConfigure(Pkg); + clog << OutputInDepth(Depth) << "Trying to SmartConfigure " << Pkg.Name() << endl; + Bad = !SmartConfigure(Pkg, Depth + 1); } /* If this or element did not match then continue on to the @@ -611,46 +646,27 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate) VerIterator InstallVer(Cache,Cache[ConflictPkg].InstallVer); // See if the current version is conflicting - if (ConflictPkg.CurrentVer() == Ver && !List->IsFlag(ConflictPkg,pkgOrderList::UnPacked)) - { - if (Debug && false) - cout << " " << Pkg.Name() << " conflicts with " << ConflictPkg.Name() << endl; - - if (Debug && false) { - if (Ver==0) { - cout << " Checking if " << Ver << " of " << ConflictPkg.Name() << " satisfies this dependancy" << endl; - } else { - cout << " Checking if " << Ver.VerStr() << " of " << ConflictPkg.Name() << " satisfies this dependancy" << endl; - } - - if (ConflictPkg.CurrentVer()==0) { - cout << " CurrentVer " << ConflictPkg.CurrentVer() << " IsNow " << List->IsNow(ConflictPkg) << " NeedsNothing " << (ConflictPkg.State() == PkgIterator::NeedsNothing) << endl; - } else { - cout << " CurrentVer " << ConflictPkg.CurrentVer().VerStr() << " IsNow " << List->IsNow(ConflictPkg) << " NeedsNothing " << (ConflictPkg.State() == PkgIterator::NeedsNothing) << endl; - } - - if (InstallVer==0) { - cout << " InstallVer " << InstallVer << endl; - } else { - cout << " InstallVer " << InstallVer.VerStr() << endl; - } - - cout << " Keep " << Cache[ConflictPkg].Keep() << " Unpacked " << List->IsFlag(ConflictPkg,pkgOrderList::UnPacked) << " Configured " << List->IsFlag(ConflictPkg,pkgOrderList::Configured) << " Removed " << List->IsFlag(ConflictPkg,pkgOrderList::Removed) << " Loop " << List->IsFlag(ConflictPkg,pkgOrderList::Loop) << endl; - cout << " Delete " << Cache[ConflictPkg].Delete() << endl; - } - + 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) { - cout << "Unpacking " << ConflictPkg.Name() << " to prevent conflict" << endl; - List->Flag(Pkg,pkgOrderList::Loop); - SmartUnPack(ConflictPkg,false); + 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)) { - cout << "Because of conficts knot, removing " << ConflictPkg.Name() << " to conflict violation" << endl; + 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()); } @@ -668,93 +684,71 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate) PkgIterator BrokenPkg = Ver.ParentPkg(); VerIterator InstallVer(Cache,Cache[BrokenPkg].InstallVer); - if (Debug && false) { - if (Ver==0) { - cout << " Checking if " << Ver << " of " << BrokenPkg.Name() << " satisfies this dependancy" << endl; - } else { - cout << " Checking if " << Ver.VerStr() << " of " << BrokenPkg.Name() << " satisfies this dependancy" << endl; - } - - if (BrokenPkg.CurrentVer()==0) { - cout << " CurrentVer " << BrokenPkg.CurrentVer() << " IsNow " << List->IsNow(BrokenPkg) << " NeedsNothing " << (BrokenPkg.State() == PkgIterator::NeedsNothing) << endl; - } else { - cout << " CurrentVer " << BrokenPkg.CurrentVer().VerStr() << " IsNow " << List->IsNow(BrokenPkg) << " NeedsNothing " << (BrokenPkg.State() == PkgIterator::NeedsNothing) << endl; - } - - if (InstallVer==0) { - cout << " InstallVer " << InstallVer << endl; - } else { - cout << " InstallVer " << InstallVer.VerStr() << endl; - } - - cout << " Keep " << Cache[BrokenPkg].Keep() << " Unpacked " << List->IsFlag(BrokenPkg,pkgOrderList::UnPacked) << " Configured " << List->IsFlag(BrokenPkg,pkgOrderList::Configured) << " Removed " << List->IsFlag(BrokenPkg,pkgOrderList::Removed) << " Loop " << List->IsFlag(BrokenPkg,pkgOrderList::Loop) << " InList " << List->IsFlag(BrokenPkg,pkgOrderList::InList) << endl; - cout << " Delete " << Cache[BrokenPkg].Delete() << endl; - } // Check if it needs to be unpacked if (List->IsFlag(BrokenPkg,pkgOrderList::InList) && Cache[BrokenPkg].Delete() == false && - !List->IsFlag(BrokenPkg,pkgOrderList::Loop) && List->IsNow(BrokenPkg)) { - List->Flag(Pkg,pkgOrderList::Loop); - // Found a break, so unpack the package - if (Debug) - cout << " Unpacking " << BrokenPkg.Name() << " to avoid break" << endl; - /* */ - SmartUnPack(BrokenPkg, 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 << " Removing " << BrokenPkg.Name() << " to avoid break" << endl; + cout << OutputInDepth(Depth) << " Removing " << BrokenPkg.Name() << " to avoid break" << endl; SmartRemove(BrokenPkg); } } } } - // FIXME: Crude but effective fix, allows the SmartUnPack method to be used for packages that new to the system - if (instVer != 0) { - //cout << "Check for reverse conflicts on " << Pkg.Name() << " " << instVer.VerStr() << endl; - - // Check for reverse conflicts. - if (CheckRConflicts(Pkg,Pkg.RevDependsList(), + // Check for reverse conflicts. + if (CheckRConflicts(Pkg,Pkg.RevDependsList(), instVer.VerStr()) == false) - return false; + return false; - for (PrvIterator P = instVer.ProvidesList(); + for (PrvIterator P = instVer.ProvidesList(); P.end() == false; P++) CheckRConflicts(Pkg,P.ParentPkg().RevDependsList(),P.ProvideVersion()); - List->Flag(Pkg,pkgOrderList::UnPacked,pkgOrderList::States); + if (PkgLoop) return true; - if (instVer->MultiArch == pkgCache::Version::Same) - for (PkgIterator P = Pkg.Group().PackageList(); - P.end() == false; P = Pkg.Group().NextPkg(P)) - { - if (Pkg == P || List->IsFlag(P,pkgOrderList::UnPacked) == true || + List->Flag(Pkg,pkgOrderList::UnPacked,pkgOrderList::States); + + if (instVer->MultiArch == pkgCache::Version::Same) + for (PkgIterator P = Pkg.Group().PackageList(); + P.end() == false; P = Pkg.Group().NextPkg(P)) + { + if (Pkg == P || List->IsFlag(P,pkgOrderList::UnPacked) == true || Cache[P].InstallVer == 0 || (P.CurrentVer() == Cache[P].InstallVer && (Cache[Pkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall)) - continue; - SmartUnPack(P, false); - } - - } else { - VerIterator InstallVer(Cache,Cache[Pkg].InstallVer); - //cout << "Check for reverse conflicts on " << Pkg.Name() << " " << InstallVer.VerStr() << endl; - - // Check for reverse conflicts. - if (CheckRConflicts(Pkg,Pkg.RevDependsList(), - InstallVer.VerStr()) == false) - return false; - - List->Flag(Pkg,pkgOrderList::UnPacked,pkgOrderList::States); - } + continue; + SmartUnPack(P, false, Depth + 1); + } if(Install(Pkg,FileNames[Pkg->ID]) == false) return false; - if (Immediate == true && List->IsFlag(Pkg,pkgOrderList::Immediate) == true) { - + if (Immediate == true) { // Perform immedate configuration of the package. - if (SmartConfigure(Pkg) == false) + if (SmartConfigure(Pkg, Depth + 1) == false) _error->Warning(_("Could not perform immediate configuration on '%s'. " "Please see man 5 apt.conf under APT::Immediate-Configure for details. (%d)"),Pkg.Name(),2); } @@ -795,7 +789,7 @@ pkgPackageManager::OrderResult pkgPackageManager::OrderInstall() if (List->IsNow(Pkg) == false) { if (!List->IsFlag(Pkg,pkgOrderList::Configured) && !NoImmConfigure) { - if (SmartConfigure(Pkg) == false && Debug) + if (SmartConfigure(Pkg, 0) == false && Debug) _error->Warning("Internal Error, Could not configure %s",Pkg.Name()); // FIXME: The above warning message might need changing } else { @@ -834,14 +828,15 @@ pkgPackageManager::OrderResult pkgPackageManager::OrderInstall() return Failed; } else - if (SmartUnPack(Pkg) == false) + if (SmartUnPack(Pkg,List->IsFlag(Pkg,pkgOrderList::Immediate),0) == false) return Failed; DoneSomething = true; if (ImmConfigureAll) { /* ConfigureAll here to pick up and packages left unconfigured becuase they were unpacked in the "PreUnpack Checks" section */ - ConfigureAll(); + if (!ConfigureAll()) + return Failed; } }