]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/depcache.cc
Added diff-only and tar-only options
[apt.git] / apt-pkg / depcache.cc
index 7d1ff05ead192836d7766d40de867d87701385a7..7b7d0b29dafb4568ac4befe8df918da5937b0947 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: depcache.cc,v 1.17 1999/04/16 21:46:13 jgg Exp $
+// $Id: depcache.cc,v 1.20 1999/09/09 06:08:45 jgg Exp $
 /* ######################################################################
 
    Dependency Cache - Caches Dependency information.
@@ -264,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;
@@ -504,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());
 }
 
                                                                        /*}}}*/
@@ -519,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 */
@@ -556,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)
@@ -564,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;
@@ -575,7 +590,7 @@ void pkgDepCache::MarkDelete(PkgIterator const &Pkg)
    RemoveSizes(Pkg);
    RemoveStates(Pkg);
    
-   if (Pkg->CurrentVer == 0)
+   if (Pkg->CurrentVer == 0 && (Pkg.Purge() == true || rPurge == false))
       P.Mode = ModeKeep;
    else
       P.Mode = ModeDelete;