Author: jgg
Date: 1999-07-10 04:58:42 GMT
Purge support
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: cacheiterators.h,v 1.13 1999/02/23 06:46:24 jgg Exp $
+// $Id: cacheiterators.h,v 1.14 1999/07/10 04:58:42 jgg Exp $
 /* ######################################################################
    
    Cache Iterators - Iterators for navigating the cache structure
 /* ######################################################################
    
    Cache Iterators - Iterators for navigating the cache structure
    inline const char *Name() const {return Pkg->Name == 0?0:Owner->StrP + Pkg->Name;};
    inline const char *Section() const {return Pkg->Section == 0?0:Owner->StrP + Pkg->Section;};
    inline const char *TargetDist() const {return Pkg->TargetDist == 0?0:Owner->StrP + Pkg->TargetDist;};
    inline const char *Name() const {return Pkg->Name == 0?0:Owner->StrP + Pkg->Name;};
    inline const char *Section() const {return Pkg->Section == 0?0:Owner->StrP + Pkg->Section;};
    inline const char *TargetDist() const {return Pkg->TargetDist == 0?0:Owner->StrP + Pkg->TargetDist;};
+   inline bool Purge() const {return Pkg->CurrentState == pkgCache::State::Purge;};
    inline VerIterator VersionList() const;
    inline VerIterator TargetVer() const;
    inline VerIterator CurrentVer() const;
    inline VerIterator VersionList() const;
    inline VerIterator TargetVer() const;
    inline VerIterator CurrentVer() const;
 
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: depcache.cc,v 1.18 1999/04/28 22:48:45 jgg Exp $
+// $Id: depcache.cc,v 1.19 1999/07/10 04:58:42 jgg Exp $
 /* ######################################################################
 
    Dependency Cache - Caches Dependency information.
 /* ######################################################################
 
    Dependency Cache - Caches Dependency information.
    // Not installed
    if (Pkg->CurrentVer == 0)
    {
    // 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;
       if (State.Mode == ModeInstall)
         iInstCount += Add;
       return;
 // DepCache::MarkDelete - Put the package in the delete state          /*{{{*/
 // ---------------------------------------------------------------------
 /* */
 // 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)
 {
    // Simplifies other routines.
    if (Pkg.end() == true)
 
    // Check that it is not already marked for delete
    StateCache &P = PkgState[Pkg->ID];
 
    // 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))
    // We dont even try to delete virtual packages..
    if (Pkg->VersionList == 0)
       return;
    // We dont even try to delete virtual packages..
    if (Pkg->VersionList == 0)
       return;
    RemoveSizes(Pkg);
    RemoveStates(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;
       P.Mode = ModeKeep;
    else
       P.Mode = ModeDelete;
 
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: depcache.h,v 1.10 1999/07/09 04:11:34 jgg Exp $
+// $Id: depcache.h,v 1.11 1999/07/10 04:58:42 jgg Exp $
 /* ######################################################################
 
    DepCache - Dependency Extension data for the cache
 /* ######################################################################
 
    DepCache - Dependency Extension data for the cache
 
    // Manipulators
    void MarkKeep(PkgIterator const &Pkg,bool Soft = false);
 
    // Manipulators
    void MarkKeep(PkgIterator const &Pkg,bool Soft = false);
-   void MarkDelete(PkgIterator const &Pkg);
+   void MarkDelete(PkgIterator const &Pkg,bool Purge = false);
    void MarkInstall(PkgIterator const &Pkg,bool AutoInst = true);
    
    // This is for debuging
    void MarkInstall(PkgIterator const &Pkg,bool AutoInst = true);
    
    // This is for debuging
 
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: packagemanager.cc,v 1.17 1999/07/09 04:11:34 jgg Exp $
+// $Id: packagemanager.cc,v 1.18 1999/07/10 04:58:42 jgg Exp $
 /* ######################################################################
 
    Package Manager - Abstacts the package manager
 /* ######################################################################
 
    Package Manager - Abstacts the package manager
       // Not interesting
       if ((Cache[I].Keep() == true || 
          Cache[I].InstVerIter(Cache) == I.CurrentVer()) && 
       // Not interesting
       if ((Cache[I].Keep() == true || 
          Cache[I].InstVerIter(Cache) == I.CurrentVer()) && 
-         I.State() == pkgCache::PkgIterator::NeedsNothing)
+         I.State() == pkgCache::PkgIterator::NeedsNothing &&
+         (I.Purge() != false || Cache[I].Mode != pkgDepCache::ModeDelete ||
+          (Cache[I].iFlags & pkgDepCache::Purge) != pkgDepCache::Purge))
         continue;
       
       // Append it to the list
         continue;
       
       // Append it to the list
 
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: apt-get.cc,v 1.68 1999/07/09 04:11:34 jgg Exp $
+// $Id: apt-get.cc,v 1.69 1999/07/10 04:58:42 jgg Exp $
 /* ######################################################################
    
    apt-get - Cover for dpkg
 /* ######################################################################
    
    apt-get - Cover for dpkg
    {
       pkgCache::PkgIterator I = Cache->PkgBegin();
       for (; I.end() == false; I++)
    {
       pkgCache::PkgIterator I = Cache->PkgBegin();
       for (; I.end() == false; I++)
-        Cache[I].iFlags |= pkgDepCache::Purge;
+      {
+        if (I.Purge() == false && Cache[I].Mode == pkgDepCache::ModeDelete)
+           Cache->MarkDelete(I,true);
+      }
       if (Remove == true)
       {
         Fix.Remove(Pkg);
       if (Remove == true)
       {
         Fix.Remove(Pkg);
-        Cache->MarkDelete(Pkg);
+        Cache->MarkDelete(Pkg,_config->FindB("APT::Get::Purge",false));
       // Remove packages 
       if (I->SelectedState == pkgCache::State::DeInstall ||
          I->SelectedState == pkgCache::State::Purge)
       // Remove packages 
       if (I->SelectedState == pkgCache::State::DeInstall ||
          I->SelectedState == pkgCache::State::Purge)
-        Cache->MarkDelete(I);
-      if (I->SelectedState == pkgCache::State::Purge)
-        Cache[I].iFlags |= pkgDepCache::Purge;
+        Cache->MarkDelete(I,I->SelectedState == pkgCache::State::Purge);
    }
 
    /* Resolve any problems that dselect created, allupgrade cannot handle
    }
 
    /* Resolve any problems that dselect created, allupgrade cannot handle
 
   * Multiple media swap support
   * Purge support. Closes: #33291, #40694
   * Better handling of - remove notation. Closes: #41024
   * Multiple media swap support
   * Purge support. Closes: #33291, #40694
   * Better handling of - remove notation. Closes: #41024
+  * Purge support. Closes: #33291, #40694
   
  -- Jason Gunthorpe <jgg@debian.org>  Mon, 28 Jun 1999 21:06:44 -0700
  
   
  -- Jason Gunthorpe <jgg@debian.org>  Mon, 28 Jun 1999 21:06:44 -0700