X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/813c8eea956b2dee1e7a4a8018a1e94880a2cfbf..29f7b36cd63f16ceab825531b5c131eac4b99f9b:/apt-pkg/algorithms.cc?ds=inline diff --git a/apt-pkg/algorithms.cc b/apt-pkg/algorithms.cc index 991a61228..21db98941 100644 --- a/apt-pkg/algorithms.cc +++ b/apt-pkg/algorithms.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: algorithms.cc,v 1.17 1999/04/28 22:48:45 jgg Exp $ +// $Id: algorithms.cc,v 1.20 1999/07/03 03:10:35 jgg Exp $ /* ###################################################################### Algorithms - A set of misc algorithms @@ -33,6 +33,11 @@ pkgSimulate::pkgSimulate(pkgDepCache &Cache) : pkgPackageManager(Cache), { Flags = new unsigned char[Cache.HeaderP->PackageCount]; memset(Flags,0,sizeof(*Flags)*Cache.HeaderP->PackageCount); + + // Fake a filename so as not to activate the media swapping + string Jnk = "SIMULATE"; + for (int I = 0; I != Cache.Head().PackageCount; I++) + FileNames[I] = Jnk; } /*}}}*/ // Simulate::Install - Simulate unpacking of a package /*{{{*/ @@ -755,10 +760,16 @@ bool pkgProblemResolver::Resolve(bool BrokenFix) ((Cache[End] & pkgDepCache::DepGNow) == 0 && End->Type != pkgCache::Dep::Conflicts)) { + // Try a little harder to fix protected packages.. if ((Flags[I->ID] & Protected) == Protected) + { + if (DoUpgrade(Pkg) == true) + Scores[Pkg->ID] = Scores[I->ID]; continue; - - // See if a keep will do + } + + /* See if a keep will do, unless the package is protected, + then installing it will be necessary */ Cache.MarkKeep(I); if (Cache[I].InstBroken() == false) { @@ -776,7 +787,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix) Scores[I->ID] = Scores[Pkg->ID]; } } - + Change = true; Done = true; break; @@ -856,8 +867,19 @@ bool pkgProblemResolver::Resolve(bool BrokenFix) delete [] PList; if (Cache.BrokenCount() != 0) - return _error->Error("Internal error, pkgProblemResolver::Resolve generated breaks."); - + { + // See if this is the result of a hold + pkgCache::PkgIterator I = Cache.PkgBegin(); + for (;I.end() != true; I++) + { + if (Cache[I].InstBroken() == false) + continue; + if ((Flags[I->ID] & Protected) != Protected) + return _error->Error("Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages."); + } + return _error->Error("Unable to correct problems, you have held broken packages."); + } + return true; } /*}}}*/