X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/2cca3bd92f9ca2f6e262235e0099383bb47fc6c6..421c8d109932a2615b9327c8b69aad715d4b1162:/apt-pkg/depcache.cc diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc index 9535a79f1..7b7d0b29d 100644 --- a/apt-pkg/depcache.cc +++ b/apt-pkg/depcache.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: depcache.cc,v 1.9 1998/12/07 23:54:42 jgg Exp $ +// $Id: depcache.cc,v 1.20 1999/09/09 06:08:45 jgg Exp $ /* ###################################################################### Dependency Cache - Caches Dependency information. @@ -25,6 +25,12 @@ pkgDepCache::pkgDepCache(MMap &Map,OpProgress &Prog) : { if (_error->PendingError() == false) Init(&Prog); +} +pkgDepCache::pkgDepCache(MMap &Map) : + pkgCache(Map), PkgState(0), DepState(0) +{ + if (_error->PendingError() == false) + Init(0); } /*}}}*/ // DepCache::~pkgDepCache - Destructor /*{{{*/ @@ -93,24 +99,13 @@ bool pkgDepCache::Init(OpProgress *Prog) // --------------------------------------------------------------------- /* The default just returns the target version if it exists or the highest version. */ -pkgDepCache::VerIterator pkgDepCache::GetCandidateVer(PkgIterator Pkg) +pkgDepCache::VerIterator pkgDepCache::GetCandidateVer(PkgIterator Pkg, + bool AllowCurrent) { // Try to use an explicit target - if (Pkg->TargetVer == 0) - { - /* Not source versions cannot be a candidate version unless they - are already installed */ - for (VerIterator I = Pkg.VersionList(); I.end() == false; I++) - { - if (Pkg.CurrentVer() == I) - return I; - for (VerFileIterator J = I.FileList(); J.end() == false; J++) - if ((J.File()->Flags & Flag::NotSource) == 0) - return I; - } - - return VerIterator(*this,0); - } + if (Pkg->TargetVer == 0 || + (AllowCurrent == false && Pkg.TargetVer() == Pkg.CurrentVer())) + return pkgCache::GetCandidateVer(Pkg,AllowCurrent); else return Pkg.TargetVer(); } @@ -208,11 +203,9 @@ void pkgDepCache::AddSizes(const PkgIterator &Pkg,long Mult) { StateCache &P = PkgState[Pkg->ID]; - if (Pkg.State() == pkgCache::PkgIterator::NeedsConfigure) - { - iUsrSize += Mult*P.InstVerIter(*this)->InstalledSize; + if (Pkg.State() == pkgCache::PkgIterator::NeedsConfigure && + P.Keep() == true) return; - } // Compute the size data if (P.NewInstall() == true) @@ -271,6 +264,10 @@ void pkgDepCache::AddStates(const PkgIterator &Pkg,int Add) // Not installed if (Pkg->CurrentVer == 0) { + if (State.Mode == ModeDelete && + (State.iFlags | Purge) == Purge && Pkg.Purge() == false) + iDelCount += Add; + if (State.Mode == ModeInstall) iInstCount += Add; return; @@ -511,9 +508,10 @@ void pkgDepCache::Update(PkgIterator const &Pkg) Update(P.ParentPkg().RevDependsList()); // Update the provides map for the candidate ver - for (PrvIterator P = PkgState[Pkg->ID].CandidateVerIter(*this).ProvidesList(); - P.end() != true; P++) - Update(P.ParentPkg().RevDependsList()); + if (PkgState[Pkg->ID].CandidateVer != 0) + for (PrvIterator P = PkgState[Pkg->ID].CandidateVerIter(*this).ProvidesList(); + P.end() != true; P++) + Update(P.ParentPkg().RevDependsList()); } /*}}}*/ @@ -526,6 +524,12 @@ void pkgDepCache::MarkKeep(PkgIterator const &Pkg,bool Soft) // Simplifies other routines. if (Pkg.end() == true) return; + + /* Reject an attempt to keep a non-source broken installed package, those + must be upgraded */ + if (Pkg.State() == PkgIterator::NeedsUnpack && + Pkg.CurrentVer().Downloadable() == false) + return; /* We changed the soft state all the time so the UI is a bit nicer to use */ @@ -563,7 +567,7 @@ void pkgDepCache::MarkKeep(PkgIterator const &Pkg,bool Soft) // DepCache::MarkDelete - Put the package in the delete state /*{{{*/ // --------------------------------------------------------------------- /* */ -void pkgDepCache::MarkDelete(PkgIterator const &Pkg) +void pkgDepCache::MarkDelete(PkgIterator const &Pkg, bool rPurge) { // Simplifies other routines. if (Pkg.end() == true) @@ -571,10 +575,14 @@ void pkgDepCache::MarkDelete(PkgIterator const &Pkg) // Check that it is not already marked for delete StateCache &P = PkgState[Pkg->ID]; - P.iFlags &= ~AutoKept; - if (P.Mode == ModeDelete || P.InstallVer == 0) + P.iFlags &= ~(AutoKept | Purge); + if (rPurge == true) + P.iFlags |= Purge; + + if ((P.Mode == ModeDelete || P.InstallVer == 0) && + (Pkg.Purge() == true || rPurge == false)) return; - + // We dont even try to delete virtual packages.. if (Pkg->VersionList == 0) return; @@ -582,7 +590,10 @@ void pkgDepCache::MarkDelete(PkgIterator const &Pkg) RemoveSizes(Pkg); RemoveStates(Pkg); - P.Mode = ModeDelete; + if (Pkg->CurrentVer == 0 && (Pkg.Purge() == true || rPurge == false)) + P.Mode = ModeKeep; + else + P.Mode = ModeDelete; P.InstallVer = 0; P.Flags &= Flag::Auto;